IOS / OpenAl Sound Interference - PullRequest
       9

IOS / OpenAl Sound Interference

0 голосов
/ 12 октября 2011

Я новичок в Objective - C ...

Я нашел исходный код, как использовать OpenAl, скопировал это и затем протестировал, но звук воспроизводился с помехами.Можете ли вы взглянуть на код и сказать, что не так?

ALCcontext *context = NULL;
ALCdevice *device = alcOpenDevice(NULL);
if (device)
{
    context = alcCreateContext(device, NULL);
    alcMakeContextCurrent(context);
}
NSString *path = [[NSBundle mainBundle] pathForResource:@"sound" ofType:@"caf"];

AudioFileID fileID = 0;
NSURL *url = [NSURL fileURLWithPath:path];

OSStatus result = AudioFileOpenURL((CFURLRef)url, kAudioFileReadPermission, 0, &fileID);
if (result != 0)
    NSLog(@"Faild to load file at path:%@",path);

UInt32 fileSize = 0;
UInt32 propSize = sizeof(UInt64);

OSStatus result1 = AudioFileGetProperty(fileID, kAudioFilePropertyAudioDataByteCount, &propSize, &fileSize);
if (result1 != 0)
    NSLog(@"Cannot get size of file!");

unsigned char *buffer = malloc(fileSize);
OSStatus result2 = noErr;
result2 = AudioFileReadBytes(fileID, false, 0, &fileSize, buffer);
AudioFileClose(fileID);
if (result2 != 0)
    NSLog(@"Cannot load data from file!");

ALuint bufferId = 0;
alGenBuffers(1, &bufferId);
alBufferData(bufferId, AL_FORMAT_STEREO16,  buffer, fileSize, 44100);

free(buffer); 

ALuint sourceId = 0;
alGenSources(1, &sourceId);
alSourcei(sourceId, AL_BUFFER, bufferId);
alSourcef(sourceId, AL_PITCH, 1.0f);
alSourcef(sourceId, AL_GAIN, 1.0f); 
alSourcei(sourceId, AL_LOOPING, AL_TRUE);

alSourcePlay(sourceId);

Ответы [ 2 ]

0 голосов
/ 13 октября 2011

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

Вот пример загрузки аудиоданных для использования в OpenAL: https://github.com/kstenerud/ObjectAL-for-iPhone/blob/master/libs/ObjectAL/Support/OALAudioFile.m

0 голосов
/ 12 октября 2011

Звук не воспроизводится, если звуковые данные не сохранены в памяти.

free(buffer); 

Ваши звуковые данные стираются из памяти, alBufferData () привязывает OpenAL только к звуковым данным. Я предлагаю хранить указатель буфера в другом месте, чтобы его можно было освободить, когда вы хотите удалить звук из памяти.

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