В моем приложении я обычно использую 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 очень высока. Кто-нибудь знает, если идентификатор образца перерабатывается при удалении, или это просто счетчик?