Delphi-PRAXiS

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)

hedie 24. Feb 2007 11:41


Haupt Lautstärke Regeln
 
Hallo

Die einen denken sicher.. ach mann wieder mal jemand der die suche nicht benutzt... doch ich habe sie benutzt


Wie ich die Wave Lautstärke regeln kann weiss ich, aber ich möchte die HauptLautstärke regeln


Hoffe ihr habt ne idee

Danke

grüsschen

hedie 24. Feb 2007 11:53

Re: Haupt Lautstärke Regeln
 
für wave benutze ich diesen code

Delphi-Quellcode:
procedure SetVolume(const volL, volR: Word);
var
  hWO: HWAVEOUT;
  waveF: TWAVEFORMATEX;
  vol: DWORD;
begin
  // init TWAVEFORMATEX
  FillChar(waveF, SizeOf(waveF), 0);
  // open WaveMapper = std output of playsound
  waveOutOpen(@hWO, WAVE_MAPPER, @waveF, 0, 0, 0);
  vol:= volL + volR shl 16;
  // set volume
  waveOutSetVolume(hWO, vol);
  waveOutClose(hWO);
end;
kann man den irgendwie für die "Hauptlautstärke" umwandeln?

marabu 24. Feb 2007 12:14

Re: Haupt Lautstärke Regeln
 
Hallo Claudio,

mit waveOutSetVolume() kontrollierst du nur die Lautstärke eines speziellen Audio Device.

Vielleicht hilft dir ein Blick auf diesen Code. Beachte den DeviceIndex 5 (MASTER).

Grüße vom marabu

hedie 24. Feb 2007 12:23

Re: Haupt Lautstärke Regeln
 
Danke

Das problem

Delphi-Quellcode:
procedure SetVolume(aVolume:Byte);
var
Volu: TVolumeRec;
begin
   Volu.LeftVolume := aVolume shl 8;
   Volu.RightVolume:= Volu.LeftVolume;
   auxSetVolume(UINT(DeviceIndex), Volu.LongVolume) ;
end;
er kennt aVolume nicht

hedie 24. Feb 2007 12:27

Re: Haupt Lautstärke Regeln
 
:wall: Ok habs herausgefunden


hatte ne zweite Prozedure mit gleichem namen

hedie 24. Feb 2007 12:36

Re: Haupt Lautstärke Regeln
 
Irgendwie funktioniert das nicht....

Kann es daran liegen, das ich SoundMax für die Steuerung benutze und nicht den Windows Regler?

turboPASCAL 24. Feb 2007 15:15

Re: Haupt Lautstärke Regeln
 
[code=delphi]uses MMSystem;

const
MasterVolumeControl = 0;
MaxVolume = 65535;
MinVolume = 0; // ;-)

function _VolumeControl(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;

procedure SetMasterVolume(Mixer: hMixerObj; Value: Word);
var
MasterVolume : TMixerControl;
Details : TMixerControlDetails;
UnsignedDetails : TMixerControlDetailsUnsigned;
Code : MMResult;
begin
Code := _VolumeControl(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;
Code := mixerSetControlDetails(Mixer,
@Details,
MIXER_SETCONTROLDETAILSF_VALUE);
end;
if Code <> MMSYSERR_NOERROR then
raise Exception.CreateFmt('SetMasterVolume failure, '+
'multimedia system error #%d', [Code]);
end;

function GetMasterVolume(Mixer: hMixerObj): Word;
var
MasterVolume : TMixerControl;
Details : TMixerControlDetails;
UnsignedDetails : TMixerControlDetailsUnsigned;
Code : MMResult;
begin
Result := 0;

Code := _VolumeControl(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;
Code := mixerGetControlDetails(Mixer,
@Details,
MIXER_GETCONTROLDETAILSF_VALUE);

Result := UnsignedDetails.dwValue;
end;
if Code <> MMSYSERR_NOERROR then
raise Exception.CreateFmt('GetMasterVolume failure, '+
'multimedia system error #%d',
Code:
);
end;

procedure TFormX.Foo...
begin
  // Set
  SetMasterVolume(MasterVolumeControl, 0815); // MaxVolume => 65535

  // Get
  Caption := IntToStr( GetMasterVolume(MasterVolumeControl) );
end;
:mrgreen:

hedie 24. Feb 2007 15:23

Re: Haupt Lautstärke Regeln
 
Danke :D

turboPASCAL 24. Feb 2007 16:04

Re: Haupt Lautstärke Regeln
 
Bitte. :stupid:

Aike 16. Mär 2007 09:38

Re: Haupt Lautstärke Regeln
 
Hm, man sagte mir, damit könne man auch die anderen Lautstärken auslesen, aber ich hab keine Ahnung, wo ich den Code da verändern muss. Ich hab einiges ausprobiert, aber ich kenne mich mit der Mixer-Materie kaum aus :-/

Ich würde gerne die Lautstärken von LineIn, Wave, CD-Player und Mikrophon auslesen.

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.

Helmi 30. Dez 2007 10:25

Re: Haupt Lautstärke Regeln
 
Danke!

Aber wie verwend ich den Code von der Seite:


turboPASCAL 30. Dez 2007 10:47

Re: Haupt Lautstärke Regeln
 
Irgendwie habe ich mir schon gedacht das sie Frage kommt. ;)

Ich habe die Unit noch nicht getestet, aber die Namen der Functionen sind doch eindeutig.
Fehlen da Grundlagen ? :stupid:

Helmi 30. Dez 2007 10:50

Re: Haupt Lautstärke Regeln
 
Zitat:

Zitat von turboPASCAL
Fehlen da Grundlagen ? :stupid:

*grins* - nein - ich steh nur auf´m Schlauch

Ich hab diesen Code in eine Unit gepackt und hab die in die uses meiner Unit mit aufgenommen.

Frag ich dann eine function dieser Unit auf, dann findet delphi diese nicht


Irgendwo hab ich einen Gedankenfehler...


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