Switchen des Wiedergabegeräts



  • Hallo @all,
    ich habe mir vorgenommen zur Übung ein kleines Programm / Script zu schreiben, welches das Wiedergabegerät unter Windows 7 switcht.
    Zur Erklärung:
    `

    Am Computer sind zwei normale Boxen angeschlossen sowie ein Headset.

    Jetzt ist es ja so das man nur ein Standardgerät auswählen kann, d.h. man kann den Ton in meinem Fall entweder nur über die Lautsprecher oder über das Headset wiedergeben lassen.

    Um das Wiedergabegerät umzuschalten führt man man unter Windows 7 einen Rechtsklick auf das Lautsprechersymbol in der Taskleiste aus und wählt "Wiedergabegeräte", im erscheinendem Fenster wählt man das gewünschte Wiedergabegerät aus, führt einen Rechtsklick darauf aus und wählt anschließend "Als Standardgerät auswählen"

    Ich habe mir mit AutoIt ein Script geschrieben, das erkennt welches dieser beiden Geräte momentan das Standardgerät ist, und anschließend auf das andere umschaltet. Habe ich gerade das Headset als Standardgerät, schaltet mir das Script bei ausführung die normalen Lautsprecher als Standartgerät um.`

    Nun ist es leider so, das mir dieses Script zu lange braucht um das Problem zu lösen (manchmal über 5 sekunden!) da es von mir auf eine eher unkonventionelle weise gelöst wurde. Außerdem beansprucht es 25% Leistung meines Intel i5 3570k

    Aus diesem Grund suche ich nach einer schnelleren Möglichkeit und bitte euch mir alle Möglichkeiten zu nennen die euch einfallen um dieses Problem zu lösen. Mein Idee war auf die Registry zuzugreifen und den Wert dort ändern zu lassen, leider weiss ich jedoch nicht wie ich herausfinden kann wo ich die richtigen Schlüssel finden kann und ob das überhaupt auf diese Weise machbar ist.

    Ich bedanke mich im voraus für eure Hilfe ! 🙂

    MFG
    Edward Black



  • Es gibt keine dokumentierte API über die man das Default-Audio Device unter Windows Vista oder 7 ändern könnte. Warum weiss keiner so genau. Anscheinend weil MS meint ein Programm müsse das nicht können, und daher sollte es ein Programm auch nicht können.
    (Unter Windows XP war es dagegen relativ einfach.)

    Zum Ändern braucht man das undokumentierte IPolicyConfig Interface. Gibt aber Libraries die bereits die nötige Funktionalität bereitstellen, z.B. diese hier: http://software.xfx.net/netcl/mxp/



  • Ich denke damit sollte ich es schaffen, Thx!
    Ich versuche zur Übung ein normales C++ Projekt zu erstellen, bei dem ich lediglich zwei Eingaben machen kann, 1 oder 2. Wenn ich 1 wähle, soll das Headset das Standardgerät sein, bei 2 die Lautsprecher, mal sehen ob ich es hinbekomme. Falls nicht kann mir ja vielleicht hoffentlich jemand Helfen.
    Nochmals Danke!

    Edit: Wird wohl doch um einiges schwerer als ich dachte. Ich dachte weil der Source Code dabei ist wird es kein Problem sein, aber ich bekomme vom Debugger jede Menge Fehler ausgegeben wenn ich versuche das mitgelieferte Projekt zu compilen. (z.B: "Der Typ Volume Fader ist nicht definiert") Habe ich etwas bestimmtes vergessen ?! Woran könnte es liegen ?
    Wäre nice wenn sich das mal jemand anschauen könnte der mehr Erfahrung hat.

    MFG
    Edward Black



  • Ich hatte das gleiche Problem.
    Ich habe ein kleines Script gefunden, welches mit das Ausgabegerät über einen Hotkey ändert.
    http://www.computerbase.de/forum/showthread.php?t=829148
    Alternativ kanst du das ganze ev auch mit Autoit einfach realisieren



  • Danke für deine Antwort, ich schaue mir die verlinkte Website an. Ich habe es ja wie erwähnt bereits mit AutoIt lösen können, aber auf eine wahrscheinlich eher unkonventionelle Art, nämlich mit der ImageSearch Methode.

    Könntest du mir bitte den Quellcode deines AutoIt Programms mitteilen ? Das würde mir sehr weiterhelfen ! Ich bedanke mich im voraus für jede Hilfe!

    Edit: Mit AutoHotKey kann ich leider nicht das erreichen was ich vor hatte. Ich wollte eigentlich das das Programm sobald ich es ausführe automatisch erkennt welches Gerät momentan das Standardgerät ist, und dann dementsprechend das andere zum Standardgerät macht.
    Oder eben mit C++ ein Prog schreiben bei dem Abgefragt wird welches Gerät das Standardgerät sein soll und anschließend dementsprechend geändert werden soll.

    Gruß
    Black



  • Du kannst erstmal mit IMMDeviceEnumerator::EnumAudioEndpoints die Audio-Endpoints enumerieren.
    Das ist ein dokumentiertes Interface, mit C++ muss man das einfach nur verwenden. COM-Grundlagenkenntnisse vorausgesetzt. Bzw. wenn du nach dem Funktionsnamen googelst findest du vielleicht Beispielcode.
    (Ein Endpoint ist im Prinzip ein Ausgang bzw. Eingang einer Soundkarte -- d.h. eine Soundkarte kann auch mehrere "Render" (Ausgang) Endpoints haben.)

    Und dann musst du mit IPolicyConfig::SetDefaultEndpoint den neuen Default-Endpoint einstellen.
    Zu IPolicyConfig gibt es keine offizielle Doku und auch keine offiziellen Header-Files. Aber es gibt Leute die das Reverse-Engineered haben, und deren Code in diversen Open-Source Projekten zu finden ist.
    z.B. hier:
    http://code.google.com/p/soundprison/source/browse/trunk/ipolicyconfig.h?r=4&spec=svn6

    Oder das, sieht nach einem fertigen Commandline-Tool zum Ändern des Default Audio-Endpoints aus:
    https://zorn-software.svn.beanstalkapp.com/src/SetDefaultAudioDevice/

    Oder hier ein ganzer Artikel zu dem Thema - enthält auch den kompletten Code zu so einem Tool:
    http://www.daveamenta.com/2011-05/programmatically-or-command-line-change-the-default-sound-playback-device-in-windows-7/

    Wenn du es mit C++ machen möchtest musst du den Code von diesen Seiten im Prinzip nur noch auf deine Anforderungen anpassen.



  • Vielen Dank hustbaer ! 🙂 Ich werde mich gleich mal informieren. Ich werde euch über meine Fortschritte oder Fehlschläge informieren 😉

    Edit: Habe mir gerade alles angeschaut und sehe das mir das ein paar Level zu hoch ist. Schließlich habe ich gerade mal 2 Jahre Erfahrung mit C++. Aber zumindest habe ich jetzt ein Programm gefunden mit dem ich per Konsoleneingabe umschalten kann (letzter Link)!

    Oder könnte ich es hinbekommen wenn ich die Grundlagen von COM beherrschen würde ? Falls ja, kann mir jemand einen Tipp geben wo ich COM am besten lernen kann ?


Anmelden zum Antworten