2011-05-08 72 views
0

聲音結束後,另一個聲音可以播放......但在這段代碼中,聲音正在混合......我該如何解決它? audioplayerdidfinishplaying問題! iphone sdk

-(IBAction) ... { 
    for (...) { 
    if (compare(Output, N1)) { 
     songPath = [[NSBundle mainBundle] pathForResource:@"a" ofType:@"wav"]; 
    } 
    if (compare(Output, N2)) { 
     songPath = [[NSBundle mainBundle] pathForResource:@"b" ofType:@"wav"]; 
    } 
    audioPlayer=[[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath: songPath] error:NULL]; 
       [audioPlayer setDelegate:self]; 
       [audioPlayer play]; 
    } 
} 


-(void) audioPlayerDidFinishPlaying: (AVAudioPlayer *) player successfully: (BOOL) flag { 
    NSLog(@"Song FINISHED!!!!!!"); 
    [player release]; 
} 
+0

您已將'[audioPlayer play]'放在'for'循環中。顯然,如果循環迭代次數超過1次,則會有多個音頻播放器一起播放。 – 2011-05-09 00:00:05

回答

0

你的代碼是不是真的可以理解的,但我想我明白你的目標是什麼。

要實現它,可以說,你有一個NSArray *itemsToPlay。 在開始時(即用戶點擊按鈕時),它充滿了您的所有聲音。

用戶點擊按鈕後,調用IBAction。在那裏,您從itemsToPlay中選擇第一個聲音(並將其從此容器中移除)並告訴audioPlayer播放。

玩家完成遊戲後,audioPlayerDidFinishPlaying:successfully:被調用。在那裏,你再次從itemsToPlay中挑選第一個項目,並重新啓動你的audioPlayer。再次說,要玩audioPlayer

itemsToPlay爲空時,此循環結束。

1

一旦用戶點擊按鈕,音頻播放器播放,但它似乎是如果音頻沒有完成,用戶再次點擊它,音頻播放器的另一個對象創建與音頻文件的另一個引用。這使得兩個或更多的音頻可以同時播放。那麼,解決方案很簡單。每次點擊按鈕時都要檢查一下,如果播放器已經在播放,如果這樣就停止播放器並釋放,並用新的文件url引用創建一個新實例。爲此,您應該綜合audioPlayer並將其用作

-(IBAction) ... { 
    for (...) { 
    if (compare(Output, N1)) { 
    songPath = [[NSBundle mainBundle] pathForResource:@"a" ofType:@"wav"]; 
    } 
    if (compare(Output, N2)) { 
    songPath = [[NSBundle mainBundle] pathForResource:@"b" ofType:@"wav"]; 
    } 
    if(self.audioPlayer){ 
    self.audioPlayer.delegate=nil; 
    self.audioPlayer=nil; 
    } 
    self.audioPlayer=[[AVAudioPlayer alloc] initWithContentsOfURL: 
          [NSURL fileURLWithPath: songPath] error:NULL]; 
    [self.audioPlayer setDelegate:self]; 
    [self.audioPlayer play]; 
    } 
} 


-(void) audioPlayerDidFinishPlaying: (AVAudioPlayer *) player successfully: (BOOL) flag { 
    NSLog(@"Song FINISHED!!!!!!"); 
    [self.audioPlayer setDelegate:nil]; 
    self.audioPlayer=nil; 
    } 
+0

它是否會導致設置self.audioPlayer = nil ,然後執行[self.audioPlayer setDelegate:nil]; ? – 2012-11-03 16:50:58

+0

是的它,上面的代碼是錯誤的,它的音頻播放器應該設置爲零後代理設置爲零。由於代表是音頻播放器本身的弱性質,它不會被音頻播放器保留,它可能不會崩潰,但它不是一個正確的方法。 – Sandeep 2012-11-03 17:41:34