OpenAL: alBufferData возвращает недопустимое значение AL, даже если входные переменные *выглядят * хорошо?
Итак, я создаю потоковый декодер 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... ;))
быстрый упрощенный тур по потоковой передаче-декодер-модуль-вещь
Как воспроизводится звук:
- для воспроизведения запускается звук. Один размер буфера аудио декодируется, а остальные помещаются в очередь для дальнейшего декодирования.
- OpenAL запускается для начала воспроизведения звук.
Цикл декодирования / потоковой передачи
- для каждого звука, стоящего в очереди на декодирование, декодируйте размер буфера звука. Декодированный звук добавляется к альбуферу (см. вызов выше) с соответствующим идентификатором буфера.
1 ответ:
Если еще не поздно, я расскажу вам о подобных проблемах, которые у меня были с BufferData, и вот как я это исправил. Хотя, имейте в виду, я не знаю специфики вашей потоковой программы.
Недопустимое значение возвращается по ряду причин,о которых я знаю...
- Постановка в очередь новых буферов (к источнику потоковой передачи), если источнику уже присвоен идентификатор буфера (поскольку он получает значение static, если вы задаете идентификатор буфера). Если это так, удалите идентификатор в свойстве source.
- Изменение буфера формат середине игры. Вы не можете изменить настройки буфера (fmt, samplerate), за исключением самих буферных данных, когда источник начинает воспроизводиться, даже если он находится в другой очереди.Похоже, что вы меняете одну из этих настроек в другом потоке.
Еще одна вещь, которая может вызвать хлопки, - это воспроизведение звука. Вызов воспроизведения снова просто останавливает исходный холод, затем перематывает текущий буфер и начинает воспроизведение с самого начала. Игра на пушке звучит так, что это не будет звучать как вы хотите этого (я полагаю, многослойного). 2 варианта, смешайте оставшийся звук пушки в буфер, а затем воспроизведите его, но это может не сработать. еще одно доказательство глупости - это просто использовать несколько источников и вращать, какие из них вызываются при каждом выстреле.
Удачи вам в вашем проекте.