Воспроизведение звуков в последовательности с SimpleAudioEngine
Я создаю приложение для iOS с cocos2d 2 и использую 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];
2 ответа
Самый простой способ - получить длительность трека, используя -[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
,
Все просто, протестировано с Cocos2D 2.1:
Создает свойство durationInSeconds для SimpleAudioEngine.h:
@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; } }
Как вы можете видеть, я вставил значение durationInSeconds непосредственно из soundEngine bufferDurationInSeconds из результата bufferManager.
Теперь спросите только значение [SimpleAudioEngine sharedEngine].durationInSeconds, и вы получите длительность плавания в секундах этого звука.
Установите таймер на эти секунды и после этого проиграйте следующую итерацию вашего звука или установите флажок OFF или что-то в этом роде.