使用SimpleAudioEngine按顺序播放声音

时间:2013-02-20 18:15:54

标签: ios audio simpleaudioengine

我正在用cocos2d 2构建一个iOS应用程序,我正在使用SimpleAudioEngine来播放一些效果。

有没有办法对前一个声音完成后播放的多个声音进行排序?

例如在我的代码中:

[[SimpleAudioEngine sharedEngine] playEffect:@"yay.wav"];
[[SimpleAudioEngine sharedEngine] playEffect:@"youDidIt.wav"];

运行此代码时,yay.wavyouDidIt.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];

2 个答案:

答案 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) {
      ...

sourceIdALuint返回的playEffect

答案 1 :(得分:0)

这很简单,使用Cocos2D 2.1测试:

  1. 在SimpleAudioEngine.h上创建属性durationInSeconds:

    @property (readonly) float durationInSeconds;
    
  2. 合成它们:

    @synthesize durationInSeconds;
    
  3. 像这样修改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;
        }
    }
    
  4. 如您所见,我从bufferManager的结果直接从soundEngine bufferDurationInSeconds插入了durationInSeconds值。

  5. 现在,只询问[SimpleAudioEngine sharedEngine] .durationInSeconds的值,你就得到了这个声音的浮动持续时间(以秒为单位)。

  6. 在这几秒后放一个计时器,然后播放声音的下一次迭代或将标志设置为OFF。