DirectSound stereo Kanal verzögern
-
Hallo zusammen,
ich bin gerade erst frisch in directsound eingestiegen, habe aber schon ein spezielles problem zu lösen: ich möchte während dem abspielen einer wav-datei einen stereokanal zeitverzögert ausgeben. ist das mit directsound irgendwie möglich? wie bekomme ich aus einer wav-datei die stereo kanäle separiert (dann könnte ich zumindest schonmal 2 verschiedenen puffer für die kanäle verwenden und könnte diese dann wieder zusammenmixen)?
vielen dank für vorschläge!
-
du solltest nicht 2 verschiedene buffer für einen stereo-sound verwenden. oder anders gesagt: ich würde das nicht empfehlen.
trennen kannst du die daten einfach indem du die daten eben trennst, ... in nem wav file wechseln sich die einzelnen kanäle immer ab, also erst ein sample links dann ein sample rechts dann wieder eins links etc.
verzögern kannst du das z.b. indem du die daten zwischen linken und rechtem kanal aufteilst, einen teil dann mit einer fifo verzögerst, und die kanäle dann wieder zusammenfügst. die so wieder zusammengefügten daten schliesslich steckst du dann in den directsound buffer rein.
-
Vielen Dank für den Tip!
Der Aufbau einer wav-Datei ist mir jetzt erstmal klar. Ich habe aber noch ein paar Fragen: Ist mit Daten aufteilen gemeint, dass ich die Daten aus der wav-Datei im Voraus z.B. auf zwei verschiedene Arrays für beide Kanäle aufteile und dann einen davon verzögert in den directsound buffer schreibe? Mein Problem ist dabei, dass ich verschiedene Zeitverzögerung so ziemlich in Echtzeit hinbekommen muss, während! die Datei abgespielt wird.
-
Naja, es gibt viele Möglichkeiten das zu implementieren.
Wie man es ab besten macht kommt wohl darauf an was das Ding genau können muss, also ob das Delay sich innerhalb fixer Grenzen (z.B. max. 1 Sekunde) bewegt oder nicht, wieviel Speicher man verbrauchen darf und wieviel CPU Zeit es fressen darf (und natürlich wie schnell die CPU ist).
Hast du ein Delay innerhalb fixer Grenzen kannst du einfach einen Puffer machen in dem du immer die letzte Sekunde (bzw. halt soviel wie dein max. Delay ist + ein bisschen was) pufferst, dann kannst du beim Anfüllen des Play Buffers einfach immer die nötigen Samples aus diesem Puffer rausholen.
Ist die Länge des Delays nicht begrenzt wird es komplizierter.Eine wichtige Frage ist auch noch: darf es beim Ändern des Delays (was ja wie ich dich verstehe während des Abspielens möglich sein muss) "knacken"? Wenn nicht wird es wieder ein Eck komplizierter. Und muss das "Ändern" des Delays "fliessend" geschehen, oder darf das Delay "springen"? Wenn es nicht springen darf wird es nämlich ein ganz riesiges Stück komplizierter, vor allem wenn du kein brutales Resampling-Rauschen im Output haben willst. Dann musst du nämlich "sauber" Resamplen, und das ist ne echte Herausforderung.
Oder vielleicht sagst du mir einfach was das überhaupt werden soll wenns fertig ist, vielleicht kann ich dir dann besser helfen

-
Vielen Dank erstmal für deine Hilfe!
Also:
Ich will versuchen den stereo "sweet spot" über die Anpassung der Laufzeiten zu verschieben. Dabei geht es um Verzögerungen von vielleicht max. 5 ms. Die Verzögerung sollte möglichst fließend erzeugt werden. Ich habe mir gedacht, dass man vielleicht einfach ein paar samples doppeln kann bis man das delay erreicht hat. Ich habe aber keine Ahnung, ob das ohne "knacksen" oder andere Artefakte möglich ist?