AGB  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Primäre Soundkarte setzen

Ein Thema von Eichhoernchen · begonnen am 21. Jul 2006 · letzter Beitrag vom 22. Jul 2006
Antwort Antwort
Eichhoernchen

Registriert seit: 22. Apr 2004
Ort: Hagen
322 Beiträge
 
Turbo Delphi für Win32
 
#1

Primäre Soundkarte setzen

  Alt 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
Angehängte Dateien
Dateityp: zip changesnddevice_178.zip (226,5 KB, 112x aufgerufen)
Jan
  Mit Zitat antworten Zitat
Eichhoernchen

Registriert seit: 22. Apr 2004
Ort: Hagen
322 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: Primäre Soundkarte setzen

  Alt 22. Jul 2006, 14:06
Hier habe ich noch eine kleine Konsolenanwendung, die ebenfalls nocheinmal die Benutzung der funktionen zeigt sowie ein paar zusätzliche MMSystem funktionen
Angehängte Dateien
Dateityp: zip audiooptscmdline_188.zip (29,4 KB, 75x aufgerufen)
Jan
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es 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

Gehe zu:

Impressum · AGB · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:22 Uhr.
Powered by vBulletin® Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2014 by Daniel R. Wolf