3

我正在用 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];
4

2 回答 2

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

于 2013-02-20T18:51:57.827 回答
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. 如您所见,我直接从 soundEngine bufferDurationInSeconds 中插入了来自 bufferManager 的结果的 durationInSeconds 值。

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

  6. 在这几秒钟内放一个计时器,然后播放下一次声音或关闭标志或其他东西。

于 2013-10-16T19:18:15.383 回答