Wie kann man bei Direct Sound die Verzögerung bei Effekten minimieren?



  • Hallo!

    Ich habe festgestellt, dass der Abstand zwischen Play- und WriteCursor ziemlich gross wird, sobald man einen Effekt mit SetFx() auf einen SoundBuffer setzt.

    Ohne Effekt läuft bei mir der WriteCursor mit etwa 1700 Bytes vor dem PlayCursor.
    Mit Effekt sind es etwa 20000 Bytes. Das sind bei einer durchschnittlichen ByteRate von 176400 Bytes/s etwa 100ms Gap.

    Da ich einen Buffer beim Recorden gleich wieder mit Effekt abspielen möchte ist mir das eindeutig zu viel.

    Ohne Effekt ist die Verzögerung kaum wahrzunehmen. Mit Effekt ist die Verzögerung deutlich zu hören. (Klingt aber nicht ganz nach 100ms, vielleicht stimmen die CursorPosition Angaben auch nicht zu 100%, obwohl ich schon DSBCAPS_GETCURRENTPOSITION2 als Flag für den Soundbuffer mitgesetzt habe.)

    Ich denke mir den Abstand zwischen Play und WriteCursor braucht er zum Cachen und Preprocessing der Effekte.

    Nun meine Fragen:
    Kann man diesen Abstand irgendwie minimieren? Und wenn ja wie?
    Wie gesagt ohne Effekt ist die Verzögerung akzeptabel. Nur mit zickt das alles.

    Einfach vor dem Writecursor in den Buffer die Daten vom Recording zu schreiben funktioniert nicht, dann rauscht und knistert alles.

    Ich hoffe jemand versteht was ich meine und hat einen guten Tipp parat. Sorry wenn ich mich kompliziert oder unverständlich ausgedrückt habe.

    Mein erster Beitrag hier. Seid gegrüßt ihr C/C++ Freaks - hoffe ihr könnt mir helfen

    Gruß Jan



  • Ja, den Effekt selbst programmieren und selbst drüberrechnen bevor man es in den Play-Buffer reinsteckt -- also auf Deutsch: verwende DirectSound bloss zum Aufnehmen und Abspielen, aber nicht für den Effekt.



  • Ich wuerde sagen, das geht gar nicht, wenn der Effekt mehr als nur ein paar Bytes braucht, um berechnet zu werden. Und schrecklich ineffizient wuerde es auch, da man staendig da ein kleines Stueck weiterrechnen muss. f'`8k

    Gruß, TGGC (\-/ has leading)



  • Hmmm, also den Effekt selber drüberrechnen, das krieg ich nie selber hin... dazu habe ich zu wenig Wissen darüber wie man Effekte überhaupt schreibt.
    Gibt es da schon vorgefertigte Effekte, so wie die von Direct Sound, die man irgendwie einbinden kann?



  • @TGGC: Doch, das geht. Wenn der Effekt mehr Samples braucht dann muss man eben einen Buffer verwenden wo man alte Samples aufhebt. Und wie effizient das wird hängt hauptsächlich davon ab wie gut es programmiert ist. BTW: wenn man ne geringe Latenz will *muss* man mit kleinen Chunks arbeiten, und muss auch diese kleinen Chunks in den DirectSound Buffer reinschreiben. Alleine das ist schon ineffizient, da wird die Berechnung eines Effekts mit kleinen Chunks kaum noch viel ausmachen.

    @jleibold: Um was für Effekte geht's denn im speziellen? Es gibt Effekte die ganz einfach umsetzbar sind (z.B. Echo, Reverb), aber natürlich auch andere die ziemlich schwierig sind.



  • Wenn der Effekt mehr Samples braucht dann muss man eben einen Buffer verwenden wo man alte Samples aufhebt

    und bis dieser buffer so viele samples enthaelt wie noetig sind, ist eine bestimmte zeit vergangen - und um genau dieses problem geht es.

    Es gibt Effekte die ganz einfach umsetzbar sind (z.B. Echo, Reverb)

    realistischer reverb heisst die impulsantwort eines raumes zu synthetisieren.
    so "ganz einfach" ist das nun auch wieder nicht.



  • hustbaer schrieb:

    einen Buffer verwenden wo man alte Samples aufhebt.

    Wer lesen kann, ist klat im Vorteil. f'`8k

    Gruß, TGGC (\-/ has leading)


Anmelden zum Antworten