Вопрос

Я работаю над аудиоприложением, написанным на C.Мне нужно обеспечить воспроизведение звука в реальном времени под Windows.Мне нужно решить, какой аудио API использовать.Я планирую использовать базовый API WaveOut, но я хотел проверить, что рекомендует сообщество.

Мне нужен код, который будет работать в любой последней версии Windows без необходимости установки библиотек;и мне нужна минимальная задержка.

Мне не нужны какие-либо «эффекты», мне просто нужно добросовестно воспроизводить любые волновые сэмплы, которые генерирует приложение.

Насколько я понимаю, большинство профессиональных аудиоприложений в Windows используют ASIO, который обеспечивает отличную низкую задержку, но мне не нужен ASIO, потому что я хочу, чтобы мой код просто работал, а у большинства людей на компьютерах не предустановлен ASIO. .(Позже я, возможно, вернусь и добавлю ASIO в качестве опции, но сначала я выберу самое общее решение.)

Есть ли что-нибудь, что было бы лучше, чем waveOut для моих целей, или это лучший выбор?

Это было полезно?

Решение

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

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

waveOut предназначен для облегчения воспроизведения постоянного звука, например файла .mp3.DirectX предназначен для прерывистого звука, например обратной связи в игре.

ASIO по сложности программирования похож на худший из waveOut и DirectX.И это не так стабильно.Приложения обычно не могут совместно использовать аудиоустройство.Но это дает вам доступ к аудиооборудованию с минимальной задержкой.

ASIO также дает возможность синхронизировать воспроизведение на нескольких устройствах.

Если вам не нужно иметь возможность изменять то, что будет воспроизводиться непосредственно перед воспроизведением, и вам не нужно синхронизировать несколько устройств, тогда вам не нужен ASIO.

Другие советы

В то время, когда я задавал этот вопрос, я писал код потоковой передачи с использованием API waveOut и waveIn.С тех пор я обнаружил полезную библиотеку:

ПортАудиоhttp://www.portaudio.com/

PortAudio — бесплатное программное обеспечение с коммерческой лицензией.Если вы напишете свой код для вызова PortAudio, он должен иметь возможность работать с устройствами waveOut, а также с устройствами ASIO под Windows;затем его можно перекомпилировать для Linux, и он должен работать с устройствами ALSA;затем его можно будет перекомпилировать для Mac, и он должен работать с устройствами CoreAudio.Я не тестировал часть Mac, но мой проект отлично работает с Windows и Linux.

Помимо вариантов, упомянутых Джоном Кноллером, существует ВАСАПИ который обеспечивает гораздо меньшие задержки, чем WaveOut, но, к сожалению, доступен только начиная с Windows Vista.

Поскольку я сам написал приложение потоковой передачи DirectSound, я определенно рекомендую его из-за низкой задержки и простоты использования.Кроме того, он позволяет вам установить формат более высокого качества для воспроизведения в устаревших выпусках Windows.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top