Registriert seit: 22. Apr 2004
Ort: Hagen
322 Beiträge
Turbo Delphi für Win32
|
Primäre Soundkarte setzen
21. Jul 2006, 10:24
Ziel:Ändern des primären Soundgerätes für, Ausgabe, Aufnahme und Midiausgabe.
Die Funktionen:
Delphi-Quellcode:
uses MMSystem;
...
const
DRVM_MAPPER = $2000; // mmddk.h #define DRVM_MAPPER 0x2000
DRVM_MAPPER_PREFERRED_GET = DRVM_MAPPER+21; // mmddk.h, damit könnte man sich die ID der primären Soundkarte besorgen
DRVM_MAPPER_PREFERRED_SET = DRVM_MAPPER+22; // in einer uralten version von mmddk.h, jetzt undokumentiert
...
//Ändert die primäre Soundkarte für die Ausgabe
function ChangePrimarySndOutDevice(dev: cardinal): integer;
{dev Bereich: 0 bis waveOutGetNumDevs - 1}
begin
result := waveOutMessage(HWAVEOUT(WAVE_MAPPER), DRVM_MAPPER_PREFERRED_SET, dev, 0);
end;
//Ändert die primäre Soundkarte für die Aufnahme
function ChangePrimarySndInDevice(dev: cardinal): integer;
{dev Bereich: 0 bis waveInGetNumDevs - 1}
begin
result := waveInMessage(HWAVEIN(WAVE_MAPPER), DRVM_MAPPER_PREFERRED_SET, dev, 0);
end;
//Ändert die primäre Soundkarte für die MIDI-Ausgabe
function ChangePrimaryMidiOutDevice(dev : cardinal): integer;
{dev Bereich: 0 bis midiOutGetNumDevs - 1}
begin
result := midiOutMessage(HMIDIOUT(MIDI_MAPPER), DRVM_MAPPER_PREFERRED_SET, dev, 0);
end;
Die Funktionen geben als Ergebnis das Ergebnis der Message funktion zurück, was eine detailierte Fehleranalyse zulässt, Rückgabewerte sind wie folg:
Zitat:
MMSYSERR_NOERROR { no error }
MMSYSERR_ERROR { unspecified error }
MMSYSERR_BADDEVICEID { device ID out of range }
MMSYSERR_NOTENABLED { driver failed enable }
MMSYSERR_ALLOCATED { device already allocated }
MMSYSERR_INVALHANDLE { device handle is invalid }
MMSYSERR_NODRIVER { no device driver present }
MMSYSERR_NOMEM { memory allocation error }
MMSYSERR_NOTSUPPORTED { function isn't supported }
MMSYSERR_BADERRNUM { error value out of range }
MMSYSERR_INVALFLAG { invalid flag passed }
MMSYSERR_INVALPARAM { invalid parameter passed }
MMSYSERR_HANDLEBUSY { handle being used
simultaneously on another
thread (eg callback) }
MMSYSERR_INVALIDALIAS { specified alias not found }
MMSYSERR_BADDB { bad registry database }
MMSYSERR_KEYNOTFOUND { registry key not found }
MMSYSERR_READERROR { registry read error }
MMSYSERR_WRITEERROR { registry write error }
MMSYSERR_DELETEERROR { registry delete error }
MMSYSERR_VALNOTFOUND { registry value not found }
MMSYSERR_NODRIVERCB { driver does not call DriverCallback }
MMSYSERR_LASTERROR { last error in range }
Anwendung:
Auf dem Formular exsistieren 3 Combobox, 3 labels zur Beschreibung letzterer und ein Button.
Wenn das Formular geladen wird werden die verfügbaren Geräte in die Comboboxen geschrieben(GetXXXDevices), anschließend wählt der User seine bevorzugten Geräte aus und legt diese mit einem Klick auf den Button fest.
Delphi-Quellcode:
...
type
TMainForm = class(TForm)
ComboBox1: TComboBox; //SoundAusgabe
ComboBox2: TComboBox; //SoundAufnahme
ComboBox3: TComboBox; //MidiAusgabe
Button1: TButton; //Einstellugen übernehmen
Label1: TLabel; //Beschriftung der Comboboxen
Label2: TLabel;
Label3: TLabel;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
procedure GetOutDevices;
procedure GetInDevices;
procedure GetMidiOutDevices;
public
{ Public declarations }
end;
var
MainForm: TMainForm;
implementation
{$R *.dfm}
uses MMSystem;
const
DRVM_MAPPER = $2000; // mmddk.h #define DRVM_MAPPER 0x2000
DRVM_MAPPER_PREFERRED_GET = DRVM_MAPPER+21; // mmddk.h
DRVM_MAPPER_PREFERRED_SET = DRVM_MAPPER+22; // in einer uralten version von mmddk.h
function ChangePrimarySndOutDevice(dev: cardinal): integer;
{dev Bereich: 0 bis waveOutGetNumDevs - 1}
begin
result := waveOutMessage(HWAVEOUT(WAVE_MAPPER), DRVM_MAPPER_PREFERRED_SET, dev, 0);
end;
function ChangePrimarySndInDevice(dev: cardinal): integer;
{dev Bereich: 0 bis waveInGetNumDevs - 1}
begin
result := waveInMessage(HWAVEIN(WAVE_MAPPER), DRVM_MAPPER_PREFERRED_SET, dev, 0);
end;
function ChangePrimaryMidiOutDevice(dev : cardinal): integer;
{dev Bereich: 0 bis midiOutGetNumDevs - 1}
begin
result := midiOutMessage(HMIDIOUT(MIDI_MAPPER), DRVM_MAPPER_PREFERRED_SET, dev, 0);
end;
//Listet alle verfügbaren Ausgabekarten
procedure TMainForm.GetOutDevices;
var
dev: Integer;
caps: TWaveOutCaps;
begin
ComboBox1.Clear;
for dev := 0 to waveOutGetNumDevs - 1 do
begin
waveOutGetDevCaps(dev, @caps, sizeof(TWaveOutCaps));
ComboBox1.Items.Add(caps.szPname);
end;
ComboBox1.ItemIndex := 0; //Die jetzige primäre Soundkarte auswählen
end;
//Listet alle verfügbaren AufnahmeKarten
procedure TMainForm.GetInDevices;
var
dev: Integer;
caps: TWaveInCaps;
begin
ComboBox2.Clear;
for dev := 0 to waveInGetNumDevs - 1 do
begin
waveInGetDevCaps(dev, @caps, sizeof(TWaveInCaps));
ComboBox2.Items.Add(caps.szPname);
end;
ComboBox2.ItemIndex := 0; //Die jetzige primäre Soundkarte auswählen
end;
//Listet alle Midiausgabe Geräte
procedure TMainForm.GetMidiOutDevices;
var
dev: Integer;
caps: TMidiOutCaps;
begin
ComboBox3.Clear;
for dev := 0 to midiOutGetNumDevs - 1 do
begin
midiOutGetDevCaps(dev, @caps, sizeof(TMidiOutCaps));
ComboBox3.Items.Add(caps.szPname);
end;
ComboBox3.ItemIndex := 0; //Die jetzige primäre Soundkarte auswählen
end;
//Alle Comboboxen füllen
procedure TMainForm.FormCreate(Sender: TObject);
begin
GetOutDevices;
GetInDevices;
GetMidiOutDevices;
end;
procedure TMainForm.Button1Click(Sender: TObject);
begin
if ChangePrimarySndOutDevice(Combobox1.ItemIndex) = MMSYSERR_NOERROR then
begin
GetOutDevices; //Windows setzt immer die primäre Karte als 0, daher müssen wir die Liste neu holen
MessageDlg('Primäres Ausgabegerät wurde erfolgreich geändert', mtInformation, [mbOK], 0);
end
else
MessageDlg('Fehler beim Setzen des primären Ausgabegerätes', mtError, [mbOK], 0);
if ChangePrimarySndInDevice(Combobox2.ItemIndex) = MMSYSERR_NOERROR then
begin
GetInDevices; //Windows setzt immer die primäre Karte als 0, daher müssen wir die Liste neu holen
MessageDlg('Primäres Aufnahmegerät wurde erfolgreich geändert', mtInformation, [mbOK], 0);
end
else
MessageDlg('Fehler beim Setzen des primären Aufnahmegerätes', mtError, [mbOK], 0);
if ChangePrimaryMidiOutDevice(Combobox3.ItemIndex) = MMSYSERR_NOERROR then
begin
GetMidiOutDevices; //Windows setzt immer die primäre Karte als 0, daher müssen wir die Liste neu holen
MessageDlg('Primäres MIDI-Ausgabegerät wurde erfolgreich geändert', mtInformation, [mbOK], 0);
end
else
MessageDlg('Fehler beim Setzen des primären MIDI-Ausgabegerätes', mtError, [mbOK], 0);
end;
...
Wenn man beispielsweise 2 Soundkarten hat und einfach immer wechseln will genügt es ChangePrimarySndXDevice(1) zu schreiben, da Windows(XP) die Devicebelegung jedesmal vertauscht!
Im Anhang hab ich noch nen kleines Beispielprogramm gepackt!
Viel Spaß damit,
Eichhoernchen
Jan
|