Лучший API для аудио низкого уровня в Windows? - PullRequest
15 голосов
/ 06 января 2010

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

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

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

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

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

Ответы [ 4 ]

16 голосов
/ 06 января 2010

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

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

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

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

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

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

5 голосов
/ 28 апреля 2011

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

Portaudio http://www.portaudio.com/

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

4 голосов
/ 06 января 2010

в дополнение к опциям, упомянутым Джоном Кноллером, существует WASAPI , который допускает намного меньшие задержки, чем WaveOut, но, к сожалению, доступен только в Windows Vista и далее.

2 голосов
/ 06 января 2010

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

...