2010-01-06 2 views
15

Ich arbeite an einer Audio-Anwendung, in C geschrieben. Ich muss Live-Audio-Wiedergabe unter Windows bereitstellen. Ich muss entscheiden, welche Audio-API verwendet werden soll. Ich plane, the basic waveOut API zu verwenden, aber ich wollte überprüfen, um zu sehen, was die Gemeinschaft hier empfiehlt.Beste API für Low-Level-Audio in Windows?

Ich möchte Code, der nur mit jeder aktuellen Version von Windows funktioniert, ohne dass Bibliotheken installiert werden müssen; und ich möchte minimale Latenz.

Ich brauche oder will keine "Effekte", ich muss nur getreu wiedergeben, welche Wellenform die Anwendung erzeugt.

Mein Verständnis ist, dass die meisten professionellen Audio-Anwendungen unter Windows ASIO verwenden, die ausgezeichnete niedrige Latenz bietet, aber ich will nicht ASIO, weil ich möchte, dass mein Code zu Just Work und die meisten Menschen nicht ASIO pre auf ihren Computern installiert. (Zu einem späteren Zeitpunkt kann ich zurückgehen und auch ASIO als Option hinzufügen, aber ich gehe zuerst für die allgemeinste Lösung.)

Gibt es etwas da draußen, das wäre besser als waveOut für meine Zwecke, oder Ist das die beste Wahl?

Antwort

15

Es hängt davon ab, was Sie versuchen zu tun. Die grundlegende waveOut-Audio-API eignet sich besser zum Streamen von Audio. Sie können mehrere Puffer in eine Warteschlange stellen und sie automatisch nacheinander abspielen lassen. Aber wenn Audio abgespielt wird und Sie es ändern oder etwas hinzufügen möchten, ist das relativ schwierig.

DirectX-Audio ist besser für ereignisbasiertes Audio. Sie können mehrere Dinge gleichzeitig spielen, ohne selbst mischen zu müssen. Sie können kleine Audiodateien ganz einfach hinzufügen oder entfernen - wie das Abspielen eines Sounds, wenn der Benutzer den Abzug seiner Waffe betätigt. Aber Streaming (d. H. 1 Puffer nach dem anderen) ist schwieriger.

waveOut wurde entwickelt, um die Wiedergabe von Audiodaten zu erleichtern, die wie eine MP3-Datei konstant sind. DirectX ist für Audio, das intermittierend ist, wie Feedback in einem Spiel konzipiert.

ASIO ist wie die schlechteste von WaveOut und DirectX in Bezug auf die Schwierigkeit der Programmierung. Und es ist nicht so stabil. Anwendungen können das Audiogerät normalerweise nicht teilen. Aber es bietet Ihnen den geringsten Latenzzugriff auf diese Audio-Hardware.

ASIO gibt Ihnen auch eine Möglichkeit, die Wiedergabe auf mehreren Geräten zu synchronisieren.

Wenn Sie nicht ändern müssen, was gerade gespielt wird, bevor es abgespielt wird, und Sie nicht mehrere Geräte synchronisieren müssen, dann brauchen Sie ASIO nicht.

+0

und was ist mit XAudio2? –

+0

XAudio2 ist als Ersatz für DirectSound gedacht. Es ist auf DirectSound auf WinXP implementiert. Für WinVista und später ist es in den Kernel-Audio integriert. Es ist wahrscheinlich eine bessere Wahl als die Verwendung von DirectSound, wenn Sie DirectSound anstelle von WaveOut verwenden möchten. –

+1

@JohnKnoeller Entschuldigung für das Nekronen. Können Sie mehr über "(XAudio2) wird auf DirectSound auf WinXP implementiert. Für WinVista und später ist es in den Kernel-Audio integriert."? Ich komme von [dieser Frage] (http://gamedev.stackexchange.com/questions/51450) –

4

Zusätzlich zu den von John Knoeller erwähnten Optionen gibt es WASAPI, die viel niedrigere Latenzen als WaveOut ermöglicht, aber leider nur ab Windows Vista verfügbar ist.

2

Nachdem ich eine DirectSound-Streaming-Anwendung selbst geschrieben habe, empfehle ich sie für niedrige Latenz und Benutzerfreundlichkeit. Außerdem können Sie damit ein Format mit höherer Qualität für die Wiedergabe auf Legacy-Editionen von Windows festlegen.

5

Zu der Zeit, als ich diese Frage stellte, schrieb ich Streaming-Code mit den WaveOut und WaveIn-APIs. Seitdem habe ich eine nützliche Bibliothek entdeckt:

Portaudio http://www.portaudio.com/

Portaudio ist eine kostenlose Software mit einem kommerziellen freundlichen Lizenz.Wenn Sie Ihren Code zum Aufrufen von PortAudio schreiben, sollte er in der Lage sein, mit waveOut-Geräten, aber auch mit ASIO-Geräten unter Windows zu arbeiten; Es kann dann für Linux neu kompiliert werden und sollte mit ALSA-Geräten arbeiten; und es kann dann für den Mac neu kompiliert werden und sollte mit CoreAudio-Geräten arbeiten. Ich habe den Mac Teil nicht getestet, aber mein Projekt funktioniert gut mit Windows und Linux.

Verwandte Themen