Как полностью удалить и освободить память из звукового файла OpenAL?



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



Сначала, когда я удаляю звук, кажется, что он делает то, что должен делать – он удаляет звук, и я не могу получить к нему доступ, пока не перезагрузлю его. Но, когда я тестирую свои приложения dealloc с "инструментами", он не показывает никакого освобождения. Это, кажется, не освобождает память. Итак, когда вы переходите с уровня на уровень, это не займет много времени, чтобы память закончилась, и приложение рухнет.



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




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




Вот как я загружаю звуки -



- (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: %xn", 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: %xn", 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);


}



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



Большое вам спасибо!

685   3  

3 ответов:

Если кому-то интересно... моя проблема была решена путем изменения 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;

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

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

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

Не знаком с особенностями OpenAL для iPhone, но вот мое приблизительное предположение:

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

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

Comments

    Ничего не найдено.