2010-01-06 18 views
15

Estoy trabajando en una aplicación de audio, escrita en C. Necesito proporcionar reproducción de audio en vivo en Windows. Necesito decidir qué API de audio usar. Estoy planeando usar the basic waveOut API, pero quería verificar para ver qué recomienda la comunidad aquí.¿La mejor API para audio de bajo nivel en Windows?

Deseo el código que solo funcione en cualquier versión reciente de Windows, sin necesidad de instalar bibliotecas; y quiero latencia mínima.

No necesito ni quiero ningún "efecto", solo necesito reproducir fielmente las muestras de onda que genera la aplicación.

Según entiendo, la mayoría de las aplicaciones de audio profesionales en Windows usan ASIO, lo que brinda una excelente latencia baja, pero no quiero ASIO porque quiero que mi código funcione y la mayoría de las personas no tienen ASIO pre instalado en sus computadoras. (En una fecha posterior, puedo volver y también agregar ASIO como opción, pero voy a buscar la solución más general primero.)

¿Hay algo por ahí que sea mejor que waveOut para mis propósitos, o ¿Esa es la mejor opción?

Respuesta

15

Depende de lo que estés tratando de hacer. La API de audio waveOut básica es mejor para transmitir audio. Te permite poner en cola varios buffers y hacer que se reproduzcan automáticamente en sucesión. Pero si el audio se está reproduciendo y desea cambiarlo o agregarle algo, eso es relativamente difícil.

El audio de DirectX es mejor para audio basado en eventos. Puede tener varias cosas jugando al mismo tiempo sin tener que hacer la mezcla usted mismo. Puede agregar o eliminar pequeñas piezas de audio fácilmente, como reproducir un sonido cuando el usuario aprieta el gatillo de su arma. Pero la transmisión (es decir, reproducir 1 memoria intermedia después de otra) es más difícil.

waveOut está diseñado para facilitar la reproducción de audio que es constante, como un archivo .mp3. DirectX está diseñado para audio que es intermitente, como retroalimentación en un juego.

ASIO es como lo peor de waveOut y DirectX en términos de dificultad de programación. Y no es tan estable. Las aplicaciones generalmente no pueden compartir el dispositivo de audio. Pero te da el acceso de latencia más bajo a ese hardware de audio.

ASIO también le ofrece una forma de sincronizar la reproducción en múltiples dispositivos.

Si no necesita cambiar qué se va a reproducir justo antes de reproducirlo, y no necesita sincronizar varios dispositivos, entonces no necesita ASIO.

+0

y qué hay de XAudio2? –

+0

XAudio2 está destinado a reemplazar a DirectSound. Está implementado sobre DirectSound en WinXP. Para WinVista y más tarde, está integrado en el audio del kernel. Probablemente sea una mejor opción que utilizar DirectSound si planea usar DirectSound en lugar de Waveout. –

+1

@JohnKnoeller lo siento por necroing esto. ¿Puede ampliar más sobre "(XAudio2) se implementa sobre DirectSound en WinXP. Para WinVista y más tarde, está integrado en el núcleo de audio"? Vengo de [esta pregunta] (http://gamedev.stackexchange.com/questions/51450) –

4

además de las opciones mencionadas por John Knoeller, hay WASAPI que permite latencias mucho más bajas que WaveOut, pero desafortunadamente solo está disponible desde Windows Vista en adelante.

2

Después de haber escrito una aplicación de transmisión DirectSound, ciertamente la recomiendo por baja latencia y facilidad de uso. Además, le permite establecer un formato de mayor calidad para la reproducción en ediciones heredadas de Windows.

5

En el momento en que hice esta pregunta, escribí un código de transmisión usando las API waveOut y waveIn. Desde entonces, he descubierto una biblioteca útil:

PortAudio http://www.portaudio.com/

PortAudio es software libre con una licencia comercial de usar.Si escribe su código para llamar a PortAudio, debería poder funcionar con dispositivos WaveOut pero también con dispositivos ASIO en Windows; luego se puede recompilar para Linux y debería funcionar con dispositivos ALSA; y luego puede ser recompilado para Mac y debería funcionar con dispositivos CoreAudio. No he probado la parte de Mac, pero mi proyecto funciona muy bien con Windows y Linux.

Cuestiones relacionadas