2016-11-01 7 views
1

ich erfolgreich Sounds mit Xamarin Formen (Android und iOS) spielen können, aber das folgende Ich muss auch erreichen:Xamarin Forms Sound wiedergeben Asynchron

  • Ich erwarte müssen, so dass, wenn mehrere Töne sind ‚gespielt‘ , einer wird vor dem nächsten abgeschlossen sein.
  • Ich muss einen booleschen Wert zurückgeben, um anzuzeigen, ob die Operation erfolgreich war.

Hier ist mein aktueller vereinfachten Code (für die iOS-Plattform):

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; 
    } 

die Methode zu testen, habe ich versucht, es wie so nennen:

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

ich gehofft hatte zu höre das Audio für Datei1, dann Datei2 und dann Datei3. Allerdings höre ich nur Datei 1 und der Code scheint nicht die zweite zu erreichen.

Thankyou

Antwort

0

Ich denke, das Problem ist, dass die AVAudioPlayer _player heraus gelöscht wurde, bevor es fertig war. Wenn Sie Ihrem FinsihedPlaying Debugging hinzufügen, werden Sie bemerken, dass Sie diesen Punkt nie getroffen haben.

diese Änderungen ausprobieren, ich eine private AVAudioPlayer gemacht außerhalb des Task

zu sitzen (ich habe die folgende Anleitung als Referenz 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

** Apples AVAudioPlayer-Referenz ** - https://developer.apple.com/library/ios/documentation/AVFoundation/Reference/AVAudioPlayerClassReference/ –

+0

** Xamarin - Abspielen von Ton mit AVAudioPlayer ** - https://developer.xamarin.com/recipes/ios/media/sound/avaudioplayer/ –