【发布时间】:2012-02-23 03:43:41
【问题描述】:
finch 是否有完成播放回调?类似于 - audioPlayerDidFinishPlaying 在 avaudioplayer 的东西?浏览代码我找不到任何引用它的东西。
【问题讨论】:
finch 是否有完成播放回调?类似于 - audioPlayerDidFinishPlaying 在 avaudioplayer 的东西?浏览代码我找不到任何引用它的东西。
【问题讨论】:
Finch 中没有这样的回调,因为 OpenAL 不支持。 (或者至少我上次看时它不支持它。)你可以这样伪造它:
- (void) playSoundWithCallback {
[someSound play];
[someDelegate performSelector:@selector(soundDidFinishPlaying:)
withObject:someSound afterDelay:someSound.duration];
}
我没有尝试过,但它是一个简单的代码,应该可以正常工作。好吧……至少在你开始弄乱音高和音速之前:)
【讨论】:
@zoul:我知道这是一个很晚的回复。但我注意到答案不正确。如果我暂停声音或系统中断怎么办。在这种情况下,即使声音尚未完成,您也会收到回调。请阅读 openAL 规范中的“4.3.6.管理源代码执行”段落以进行正确处理。
【讨论】:
如果您不关心中断,这里有一个带有音高修复的技巧。
OpenAL 改变音高不是 1.0 时播放声音的播放长度。 (似乎无法从 OpenAL 查询这个新长度, 因为 AL 参数返回与以前相同的值)
音高范围从 0.5 到 2.0f。所以,如果我们假设 0.5 的音高正好是两倍长, 而 2.0 的音高正好是其长度的一半,我们应该能够将音高用作倍数:
- (void) playSoundWithCallback {
[someSound play];
[someDelegate performSelector:@selector(soundDidFinishPlaying:)
withObject:someSound afterDelay: someSound.duration * (1.0/someSound.pitch) ];
}
【讨论】: