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

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

Сначала, когда я удаляю звук, это, кажется, делает то, что это предназначено, чтобы сделать – это удаляет звук, и я не могу получить доступ к нему снова, если я не перезагружаю его. НО, когда я тестирую свой dealloc’s приложений с 'Инструментами', он не показывает освобождения. Это, кажется, не освобождает память. Так, когда Вы перемещаетесь от уровня до уровня, у памяти не занимает много времени заканчиваться и приложение для катастрофического отказа.

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

Программа получила сигнал: “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);

}

Кто-либо может думать далеко для завершенного удаления каждой трассировки моего звукового файла (со способностью загрузить его снова)?

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

7
задан Jonathan 10 January 2010 в 03:36
поделиться

2 ответа

Если кто-то заинтересован ... Моя проблема была решена, изменив AlbufferDataStaticProc в AlbufferData. Затем добавляя , если (данные) бесплатно (данные); см. Ниже.

Спасибо за вашу помощь.

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;
5
ответ дан 7 December 2019 в 07:45
поделиться
-

Не знаком со специальностями с openal для iPhone, но вот моего грубая предполагаемое:

- это буфер, все еще прикрепленный к источнику с открытым полом, то есть вы позвонили Alsourcei (..., Al_buffer, ...) или alsourcequeuebuffers между загрузкой и выпуском? Если это так, вам может потребоваться запустить Alsourcei (..., al_buffer, null) или alsourceunqueuebuffers перед удалением буфера.

Попробуйте проверить ошибки openal (AllgetErrors) после того, как вы позвонили AldeleteBuffers.

0
ответ дан 7 December 2019 в 07:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: