Mittwoch, 28. Juli 2010

Ton ausschalten / Lautstärke einstellen (Windows XP)

Nachtrag: Die hier vorgestellte Methode funktioniert nur bis Windows XP, nicht mit Vista und 7.
Zum Stummschalten des PCs unter diesen Betriebssystem habe ich diesen Post geschrieben.

Mittels P/Invoke (d.h. über Einbinden einer WinAPI - Funktion) kann man sehr leicht den PC stummschalten (muten) oder allgemein die Lautstärke verändern. Das Ändern der Lautstärke mit dieser Funktion ändert die Einstellung für die WAVE - Lautstärke (der Schieberegler ist auch in der Windows Lautstärkeregelung zu sehen), welche eigentlich alle Sounds auf dem PC betrifft.
Zum Einbinden von API - Funktionen ist die using - Direktive using System.Runtime.InteropServices; nötig, folgende Funktion wird benötigt:

[DllImport("winmm.dll")]
public static extern int waveOutSetVolume(IntPtr device, uint volume);

Der Parameter device bezeichnet das Audiogerät, welches angesprochen werden soll. Ist nur eins vorhanden (Standardfall), kann einfach ein Null - Pointer übergeben werden. volume gibt die Lautstärke an.
Der Wertebereich beträgt hierbei 0 - 65535, wobei bei 0 Stille herrscht und 65535 volle Lautstärke bedeutet.
Folgender Aufruf schaltet beispielsweise den Ton am PC komplett aus:

waveOutSetVolume(IntPtr.Zero, 0);

Kommentare:

  1. Bei mir (in Windows7Ultimate x64) wird bei IntPtr.Zero nur das Programm selbst stumm gestellt.
    Nicht der PC.

    Wie könnte man die Adressen der Devices herausfinden?

    AntwortenLöschen
  2. Hi,
    hast Recht, hatte den Post noch mit XP geschrieben da ging's, und unter Vista und 7 wird anscheinend nur das Programm stumm gestellt.
    Hm, Adressen der Devices sind etwas schwierig, auf jeden Fall lässt sich die Anzahl dieser über
    waveInGetNumDevs herausfinden.
    Kannst ja damit etwas experimentieren falls es dich interessiert.
    Ich habe jetzt aber einen neuen Post geschrieben, wie man unter Windows Vista und 7 den PC stumm schalten kann.
    Danke für deinen Hinweis.

    AntwortenLöschen
  3. Hallo!

    Ist es auch möglich die „Line In“- Lautstärke zu verändern?
    Mfg!

    AntwortenLöschen
  4. Hallo Martin,

    so einfach ist es bei der LineIn Lautstärke meines Wissens leider nicht.
    Eine Möglichkeit jedoch dies zu erreichen ist über die Funktion mixerSetControlDetails().
    Diese ist allerdings recht umfangreich, deswegen musst du dir deinen Code wohl selber zusammenflicken, ein gutes Einstiegsbeispiel gibt's hier:
    http://support.microsoft.com/kb/178456/de

    Hoffe ich konnte ein bisschen helfen, vielleicht setze ich mich irgendwann mal hin und befasse mich näher mit dem Thema.

    AntwortenLöschen
  5. Hallo gibt es auch eine Möglichkeit den aktuellen Wert mit c# abzufragen?
    So das ich dann einen wert zwischen 0 - 65535 als Rückgabewert bekomme!?

    AntwortenLöschen
  6. Hallo, ich habe eine WinForms anwendung in C# geschrieben. und zwar einen eigenen MediaPlayer. Dieser Post hier ist sehr hilfreich wegen der Lautstärkeregelung. Nur gibt es dabei ein Problem... Wenn ich versuche die Lautstärke zu verändern, funktioniert zwar aber..., dann wird nur eine Box lauter/leiser.
    Wie schaffe ich es das beide boxen einen Sound ausgeben und entsprechend dem Pegel lauter oder leiser wird?
    Wäre super wenn hier einer eine gute Lösung geben könnte.

    AntwortenLöschen
  7. Hallo LegecyWolf, leider verstehe ich deinen Kommentar nicht ganz?
    Das Ändern von Soundeinstellungen über C# ändert nur den Sound an einer Box, bei welcher Operation genau?
    Das müsste meiner Meinung nach an den Einstellungen im Betriebssystem liegen (wie die Lautsprecher definiert sind), da du in C# über die meisten "Soundoperationen" das "Hauptsoundsystem" ansprichst.

    AntwortenLöschen