2013-07-16 4 views
1

В моем приложении я обычно использую 5 буферов и 5 источников, но он меняется вверх и вниз. Все работает отлично с самого начала, но через некоторое время, похоже, есть какой-то тип утечки ресурсов, поэтому воспроизводится все меньше и меньше звуков. Примерно через 15 минут все звуки исчезли. Я искал ошибку в моем коде в течение нескольких дней, и я предполагаю, что утечка ресурсов находится в другом месте. Псевдо:OpenAL перестает работать через некоторое время (iOS)

context = alcCreateContext(device, attributes); 
    alcMakeContextCurrent(context); 
    alutInitWithoutContext(0, 0); 
    ... 
10: buffer = alutCreateBufferFromFileImage(data, len); 
    ... 
    alGenSources(1, &sid); 
    alSourcei(sid, AL_SOURCE_RELATIVE, AL_FALSE); 
    alSourcef(sid, AL_ROLLOFF_FACTOR, 0.2f); 
    alSourcei(sid, AL_BUFFER, buffer); 
    ... 
    alSourceStop(sid); 
    ... 
    alDeleteSources(1, &sid); 
    alDeleteBuffers(1, &buffer); 
    ... 
    goto 10 

После каждого вызова я проверяю на наличие ошибок OpenAL, но ни один из них не сообщалось. Я также попытался добавления приостановки/возобновления кода при перемещении приложения в/из фона, например, так:

// -> background 
alcMakeContextCurrent(0); 
alcSuspendContext(context); 
// -> foreground 
alcMakeContextCurrent(context); 
alcProcessContext(context); 

Но это не имеет никакого заметного эффекта (когда я нажимаю заявление в фоновом режиме, а затем вытащить его обратно снова). Ошибка аналогична iPad2 с недавней версией iOS, так как на iPhone3GS работает старая версия iOS. что делать, что делать?

Редактировать: В сборке отладки я получаю -1, возвращенный из alSourcePlay (sid = 5260). Насколько мне известно, -1 не является одним из действительных кодов возврата. Похоже, что некоторая старая реализация определяет AL_INVALID как -1. Невзирая на это, в зависимости от реализации, если sid из alGenSources() перерабатывается при выполнении alDeleteSources(), 5260 очень высока. Кто-нибудь знает, если идентификатор образца перерабатывается при удалении, или это просто счетчик?

ответ

0

Я не нашел способа исправить это, это, похоже, утечка ресурсов в реализации OpenAL на iOS. Мой путь к обходу - это выключение и повторная инициализация OpenAL, которая работает с некоторыми глюками, но альтернатива намного хуже. Код ремонта:

if OpenALIrreparableLeakState: 
    for sound in resources_of_type("sound"): 
     sound.release() 
    openal.shutdown() 
    openal.initialize() 
    for sound in resources_of_type("sound"): 
     sound.load() 
Смежные вопросы