У меня небольшое приложение на 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);
}
Может кто-нибудь думать прочь, чтобы полностью удалить все следы моего звукового файла (с возможностью загрузить его снова)?
спасибо!
Hi, Несколько просмотров, но пока ответов нет ... Если вы посмотрите на этот код и не видите ничего плохого, скажите об этом.Тогда это может заставить меня думать, что моя проблема не в том, что мои буферы не освобождают память. Спасибо – Jonathan
alBufferDataStatic - это «острый нож» с кучей скрытых оговорок. Я рекомендую смотреть это видео: http://youtu.be/6QQAzhwalPI – dontWatchMyProfile