2016-11-01 6 views
1

Я могу успешно воспроизводить звуки с помощью Xamarin формы (Android и IOS), однако я также необходимо добиться:Xamarin Формы Воспроизведение звука Асинхронный

  • мне нужно ждать, так что, если несколько звуки «играли» , один будет завершен до следующего.
  • Мне нужно вернуть логическое значение, чтобы указать, была ли операция успешной.

Вот мой текущий упрощенный код (для платформы IOS):

public Task<bool> PlayAudioTask(string fileName) 
    { 
     var tcs = new TaskCompletionSource<bool>(); 

     string filePath = NSBundle.MainBundle.PathForResource(
       Path.GetFileNameWithoutExtension(fileName), Path.GetExtension(fileName)); 

     var url = NSUrl.FromString(filePath); 

     var _player = AVAudioPlayer.FromUrl(url); 

     _player.FinishedPlaying += (object sender, AVStatusEventArgs e) => 
      { 
       _player = null; 
       tcs.SetResult(true); 
      }; 

     _player.Play(); 

     return tcs.Task; 
    } 

Для проверки метода, я попытался назвать его так:

var res1 = await _audioService.PlayAudioTask("file1"); 
    var res2 = await _audioService.PlayAudioTask("file2"); 
    var res3 = await _audioService.PlayAudioTask("file3"); 

Я надеялся услышать звук для файла1, затем файл2, затем файл3. Однако я слышу только файл 1, и код, похоже, не доходит до второго ожидания.

Thankyou

ответ

0

Я думаю, что ваш вопрос здесь в том, что AVAudioPlayer _player был очищаются перед она была закончена. Если вы хотите добавить отладку в FinsihedPlaying, вы заметите, что никогда не попадаете в эту точку.

Попробуйте эти изменения, я сделал личное AVAudioPlayer сидеть за пределами Task

(я использовал следующее руководство в качестве ссылки https://developer.xamarin.com/recipes/ios/media/sound/avaudioplayer/)

public async void play() 
    { 

     System.Diagnostics.Debug.WriteLine("Play 1"); 
     await PlayAudioTask("wave2.wav"); 

     System.Diagnostics.Debug.WriteLine("Play 2"); 
     await PlayAudioTask("wave2.wav"); 

     System.Diagnostics.Debug.WriteLine("Play 3"); 
     await PlayAudioTask("wave2.wav"); 

    } 


    private AVAudioPlayer player; // Leave the player outside the Task 

    public Task<bool> PlayAudioTask(string fileName) 
    { 
     var tcs = new TaskCompletionSource<bool>(); 

     // Any existing sound playing? 
     if (player != null) 
     { 
      //Stop and dispose of any sound 
      player.Stop(); 
      player.Dispose(); 
     } 

     string filePath = NSBundle.MainBundle.PathForResource(
       Path.GetFileNameWithoutExtension(fileName), Path.GetExtension(fileName)); 

     var url = NSUrl.FromString(filePath); 

     player = AVAudioPlayer.FromUrl(url); 

     player.FinishedPlaying += (object sender, AVStatusEventArgs e) => 
     { 
      System.Diagnostics.Debug.WriteLine("DONE PLAYING"); 
      player = null; 
      tcs.SetResult(true); 
     }; 


     player.NumberOfLoops = 0; 
     System.Diagnostics.Debug.WriteLine("Start Playing"); 
     player.Play(); 

     return tcs.Task; 
    } 

application output

+0

** Ссылка на AVAudioPlayer от Apple ** - https://developer.apple.com/library/ios/documentation/AVFoundation/Reference/AVAudioPlayerClassReference/ –

+0

** Xamarin - Воспроизведение звука с помощью AVAudioPlayer ** - https://developer.xamarin.com/recipes/ios/media/sound/avaudioplayer/ –