2010-01-10 2 views
7

У меня небольшое приложение на iPhone. Мне нужно загружать и выпускать звуковые файлы для каждого уровня. Все работает отлично с моим openAL SoundManager, кроме выпуска звуков.Как вы полностью удаляете и освобождаете память звукового файла OpenAL?

Сначала, когда я удаляю звук, он, кажется, делает то, что он предназначен, - он удаляет звук, и я не могу получить к нему доступ снова, если не перезагружу его. НО, когда я тестирую свои приложения dealloc с помощью «Инструменты», он не показывает никакого освобождения. Кажется, он не освобождает память. Таким образом, когда вы переходите от уровня к уровню, для завершения работы памяти не требуется много времени, и приложение может аварийно завершить работу.

Я получаю эту ошибку в консоли:

Программа получила сигнал: «0». предупреждение: check_safe_call: не может восстановить текущий кадр убить бросить

Это, как я загрузить звуки -

- (void)loadSoundWithKey:(NSString*)aSoundKey fileName:(NSString*)aFileName fileExt:(NSString*)aFileExt { 
// Check to make sure that a sound with the same key does not already exist 
NSNumber *numVal = [soundLibrary objectForKey:aSoundKey]; 
// If the key is found log it and finish 
if(numVal != nil) { 
    NSLog(@"WARNING - SoundManager: Sound key '%@' already exists.", aSoundKey); 
    return; 
} 
    NSUInteger bufferID; 
// Generate a buffer within OpenAL for this sound 
alGenBuffers(1, &bufferID); 
// Set up the variables which are going to be used to hold the format 
// size and frequency of the sound file we are loading 
ALenum error = AL_NO_ERROR; 
ALenum format; 
ALsizei size; 
ALsizei freq; 
ALvoid *data; 
NSBundle *bundle = [NSBundle mainBundle]; 
// Get the audio data from the file which has been passed in 
CFURLRef fileURL = (CFURLRef)[[NSURL fileURLWithPath:[bundle pathForResource:aFileName ofType:aFileExt]] retain]; 
if (fileURL) 
{ 
    data = MyGetOpenALAudioData(fileURL, &size, &format, &freq); 
    CFRelease(fileURL); 
    if((error = alGetError()) != AL_NO_ERROR) { 
     NSLog(@"ERROR - SoundManager: Error loading sound: %x\n", error); 
     exit(1); 
    } 
    // Use the static buffer data API 
    alBufferDataStaticProc(bufferID, format, data, size, freq); 
    if((error = alGetError()) != AL_NO_ERROR) { 
     NSLog(@"ERROR - SoundManager: Error attaching audio to buffer: %x\n", error); 
    }  
} 
else 
{ 
    NSLog(@"ERROR - SoundManager: Could not find file '%@.%@'", aFileName, aFileExt); 
    data = NULL; 
} 

// Place the buffer ID into the sound library against |aSoundKey| 
[soundLibrary setObject:[NSNumber numberWithUnsignedInt:bufferID] forKey:aSoundKey]; 
if(DEBUG) NSLog(@"INFO - SoundManager: Loaded sound with key '%@' into buffer '%d'", aSoundKey, bufferID); 

}

И это, как я пытаюсь удалить/выпуск. Но она по-прежнему кажется, сохранить память звукового файла -

- (void)removeSoundWithKey:(NSString*)aSoundKey { 
// Find the buffer which has been linked to the sound key provided 
NSNumber *numVal = [soundLibrary objectForKey:aSoundKey]; 
// If the key is not found log it and finish 
if(numVal == nil) { 
    NSLog(@"WARNING - SoundManager: No sound with key '%@' was found so cannot be removed", aSoundKey); 
    return; 
}  
// Get the buffer number form the sound library so that the sound buffer can be released 
NSUInteger bufferID = [numVal unsignedIntValue]; 
alDeleteBuffers(1, &bufferID); 
[soundLibrary removeObjectForKey:aSoundKey]; 
if(DEBUG) NSLog(@"INFO - SoundManager: Removed sound with key '%@'", aSoundKey); 

}

Может кто-нибудь думать прочь, чтобы полностью удалить все следы моего звукового файла (с возможностью загрузить его снова)?

спасибо!

+0

Hi, Несколько просмотров, но пока ответов нет ... Если вы посмотрите на этот код и не видите ничего плохого, скажите об этом.Тогда это может заставить меня думать, что моя проблема не в том, что мои буферы не освобождают память. Спасибо – Jonathan

+0

alBufferDataStatic - это «острый нож» с кучей скрытых оговорок. Я рекомендую смотреть это видео: http://youtu.be/6QQAzhwalPI – dontWatchMyProfile

ответ

5

Если кому-то интересно ... моя проблема была решена путем изменения alBufferDataStaticProc в alBufferData. Затем добавьте if(data) free(data); См. Ниже.

Благодарим за помощь.

alBufferData(bufferID, format, data, size, freq); 
    if((error = alGetError()) != AL_NO_ERROR) { 
     NSLog(@"ERROR - SoundManager: Error attaching audio to buffer: %x\n", error); 
    } 
    if (data) 
     free(data); 
}else{ 
    NSLog(@"ERROR - SoundManager: Could not find file '%@.%@'", fileName, fileType); 
    data = NULL; 
+0

это работает! благодаря! – Ricibald

+0

На самом деле, это не сработало для меня, но это очень помогло найти проблему. Все, что мне нужно было сделать, используя один и тот же пример apple, добавлял 'if (device! = NULL) [self teardownOpenAL];' before '[self initOpenAL];' – cregox

0

Не знаком с кухней с OpenAL для iPhone, но вот моя грубая догадка:

ли буфер еще присоединен к источнику OpenAL, т.е. у вас называется alSourcei (..., AL_BUFFER, ...) или alSourceQueueBuffers между загрузкой и выпуском? Если это так, вам может потребоваться запустить alSourcei (..., AL_BUFFER, NULL) или alSourceUnqueueBuffers перед удалением буфера.

Попробуйте проверить ошибки OpenAL (alGetErrors) после вызова alDeleteBuffers.

2

Это сумма до того, что я сделал «, чтобы полностью удалить все следы моего звукового файла (с возможностью загрузить его снова)», используя тот же apple example и некоторые openAL documentation:

if (device != NULL) 
    [self teardownOpenAL]; 
[self initOpenAL]; 
alSourcePlay(source); 

Главное дополнение здесь if, которое в моем случае я фактически добавил в teardownOpenAL.

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