Gleichzeitiges Abspielen und Aufzeichnen von Waves (WIndows), Latenzen

Gast #1995287
Lesenswert?

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?
#1995307
Lesenswert?

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.
Gast #1995341
Lesenswert?

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).
#1995724
Lesenswert?

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.
Gast #1996401
Lesenswert?

> 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.
Gast #1996456
Lesenswert?

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
Persönliche Seite #1996467
Lesenswert?

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.

Nachtrag

http://www.portaudio.com/

könnte eine Grundlage für weitere Entwicklungen sein, das soll auch ASIO 
"sprechen".

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren