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... ;))

быстрый упрощенный тур по потоковой передаче-декодер-модуль-вещь

Как воспроизводится звук:

  1. для воспроизведения запускается звук.
  2. Один размер буфера аудио декодируется, а остальные помещаются в очередь для дальнейшего декодирования.
  3. OpenAL запускается для начала воспроизведения звук.

Цикл декодирования / потоковой передачи

  1. для каждого звука, стоящего в очереди на декодирование, декодируйте размер буфера звука.
  2. Декодированный звук добавляется к альбуферу (см. вызов выше) с соответствующим идентификатором буфера.
1 4

1 ответ:

Если еще не поздно, я расскажу вам о подобных проблемах, которые у меня были с BufferData, и вот как я это исправил. Хотя, имейте в виду, я не знаю специфики вашей потоковой программы.

Недопустимое значение возвращается по ряду причин,о которых я знаю...
- Постановка в очередь новых буферов (к источнику потоковой передачи), если источнику уже присвоен идентификатор буфера (поскольку он получает значение static, если вы задаете идентификатор буфера). Если это так, удалите идентификатор в свойстве source.
- Изменение буфера формат середине игры. Вы не можете изменить настройки буфера (fmt, samplerate), за исключением самих буферных данных, когда источник начинает воспроизводиться, даже если он находится в другой очереди.

Похоже, что вы меняете одну из этих настроек в другом потоке.

Еще одна вещь, которая может вызвать хлопки, - это воспроизведение звука. Вызов воспроизведения снова просто останавливает исходный холод, затем перематывает текущий буфер и начинает воспроизведение с самого начала. Игра на пушке звучит так, что это не будет звучать как вы хотите этого (я полагаю, многослойного). 2 варианта, смешайте оставшийся звук пушки в буфер, а затем воспроизведите его, но это может не сработать. еще одно доказательство глупости - это просто использовать несколько источников и вращать, какие из них вызываются при каждом выстреле.

Удачи вам в вашем проекте.