Лучший API для низкоуровневого звука в Windows?

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

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

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

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

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

Ответы

Ответ 1

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

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

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

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

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

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

Ответ 2

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

Portaudio http://www.portaudio.com/

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

Ответ 3

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

Ответ 4

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