2010-08-16 72 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) ]; 
}