BassWasapi Latenz beim Duplexn entfernen möglich?

Drache2

Erfahrenes Mitglied
Moinmoin.
Ersteinmal zur Geschichte:
Habe mir mal 'nen Player mit der bass.dll geschrieben und da 'nen "Pluginsystem" intengriert und mit den Sampledaten nen Spektrum,
sowie ne externe LED-Leiste betrieben. Das lief jeweils Zeitnah zur Musik.

Nun wollte ich die Leiste jedoch nicht an dem Player gekoppelt haben und bin soweit gekommen, dass ich mit der BassWasapi (ab Vista aufwärts) über ein Loopbackdevice per Fullduplex die Audiodaten an das Bass-0 Device (NoSound) mit einem BASS_STREAM_DECODE Channel sende, um von dort die Sampeldaten für die LED-Leiste zu beziehen.

Es funktioniert in sofern, dass ich die Daten korrekt erhalte.
Jedoch mit ca 5 Sekunden Latenz und das ist definitv zu viel!

An der Verarbeitung der Daten für die Leiste kann es jedenfalls nicht liegen, da es, im Selbstgeschriebenen Player, bei dem die Verarbeitung direkt am abspielenden Channel gekoppelt ist, keine (sitchtbare) Latenz gibt.

Somit muss es an dem Loopback, oder dem FullDuplex (andere Gründe nicht ausgeschlossen) liegen.
Wie gesagt, er erhält die korrekten Daten, nur zu stark versetzt.

Hier der Codeausschnitt (Mit Konsolenausgaben, da sich das ganze noch in Entwicklung befindet und ich wissen wollte, ob alles glatt läuft), in dem ich das ausgewählte Audiodevice initialisiere und den Stream an das NoSoundDevice der bass.dll sende.
Code:
                Console.Clear();
                if (this.WasapiHandler != null)
                {
                    this.WasapiHandler.RemoveFullDuplex();
                    bool Stop = this.WasapiHandler.Stop();
                    writeTextthenBool("Stop  :", Stop, "\n");
                    if (!Stop) this.writeBassError();

                    this.WasapiHandler.Dispose();

                }


                int Value = Convert.ToInt32(this.slider1.Value);
                this.label7.Content = (object)string.Format("{0} - {1}", BassWasapi.BASS_WASAPI_GetDeviceInfo(this.Loopbackdevices[Value]).name, this.Loopbackdevices[Value]);

                Console.WriteLine("Device soll = {0}", this.Loopbackdevices[Value]);
                Console.WriteLine("DeviceName = {0}", BassWasapi.BASS_WASAPI_GetDeviceInfo(this.Loopbackdevices[Value]).name);


                this.WasapiHandler = new BassWasapiHandler(this.Loopbackdevices[Value], false, 44100, 2, 0.01f, 0.01f);
                BASSError errdeklar = Bass.BASS_ErrorGetCode();
                Console.Write("Handler erstellen: ");
                if (errdeklar == BASSError.BASS_OK)
                    Console.ForegroundColor = ConsoleColor.Green;
                else
                    Console.ForegroundColor = ConsoleColor.Red;
                Console.WriteLine(errdeklar);
                this.ResetConsoleColor();

                bool? init = null;
                //if (!BassWasapi.BASS_WASAPI_GetDeviceInfo(this.Loopbackdevices[Value]).IsInitialized)
                init = this.WasapiHandler.Init();
                if (init.HasValue)
                {
                    writeTextthenBool("Init : ", init.Value, "\n");
                    if (!init.Value) this.writeBassError();
                }
                else
                    Console.Write("Init : Wurde schon initialisiert");


                Console.WriteLine("Bufferlen = {0}", this.WasapiHandler.BufferLength);

                //bool setdevice = BassWasapi.BASS_WASAPI_SetDevice(this.Loopbackdevices[Value]);
                //writeTextthenBool("Set  : ", setdevice, "\n");
                //if (!setdevice) this.writeBassError();

                bool Start = this.WasapiHandler.Start();
                writeTextthenBool("Start:", Start, "\n");
                if (!Start) this.writeBassError();
                Console.Write("Device Ist = ");
                Console.ForegroundColor = BassWasapi.BASS_WASAPI_GetDevice() == this.Loopbackdevices[Value] ? ConsoleColor.Green : ConsoleColor.Red;
                Console.WriteLine(BassWasapi.BASS_WASAPI_GetDevice());
                this.ResetConsoleColor();
                if (BassWasapi.BASS_WASAPI_GetDevice() == -1)
                {
                    Console.ForegroundColor = ConsoleColor.Red;
                    Console.WriteLine("ErrorCode = {0}", Bass.BASS_ErrorGetCode());
                    this.ResetConsoleColor();
                }



                this.WasapiHandler.SetFullDuplex(0, BASSFlag.BASS_STREAM_DECODE, false);

                this.chan = this.WasapiHandler.OutputChannel;
                //this.WasapiHandler.AddOutputSource(this.WasapiHandler.InputChannel, BASSFlag.BASS_STREAM_DECODE);

                Console.WriteLine("Outputchan: {0} - Device: {1}", this.WasapiHandler.OutputChannel, Bass.BASS_ChannelGetDevice(this.WasapiHandler.OutputChannel));
                //this.WasapiHandler.RemoveFullDuplex();


                Console.WriteLine("Inputchan : {0} - Device: {1}", this.WasapiHandler.InputChannel, Bass.BASS_ChannelGetDevice(this.WasapiHandler.InputChannel));

this.WasapiHandler ist die von mir genutzte Instanz des WasapiHandlers.
writeTextthenBool() ist ne (schlampig) geschriebene funktion zur Kosnolenausgabe mit farblich gekennzeichnetem boolischem Wert.
writeBassError() schreibt mir den Error der Bass (mit Farbe) in die Konsole, nichts weiter.
Die Geräte nutze ich im Shared Modus.

Die bass.dll ist in der Version 2.4.8.1,
die BassWasapi in 0.0.0.15,
der .Net Wrapper Bass.Net in der entsprechend kompatiblen Version.
Die Ausgabegeräte hab ich schon vorher auf die Loopback Geräte reduziert.

Mein System:
CPU: Intel i7 860
Grafikkarte: ATI Readon 5800 HD
Mainboard: Gigabyte GA-P55A-UD3
Soundkarte: Onboard

Wäre schön, wenn jemand eine Möglichkeit kennt, die Verzögerung zu eliminieren und diese dann auch noch hier schreibt :)
Im Anhang ist ein Bild der Leiste, für die, die's interresiert.
MFG
 

Anhänge

  • UmgewickelteLEDLeiste.jpg
    UmgewickelteLEDLeiste.jpg
    150,9 KB · Aufrufe: 7
Zuletzt bearbeitet:
Zurück