0

私はメディアプレーヤーを使用していくつかの可聴的な指示をしたいと思います。コンピュータは言うしようとします:
)の四つの継続する前にMediaPlayerが完了するのを待っているUWP

一つは

1が起こる "と入力し、テキストボックスとプレスで自分のイニシャルを入力し、" イベントMediaPlayer.OnMediaPlayerFailed
2)イベントMediaPlayer.OnMediaPlayerEnded
3) MediaPlayerの再生中にユーザーがタスクを完了してEnterキーを押したとき 4)ユーザーは何もせずタイムアウトしたい

MediaPlayer.Play()は、開始する前に次の命令に制御を戻しますgを押して録音を再生します。 UIスレッドは待機しなければなりません。しかしどうですか? Task.Run/Task.Factory.Run/Task.Factory.RunStartを使用して新しいタスクを開始することに決めました。次に、UIスレッドでWait(timeout_interval)を実行します。しかし、私は新しいスレッド/タスクに同じ問題を渡しました。 MediaPlayer.Play()は実質的に新しいタスクの最後の行で、サウンドが終了する前に完了します。私はOnMediaXxxxが実行されるまでタスクを生かしておく必要があります。 2つのイベントは、タスクを終了するかUIをキャンセルします.Wait() 私はCancellationTokens、CancellationTokenSources、および無数のさまざまな待機方法でサークルに参加してきました。

解決策は何ですか?私がやろうとしていることは動作していないようです。

+0

を行うことができます。..そのうちの一つは、あなたがテキストボックスを無効にしていることができるということですMediaPlayerがサウンドの再生を開始してから5秒後にスレッドが待機することで、メディアが完全に再生されたときに有効にします。 – Pratyay

答えて

0

私は今大げさですが成功しました。録音が終わるのを待つまで煮詰まった。だから私は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); 
関連する問題