2012-06-12 2 views
4

Итак, я создаю поточный декодер IMA ADPCM для потоковой передачи аудиоданных в OpenAL (см. Ниже для краткого описания), но я столкнулся с некоторыми проблемами.OpenAL: alBufferData возвращает AL_INVALID_VALUE, хотя входные переменные * выглядят * ОК?

Одна из моих проблем является то, что иногда мой призыв к 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. Для каждого звука в очереди для декодирования, декодирования BufferSize ценности аудио.
  2. Декодированный звук добавляется в альбуффер (см. Вызов выше) с соответствующим идентификатором буфера.
+0

Имеет ли целое число, для которого указывает буферный идентификатор, действительный идентификатор буфера? Если бы он был создан с помощью alGenBuffers? –

+0

Значение bufferID похоже на значение dataPtr. Скорее это указатель. Вы печатаете bufferID или * bufferID? Меня больше интересует * bufferID. –

+0

Игнорировать выше комментарий, я слишком медленно редактировал его: Hiya @ Mārtiņš! Значение 'bufferID' - это значение, показанное выше (' '109770616''). БуферID генерируется и используется следующим образом: 'alGenBuffers' ->' alBufferData' -> 'alSourceQueueBuffers'. Я постоянно проверяю обработанные буферы с помощью 'alGetSourcei (sID, AL_BUFFERS_PROCESSED и обработанных буферов)' и повторно использую обработанный буферный идентификатор, отменяя его с помощью 'alSourceUnqueueBuffers' и снова заполняя его' alBufferData'. – happytrooper

ответ

3

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

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

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

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

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

+0

Отличный ответ, спасибо @extracrispy! Хотя я еще не успел продолжить работу над этим проектом (хотя бы через некоторое время), причины, которые вы указываете, действительно звучат корректно! Как только я вернусь к этому проекту, я буду исследовать это дальше и вернуться с ответом. До тех пор, поскольку я не могу просто поддержать ваш ответ (нужно 15 реп.), Я отмечу его как принятый! – happytrooper