Большое количество звуковых эффектов с SimpleAudioEngine - PullRequest
1 голос
/ 16 октября 2011

Фон: Моя фоновая музыка воспроизводится как звуковой эффект, потому что я хочу менять высоту звука между каждым повторением мелодии.

Проблема: Во время воспроизведения фоновой музыки происходит много других коротких звуковых эффектов.После воспроизведения определенного количества звуковых эффектов моя фоновая музыка (также звуковой эффект) отключается.Кажется, что очередь зацикливается, так что после того, как, скажем, 50 звуковых эффектов сыграли, когда 51-й проиграет, будет выпущен 1-й, независимо от того, завершился он или нет.

Запрос направления: Естьдва направления, которые я вижу, возможно, идут с этим вопросом.1. Не воспроизводить фоновую музыку как эффект и выяснить, как сменить высоту звука в качестве фоновой музыки вместо эффекта. 2. Как-то убедиться, что эффект будет сохранен до его завершения.

Спасибо

1 Ответ

4 голосов
/ 16 октября 2011

SimpleAudioEngine не позволяет вам управлять каналами, поэтому он будет просто воспроизводить ваши звуковые эффекты на одном из каналов, которые он выделил внутри. В конце концов все каналы воспроизводят аудио. В этом случае, когда новый аудиофайл должен быть воспроизведен, и все каналы уже воспроизводятся, SimpleAudioEngine отменит один из существующих аудиофайлов. Иногда это будет ваша фоновая музыка. Dang.

Что вы обычно делаете, чтобы это исправить, это назначаете (выделяете) один аудиоканал специально для фоновой музыки. Никакой другой звук никогда не будет пытаться воспроизвести звук на этом канале. Вам придется использовать «обычный» CocosDenshion API . Похоже, вам либо нужно использовать CDAudioManager или CDSoundEngine , но у меня нет опыта использования каналов с CocosDenshion.

Лично я никогда не использовал CocosDenshion, всякий раз, когда мне требовалось больше контроля, я обнаруживал, что API ObjectAL проще для понимания и у него есть отличная документация. Я сделал следующую вспомогательную функцию для ObjectAL, которая воспроизводит звук на определенном канале. Я просто создал ALChannelSource для своей фоновой музыки и воспроизводил только фоновую музыку через этот канал. Возвращенный ALSoundSource даже позволяет вам изменять высоту, панорамирование и т. Д. Во время воспроизведения звука.

+(id<ALSoundSource>) playEffect:(NSString*)effect channel:(ALChannelSource*)channel loop:(bool)loop
{
    id<ALSoundSource> soundSource = nil;

    if (channel)
    {
        ALBuffer* buffer = [[OALAudioSupport sharedInstance] bufferFromFile:effect];
        soundSource = [channel play:buffer loop:loop];
    }

    return soundSource;
}

Все остальные аудиофайлы, которые я воспроизводю в классе OALSimpleAudio .

...