![]() |
AW: Zuweisung der Hauptlautstärke
Zitat:
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 |
AW: Zuweisung der Hauptlautstärke
Zitat:
wie im Bereich Form.OnShow zugewiesen werden. |
AW: Zuweisung der Hauptlautstärke
Zitat:
Werde das Projekt aktualisieren wenn fertig. gruss |
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:
Es ändert sich nur der Linke Kanal.
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; 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 |
AW: Zuweisung der Hauptlautstärke
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
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. |
AW: Zuweisung der Hauptlautstärke
Zitat:
Aber es geht nicht um die Lautstärke der Anwendung das ist etwas ganz anderes. gruss |
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:
So funktioniert das zumindest bei mir. Die Adaption auf die Komponente dürfte dann wohl nicht mehr schwer fallen. HTH
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; Nachtrag: ch_LEFT und ch_RIGHT sind Konstanten die ich bei Bedarf vertauschen kann. Der User hat Ausgang-links => rechts angeschlossen ;-) |
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 |
AW: Zuweisung der Hauptlautstärke
Funktioniert nicht siehe editierten Post drüber..
gruss |
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 12:09 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz