2013-02-20 3 views
3

Я создаю приложение iOS с cocos2d 2, и я использую SimpleAudioEngine для воспроизведения некоторых эффектов.Воспроизведение звуков в последовательности с SimpleAudioEngine

Есть ли способ упорядочить несколько звуков, которые будут воспроизводиться после завершения предыдущего звука?

Например, в моем коде:

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

Когда этот код выполняется, yay.wav и youDidIt.wav играть в одно и то же время, друг над другом.

Я хочу, чтобы yay.wav играть и один раз заполнить, youDidIt.wav играть.

Если нет с SimpleAudioEngine, есть ли способ с AudioToolbox или что-то еще?

Спасибо!

== UPDATE ==

Я думаю, что я собираюсь идти с этим методом, используя 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

Отредактировано: был найден метод, который в настоящее время работает. – Corey

ответ

0

Самый простой способ будет получать продолжительность трека с помощью -[CDSoundSource durationInSeconds] и затем расписание второй эффект, выполняемый после надлежащей задержки:

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

Более простой способ получить продолжительность звука woul d будет латать SimpleAudioManager и добавить метод, который запрашивает его CDSoundEngine (статический глобальный) для аудио продолжительность:

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

Второй подход был бы опрос о состоянии звукового движка и ждать его, чтобы остановить воспроизведение.

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

The sourceId является ALuint возвращаемый playEffect.

+0

Можете ли вы получить длительностьInSeconds из звука ALuint? – Jonny

0

Это просто, испытанный с Cocos2D 2.1:

  1. Создает свойство durationInSeconds на SimpleAudioEngine.h:

    @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. Как вы можете видеть, я ввел значение durationInSeconds непосредственно из soundEngine bufferDurationInSeconds из результата bufferManager.

  5. Теперь попросите значение [SimpleAudioEngine sharedEngine] .durationInSeconds и вы получите продолжительность поплавка в секундах от этого звука.

  6. Положите таймер на эти секунды и после этого воспроизведите следующую итерацию своего звука или поставьте флаг в положение OFF или что-то в этом роде.

Смежные вопросы