完成与finch播放音频回拨
问题描述:
有finch播放完成回调吗?类似于 - audioPlayerDidFinishPlaying在avaudioplayer的东西?通过代码看我找不到任何引用它的东西。完成与finch播放音频回拨
答
在Finch中没有这样的回调,因为OpenAL不支持它。 (或者至少它不支持它,当我上次看)。你可以假像这样:
- (void) playSoundWithCallback {
[someSound play];
[someDelegate performSelector:@selector(soundDidFinishPlaying:)
withObject:someSound afterDelay:someSound.duration];
}
我没有尝试,但它是一个简单的代码,它应该工作的罚款。那么...至少直到你开始搞乱球场,因此声速:) :)
答
@zoul:我知道这是一个vey迟到的回复。但我注意到答案是不正确的。如果我暂停声音或系统中断,该怎么办?在这种情况下,即使声音尚未完成,您也会收到回电。请阅读openAL规范中的“4.3.6。管理源代码执行”一节,了解正确的处理方法。
答
如果你不关心中断,那么这里有一个修补程序。
OpenAL更改音高不是1.0时播放声音的播放长度。 (似乎不可能从OpenAL查询这个新长度, ,因为AL参数返回与之前相同的值)
间距范围从0.5到2.0f。所以,如果我们假设0.5间距正好是两倍长, 和间距在2.0 exacty一半长,我们应该能够用沥青为乘数:
- (void) playSoundWithCallback {
[someSound play];
[someDelegate performSelector:@selector(soundDidFinishPlaying:)
withObject:someSound afterDelay: someSound.duration * (1.0/someSound.pitch) ];
}
我没有挖过深成Finch/OpenAL,但是可能有一种方法可以查询声音是否在播放?这会稍微复杂一点,但即使球场正在改变也会起作用。 – Adam 2010-10-16 19:47:10