Задержка воспроизведения звука (икота) при реализации OpenAL на iphone

Я внедрил код OpenAL в свою игру для iphone. Когда я запускаю игру, она длится 1 секунду и останавливается на 2 секунды, а затем возобновляется (эффект икоты). Я считаю, что это задерживается из-за загрузки звуковых файлов. Каково решение? Может ли кто-нибудь порекомендовать какую-либо книгу, сайт или исходный код (пожалуйста, не ссылку на iphone)? Есть ли процесс загрузки и где мне его инициализировать? Это поможет?

Ниже я включил соответствующие компоненты реализованного мной кода OpenAL. Звуковой файл будет воспроизведен и вызван оператором if в цикле игры. Класс OpenALController предназначен для создания источников звука и буферов, а метод InitOpenAL вызывается в OpenALController. MyView - это настраиваемый подкласс UIView, подключенный к основному представлению (я не использовал представление по умолчанию).

// MyView.m // Настроенный UIView в качестве основного представления.
#import "OpenALSoundController.h"
- (void) startPlaying {
...
[self initializeValuables];
...
[self initializeTimer];
}
- (void) initializeTimer {if (theTimer == nil) {
theTimer = [CADisplayLink displayLinkWithTarget: self selector: @selector) gameLoop) ];
theTimer.frameInterval = 2;
[theTimer addToRunLoop: [NSRunLoop currentRunLoop] forMode: NSDefaultRunLoopMode];
}
}
- (void) gameLoop {... If something = true // Воспроизвести звук [[OpenALSoundController sharedSoundController] playSound1];
...
}
...
@end


// OpenALSoundController.h @interface OpenALSoundController: NSObject {
...}
...
+ (OpenALSoundController *) sharedSoundController
...
@end


// OpenALSoundController.m
// Одноэлементный аксессор
{
static OpenALSoundController * shared_sound_controller;
@synchronized (self)
{
if (nil == shared_sound_controller)
{ shared_sound_controller = [[OpenALSoundController alloc] init];
}
return shared_sound_controller;
}
return shared_sound_controller;
}
- (void) initOpenAL {
... < br> file_url = [[NSURL alloc] initFileURLWithPath: [[NSBundle mainBundle] pathForResource: @ "fire" ofType: @ "wav"]];
firePcmData = MyGetOpenALAudioDataAll ((CFURLRef) file_url, sample & al_form_size)
alBufferData (fireOutputBuffer, al_format, firePcmData, data_size, sample_rate);
[file_url release];
...
alSourcei (outputSourceFire, AL_BUFFER, fireOutputBuffer);
...
}


person NorthKyut    schedule 26.11.2010    source источник


Ответы (2)


Возможно, вас заинтересует Finch, звуковой движок OpenAL для iOS. Он очень хорошо подходит для игр. Обычно лучше повторно использовать уже существующий код, чем разрабатывать и поддерживать свой собственный.

person zoul    schedule 27.11.2010

Во-первых, лучше использовать mp3, так как файлы wav огромны и загрузка с диска требует времени. Файлы Mp3 меньше на диске, загружаются в память и распаковываются там для воспроизведения. Попробуйте поэкспериментировать, уменьшив битрейт и качество кодирования mp3.

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

person Rajavanya Subramaniyan    schedule 03.02.2011