Delphi-PRAXiS
Seite 3 von 4     123 4      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Zuweisung der Hauptlautstärke (https://www.delphipraxis.net/191566-zuweisung-der-hauptlautstaerke.html)

EWeiss 29. Jan 2017 19:44

AW: Zuweisung der Hauptlautstärke
 
Zitat:

Zitat von markus5766h (Beitrag 1360280)
... lässt sich bestimmt noch verbessern, z.B. BalanceBar.OnChange könnte man per case of .. abhandeln,
aber für's Prinzip sollte es so mal reichen.

Was passiert wenn zur Laufzeit die Gesamtlautstärke verändert wird?
Wie gesagt kann ich nicht testen da du kein Callback verwendest.

Ansonsten ist es so wie ich mir das vorstelle.

Danke für deine Mühe.
Werde versuchen das mal so bei mir umzusetzen.

gruss

markus5766h 29. Jan 2017 19:56

AW: Zuweisung der Hauptlautstärke
 
Zitat:

Zitat von EWeiss (Beitrag 1360281)
Was passiert wenn zur Laufzeit die Gesamtlautstärke verändert wird?
Wie gesagt kann ich nicht testen da du kein Callback verwendest.
gruss

... nichts, das hatte ich damals nicht vorgesehen, bei einem Callback müssten die Werte
wie im Bereich Form.OnShow zugewiesen werden.

EWeiss 29. Jan 2017 19:59

AW: Zuweisung der Hauptlautstärke
 
Zitat:

Zitat von markus5766h (Beitrag 1360282)
Zitat:

Zitat von EWeiss (Beitrag 1360281)
Was passiert wenn zur Laufzeit die Gesamtlautstärke verändert wird?
Wie gesagt kann ich nicht testen da du kein Callback verwendest.
gruss

... nichts, das hatte ich damals nicht vorgesehen, bei einem Callback müssten die Werte
wie im Bereich Form.OnShow zugewiesen werden.

Ok.. Werde es testen sollte kein Problem mehr sein dank deiner Hilfe.
Werde das Projekt aktualisieren wenn fertig.

gruss

EWeiss 29. Jan 2017 21:21

AW: Zuweisung der Hauptlautstärke
 
Hatte gerade was zeit zum implementieren aber funktioniert nicht.

Delphi-Quellcode:
function TAudioVolume.GetMasterBalance(): integer;
 var
  HR: HResult;
  f: Single;
  i: Integer;
  Chans: Uint;
  MasterVol: Single;
  VerifyChannels: BOOL;

begin
  Result := (tbMasterVolume.Max div 2); //Center 100% für alles

  if AudioEndpointVolume = nil then
    exit;

  HR := AudioEndpointVolume.GetChannelCount(Chans);
  if HR = S_OK then
  begin
    if Chans < 2 then
      exit;
  end else
  exit;

  for i := 0 to Chans - 1 do
  begin
    HR := AudioEndpointVolume.GetChannelVolumeLevelScalar(i, f);
    if HR = S_OK then
    begin
      case i of
        0:
          Channels.LeftVol := f;
        1:
          Channels.RightVol := f;
      end;
    end;
  end;

  MasterVol := GetMasterVolume;

  VerifyChannels := Channels.LeftVol <> Channels.RightVol;
  if VerifyChannels then
  begin
    if Channels.LeftVol < MasterVol then
      Result := Round(0 + (tbMasterBalance.Max -
        (tbMasterBalance.Max / MasterVol * Channels.LeftVol)))
    else
    if Channels.RightVol < MasterVol then
      Result := Round(0 - (tbMasterBalance.Max -
        (tbMasterBalance.Max / MasterVol * Channels.RightVol)));
  end;
end;
Delphi-Quellcode:
procedure TAudioVolume.tbMasterBalanceChange(Sender: TObject);
var
  MasterVol: single;
begin

  if AudioEndpointVolume = nil then
    exit;

  MasterVol := GetMasterVolume;

  if tbMasterBalance.Position = 0 then
  begin
    Channels.LeftVol := MasterVol;
    Channels.RightVol := MasterVol;
  end;
  if tbMasterBalance.Position < 0 then
  begin
    Channels.LeftVol := MasterVol;
    Channels.RightVol := MasterVol / tbMasterBalance.Max *
      (tbMasterBalance.Max - tbMasterBalance.Position * -1);
  end;
  if tbMasterBalance.Position > 0 then
  begin
    Channels.LeftVol := MasterVol / tbMasterBalance.Max *
      (tbMasterBalance.Max - tbMasterBalance.Position);
    Channels.RightVol := MasterVol;
  end;

  AudioEndpointVolume.SetChannelVolumeLevelScalar(0, Channels.LeftVol, @GUID_TAudioVolume);
  AudioEndpointVolume.SetChannelVolumeLevelScalar(1, Channels.RightVol, @GUID_TAudioVolume);
end;
Es ändert sich nur der Linke Kanal.
Hab erst mal genug muss mich mal mit was anderem beschäftigen.
Du darfst es aber gerne mit meinem Test Projekt versuchen.
Solche Probleme hatte ich schon lange nicht mehr. :duck: :wall:

PS:
Ich denke es liegt ganz einfach daran das du keine Callback verwendest deshalb ändert sich bei dir auch das MasterVolumen nicht.
Bei mir schon deshalb funktioniert deine Lösung nicht.

gruss

t.roller 30. Jan 2017 05:54

AW: Zuweisung der Hauptlautstärke
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von EWeiss (Beitrag 1360281)
Was passiert, wenn zur Laufzeit die Gesamtlautstärke verändert wird?

Wenn ich in einem Project die Lautstärke ändere, geschieht das relativ zur Gesamtlautstärke.
Stelle ich in einem Project 50%-Lautstärke ein und die Gesamtlautstärke ist 70%, dann ist die resultierende Project-Lautstärke tatsächlich 35%.
Ändere ich die Gesamtlautstärke, dann ändert sich auch die Project-Lautstärke - sie bleibt aber 50% der Gesamtlautstärke.

EWeiss 30. Jan 2017 10:10

AW: Zuweisung der Hauptlautstärke
 
Zitat:

Zitat von t.roller (Beitrag 1360295)
Zitat:

Zitat von EWeiss (Beitrag 1360281)
Was passiert, wenn zur Laufzeit die Gesamtlautstärke verändert wird?

Wenn ich in einem Project die Lautstärke ändere, geschieht das relativ zur Gesamtlautstärke.
Stelle ich in einem Project 50%-Lautstärke ein und die Gesamtlautstärke ist 70%, dann ist die resultierende Project-Lautstärke tatsächlich 35%.
Ändere ich die Gesamtlautstärke, dann ändert sich auch die Project-Lautstärke - sie bleibt aber 50% der Gesamtlautstärke.

Ich weis jetzt nicht auf was du hinaus willst.
Aber es geht nicht um die Lautstärke der Anwendung das ist etwas ganz anderes.

gruss

mm1256 30. Jan 2017 15:46

AW: Zuweisung der Hauptlautstärke
 
Hallo Fangemeinde des musikalischen Hörgenusses,

ich bin kein Mathematiker und darum versuche ich es mal mit einfachen Worten zu erklären. Wenn man zwei Fader bzw. Werte (Volume rechts und links) mit einem einzigen Balance-Regler steuern will/muss/möchte dann ist das Maximum jeder Seite immer die Gesamtlautstärke und dann muss man ja nur noch abziehen:

Delphi-Quellcode:
procedure TFrmPlayer.BalanceChange(Sender: TObject);
var
  Vol, BalanceOffset, LeftVol, RightVol: Single;

  function CheckValue(const aValue: Single): Single;
  begin
    Result := aValue;
    if Result > 1.0 then Result := 1.0 else
    if Result < 0 then Result := 0;
  end;

begin
  Vol := GetMasterVolume;
  LeftVol := Vol;
  RightVol := Vol;
  BalanceOffset := Balance.Position * 0.01 * Vol; // Trackbar: Min = -100...Max = 100
  if BalanceOffset < 0 // Fader = links, Lautstärke rechts anpassen
  then RightVol := CheckValue(Vol + BalanceOffset) else
  if BalanceOffset > 0 // Fader = rechts, Lautstärke links anpassen
  then LeftVol := CheckValue(Vol - BalanceOffset);
  SetVolumeChannel(LeftVol, ch_LEFT);
  SetVolumeChannel(RightVol, ch_RIGHT);
end;
So funktioniert das zumindest bei mir. Die Adaption auf die Komponente dürfte dann wohl nicht mehr schwer fallen. HTH

Nachtrag: ch_LEFT und ch_RIGHT sind Konstanten die ich bei Bedarf vertauschen kann. Der User hat Ausgang-links => rechts angeschlossen ;-)

EWeiss 30. Jan 2017 15:51

AW: Zuweisung der Hauptlautstärke
 
Werde es mal testen Danke.

EDIT:
Nein Funktioniert nicht deine Auslegung ist auf 1 Kanal beschränkt.
Es ändert sich nur der Linke Kanal.

Wenn die Trackbar zentriert ist soll die erste Hälfte für den Linken Kanal
und die andere für den Rechten zuständig sein.

Aber du darfst es gerne selbst nochmal testen.

Delphi-Quellcode:
procedure TAudioVolume.tbMasterBalanceChange(Sender: TObject);
var
  Balance: single;
  Chans: UINT;
  Channels: TChannels;
  MasterVol: single;
  HR: HResult;
  BalanceOffset: Single;

  function CheckValue(const aValue: Single): Single;
   begin
     Result := aValue;
     if Result > 1.0 then Result := 1.0 else
     if Result < 0 then Result := 0;
   end;
begin

  if AudioEndpointVolume = nil then
    exit;

  HR := AudioEndpointVolume.GetChannelCount(Chans);
  if HR = S_OK then
  begin
    if Chans < 2 then
      exit;
  end else
  exit;

  MasterVol := GetMasterVolume();

  Channels.LeftVol := MasterVol;
  Channels.RightVol := MasterVol;

  BalanceOffset := tbMasterBalance.Position * 0.01;

  if BalanceOffset < 0 then
    Channels.RightVol := CheckValue(MasterVol + BalanceOffset)
  else
  if BalanceOffset > 0 then
    Channels.LeftVol := CheckValue(MasterVol - BalanceOffset);

  AudioEndpointVolume.SetChannelVolumeLevelScalar(0, Channels.LeftVol, @GUID_TAudioVolume);
  AudioEndpointVolume.SetChannelVolumeLevelScalar(1, Channels.RightVol, @GUID_TAudioVolume);

end;

gruss

EWeiss 30. Jan 2017 16:08

AW: Zuweisung der Hauptlautstärke
 
Funktioniert nicht siehe editierten Post drüber..

gruss

mm1256 30. Jan 2017 16:41

AW: Zuweisung der Hauptlautstärke
 
Bei mir in der Anwendung funktioniert es so. Dann hast du irgendwo anders noch ein Problem. Nur der Vollständigkeit halber: Bei mir Windows 10 und Delphi 10.1.

BTW das einzige mir bekannte Optimierungsmöglichkeit ist noch, dass man den Wert vom Trackbar nicht absolut sondern prozentual korrigiert. Bei einer Gesamtlautstärke von 1.0 spielt das keine Rolle, aber wenn die Laustärke weit unten ist, dann reagiert der Fader nicht linear.

Nachtrag: Hab es angepasst:
Delphi-Quellcode:
...
BalanceOffset := Balance.Position * 0.01 * Vol; // Trackbar: Min = -100...Max = 100


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:56 Uhr.
Seite 3 von 4     123 4      

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