我正在用cocos2d 2构建一个iOS应用程序,我正在使用SimpleAudioEngine来播放一些效果。
有没有办法对前一个声音完成后播放的多个声音进行排序?
例如在我的代码中:
[[SimpleAudioEngine sharedEngine] playEffect:@"yay.wav"];
[[SimpleAudioEngine sharedEngine] playEffect:@"youDidIt.wav"];
运行此代码时,yay.wav
和youDidIt.wav
会在同一时间播放,而不是彼此播放。
我希望yay.wav
播放,一旦完成,youDidIt.wav
即可播放。
如果没有使用SimpleAudioEngine,有没有办法使用AudioToolbox或其他东西?
谢谢!
== 更新 ==
我想我会使用AVFoundation来使用这种方法:
AVPlayerItem *sound1 = [[AVPlayerItem alloc] initWithURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"yay" ofType:@"wav"]]];
AVPlayerItem *sound2 = [[AVPlayerItem alloc] initWithURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"YouDidIt" ofType:@"wav"]]];
AVQueuePlayer *player = [[AVQueuePlayer alloc] initWithItems: [NSArray arrayWithObjects:sound1, sound2, nil]];
[player play];
答案 0 :(得分:0)
简单的方法是使用-[CDSoundSource durationInSeconds]
获取音轨持续时间,然后在适当的延迟后安排播放第二个效果:
[[SimpleAudioEngine sharedEngine] performSelector:@selector(playEffect:) withObject:@"youDidIt.wav" afterDelay:duration];
获取音频持续时间的一种更简单的方法是修补SimpleAudioManager并添加一个查询其CDSoundEngine
(静态全局)的音频持续时间的方法:
- (float)soundDuration {
return [_engine bufferDurationInSeconds:_soundId];
}
第二种方法是轮询音频引擎的状态并等待它停止播放。
alGetSourcei(sourceId, AL_SOURCE_STATE, &state);
if (state == AL_PLAYING) {
...
sourceId
是ALuint
返回的playEffect
。
答案 1 :(得分:0)
这很简单,使用Cocos2D 2.1测试:
在SimpleAudioEngine.h上创建属性durationInSeconds:
@property (readonly) float durationInSeconds;
合成它们:
@synthesize durationInSeconds;
像这样修改playEffect:
-(ALuint) playEffect:(NSString*) filePath pitch:(Float32) pitch pan:(Float32) pan gain:(Float32) gain {
int soundId = [bufferManager bufferForFile:filePath create:YES];
if (soundId != kCDNoBuffer) {
durationInSeconds = [soundEngine bufferDurationInSeconds:soundId];
return [soundEngine playSound:soundId sourceGroupId:0 pitch:pitch pan:pan gain:gain loop:false];
} else {
return CD_MUTE;
}
}
如您所见,我从bufferManager的结果直接从soundEngine bufferDurationInSeconds插入了durationInSeconds值。
现在,只询问[SimpleAudioEngine sharedEngine] .durationInSeconds的值,你就得到了这个声音的浮动持续时间(以秒为单位)。
在这几秒后放一个计时器,然后播放声音的下一次迭代或将标志设置为OFF。