2013-03-22 94 views
9

我正在使用SimpleAudioEngine,並試圖在繼續之前檢測聲音效果是否完成播放。如何檢測音效何時播放完畢?

我正在尋找任何方法,但我試圖實現的方法不起作用!

CDSoundEngine *engine = [CDAudioManager sharedManager].soundEngine;  
ALuint soundId = [[SimpleAudioEngine sharedEngine] playEffect:soundId]; 

float seconds = [engine bufferDurationInSeconds:soundId]; 

每次我使用bufferDurationInSeconds時,它都會返回-1的浮點值給變量秒。我檢查了實現,當id無效時返回-1,但我是100%ID是有效的!

任何人都可以幫助我解決這個問題,或者建議我以另一種方式來檢測音效結束?

+0

[This](http://www.cocos2d-iphone.org/forum/topic/13178)可能會引導您朝着正確的方向前進。 – jverrijt 2013-03-23 20:35:48

回答

9

Violà!獲取CDSoundSource,然後從該工作中獲得soundId。

(第二行是可選的,它只是播放聲音)。

CDSoundEngine *engine = [CDAudioManager sharedManager].soundEngine; 
[[SimpleAudioEngine sharedEngine] playEffect:@"soundeffect.m4a"]; 
CDSoundSource *aSound =[[SimpleAudioEngine sharedEngine] soundSourceForFile:@"soundeffect.m4a"]; 
float seconds = [engine bufferDurationInSeconds:aSound.soundId]; 

此外,要運行一個方法,當它完成播放時,我會使用NSTimer使用秒結果。

[NSTimer scheduledTimerWithTimeInterval:seconds target:self selector:@selector(aMethod) userInfo:nil repeats:NO]; 

然後最後的方法實現了一些東西。

-(void)aMethod 
{ 
NSLog(@"finished playing"); 
} 

雖然,這不會影響-1的結果,我要指出的是,soundId變量作爲兩種不同的代碼,在同一條線上,這將導致問題出現兩次。不過不用擔心,我已經在上面測試了我的方法並取得了成功。

ALuint **soundId** = [[SimpleAudioEngine sharedEngine] playEffect:**soundId**]; 
+0

不錯的解決方法 – 2013-03-30 11:49:32

+0

太棒了!我正在努力尋找答案。 – Hahnemann 2014-04-26 04:34:55

相關問題