如何检测音效何时完成播放?

时间:2013-03-22 23:04:22

标签: ios objective-c audio cocos2d-iphone simpleaudioengine

我正在使用SimpleAudioEngine,我试图在继续播放之前检测声音效果是否完成。

我正在寻找任何方法,但我试图实施的方法不起作用!

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

float seconds = [engine bufferDurationInSeconds:soundId];

每次我使用bufferDurationInSeconds时,它都会将float值-1返回到变量秒。我检查了实现,当id无效时返回-1,但我100%ID是有效的!

任何人都可以帮我解决这个问题,或者建议我另一种方法来检测音效的结束吗?

1 个答案:

答案 0 :(得分:9)

中提琴!获取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**];