Zugriff auf die Master Lautstärke über C#



  • Hi!

    Ich komme nicht weiter und bräuchte etwas Hilfe. Ich versuche mit C# über die
    Windows API die Master Lautstärke von Windows auszulesen.
    Dafür habe ich folgenden Code geschrieben:

    using System;
    using System.Runtime.InteropServices;
    
    namespace VolumeAPI
    {
    	class Class1
    	{		
    		[DllImport("Winmm.dll")]
    		public static extern int auxGetVolume(long uDeviceID, long lpdwVolume);
    
    		static void Main(string[] args)
    		{
    			long testVolume = new long();
    
    			int retval = auxGetVolume(0,testVolume);
    			System.Console.WriteLine("Die Lautstärke ist: "+testVolume.ToString());
    			System.Console.WriteLine("Fehlercode: "+retval.ToString());
    
    			System.Console.Read();	
    		}
    	}
    }
    

    Die Konsolenausgabe lautet:

    Die Lautstärke ist: 0
    Fehlercode: 11

    Fehlercode 11 bedeutet laut MMSystem.h, dass einer der Parameter von
    auxGetVolume ungültig ist.
    Was mach ich da falsch????

    Gruss



  • na was ist z.b. uDeviceID? warum ist sie 0?
    hast du mit auxGetNumDevs() geprüft, ob überhsupt was "existiert"? bei mir gibt die funktion immer 0 zurück. 😕



  • auxGetNumDevs() gibt mir 0 zurück, womit bewiesen wäre, dass
    auxGetVolume() auf meinen System wohl nicht funktioniert (liegt das
    an der Soundkarte? Naja).

    Also: Strategiewechsel.
    Neuer Versuch mit waveOutGetVolume().
    Ist zwar nicht das was ich wollte (Ich wollte ja die Gesammtlautstärke),
    ist aber als Test OK.
    waveOutGetNumDevs() gibt 1 zurück,
    es muss also ein Device vorhanden sein. Der neue Code lautet:

    using System;
    using System.Runtime.InteropServices;
    
    namespace VolumeAPI
    {
    	class Class1
    	{		
    		[DllImport("Winmm.dll")]
    		public static extern int waveOutGetVolume(long uDeviceID,long lpdwVolume);
    
    		static void Main(string[] args)
    		{
    			long testVolume = new long();
    
    			int retval = waveOutGetVolume(0,testVolume);
    			System.Console.WriteLine("Die Lautstärke ist: "+testVolume.ToString());
    			System.Console.WriteLine("Fehlercode: "+retval.ToString());
    
    			System.Console.Read();	
    		}
    	}
    }
    

    Ausgabe:
    Die Lautstärke ist: 0
    Fehlercode: 11

    Deja vu!

    Villeicht ist ja die uDeviceID gar nicht 0. Wie finde ich die raus?



  • Ok, ich geb's ja, zu - Es wird wahrscheinlich keinen mehr interessieren, aber ich hab grad so durch's Forum geschmökert und konnt' nicht anders:

    Wildside schrieb:

    auxGetNumDevs() gibt mir 0 zurück, womit bewiesen wäre, dass
    auxGetVolume() auf meinen System wohl nicht funktioniert (liegt das
    an der Soundkarte? Naja).

    Nö, liegt an deiner Implementierung 😉

    Wildside schrieb:

    Also: Strategiewechsel.

    Hm, Trick 17!?

    Wildside schrieb:

    using System;
    using System.Runtime.InteropServices;
    
    namespace VolumeAPI
    {
      class Class1
      {		
        // [DllImport("Winmm.dll")]
        // public static extern int waveOutGetVolume(long uDeviceID,long lpdwVolume); // Jup, schon, nur...
        //
        // Ist waveOutGetVolume in VC++ wie folgt definiert:
        //
        // WINMMAPI MMRESULT WINAPI waveOutGetVolume( IN HWAVEOUT hwo, OUT LPDWORD pdwVolume);
        // 
        //   MMRESULT == UINT (32 Bit) ...entsprechung in C#: uint
        //   HWAVEOUT == void *        ...hier wurscht, da IN.
        //     Darfst dich hier auf das automatische Marshaling verlassen.
        //     Nur ist ein Device ID ein VC++ UINT (32 Bit) und in
        //     C# wär da ein long (64 Bit, signed) doch ein bisserl übertrieben.
        %F   DWORD == UINT (32 Bit)    ...entsprechung in C# uint und kein long
        //
        // Daraus und aus der Tatsache, daß pdwVolume als OUT und void* definiert ist, folgt:
    
        [DllImport("Winmm.dll")] 
        public static extern uint waveOutGetVolume(uint uDeviceID, ref uint lpdwVolume);
    
        static void Main(string[] args)
        {
          // long testVolume = new long();    Nö, uint ->
          uint testVolume = 0;
          
          // int retval = waveOutGetVolume(0,testVolume);   Nö, uint und ref ->
          uint retval = waveOutGetVolume(0, ref testVolume);
    
          // Console.WriteLine("Die Lautstärke ist: "+testVolume.ToString());    Nö ->
          // Da bekommst irgendwas, denn:
          //   "The low-order word of this location contains the left-channel volume setting,
          //    and the high-order word contains the right-channel setting."
          // Also:
    	ushort LeftVolume = (ushort) (testVolume & 0xffff); // low word
    	ushort RightVolume = (ushort) (testVolume >> 16);   // high word
           Console.WriteLine("Linke Lautstärke:  " + LeftVolume.ToString());
           Console.WriteLine("Rechte Lautstärke: " + RightVolume.ToString());
    
          Console.WriteLine("Fehlercode: "+retval.ToString());    Jup, aber
          // Davon wirst wohl nicht viel haben, also:
          switch(retval)
          {
            case 5:
              Console.WriteLine("Ungültiges Handle!");
              break;
            case 6:
              Console.WriteLine("Kein Gerätetreiber installiert!");
              break;
            case 7:
              Console.WriteLine("Speicherreservierung fehlgeschlagen!");
              break;
            case 8:
              Console.WriteLine("Die angeforderte Funktion wird nicht unterstützt!");
              break;
            case 0:
              Console.WriteLine("Kein Fehler.");
              break;
          }
          System.Console.Read();	
        }
      }
    }
    

    Wildside schrieb:

    Ausgabe:
    Die Lautstärke ist: 0
    Fehlercode: 11

    Deja vu!

    Tja, Fehlercode 11 wär dann MMSYSERR_INVALPARAM (invalid parameter passed) gewesen 😉

    Ich hoff jetzt sind alle Klarheiten beseitigt

    GreeTz, Swordfish


Anmelden zum Antworten