2010-01-06 2 views
15

Sto lavorando a un'applicazione audio, scritta in C. Devo fornire la riproduzione audio dal vivo sotto Windows. Devo decidere quale API audio utilizzare. Sto pensando di usare the basic waveOut API, ma volevo controllare per vedere cosa consiglia la comunità qui.Migliore API per audio di basso livello in Windows?

Desidero codice che funzioni solo su qualsiasi versione recente di Windows, senza bisogno di installare librerie; e voglio una minima latenza.

Non ho bisogno né voglio alcun "effetto", ho solo bisogno di riprodurre fedelmente i campioni d'onda generati dall'applicazione.

La mia comprensione è che la maggior parte delle applicazioni audio professionali su Windows utilizzano ASIO, che offre un'eccellente bassa latenza, ma non voglio ASIO perché voglio che il mio codice funzioni correttamente e la maggior parte delle persone non ha pre-ASIO installato sui loro computer. (In un secondo momento potrei tornare indietro e aggiungere ASIO come opzione, ma per prima cosa cercherò la soluzione più generale.)

C'è qualcosa là fuori che sarebbe meglio di waveOut per i miei scopi, o è quella la scelta migliore?

risposta

15

Dipende da ciò che si sta tentando di fare. L'API audio waveOut base è migliore per lo streaming audio. Ti consente di mettere in coda diversi buffer e di farli automaticamente riprodurre in successione. Ma se l'audio è in riproduzione e vuoi cambiarlo o aggiungerne qualcosa, è relativamente difficile.

L'audio DirectX è migliore per l'audio basato su eventi. Puoi giocare diverse cose contemporaneamente senza dover fare il missaggio tu stesso. Puoi aggiungere o rimuovere piccoli pezzi di audio facilmente, ad esempio suonare un suono quando l'utente preme il grilletto sulla sua pistola. Ma lo streaming (cioè riprodurre 1 buffer dopo l'altro) è più difficile.

waveOut è progettato per facilitare la riproduzione di audio che è costante, come un file .mp3. DirectX è progettato per l'audio che è intermittente, come il feedback in un gioco.

ASIO è come il peggiore di waveOut e DirectX in termini di difficoltà di programmazione. E non è così stabile. Le applicazioni in genere non possono condividere il dispositivo audio. Ma ti dà l'accesso alla latenza più basso a quell'hardware audio.

ASIO offre anche un modo per sincronizzare la riproduzione su più dispositivi.

Se non è necessario essere in grado di modificare cosa verrà riprodotto prima che venga riprodotto, e non è necessario sincronizzare più dispositivi, quindi non è necessario ASIO.

+0

e che dire di XAudio2? –

+0

XAudio2 è destinato alla sostituzione di DirectSound. È implementato su DirectSound su WinXP. Per WinVista e versioni successive, è integrato nell'audio del kernel. È probabilmente una scelta migliore rispetto all'utilizzo di DirectSound se si prevede di utilizzare DirectSound anziché waveout. –

+1

@JohnKnoeller scusa per averlo prelevato. Puoi approfondire l'argomento "(XAudio2) è implementato su DirectSound su WinXP. Per WinVista e versioni successive, è integrato nell'audio del kernel."? Vengo da [questa domanda] (http://gamedev.stackexchange.com/questions/51450) –

4

in aggiunta alle opzioni menzionate da John Knoeller, c'è WASAPI che consente latenze molto inferiori rispetto a WaveOut, ma sfortunatamente è disponibile solo da Windows Vista in poi.

2

Avendo scritto direttamente un'applicazione di streaming DirectSound, la raccomando sicuramente per la bassa latenza e la facilità d'uso. Inoltre, ti consente di impostare un formato di qualità superiore per la riproduzione su edizioni legacy di Windows.

5

Al momento in cui ho posto questa domanda, ho scritto il codice di streaming utilizzando le API waveOut e waveIn. Da allora, ho scoperto un utile libreria:

PortAudio http://www.portaudio.com/

PortAudio è un software libero con una licenza commerciale-friendly.Se scrivi il tuo codice per chiamare PortAudio, dovrebbe essere in grado di funzionare con i dispositivi waveOut ma anche con i dispositivi ASIO sotto Windows; può essere poi ricompilato per Linux e dovrebbe funzionare con i dispositivi ALSA; e può quindi essere ricompilato per il Mac e dovrebbe funzionare con i dispositivi CoreAudio. Non ho testato la parte Mac ma il mio progetto funziona perfettamente con Windows e Linux.