AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Welche Nachricht bei Änderung der Lautstärke?
Thema durchsuchen
Ansicht
Themen-Optionen

Welche Nachricht bei Änderung der Lautstärke?

Ein Thema von Garfield · begonnen am 27. Mai 2007 · letzter Beitrag vom 27. Mai 2007
Antwort Antwort
Benutzerbild von Garfield
Garfield

Registriert seit: 9. Jul 2004
Ort: Aken (Anhalt-Bitterfeld)
1.335 Beiträge
 
Delphi XE5 Professional
 
#1

Welche Nachricht bei Änderung der Lautstärke?

  Alt 27. Mai 2007, 00:44
Ä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.
Gruss Garfield
Ubuntu 22.04: Laz2.2.2/FPC3.2.2 - VirtBox6.1+W10: D7PE, DXE5Prof
  Mit Zitat antworten Zitat
Benutzerbild von calculon
calculon

Registriert seit: 16. Sep 2006
256 Beiträge
 
Delphi 7 Personal
 
#2

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

  Alt 27. Mai 2007, 04:04
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
--
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#3

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

  Alt 27. Mai 2007, 09:02
@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)
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von Garfield
Garfield

Registriert seit: 9. Jul 2004
Ort: Aken (Anhalt-Bitterfeld)
1.335 Beiträge
 
Delphi XE5 Professional
 
#4

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

  Alt 27. Mai 2007, 10:22
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.
Gruss Garfield
Ubuntu 22.04: Laz2.2.2/FPC3.2.2 - VirtBox6.1+W10: D7PE, DXE5Prof
  Mit Zitat antworten Zitat
Benutzerbild von bitsetter
bitsetter

Registriert seit: 17. Jan 2007
1.169 Beiträge
 
Turbo Delphi für Win32
 
#5

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

  Alt 27. Mai 2007, 10:42
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.
Gruß bitsetter
"Viele Wege führen nach Rom"
Wolfgang Mocker (geb. 1954), dt. Satiriker und Aphoristiker
  Mit Zitat antworten Zitat
Benutzerbild von toms
toms
(CodeLib-Manager)

Registriert seit: 10. Jun 2002
4.648 Beiträge
 
Delphi XE Professional
 
#6

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

  Alt 27. Mai 2007, 11:37
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.
Miniaturansicht angehängter Grafiken
mixerdemo_473.jpg  
Thomas
  Mit Zitat antworten Zitat
Benutzerbild von Garfield
Garfield

Registriert seit: 9. Jul 2004
Ort: Aken (Anhalt-Bitterfeld)
1.335 Beiträge
 
Delphi XE5 Professional
 
#7

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

  Alt 27. Mai 2007, 11:41
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.
Gruss Garfield
Ubuntu 22.04: Laz2.2.2/FPC3.2.2 - VirtBox6.1+W10: D7PE, DXE5Prof
  Mit Zitat antworten Zitat
Benutzerbild von Garfield
Garfield

Registriert seit: 9. Jul 2004
Ort: Aken (Anhalt-Bitterfeld)
1.335 Beiträge
 
Delphi XE5 Professional
 
#8

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

  Alt 27. Mai 2007, 11:59
Zitat von toms:
Colin Wilson's MixerDemo
demonstiert noch weitere Funktionen von MM_MIXM_CONTROLCHANGE wie Balance, Mute usw.
Eindrucksvoll und etwas umfangreicher.
Gruss Garfield
Ubuntu 22.04: Laz2.2.2/FPC3.2.2 - VirtBox6.1+W10: D7PE, DXE5Prof
  Mit Zitat antworten Zitat
Antwort Antwort


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 · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:28 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