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.
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