Многоканальный звук с winmm, много WaveOutOpen?

Я пытаюсь воспроизвести звук в Windows XP многоканальным (параллельным) способом. Я где-то читал, что воспроизведение параллельных звуков с WinMM возможно не возможно, но вот что я наблюдаю:

Когда я вызываю WaveOutOpen() один раз, а затем много раз вызываю WaveOutWrite(), тогда звуки не параллельны - они ставятся в очередь.

Но когда я вызываю WaveOutOpen, скажем девять раз (а затем сохраню для него девять дескрипторов), а затем девять раз вызову WaveOutWrite() с девятью разными звуками, они воспроизводятся параллельно (многоканально) - то есть они смешиваются.

Кажется, что это работает, но я не уверен, что все в порядке, потому что я не нахожу это четко изложенным в каком-либо руководстве или документации.

Это нормально, чтобы воспроизводить звук таким способом "много WaveOutOpen"??

3 ответа

Решение

Когда я вызываю WaveOutOpen() один раз, а затем много раз вызываю WaveOutWrite(), тогда звуки не параллельны - они ставятся в очередь.

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

Но когда я вызываю WaveOutOpen, скажем девять раз (а затем сохраню для него девять дескрипторов), а затем девять раз вызову WaveOutWrite() с девятью разными звуками, они воспроизводятся параллельно (многоканально) - то есть они смешиваются.

Опять же, это правильно и ожидаемо. Это самый простой способ воспроизвести много одновременных звуков. Однако, если вы хотите микширование с сэмплированием, вы должны сами микшировать сэмплы в один поток сэмплов и воспроизводить их через одно устройство WaveOut.

Я исправлен способностью waveOut* API воспроизводить звуки одновременно и смешанно.

Вот тестовый код для любопытных: http://www.alax.info/trac/public/browser/trunk/Utilities/WaveOutMultiPlay Приложение, запущенное с аргументами abc играет на разных потоках звуки на 1, 5 и 15 кГц соответственно и они хорошо микшируются.

В то же время фильтр DirectShow Audio Renderer (WaveOut), построенный на основе того же API, не может воспроизводить ничего, кроме одного потока, без видимой причины.

FYI waveOutOpen API давно устарел и в настоящее время является оберткой поверх новых API. waveOutOpen предполагает, что устройство вывода звука открыто для эксклюзивного использования, поэтому нет никакой гарантии, что многократно открытые устройства одновременно выдадут смешанный вывод звука. Чтобы добиться такого поведения, вам лучше использовать новый аудио API: DirectSound, DirectShow поверх DirectSound или WASAPI.

Я предлагаю пойти с DirectSound, если ваш продукт для потребителей.

Начиная с DirectX8, API находится на том этапе, когда он на самом деле довольно безболезненный, и на большинстве потребительских компьютеров он будет установлен.

Другие вопросы по тегам