Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Library: Grafik / Sound / Multimedia (https://www.delphipraxis.net/21-library-grafik-sound-multimedia/)
-   -   Delphi Primäre Soundkarte setzen (https://www.delphipraxis.net/73654-primaere-soundkarte-setzen.html)

Eichhoernchen 21. Jul 2006 10:24


Primäre Soundkarte setzen
 
Liste der Anhänge anzeigen (Anzahl: 1)
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

Eichhoernchen 22. Jul 2006 14:06

Re: Primäre Soundkarte setzen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hier habe ich noch eine kleine Konsolenanwendung, die ebenfalls nocheinmal die Benutzung der funktionen zeigt sowie ein paar zusätzliche MMSystem funktionen


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:14 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz