iOS SDK 4.3 OpenAL alGenSources приводит к AL_INVALID_OPERATION - PullRequest
0 голосов
/ 27 июня 2011

Я пытаюсь разобраться с OpenAL, прорабатывая учебник здесь: http://benbritten.com/2008/11/06/openal-sound-on-the-iphone/

Моя проблема в том, что звук не воспроизводится, хотя нет ошибок iOS. Существует ошибка OpenAL, хотя. Пример кода ниже представляет собой тело метода IBAction и приводит к AL_INVALID_OPERATION в alGenSources (1, & sourceID). sourceID сообщает как NULL.

Я пробовал это на устройстве и симуляторе.

Этот пример кода, кажется, широко используется, но я не могу найти никого, кто бы жаловался на эту конкретную проблему. Кто-нибудь может пролить свет на это? Большое спасибо за любую помощь,

 NSString *audioFileName = [[NSBundle mainBundle] pathForResource:@"1" ofType:@"caf"];
AudioFileID fileID = [self openAudioFile:audioFileName];

UInt32 filesize = [self audioFileSize:fileID];
unsigned char *outData = malloc(filesize);
OSStatus result = noErr;
result = AudioFileReadBytes(fileID, false, 0, &filesize, outData);
AudioFileClose(fileID);

if (result != 0) {
    NSLog(@"Can't load file..");
}

NSUInteger bufferID;
//NSLog(@"bufferID %@", [NSNumber numberWithUnsignedInteger:bufferID]);
alGenBuffers(1, &bufferID);
//NSLog(@"bufferID %@", [NSNumber numberWithUnsignedInteger:bufferID]);
alBufferData(bufferID, AL_FORMAT_STEREO16, outData, filesize, 44100);

[bufferStorageArray addObject:[NSNumber numberWithUnsignedInteger:bufferID]];

alGetError();
ALuint sourceID;
alGenSources(1, &sourceID);

if(alGetError() == AL_INVALID_OPERATION) 
{
    printf("\n++++ Error creating buffers INVALID_OPERATION!!\n");

    //exit(1);
}
else
{
    printf("No errors yet.");
}

alSourcei(sourceID, AL_BUFFER, bufferID);

alSourcef(sourceID, AL_PITCH, 1.0f);
alSourcef(sourceID, AL_GAIN, 1.0f);
if (loops) {
    alSourcei(sourceID, AL_LOOPING, AL_TRUE);
}

[soundDictionary setObject:[NSNumber numberWithUnsignedInt:sourceID] forKey:@"sound"];

if (outData) {
    free(outData);
    outData = NULL;
}

[self playSound:@"sound"];

Ответы [ 2 ]

0 голосов
/ 29 июня 2011

Глупая ошибка с моей стороны - я инициализировал OpenAL в initWithNibName, который никогда не вызывался.Перемещая инициализацию в viewDidLoad, все работает, хотя воспроизведение выполняется в стиле бурундука

0 голосов
/ 28 июня 2011

Для вашей проблемы высоты тона убедитесь, что загружаемый вами звуковой файл соответствует частоте дискретизации, которую вы вводите в alBufferData. Ваш файл caf, вероятно, сохранен на частоте 22050 Гц.

Функция mSampleRate AudioStreamBasicDescription сообщит вам, какова на самом деле частота дискретизации аудиофайла.

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

Кроме того, OpenAL по умолчанию на iOS генерирует только 4 стереоисточника. Если вы попытаетесь загрузить более 4 источников стереоданных, ваш звук будет звучать как мусор. Вы можете изменить это, указав атрибуты ALC_STEREO_SOURCES и ALC_MONO_SOURCES при создании контекста. У вас есть максимум 32 источника (по умолчанию он устанавливает 28 моно и 4 стерео источника).

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