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]、適切な遅延の後に 2 番目のエフェクトの再生をスケジュールすることです。

[[SimpleAudioEngine sharedEngine] performSelector:@selector(playEffect:) withObject:@"youDidIt.wav" afterDelay:duration];

オーディオの長さを取得する簡単な方法は、SimpleAudioManager にパッチを適用し、そのCDSoundEngine(静​​的グローバル) にオーディオの長さを問い合わせるメソッドを追加することです。

- (float)soundDuration {
    return [_engine bufferDurationInSeconds:_soundId];
}

2 番目のアプローチは、オーディオ エンジンのステータスをポーリングし、再生が停止するのを待つことです。

    alGetSourcei(sourceId, AL_SOURCE_STATE, &state);
    if (state == AL_PLAYING) {
      ...

sourceIdによってALuint返されplayEffectます。

于 2013-02-20T18:51:57.827 に答える