многоканальный звук с winmm, много WaveOutOpen? - PullRequest
4 голосов
/ 06 октября 2011

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

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

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

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

Это нормально - воспроизводить звук таким способом 'много WaveOutOpen' ??

Ответы [ 3 ]

3 голосов
/ 07 октября 2011

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

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

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

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

1 голос
/ 06 октября 2011

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

Вот тестовый код для любопытных: 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.

0 голосов
/ 07 октября 2011

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

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

...