PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Hilferuf für den monitor-2.1-mergeWinLin Branch



dekarl
15.08.2007, 01:40
Hallo,

im mergeWinLin Zweig haben Norad und ich den Linux und Windows Code zusammenzuführt. Funktioniert unter Linux mit ALSA und OSS auch wunderbar, nur unter Windows gibt es noch ein Problem mit dem Einlesen von der Soundkarte. (Die eingelesenen Daten haben viele Ausreißer im Audiosignal, quasi eine total verrauschte Aufnahme)
Wir haben jetzt in einigen Tagen Fehlerwuche nichts finden können was offensichtlich falsch ist und Ich möchte den Branch demnächst in den allgemeinen 2.1er Branch zurückführen.
Könnte sich einer von den Windows Spezialisten mal die MonitorAudioWin32.cpp anschauen wo der Fehler stecken könnte?

Ansonsten ist die Vereinheitlichung fast komplett, folgendes fehlt noch, würde ich aber eher nach dem Merge fertigstellen wollen:
* Soundkartenauswahl unter Windows (im Moment wird einfach die erste genommen, unter Linux funktionieren mehrere Soundkarten schon wunderbar)
* dynamische Auswahl zwischen ALSA und OSS (im Moment wird ALSA genommen wenn möglich, sonst OSS)
* SunAudio Unterstützung (gibt es aber im 2.1er auch nicht)
* Windows Service (ist im Moment unter Linux/Windows eine Konsolenanwendung, Servicebetrieb ist aber vorbereitet, bis dahin geht natürlich die Nutzung via svcany.exe o.Ä.)
* Anpassung der MSVC Projektdateien (bis jetzt kompiliere ich die Windowsversion unter Linux)

Gruß,
Karl

Dove
22.08.2007, 18:13
Ne ganz blöde Frage, ihr könnt mich auch dafür hauen, aber habt ihr mal geguckt ob der Eingangspegel unter win nur zuhoch eingestellt ist ?
Maybe is das gar kein Fehler von sondern einfach ne Übersteuerung von Win selbst.

dekarl
23.08.2007, 10:27
Ne ganz blöde Frage, ihr könnt mich auch dafür hauen, aber habt ihr mal geguckt ob der Eingangspegel unter win nur zuhoch eingestellt ist?

Gute Idee, leider haben wir da schon dran gedacht. Es sieht eher nach einem Stack / Heap kaputtschreiben aus. Bei gleicher Hardwareeinstellung (Also Mixer, etc.) kann ich mit einem Audiorecorder wunderbar aufnehmen, ohne Fehler und bei allen möglichen Pegeln.

Buebchen
23.08.2007, 14:08
Konnte nur kurz in den Quelltext gucken. Ggf. einfach mal statt 2 Audiobuffer mehr anbieten (MAX_BUFFERS>2). Könnte ja auch sein, daß der zweite Puffer in der Zeit der Bearbeitung schon vollgelaufen ist, bevor der erste wieder freigegeben ist.

Aber ich vermute, daß habt Ihr schonmal versucht ...

dekarl
24.08.2007, 16:04
Aber ich vermute, daß habt Ihr schonmal versucht ...

Ja :(

weitere Ideen teste ich gerne aus, also als her damit

Buebchen
11.09.2007, 22:59
Hallo,

im mergeWinLin Zweig haben Norad und ich den Linux und Windows Code zusammenzuführt. Funktioniert unter Linux mit ALSA und OSS auch wunderbar, nur unter Windows gibt es noch ein Problem mit dem Einlesen von der Soundkarte. (Die eingelesenen Daten haben viele Ausreißer im Audiosignal, quasi eine total verrauschte Aufnahme)


Wie stellt Ihr eigentlich fest, daß die Aufnahme verrauscht ist. Schreibt Ihr das probeweise in eine Datei, die Ihr auswertet ?



* Anpassung der MSVC Projektdateien (bis jetzt kompiliere ich die Windowsversion unter Linux)


Habe MinGW-MSYS auf meinem Win-XP installiert. Hat damit unter MSYS auch sofort geklappt zu kompilieren. Und seltsamerweise habe ich auch eine ganz vernünftige Auswertung bekommen (Wobei ich die Audiodaten über das BOSTool erzeugt habe). Werde das mal weiter testen müssen.

... Aber vorher mal in Eclipse/CDT integrieren :-)

Buebchen
20.09.2007, 00:26
So, hab' mich mit dem Problem in den letzten Stunden mal auseinandergesetzt.

Das Ende vom Lied ist, daß es nichts mit den Aufnahmeroutinen zu tun hat, sondern mit dem Dateiformat mit dem geprüft wird.

Es werden float-Werte als .wav File geschrieben. Da scheinen aber die floats nicht identisch definiert zu sein. Inzwischen kann ich das recht leicht reproduzieren:

Erstelle ich den Inhalt des Aufnamespeichers manuell wie folgt, dann ist der Linke Kanal in Ordnung, der Rechte sieht aus wie Kraut-und-Rüben (i geht von 0 bis 8192)



audio_buffer->Left[i] = ((float) (i%10)-5)*0.1 ;
audio_buffer->Right[i] = sin(i*3.1415926/180.0) ;


ändere ich dann wie folgt wird auch der Linke Kanal nicht mehr zu einer Sägezahnkurve.



audio_buffer->Left[i] = ((float) (i%100)-50)*0.01 ;
audio_buffer->Right[i] = sin(i*3.1415926/180.0) ;


Meine Vermutung ist, daß die float Werte zwischen dem gcc und der Wave Datei nicht identisch definiert sind. Vermutlich unterschiedliche Grosse Mantissen.

Der Beschriebene Fehler scheint also nur bei der Erstellung der .wav Datei aufzutreten. Die aufgezeichneten Daten (innerhalb des Programms) sind m.E. korrekt.

Werde aber auch mal schauen, ob sich da noch etwas optimieren läßt.