1

我正在编写一个闹钟应用程序,我需要让用户选择要唤醒的铃声。我有一个带有我的声音列表的 UITableView,当用户点击我希望它播放的声音时。

但是,除非我跳过对 AudioServicesPlaySystemSound 的调用(或者如果我在听到声音后触发的 AudioServicesDisposeSystemSoundID 调用上设置断点),否则我的声音不会播放。

我有一个理论认为这是一个主线程问题,所以我使用了 performSelectorOnMainThread:

        [self performSelectorOnMainThread:@selector(playWakeUpSound)
                               withObject:nil
                            waitUntilDone:true];

但这没有帮助。(waitUntilDone 的值似乎无关紧要。)

这个问题很有希望,但我检查了一下,我只调用了一次我的方法。

4

1 回答 1

1

这只是一个猜测,因为我不知道 playWakeUpSound 中有什么。如果您在该调用和 ARC 中使用 AVAudioPlayer,可能是因为它正在被释放。将 AVAudioPlayer 的实例存储为该类的成员,它应该可以播放。

@interface MyClass 
{
    AVAudioPlayer *player;
}

@end

然后在实现中:

@implementation MyClass

- (void)playWakeUpSound {
    // Assuming name and extension is set somewhere.
    NSURL* musicFile = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:name ofType:extension]];

    NSError* error = nil;

    player = [[AVAudioPlayer alloc] initWithContentsOfURL:musicFile error:&error];
    if (error) {
        NSLog(@"%@", error.localizedDescription);
    } else  {
        [player play];
    }
}

@end
于 2013-05-22T17:23:55.167 回答