2010-08-16 75 views

回答

1

在Finch中没有这样的回调,因为OpenAL不支持它。 (或者至少它不支持它,当我上次看)。你可以假像这样:

- (void) playSoundWithCallback { 
    [someSound play]; 
    [someDelegate performSelector:@selector(soundDidFinishPlaying:) 
     withObject:someSound afterDelay:someSound.duration]; 
} 

我没有尝试,但它是一个简单的代码,它应该工作的罚款。那么...至少直到你开始搞乱球场,因此声速:) :)

+0

我没有挖过深成Finch/OpenAL,但是可能有一种方法可以查询声音是否在播放?这会稍微复杂一点,但即使球场正在改变也会起作用。 – Adam 2010-10-16 19:47:10

0

@zoul:我知道这是一个vey迟到的回复。但我注意到答案是不正确的。如果我暂停声音或系统中断,该怎么办?在这种情况下,即使声音尚未完成,您也会收到回电。请阅读openAL规范中的“4.3.6。管理源代码执行”一节,了解正确的处理方法。

0

如果你不关心中断,那么这里有一个修补程序。

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) ]; 
}