2013-04-13 178 views
1

我試圖在同一時間播放多個聲音。但有時候,聲音只是停止播放,或根本不會開始播放。AVFoundation.AVAudioPlayer隨機停止

我有臨危時的聲音效果應該發揮了事件的事件處理程序:

void HandlePlaySound (object sender, EventArgs e) 
    { 
     this.InvokeOnMainThread (()=>{ 
      ... 
      [set url to path] 
      ... 
      MonoTouch.AVFoundation.AVAudioPlayer player = MonoTouch.AVFoundation.AVAudioPlayer.FromUrl(url); 
      player.Play(); 
     }); 
    } 

也能正常工作的大部分時間,但是當兩個聲音同時它被觸發似乎是其中之一將被殺死或兩者兼而有之。我必須在這裏做一些非常錯誤的事情。

在iPhone應用程序中播放聲音是否更正確?每個聲音應該播放直到結束,並且可能同時播放多個聲音。

回答

2

如果我猜測,我會說有時GC會進來並且放置已經超出範圍的玩家,導致您的隨機停止行爲。我發現了一個穩定的解決方案是首先建立很多的同步音頻流,怎麼你最好喜歡到能夠發揮,然後執行這些規則:

// I'd like a maximum of 5 simultaneous audio streams 
    Queue<AVAudioPlayer> players = new Queue<AVAudioPlayer>(5); 

    void PlayAudio (string fileName) 
    { 
     NSUrl url = NSUrl.FromFilename(fileName); 
     AVAudioPlayer player = AVAudioPlayer.FromUrl(url); 

     if (players.Count == 5) { 
      players.Dequeue().Dispose(); 
     } 
     players.Enqueue(player); 
     player.Play(); 
    } 

    // In my example, I'll select files from my Sounds folder (containing a couple of .wav, a couple of .mp3 and an .aif) 
    string[] files; 
    int fileIndex = 0; 

    string GetNextFileName() 
    { 
     if (files == null) 
      files = Directory.GetFiles("Sounds"); 

     if (fileIndex == files.Length) 
      fileIndex = 0; 
     return files[fileIndex++]; 
    } 

    partial void OnPlayButtonTapped (NSObject sender) 
    { 
     string fileName = GetNextFileName(); 
     PlayAudio(fileName); 
    }  
+0

感謝薩米!這實際上導致我找到了解決方案。這可能是GC。 –

+0

@Sami Lamti:這裏有些不對勁。你沒有對你打開閱讀的wave文件做任何事情。 – henon

+0

好眼睛@henon;謝謝!我更新了代碼示例:) –