|
Registriert seit: 22. Apr 2004 Ort: Hagen 322 Beiträge Turbo Delphi für Win32 |
#1
Ziel:Ändern des primären Soundgerätes für, Ausgabe, Aufnahme und Midiausgabe.
Die Funktionen:
Delphi-Quellcode:
Die Funktionen geben als Ergebnis das Ergebnis der Message funktion zurück, was eine detailierte Fehleranalyse zulässt, Rückgabewerte sind wie folg:
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; ![]() 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 } 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:
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!
...
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; ... Im Anhang hab ich noch nen kleines Beispielprogramm gepackt! Viel Spaß damit, Eichhoernchen
Jan
|
![]() |
Ansicht |
![]() |
![]() |
![]() |
ForumregelnEs ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.
BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus. Trackbacks are an
Pingbacks are an
Refbacks are aus
|
|
Nützliche Links |
Heutige Beiträge |
Sitemap |
Suchen |
Code-Library |
Wer ist online |
Alle Foren als gelesen markieren |
Gehe zu... |
LinkBack |
![]() |
![]() |