AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Zuweisung der Hauptlautstärke
Thema durchsuchen
Ansicht
Themen-Optionen

Zuweisung der Hauptlautstärke

Ein Thema von EWeiss · begonnen am 28. Jan 2017 · letzter Beitrag vom 4. Feb 2017
Antwort Antwort
Seite 3 von 4     123 4      
EWeiss
(Gast)

n/a Beiträge
 
#21

AW: Zuweisung der Hauptlautstärke

  Alt 29. Jan 2017, 20:44
... 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

Geändert von EWeiss (29. Jan 2017 um 20:53 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von markus5766h
markus5766h

Registriert seit: 5. Mär 2009
Ort: Hamburg
569 Beiträge
 
Delphi XE8 Professional
 
#22

AW: Zuweisung der Hauptlautstärke

  Alt 29. Jan 2017, 20:56
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.
Markus H.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#23

AW: Zuweisung der Hauptlautstärke

  Alt 29. Jan 2017, 20:59
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
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#24

AW: Zuweisung der Hauptlautstärke

  Alt 29. Jan 2017, 22:21
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

Geändert von EWeiss (30. Jan 2017 um 00:33 Uhr)
  Mit Zitat antworten Zitat
t.roller
(Gast)

n/a Beiträge
 
#25

AW: Zuweisung der Hauptlautstärke

  Alt 30. Jan 2017, 06:54
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.
Miniaturansicht angehängter Grafiken
main-70pr-35pr.jpg  
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#26

AW: Zuweisung der Hauptlautstärke

  Alt 30. Jan 2017, 11:10
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
  Mit Zitat antworten Zitat
mm1256

Registriert seit: 10. Feb 2014
Ort: Wackersdorf, Bayern
640 Beiträge
 
Delphi 10.1 Berlin Professional
 
#27

AW: Zuweisung der Hauptlautstärke

  Alt 30. Jan 2017, 16:46
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
Gruss Otto
Wenn du mit Gott reden willst, dann bete.
Wenn du ihn treffen willst, schreib bei Tempo 220 eine SMS

Geändert von mm1256 (30. Jan 2017 um 17:55 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#28

AW: Zuweisung der Hauptlautstärke

  Alt 30. Jan 2017, 16:51
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

Geändert von EWeiss (30. Jan 2017 um 17:07 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#29

AW: Zuweisung der Hauptlautstärke

  Alt 30. Jan 2017, 17:08
Funktioniert nicht siehe editierten Post drüber..

gruss
  Mit Zitat antworten Zitat
mm1256

Registriert seit: 10. Feb 2014
Ort: Wackersdorf, Bayern
640 Beiträge
 
Delphi 10.1 Berlin Professional
 
#30

AW: Zuweisung der Hauptlautstärke

  Alt 30. Jan 2017, 17:41
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
Gruss Otto
Wenn du mit Gott reden willst, dann bete.
Wenn du ihn treffen willst, schreib bei Tempo 220 eine SMS

Geändert von mm1256 (30. Jan 2017 um 17:57 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 4     123 4      


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 05:23 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