Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Haupt Lautstärke Regeln (https://www.delphipraxis.net/87167-haupt-lautstaerke-regeln.html)

bitsetter 16. Mär 2007 21:05

Re: Haupt Lautstärke Regeln
 
Hallo,

hier ist noch ein Link: (ganz nach unten scrollen)
GetVolume()

Davon brauchst du die Funktionen GetMixerControlID() und GetVolume().
Ein Beispiel für LineIn:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  caption:= inttostr(GetVolume(GetMixerControlID(MIXERLINE_COMPONENTTYPE_SRC_LINE)));//LineIn
  //Min= 0
  //Max= 65535
end;
Getestet unter WinXP.

Aike 21. Mär 2007 08:22

Re: Haupt Lautstärke Regeln
 
Hah, das funktioniert auch alles super für
- MIXERLINE_COMPONENTTYPE_SRC_WAVEOUT,
- MIXERLINE_COMPONENTTYPE_SRC_COMPACTDISC,
- MIXERLINE_COMPONENTTYPE_SRC_LINE,
- MIXERLINE_COMPONENTTYPE_SRC_FIRST, aber für das Mikrofon geht es komischerweise nicht.

Ich hab's mit
- MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE,
- MIXERLINE_COMPONENTTYPE_DST_WAVEIN und
- MIXERLINE_COMPONENTTYPE_DST_VOICEIN probiert, aber alle haben nichts zur Folge.

bitsetter 21. Mär 2007 17:54

Re: Haupt Lautstärke Regeln
 
Hallo,

also beim Microfoneingang habe ich es jetzt hinbekommen, das lag an
Delphi-Quellcode:
mxcd.cChannels = 2
bei mir ging es nur mit
Delphi-Quellcode:
mxcd.cChannels = 1
.
Den Code habe ich jetzt so abgeändert, dass man den linken und rechten Kanal einzeln ansteuern kann, sofern es unterstützt wird.
Die beiden anderen Konstanten MIXERLINE_COMPONENTTYPE_DST_WAVEIN und
MIXERLINE_COMPONENTTYPE_DST_VOICEIN sehen ja etwas anders aus, kann sein dass es deswegen nicht funktioniert.

Delphi-Quellcode:
uses mmsystem;

function GetMixerControlID(CompType: DWORD): DWORD;
var
  mxl: MIXERLINE;
  mxc: MIXERCONTROL;
  mxlc: MIXERLINECONTROLS;
begin
  Result := 0;
  mxl.cbStruct := SizeOf(mxl);
  mxl.dwComponentType := CompType;
  if (mixerGetLineInfo(0, @mxl, MIXER_GETLINEINFOF_COMPONENTTYPE) = MMSYSERR_NOERROR) then
  begin
    mxlc.cbStruct := SizeOf(mxlc);
    mxlc.dwLineID := mxl.dwLineID;
    mxlc.dwControlType := MIXERCONTROL_CONTROLTYPE_VOLUME;
    mxlc.cControls := mxl.cControls;
    mxlc.cbmxctrl := sizeof(mxc);
    mxlc.pamxctrl := @mxc;
    if (mixerGetLineControls(0, @mxlc, MIXER_GETLINECONTROLSF_ONEBYTYPE) = MMSYSERR_NOERROR)
      then Result := mxc.dwControlID;
  end;
end;

type
  TVolume = record
    Left, Right: DWord;
    Channels: byte;
end;

function GetVolume(ID: DWORD; Channels: byte = 2) : TVolume;
var
  Volume : Array[0..1] Of TMixerControlDetails_Unsigned;
  mxcd: TMixerControlDetails;
  NoError: boolean;
begin
  if Channels > 2 then
    Channels := 2;
  mxcd.cbStruct := sizeof(mxcd);
  mxcd.dwControlID := ID;
  mxcd.cChannels := Channels;
  mxcd.cMultipleItems := 0;
  mxcd.cbDetails := sizeof(MIXERCONTROLDETAILS_UNSIGNED) * 2;
  mxcd.paDetails := @Volume;
  Result.Left := 0;
  Result.Right := 0;
  Result.Channels:= Channels;
  try
    NoError:= mixerGetControlDetails(0, @mxcd, MIXER_GETCONTROLDETAILSF_VALUE)= MMSYSERR_NOERROR;
    if NoError then
    begin
      Result.Left := Volume[0].dwValue;
      if Channels = 2 then
        Result.Right := Volume[1].dwValue;
    end
    else
    begin
      if Channels= 2 then
        Result := GetVolume(ID, 1);
      if Channels= 1 then
         Result.Channels:= 0;
    end;
  except
    Result.Channels:= 0;
  end;
end;

function SetVolume(ID, Left, Right: DWord; Channels: byte = 2): byte;
var Volume : Array[0..1] Of TMixerControlDetails_Unsigned;
    mxcd: TMixerControlDetails;
    NoError: boolean;
begin
  if Channels> 2 then
    Channels := 2;
  Result := Channels;
  Volume[0].dwValue := Left;
  Volume[1].dwValue := Right;
  with mxcd Do
  begin
    cbStruct := SizeOf(mxcd);
    dwControlID := ID;
    cChannels := Channels;
    cMultipleItems := 0;
    cbDetails := SizeOf(TMixerControlDetails_Unsigned) * 2;
    paDetails := @Volume;
    try
      NoError:= (mixerSetControlDetails(0, @mxcd,MIXER_SETCONTROLDETAILSF_VALUE) = MMSYSERR_NOERROR);
      if not NoError then
      begin
        if Channels= 2 then
          Result := SetVolume(ID, Left, Right,1);
        if Channels= 1 then
          Result:= 0;
      end;
    except
      Result := 0;
    end;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  MixerCtrlID: DWord;
begin                            
  MixerCtrlID := GetMixerControlID(MIXERLINE_COMPONENTTYPE_SRC_LINE);// MIXERLINE_COMPONENTTYPE_SRC_LINE);
  //SetVolume(MixerCtrlID, 65535, 65535);//100 %
  //SetVolume(MixerCtrlID, 32768, 0);//50 %  rechts= 0%
  SetVolume(MixerCtrlID, 32768, 32768);//50 %  links und rechts gleich laut
  caption:= inttostr(GetVolume(MixerCtrlID).Left);
end;

Aike 23. Mär 2007 09:22

Re: Haupt Lautstärke Regeln
 
Abgefahren. Darf ich fragen, wie du darauf gekommen bist, gerade diesen Wert abzuändern? War das irgendwie offensichtlich oder so? Ich seh da eigentlich keinen Zusammenhang o.O

bitsetter 23. Mär 2007 11:15

Re: Haupt Lautstärke Regeln
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von Aike
Darf ich fragen, wie du darauf gekommen bist, gerade diesen Wert abzuändern? War das irgendwie offensichtlich oder so? Ich seh da eigentlich keinen Zusammenhang o.O

Bei meinem "Volume Control Panel" ist mir aufgefallen, dass der Balance Schieberegler vom Microfoneingang deaktiviert worden ist (siehe Bild). Das bedeutet wohl, dass zumindest mein Microfoneingang nur einen Kanal unterstützt. Daher war es naheliegend bei
Delphi-Quellcode:
mxcd.cChannels = 1
einzutragen.
Bei Line In usw. funktioniert das übrigens auch.

FLINKER_FINGER 19. Sep 2007 18:38

Re: Haupt Lautstärke Regeln
 
Liste der Anhänge anzeigen (Anzahl: 1)
Mal eine weitere Frage:

kann man auch irgendwie das andere Mikrofon ansteuern. Ich meine das bei Aufnahme und nicht bei Summe. ( Siehe Bild ( rot markiert))

Wenn ich die Mikrofoneinstellungen bei Summe ( also wiedergabe ) ändere, bringt mir das irgendwie nicht viel...

ghost007 9. Nov 2007 23:01

Re: Haupt Lautstärke Regeln
 
Hallo,
ich verwende den code von der ersten seite um das mastervolume zu regeln. Jedoch scheint er unter vista nicht zu funktionieren.
Gibt es einen alternativ code für vista?

MfG - Ghost007

ghost007 17. Nov 2007 17:10

Re: Haupt Lautstärke Regeln
 
*Push*

Helmi 30. Dez 2007 09:25

Re: Haupt Lautstärke Regeln
 
Hallo,

ich möcht dieses Thema nochmal aufgreiffen.

Wie ist es möglich die Haupt-Lautstärke unter
Vista von einem Delphi-Programm aus zu ändern?

turboPASCAL 30. Dez 2007 10:01

Re: Haupt Lautstärke Regeln
 
Kurz und Bündig, Ja. :stupid:


Siehe dazu:
MSDN: Programming Reference
MSDN: DeviceTopology API

und:
MSDN: Vista volume control using Delphi

// edit: Link korrigiert.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:33 Uhr.
Seite 2 von 3     12 3      

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