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