Soundstream Input >> Output



  • mustafa schrieb:

    hugihuginugi nugi?

    Lieber mustafa,
    vielen Dank für deinen Versuch mir zu helfen.
    Leider konnte ich dich nicht verstehen,
    drück dich bitte ein bisschen klarer aus 😃

    mfG



  • Ich habe jetzt 2 Stunden lang im Internet nach dem Problem gesucht.
    Es wurde auch schon oft gestellt, eine vielversprechende Lösung gab es bis jetzt aber leider noch nicht :(.

    Es lief immer darauf hinaus, dass man eine Soundkarte simulieren muss ,was ich leider noch nicht kann.

    Wie funktioniert das denn in so Stimmenverzerrer-Programmen?
    Die greifen ja auch auf die Spracheingabe zu und filtern sie dann nach ihren Wünschen.

    mfG
    →euer Listing



  • Das ist die andere Richtung - die lesen vom Eingang der Soundkarte, rechnen dann ihren Effekt drüber und schreiben auf den Ausgang der Soundkarte.



  • Mal anders, kann man "waveInAddBuffer" auch iergendwie auf ein Output-device anwenden?



  • Listing schrieb:

    Mal anders, kann man "waveInAddBuffer" auch iergendwie auf ein Output-device anwenden?

    Nein.



  • Ich hab waveInAddBuffer eines vorher beliebig selektierten Targets-gehookt:

    MMRESULT __cdecl HookedWaveInAddBuffer(HWAVEIN hwi, LPWAVEHDR pwh, UINT cbwh){
    	if(!simulateMicrophoneInput)
    	{
    		return OriginalWaveInAddBuffer(hwi,pwh,cbwh);
    	}
    	else
    	{
    	//Manipulation
    	//Fill pwh with our data...
    	pwh->dwBytesRecorded = ...
    
    	return 0;
    	}
    
    }
    

    Wie muss ich da jetzt genau vorgehen, damit das Target Programm (Online-Game spracheingabe / Yahoo-Sprach chat / Microsoft Voice Recorder) das schluckt?
    Vor allem, wie bekomme ich meinen Sound in das Format, dass
    "pwh->lpData" braucht?

    Kann ich dwBytesRecorded einfach so groß machen wie den Sound und den Buffer auch, dann einfach returnen?

    PS:
    Ja, waveInBuffer wird von den allen gecallt



  • @Listing:
    Du darfst an dem was das aufrufende Programm reinschreibt nix ändern, d.h. dein Hook muss "transparent" arbeiten.

    Lies dir einfach die Dokumentation der original Funktion durch. Alles das was dort "versprochen" wird muss deine Funktion "halten".



  • Ja das ist ja erstmal zweitrangig.
    Ich möchte, dass man einfach erstmal was hört 🙂
    Den Rest mache ich dann später



  • Das wird vermutlich nicht so einfach sein.
    Ich denke alleine waveInAddBuffer zu hooken wird lange nicht ausreichen. Würde mich zumindest sehr wundern wenn -- ich wüsste nicht wie man das anstellen sollte.

    Wie kommst du überhaupt auf die Idee gerade waveInAddBuffer zu hooken? Und wie "hookst" du die Funktion überhaupt?



  • hustbaer schrieb:

    Wie kommst du überhaupt auf die Idee gerade waveInAddBuffer zu hooken?

    Naja, da holt sich das Programm ja die Daten vom Mikrofon. Ich könnte doch einfach die Daten vom Mikrofon manipulieren, dass da meine Daten stehen (eventuell vermischt mit den Daten vom Mikrofon später). Das ist meine Idee.

    Die Idee kommt daher, dass Debugging ergeben hat (^^), dass alle Programme mehrmals in der Sekunde waveInAddBuffer aufrufen um Daten vom Mikrofon zu erhalten.

    Und wie "hookst" du die Funktion überhaupt?

    Detours.h von Microsoft, ich hooke die API aus einer DLL die ich mit meinem Injector in die Programme lade. (LoadLibraryA Methode)

    Warum reicht das denn nicht aus? Die Funktion füllt doch den übergebenen Buffer, kann man das nicht mit fake-Daten probieren? Ich müsste nur mein sound-file (test.mp3) in dieses WavStream Format bringen was da erwatet wird



  • Du solltest dir wirklich mal die Doku durchlesen und versuchen sie zu verstehen.

    waveInAddBuffer übergibt einen Puffer an die API der dann SPÄTER gefüllt wird.
    Wenn er fertig gefüllt ist wird das Programm benachrichtigt (Callback, Event, ...).
    D.h. in waveInAddBuffer, bzw. gleich nachdem waveInAddBuffer zurückkehrt sind die Daten vom Eingang der Soundkarte noch NICHT im Puffer drinnen, das passiert später.
    Daher macht es IMO auch keinen Sinn diese Funktion zu hooken.



  • Sicher das waveInAddBuffer() überhaupt verwendet wird? Die meisten Programme gehen doch eher über DirectShow hätte ich gedacht?



  • Ok ihr habt recht, ich muss mir wohl doch meinen Treiber zusammenschustern.
    DDK hab ich ja schon drauf, wünscht mir Glück 😃


Anmelden zum Antworten