Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Welche Nachricht bei Änderung der Lautstärke? (https://www.delphipraxis.net/92830-welche-nachricht-bei-aenderung-der-lautstaerke.html)

Garfield 26. Mai 2007 23:44


Welche Nachricht bei Änderung der Lautstärke?
 
Ändert man per Software die Lautstärke, ändert sich augenblicklich der entsprechende Regler in der Lautstärkeregelung von Windows. Welche Nachricht muss man abfangen, um im eigenen Programm eine Lautstärkeänderung sofort nachzuvollziehen.

calculon 27. Mai 2007 03:04

Re: Welche Nachricht bei Änderung der Lautstärke?
 
Aaaaaaaaaaaaaaalso, wenn ich dich richtig verstanden hab', willst du die aktuelle Lautstärkeeinstellung von der Windows (c) Lautstärkeregelung bekommen. http://www.krazz.net/smil/schreiben[1].gif

Dazu folgende Unit benutzen:

Delphi-Quellcode:
{ Frei nach by Serhiy Perevoznyk }
unit Volume;



interface
Uses SysUtils, Windows, MMSystem;



////////////////////////////////////////////////////////////////////////////////
function SetMasterVolume(Value: Cardinal) : boolean;
function GetMasterVolume : Cardinal;
////////////////////////////////////////////////////////////////////////////////
implementation
////////////////////////////////////////////////////////////////////////////////
function InitMixer: HMixer;
var
  Err: MMRESULT;
begin
  Err := mixerOpen(@Result, 0, 0, 0, 0);
  if Err <> MMSYSERR_NOERROR then
    Result := 0;
end;
////////////////////////////////////////////////////////////////////////////////
function GetMasterVolumeControl(Mixer: hMixerObj;
                                var Control: TMixerControl): MMResult;
var
  Line    : TMixerLine;
  Controls : TMixerLineControls;
begin
  ZeroMemory(@Line, SizeOf(Line));
  Line.cbStruct := SizeOf(Line);
  Line.dwComponentType := MIXERLINE_COMPONENTTYPE_DST_SPEAKERS;
  Result := mixerGetLineInfo(Mixer,
                             @Line,
                             MIXER_GETLINEINFOF_COMPONENTTYPE);
  if Result = MMSYSERR_NOERROR then begin
    ZeroMemory(@Controls, SizeOf(Controls));
    Controls.cbStruct := SizeOf(Controls);
    Controls.dwLineID := Line.dwLineID;
    Controls.cControls := 1;
    Controls.dwControlType := MIXERCONTROL_CONTROLTYPE_VOLUME;
    Controls.cbmxctrl := SizeOf(Control);
    Controls.pamxctrl := @Control;
    Result := mixerGetLineControls(Mixer,
                                   @Controls,
                                   MIXER_GETLINECONTROLSF_ONEBYTYPE);
  end;
end;
////////////////////////////////////////////////////////////////////////////////
function SetMasterVolume(Value: Cardinal) : boolean;
var
  MasterVolume   : TMixerControl;
  Details        : TMixerControlDetails;
  UnsignedDetails : TMixerControlDetailsUnsigned;
  Code           : MMResult;
  Mixer          : hMixerObj;
begin
  Mixer := InitMixer;
  Result := false;
  Code := GetMasterVolumeControl(Mixer, MasterVolume);
  if(Code = MMSYSERR_NOERROR)then begin
    with Details do begin
      cbStruct := SizeOf(Details);
      dwControlID := MasterVolume.dwControlID;
      cChannels := 1; // set all channels
      cMultipleItems := 0;
      cbDetails := SizeOf(UnsignedDetails);
      paDetails := @UnsignedDetails;
    end;
    UnsignedDetails.dwValue := Value;
    if(mixerSetControlDetails(Mixer,
                              @Details,
                              MIXER_SETCONTROLDETAILSF_VALUE) = MMSYSERR_NOERROR)then
      Result := true;
  end;
end;
////////////////////////////////////////////////////////////////////////////////
function GetMasterVolume : Cardinal;
var
  MasterVolume   : TMixerControl;
  Details        : TMixerControlDetails;
  UnsignedDetails : TMixerControlDetailsUnsigned;
  Code           : MMResult;
  Mixer          : hMixerObj;
begin
  Mixer := InitMixer;
  Result := 0;
  Code := GetMasterVolumeControl(Mixer, MasterVolume);
  if(Code = MMSYSERR_NOERROR)then begin
    with Details do begin
      cbStruct := SizeOf(Details);
      dwControlID := MasterVolume.dwControlID;
      cChannels := 1; // set all channels
      cMultipleItems := 0;
      cbDetails := SizeOf(UnsignedDetails);
      paDetails := @UnsignedDetails;
    end;
    if(mixerGetControlDetails(Mixer,
                              @Details,
                              MIXER_GETCONTROLDETAILSF_VALUE) = MMSYSERR_NOERROR)then
      result := UnsignedDetails.dwValue;
  end;
end;
////////////////////////////////////////////////////////////////////////////////
function GetMasterMute(
  Mixer: hMixerObj;
  var Control: TMixerControl): MMResult;
  // Returns True on success
var
  Line: TMixerLine;
  Controls: TMixerLineControls;
begin
  ZeroMemory(@Line, SizeOf(Line));
  Line.cbStruct := SizeOf(Line);
  Line.dwComponentType := MIXERLINE_COMPONENTTYPE_DST_SPEAKERS;
  Result := mixerGetLineInfo(Mixer, @Line,
    MIXER_GETLINEINFOF_COMPONENTTYPE);
  if Result = MMSYSERR_NOERROR then
  begin
    ZeroMemory(@Controls, SizeOf(Controls));
    Controls.cbStruct := SizeOf(Controls);
    Controls.dwLineID := Line.dwLineID;
    Controls.cControls := 1;
    Controls.dwControlType := MIXERCONTROL_CONTROLTYPE_MUTE;
    Controls.cbmxctrl := SizeOf(Control);
    Controls.pamxctrl := @Control;
    Result := mixerGetLineControls(Mixer, @Controls,
      MIXER_GETLINECONTROLSF_ONEBYTYPE);
  end;
end;
////////////////////////////////////////////////////////////////////////////////
function MuteMaster : boolean;
var
  MasterMute: TMixerControl;
  Details: TMixerControlDetails;
  BoolDetails: TMixerControlDetailsBoolean;
  Code: MMResult;
begin
  result := false;
  Code := GetMasterMute(0, MasterMute);
  if(Code = MMSYSERR_NOERROR)then
  begin
    with Details do
    begin
      cbStruct := SizeOf(Details);
      dwControlID := MasterMute.dwControlID;
      cChannels := 1;
      cMultipleItems := 0;
      cbDetails := SizeOf(BoolDetails);
      paDetails := @BoolDetails;
    end;
    mixerGetControlDetails(0, @Details,
      MIXER_GETCONTROLDETAILSF_VALUE);



    LongBool(BoolDetails.fValue) := not LongBool(BoolDetails.fValue);

    if(mixerSetControlDetails(0, @Details,
         MIXER_SETCONTROLDETAILSF_VALUE) = MMSYSERR_NOERROR)then
      result := true;
  end;
end;
////////////////////////////////////////////////////////////////////////////////
end.
und so an die Info rankommen:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  label1.caption := inttostr(GetMasterVolume);
end;
Die Lautstärke kann hierbei einen Wert zwischen 0 und 65535 annehmen!

Gruß

Calculon
--

SirThornberry 27. Mai 2007 08:02

Re: Welche Nachricht bei Änderung der Lautstärke?
 
@calculon: Du hast es falsch verstanden. Er möchte mitbekommen wenn die Lautstärke geändert wurde. Daher will er wissen welche Window-Message ber Broadcast gesendet wird bzw. wie man eine Benachrichtigung erzhält (ohne Polling)

Garfield 27. Mai 2007 09:22

Re: Welche Nachricht bei Änderung der Lautstärke?
 
Richtig, ich möchte auf einen Timer verzichten, der ständig die aktuelle Lautstärke kontrolliert.

Nachdem ich ewig gesucht und diesen Thread gestartet habe, habe ich endlich dies gefunden. Funktioniert in dieser Form jedoch nicht.

bitsetter 27. Mai 2007 09:42

Re: Welche Nachricht bei Änderung der Lautstärke?
 
Moin,

eventuell hilft sowas hier:
Delphi-Quellcode:
  private
    { Private declarations }
    Procedure MixControlChange(var msg : TMessage); message MM_MIXM_CONTROL_CHANGE;
    Procedure MixLineChange(var msg : TMessage); message MM_MIXM_LINE_CHANGE;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

Procedure TForm1.MixControlChange(var msg : TMessage);
begin
  beep;//DEMO
end;

Procedure TForm1.MixLineChange(var msg : TMessage);
begin
  beep;//DEMO
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  Mix: HMIXER;
begin
  mixerOpen(@Mix, 0, Handle, 0, CALLBACK_WINDOW);
end;
Ohne mixerOpen() geht es anscheinend nicht.

toms 27. Mai 2007 10:37

Re: Welche Nachricht bei Änderung der Lautstärke?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Colin Wilson's MixerDemo
demonstiert noch weitere Funktionen von MM_MIXM_CONTROLCHANGE wie Balance, Mute usw.

Zitat:

This Mixer Demo download contains a component which encapsulates master volume, balance, mute, bass and treble, and MIDI volume, balance and mute. In addition it contains a demo mixer program. The component supports mixer callbacks, so that it stays in sync with other mixers on your system. Full source included. The source is heavily commented.

Garfield 27. Mai 2007 10:41

Re: Welche Nachricht bei Änderung der Lautstärke?
 
Moin bitsetter, das hat geholfen. Habe eben im Test die Wave-Lautstärke ausgelesen. Dabei reicht mir bereits die Procedure MixControlChange. Ich habe nur die Variable Mix nach Private verschoben und beim FormDestroy ein mixerClose(Mix); eingetragen.

Das Callback aus oben genannten Thread hatte ich testweise in meine Form eingebaut. Es funktioniert dabei nur, wenn die Form aktiv ist. Heißt nach einer Änderung wurde das Callback ausgelöst, wenn auf die Form geklickt wurde.

Garfield 27. Mai 2007 10:59

Re: Welche Nachricht bei Änderung der Lautstärke?
 
Zitat:

Zitat von toms
Colin Wilson's MixerDemo
demonstiert noch weitere Funktionen von MM_MIXM_CONTROLCHANGE wie Balance, Mute usw.

Eindrucksvoll und etwas umfangreicher.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:59 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