使用AudioServicesPlaySystemSound一次播放1个声音

时间:2011-12-10 13:14:42

标签: ios iphone objective-c audio overlap

我正在阅读有关使用AudioServicesPlaySystemSound一次播放一个声音的堆栈溢出的帖子。

stop sound in iPhone

我遇到了同样的问题,使用下面的代码,当你在另一个停止播放之前按一个按钮时,第二个声音在第一个声音的顶部播放,这样2个声音重叠。

-(IBAction)button1:(id)sender{
SystemSoundID soundID;   
NSString *soundFile = [[NSBundle mainBundle]    
                       pathForResource:@"sound1"
                       ofType:@"wav"];
AudioServicesCreateSystemSoundID((CFURLRef)[NSURL fileURLWithPath:soundFile],   &soundID);
AudioServicesPlaySystemSound(soundID);
[soundFile release];
} 

-(IBAction)button2:(id)sender{
SystemSoundID soundID;   
NSString *soundFile = [[NSBundle mainBundle]    
                       pathForResource:@"sound2"
                       ofType:@"wav"];
AudioServicesCreateSystemSoundID((CFURLRef)[NSURL fileURLWithPath:soundFile], &soundID);
AudioServicesPlaySystemSound(soundID);
[soundFile release];
}

根据苹果的documentation

AudioServicesPlaySystemSound应该一次只播放一个声音。

此外,当您使用AudioServicesPlaySystemSound功能时:

  • 在当前系统音量下播放声音,没有可用的编程音量控制
  • 立即播放
  • 循环和立体声定位不可用
  • 同时播放不可用:您一次只能播放一种声音

所以我不明白为什么可以同时播放多个声音。

我尝试使用AudioServicesDisposeSystemSoundID,但声音仍然重叠,我做错了吗?

-(IBAction)sound2:(id)sender{
AudioServicesDisposeSystemSoundID
SystemSoundID soundID;   
NSString *soundFile = [[NSBundle mainBundle]    
                       pathForResource:@"sound2"
                       ofType:@"wav"];
AudioServicesCreateSystemSoundID((CFURLRef)[NSURL fileURLWithPath:soundFile], &soundID);
AudioServicesPlaySystemSound(soundID);
[soundFile release];
}

目前,我正在使用AVAudioPlayer但是有一个合理的启动延迟,如果可能的话,我想使用AudioServicesPlaySystemSound,因为它会立即播放声音。

还有其他人有同样的问题吗?

非常感谢你的时间。

1 个答案:

答案 0 :(得分:4)

尝试使用AudioServicesDisposeSystemSoundID

这只是解决问题的解决方案。 如果您需要再次播放,则必须再次创建声音。