Hallo,
ich habe ein kleines Programm in C geschrieben, das auf meiner
Soundkarte (Terratec Aureon 5.1 USB) eine Wave-Datei abspielt und
gleichzeitig vom Mikrofon-Eingang eine andere aufnimmt. (= Full Duplex)
Ich verwende die MM-Funktionen (waveInStart(), waveInAddBuffer(),
waveOutWrite(), ...) mit Double Buffering.
Ich wollte einen zweistimmigen Gesang erzeugen.
Dabei stelle ich fest, dass beim gleichzeitigen Abspielen der beiden
Waves ein deutlich hoerbarer Zeitverzug auftritt. Ich schaete 200-400ms.
Was vorher (beim Aufzeichnen der 2. Spur) synchron geklungen hat, klingt
beim gleichzeitigen Abspielen ganz anders.
Dabei spielt es keine Rolle, wie gross ich die Buffer waehle, selbst bei
ganz grossen Buffer (1000ms) habe ich obigen Zeitverzug.
Dabei frage ich mich, wieso der Zeitverzug so gross ist.
Ich koennte ihn ja ausgleichen, indem ich beim Mischen der beiden Tracks
diese entsprechend verschiebe. Aber dann muesste ich wissen, wie gross
der Zeitverzug genau ist, ob er immer gleich bleibt.
Auch wuerde mich interessieren, ob man beim Einsatz von DirektX bessere
Ergebnisse erzielt. (Ich muesste mich da neu arbeiten.)
Vielleicht kennt sich jemand aus?
Das liegt an Windows selbst, die I/O-Buffer werden durch viele Schichten
des Betriebssystem geschickt bevor sie dann bei der Hardware landen. Die
Latenz ergibt sich aus der Buffergröße einer Betriebssystemschicht, die
ist fest und mit wavein/out kopiert man quasi kleine Teile diese
Buffers, eine Änderung der Größe dieser Teile hat also keinerlei
Auswirkungen auf die Latenz.
Man kann das über 2 Wege umgehen, der eine Weg ist recht umständlich und
nennt sich Kernel-Streaming. Ich habe mich damit noch nicht so befasst,
weil es eine sehr Hardwarenahe Programmierung ist, man spricht quasi mit
dem Soundkartentreiber direkt.
Der zweite Weg ist recht simpel, und quasi ein Standard um
Latenzprobleme zu umgehen, und nennt sich ASIO. Das ist eine
Multimediaschnittstelle von Steinberg und vergleichsweise einfach zu
benutzen, da es ein COM-Interface ist. Vorraussetzung ist allerdings,
dass die Grafikkarte zu den WDM-Treibern auch noch ASIO-Treiber hat,
sonst kann man die Vorteile nicht nutzen.
Wenn ich die Terratec-Faq anschaue, lese ich
>Frage 5:>Woher bekomme ich einen ASIO Treiber für die Aureon USB?>>Antwort 5:>Die Firma Propagamma wird in absehbarer Zeit einen ASIO Treiber für die >Aureon
5.1 USB anbieten. Weitere Infos erhalten Sie auf folgender Seite:
>http://www.usb-audio.de
Bei http://www.usb-audio.de kann man einen generic Treiber herunterladen
fuer 50EUR (die Demo-Version biept alle 30 Sekunden). Dieser
unterstuetzt auch die Aureon USB.
D.h. heisst vermutlich, dass ich die 50EUR ausgeben muesste (mehr als
die Soundkarte selbst).
Wenn es ein direkter Treiber für die Hardware ist, bringt es Vorteile.
Wenn es allerdings nur eine Emulation wie ASIO4ALL ist, ändert sich an
der Latenz nicht viel.
Maik M. schrieb:> Vorraussetzung ist allerdings,> dass die Grafikkarte zu den WDM-Treibern auch noch ASIO-Treiber hat,> sonst kann man die Vorteile nicht nutzen.
Das ist sicher eine gute Idee. 17 ms sind für ein USB-Interface wohl
auch ganz gut. Wenn du aber Audiosignale mit perkussiven Elementen
aufnimmst, kann man das schon hören. Du mußt ja auch immer daran denken,
daß du beim gleichzeitigen Aufnehmen und Abspielen das doppelte rechnen
mußt. Da die Latenz bei ASIO aber konstant und definiert ist, kannst du
die durch entsprechendes Verschieben wegbekommen. So machen das auch die
professionellen Tools.
Ich weiß ja nicht, was Du anstrebt - im OpenSource Bereich wärst Du
vielleicht ansatzweise fündig geworden:
http://www.opensourcepartners.nl/~costar/gramofile/
soll auch mittlerweile unter Windows laufen.
Und inwiefern löst diese Software eines der Probleme des Threadstarters?
Wenn es einfach nur um Audio-Recording ginge, dann wäre Audacity
sicherlich eine Erwähnung wert - das ist ebenfalls OSS, auf diversen
Plattformen verfügbar und nicht seit 9 Jahren eingeschlafen.
> Und inwiefern löst diese Software eines der Probleme des Threadstarters?
ich kenne nicht die genauen Zielvorgaben des Threadstartes.
Das Geld für den Treiber möchte er offenbar sparen und mal eben selber
einen Treiber schreiben? Gut, dann hat er Geld gespart und eine Menge
Erfahrung gesammelt (vorrausgesetzt es klappt) - die Frage ist, ob er
das wirklich will, wenn es schon ein fertiges Produkt gibt.
Audacity ist natürlich auch eine Möglichkeit, kannte ich vorher nicht.
mar IO schrieb:> Maik M. schrieb:>> Vorraussetzung ist allerdings,>> dass die Grafikkarte zu den WDM-Treibern auch noch ASIO-Treiber hat,>> sonst kann man die Vorteile nicht nutzen.
hehehe, da war ich wohl irgendwie mit den Gedanken woanders... aber man
hat mich verstanden :)
Gestern habe ich die M-Audio Fast-Track USB bei Thomann bestellt und mit
Paypal bezahlt, heute Mittag hat sie der Postbote gebracht, schon
unheimlich.
Ich bin mit dem Teil zunaechst zufrieden. Da ich mit
Kondensator-Mikrofonen aufnehmen will, brauchte ich sowieso ein Teil,
was mir ne Phantomspannung liefert, somit erschien mir das ne sinnvolle
Investition.
Beim Einstecken hat sich das Ding selbst installiert. Daraufhin habe ich
meine Full-Duplex-Versuche gestartet und gemerkt, dass sich an der
Latenz nichts geaendert hat.
Daraufhin habe ich von M-Audio den Asio-Treiber heruntergeladen und
installiert.
Das muss funktioniert haben, denn mein Sampler erlaubt mir als AUSGANG
die Option "M-Track-Asio" und die ist sauschnell (als Ausgang).
Also die Asio-Treiber sind am PC installiert und der Ausgang
funktioniert sehr gut.
Als ich mein Full-Duplex-Programm startete, stellte ich fest, dass mir
die Funktionen waveOutGetNumDevs(), waveInGetNumDevs(),
waveOutGetDevCaps(), waveInGetDevCaps() genau die ueblichen
Devices/Treiber anzeigen, die schon VOR der Asio-Installation hatte.
An der Latenz hat sich auch nichts geaendert, aber ich konnte in der
Systemsteuerung diese auf 128ms reduzieren. Zwar besser, aber noch nicht
optimal.
Da stellt sich mir die Frage, ob ich Asio zusammen mit den
waveOutxxx()/waveInxxx() - Funktionen benutzen kann?
Weiss das jemand?
Gruss, Juergen
Ing. ET schrieb:> Da stellt sich mir die Frage, ob ich Asio zusammen mit den> waveOutxxx()/waveInxxx() - Funktionen benutzen kann?
Wohl nicht, die nutzen die üblichen Windows-Multimediafunktionen und
kein ASIO.
Von Steinberg gibt es ein ASIO SDK, das Du vermutlich nutzen solltest:
http://www.steinberg.net/de/company/developer/src_user.html
Erfordert allerdings eine Anmeldung/Registrierung bei Steinberg.
Nachtraghttp://www.portaudio.com/
könnte eine Grundlage für weitere Entwicklungen sein, das soll auch ASIO
"sprechen".
Ing. ET schrieb:> Da stellt sich mir die Frage, ob ich Asio zusammen mit den> waveOutxxx()/waveInxxx() - Funktionen benutzen kann?
Nein. ASIO ist ein anderes Software-Interface, das man anders ansprechen
muß.