为啥这个声音循环不会停止?

Posted

技术标签:

【中文标题】为啥这个声音循环不会停止?【英文标题】:why will this sound loop not stop?为什么这个声音循环不会停止? 【发布时间】:2012-12-30 19:52:55 【问题描述】:

我在我的应用程序中创建了一个声音循环,当用户按下出现的UIAlertView 上的“确定”按钮时,我想停止该循环。

我有两个问题:


首先

当我打开断点并为所有异常设置断点时,[audioPlayer play] 上会出现异常,但日志上没有显示错误,并且应用程序不会在通过异常“F8-ing”后崩溃,除非有没有声音。


第二

我遇到的另一个问题是用户点击“确定”按钮后音频文件不会停止,并且断点显示它确实读取了[audioPlayer stop] 调用。我不知道是什么导致了这些错误,而且我所做的似乎没有任何帮助。


代码

AVAudioPlayer *audioPlayer;


-(void)done 

    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Timer Done" message:nil delegate:nil cancelButtonTitle:nil otherButtonTitles:@"Ok", nil];
    [alert show];

    [self playAlert];


-(void)playAlert 
    NSString *soundFilePath = [[NSBundle mainBundle] pathForResource:@"Alarm" ofType:@"caf"];
    NSURL *soundFileURL = [NSURL fileURLWithPath:soundFilePath];
    audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:soundFileURL error:nil];
    audioPlayer.numberOfLoops = -1; //infinite

    [audioPlayer play];


- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex 
    if (buttonIndex == 1) 
        if ([audioPlayer isPlaying]) 
            [audioPlayer stop];
        
    

请告诉我我能做些什么来解决这个问题。

【问题讨论】:

【参考方案1】:

一个明显的问题是您将 nil 作为 UIView 委托传递,因此您永远不会被回调。

   UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Timer Done" message:nil delegate:nil cancelButtonTitle:nil otherButtonTitles:@"Ok", nil];

应该是:

   UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Timer Done" message:nil delegate:self cancelButtonTitle:nil otherButtonTitles:@"Ok", nil];

另一个问题是 buttonIndex 从零开始。所以在回调中你应该检查零而不是一。

【讨论】:

谢谢!出于某种原因,我没有在我的代码中看到这些问题……一定是输入得太快了!

以上是关于为啥这个声音循环不会停止?的主要内容,如果未能解决你的问题,请参考以下文章

调用 stop() 和 release() android 后声音不会停止

为啥这个循环在完成之前就停止了?

iPhone 上的 AVAudioPlayer 声音意外停止循环:如何调试?

为啥我的 Java 应用程序没有在每个循环中播放声音?

进入下一帧/错误时如何停止循环声音

UILocalNotification 声音不会停止播放