OpenAL: alBufferData возвращает AL_INVALID_VALUE, даже если входные переменные * выглядят * ОК?
Итак, я создаю многопоточный декодер IMA ADPCM для потоковой передачи аудиоданных в OpenAL (см. Краткое описание ниже), но у меня возникли некоторые проблемы.
Одна из моих проблем заключается в том, что иногда мой вызов alBufferData:
alBufferData(*bufferID, format, pcmData, sizeInBytes, bitRate);
возвращается AL_INVALID_VALUE
хотя при проверке параметров они выглядят, например, так:
bufferID='109770616', format='AL_FORMAT_STEREO16', dataPtr='109754188', sizeInBytes='8164'
Любые подсказки, кто-нибудь? Когда это происходит, реальный звук воспроизводится как заикание, и ошибка обычно происходит ~10 раз подряд (для одного и того же звука). Это также обычно происходит, когда я многократно запускаю один и тот же звук (например, при съемке коротких очередей с LMG...;))
Быстрый упрощенный обзор вещания-модуля-декодера-вещи
Как звучит звук:
- Звук запускается для воспроизведения.
- Одно значение аудио в формате bufferSize декодируется, а остальное ставится в очередь для дальнейшего декодирования.
- OpenAL запускается, чтобы начать воспроизведение звука.
Цикл декодирования / потоковой передачи
- Для каждого звука, поставленного в очередь на декодирование, необходимо декодировать аудио на основе bufferSize.
- Декодированное аудио добавляется в alBuffer (см. Вызов выше) с соответствующим bufferID.
1 ответ
Если еще не слишком поздно, я расскажу вам о похожих проблемах, которые у меня были с BufferData, и вот как я это исправил. Хотя, имейте в виду, я не знаю специфики вашей многопоточной программы.
Неверное значение возвращается по ряду причин, из которых я знаю...
-Сообщение о новых буферах (для потокового источника), если источнику уже назначен буферный идентификатор (потому что он устанавливается на статический, если вы устанавливаете идентификатор буфера). Если это так, удалите идентификатор в свойстве источника.
- Изменение формата буфера в середине воспроизведения. Вы не можете изменить какую-либо настройку буфера (fmt, samplerate), за исключением самих данных буфера, как только источник начнет воспроизводиться, даже если он находится в другой очереди.
Похоже, вы можете изменить одну из этих настроек в другой теме.
Еще одна вещь, которая может вызвать всплеск, это воспроизведение звука. Повторный вызов play просто останавливает источник, затем перематывает текущий буфер и начинает воспроизведение с начала. Воспроизведение звука пушки не будет звучать так, как вы этого хотите (я полагаю, многослойно). 2 варианта, смешайте оставшийся звук оружия в буфер, затем воспроизведите его, но это может не сработать. Еще одно доказательство дурака - просто использовать несколько источников и поворачивать, какие из них будут вызываться при каждом выстреле.
Удачи с проектом.
Поскольку я наткнулся на ту же ошибку, и этот вопрос является первым, который появляется в поисковых системах, я хотел бы быстро опубликовать проблему, с которой я столкнулся, в надежде, что она будет полезна другим. Я использую stb_vorbis (из https://github.com/nothings/stb) с OpenAL, и когда я попытался передать данные в OpenAL, я получил ту же ошибку AL_INVALID_VALUE. Оказалось, что буферы должны быть кратны 4 (по крайней мере, в реализации soft_al и с AL_FORMAT_STEREO16 (может отличаться для других реализаций / форматов).
bufferSize = stb_vorbis_decode_filename("sound.ogg", &channels, &sampleFrequency, &pcmData);
// Adjust the bufferSize to a multiple of 4
bufferSize = bufferSize - bufferSize%4;
alBufferData(mySoundBuffer, AL_FORMAT_STEREO16, pcmData, bufferSize, sampleFrequency);
Я заставил его работать методом проб и ошибок, поэтому, если вы столкнетесь с этой ошибкой, вы также можете проверить это.
С уважением, Мориц