私は今大げさですが成功しました。録音が終わるのを待つまで煮詰まった。だから私はMediaPlayの後に待っていたが、これは動作していなかった。私が2つの連続した音を演奏しようとすると、最初の音が終わる前に最初の音を待つことができませんでした。しかし、これは仕事をした...
static private void PlayAndWait(StorageFile file, double volume)
{
playCancellationTokenSource = new CancellationTokenSource();
playTask = new Task(() => PlayFile(file, volume), playCancellationTokenSource.Token);
playTask.Start();
Task.WaitAny(new Task[] { playTask }, 15_0000);
}
static private void PlayFile(StorageFile file, double volume)
{
if (MRecording.recordingStatus != RecordingStatus.Idle)
throw new LogicException("PlayStorageFile: RecordingStatus not Idle");
FileNowPlaying = file;
var mediaPlayer = new MediaPlayer { AutoPlay = false, AudioCategory = MediaPlayerAudioCategory.Media };
mediaPlayer.MediaFailed += OnMediaPlayerFailed; // one of these two should release the mutex
mediaPlayer.MediaEnded += OnMediaPlayerEnded;
mediaPlayer.AudioCategory = Windows.Media.Playback.MediaPlayerAudioCategory.Media;
MediaSource mediaSource = MediaSource.CreateFromStorageFile(file);
var mediaPlaybackItem = new MediaPlaybackItem(mediaSource);
mediaPlayer.Source = mediaPlaybackItem;
mediaPlayer.Volume = volume;
MRecording.recordingStatus = RecordingStatus.Playing;
try
{
FileNowPlaying = file;
mediaPlayer.Play();
playTask.Wait(playCancellationTokenSource.Token);
}
catch (OperationCanceledException)
{ }
catch (Exception e)
{
throw new LogicException("PlayFile", e);
}
FileNowPlaying = null;
recordingStatus = RecordingStatus.Idle;
}
static void OnMediaPlayerFailed(object sender, MediaPlayerFailedEventArgs e) => PlayCleanUp();
static void OnMediaPlayerEnded(object sender, MediaPlayerFailedEventArgs e) => PlayCleanUp();
static void PlayCleanUp()
{
recordingStatus = RecordingStatus.Idle;
if (playTask == null)
throw new LogicException("playTask null");
string msg = string.Empty;
AggregateException exceptions = playTask.Exception;
if (exceptions != null)
foreach (Exception e in exceptions.InnerExceptions)
{
msg += e.Message + Statics.CRLF2;
throw new LogicException("PlayCleanUp exception: " + msg);
}
playCancellationTokenSource.Cancel();
}
だから今、私はそれを行うための複数の方法があると確信して、次の
PlayAndWait(StorageFile1, volume:1.0);
PlayAndWait(StorageFile2, volume:0.5);
PlayAndWait(StorageFile3, volume:0.7);
を行うことができます。..そのうちの一つは、あなたがテキストボックスを無効にしていることができるということですMediaPlayerがサウンドの再生を開始してから5秒後にスレッドが待機することで、メディアが完全に再生されたときに有効にします。 – Pratyay