Soundausgabe unter Linux - mit C++
-
Hi,
ich moechte in einem C++-Programm unter Linux eine Wave-Datei ausgeben und frage mich, wie das geht. Die Daten liegen als Float-array vor, und mein ungefaehres Vorgehen muss wohl wie folgt aussehen:
- Geraet oeffnen (welches? /dev/audio, /dev/dsp, ... )
- Daten auf schreiben (wie? Buffer oder so verwenden?)
- Daten abspielen
- Geraet schliessen.Hat jemand ein paar Hinweise fuer mich? Vielleicht auch einen Web-link, mein gegoogle hat noch nichts gebracht.
Vielen Dank
-
also mit den sound-gerätedateien ist das immer sone sache, da immer nur eine anwendung die datei benutzten kann. dazu gibt es soundserver (ALSA, ...)
ich weiss jetzt net für was du den sound brauchst aber du kannst dir entweder die libao anschaun oder direkt dein soundserver (kommt draufan welchen du hast) ansprechen.mfg blan
-
Edit: Hab das Thema verfehlt
-
OpenAL!
-
Hallo,
du kannst zum einem Alsa zur Soundausgabe verwenden. Schaust du auf www.alsa-project.org. Alsa ist m.E. übrigens kein Soundserver, sondern ein Treiberabstraktionsdingens.
Wenn du es gerne antik magst, und direkt auf die Sounddevices zugreifen möchtest, nimmst du OSS. Das benutzt bis Quake4 noch jedes Id-Software Game. Sehr ärgerlich, weil nur eine Anwendung gleichzeitig Sound ausgeben kann.
Ich persönlich würde dir FMod empfehlen; damit kannst du plattformunabhängig ganz viele Formate abspielen.
Hoffe das hilft dir
-
Einfach mit
cat /dev/mic > test.wav
(*)
und STRG+C aufnehmen vom Mikro und dann im Programm mitsystem("cat test.wav > /dev/dsp");
abspielen!
Also, OSS ist schon sehr einfach, dickes Tut als PDF gibt's auch auf der offiziellen Seite, aber halt sehr "deprecated", da es wie gesagt nur eine Anwendung gleichzeitig erlaubt.
OpenAL hat keine native Unterstützung für 2D, nur 3D.
Von ALSA hab' ich (noch ;)) keine Ahnung.
Ansonsten mal anschauen:
SDL
Audier(r?)e
FMOD
BASS
-
Sgt. Nukem schrieb:
Also, OSS ist schon sehr einfach, dickes Tut als PDF gibt's auch auf der offiziellen Seite, aber halt sehr "deprecated", da es wie gesagt nur eine Anwendung gleichzeitig erlaubt.
OSS sollte man wirklich nicht mehr anschauen. Zwar kann Alsa das emulieren, aber es ist einfach ein totes Pferd. (btw. stimmt es nicht so ganz, dass immer nur eine Anwendung erlaubt war. Das musste glaube ich nur auf Treiberebene gemixt werden, so dass es auf den Treiber ankam)
Von ALSA hab' ich (noch ;)) keine Ahnung.
Alsa hat eine sehr umfangreiche Schnitstelle, für professionelle Audioanwendungen. (wobei man dann auch jack in Betracht ziehen sollte). Alsa lohnt sich vermutlich nicht wirklich, da die API sehr low level ist und auch wieder sehr abhängig von Linux.
SDL
SDL bietet sich eben an, wenn man eh schon die SDL benutzt. Aber ansonsten würde ich die SDL nicht benutzen, da die API teilweise wirklich nicht so schön ist
Bei freshmeat und sf sollte man im Zweifelsfall noch zahlreiche Wrapper finden.
Ich würde mir einfach ein paar Libraries angucken und die benutzen, die den besten Eindruck von der API, Maintainment und Portabilität macht.
-
Sgt. Nukem schrieb:
Einfach mit
cat /dev/mic > test.wav
Dann versuch' doch mal, "test.wav" mit einem WAV-fähigen Programm abzuspielen!
Natürlich kann man mit "cat" Audiodateien aufzeichnen und abspielen, aber nur als reine Audiodaten, nicht als WAVE-Format.
@kingruedi: Auch mit dem alten OSS kann man noch eine ganze Menge machen, wie dieses Projekt zeigt.
-
Martin G schrieb:
@kingruedi: Auch mit dem alten OSS kann man noch eine ganze Menge machen, wie dieses Projekt zeigt.
Klar, nur ist es nicht sinnvoll, bei neuen Projekten darauf zu setzen, da es nicht nur alt sondern mittlerweile veraltet ist und auf vielen Systemen nur mehr via alsa-oss unterstützt wird.
-
Martin G schrieb:
Dann versuch' doch mal, "test.wav" mit einem WAV-fähigen Programm abzuspielen!
Ich meine mit alsaplay bzw. play ging das sogar... -- mit dem WMP sicher nicht.
Martin G schrieb:
Natürlich kann man mit "cat" Audiodateien aufzeichnen und abspielen, aber nur als reine Audiodaten, nicht als WAVE-Format.
Einen RIFF/WAVE-Header davorklatschen sollte doch nicht so schwer sein...