AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Audiovolume - Balance bzw. Kanal-Lautstärke setzen
Thema durchsuchen
Ansicht
Themen-Optionen

Audiovolume - Balance bzw. Kanal-Lautstärke setzen

Ein Thema von mm1256 · begonnen am 23. Jan 2017 · letzter Beitrag vom 26. Jan 2017
Antwort Antwort
mm1256

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

Audiovolume - Balance bzw. Kanal-Lautstärke setzen

  Alt 23. Jan 2017, 18:24
Hallo,

in Audiosachen bin ich nicht so fit, und darum seht es mir bitte nach, wenn meine Frage vielleicht etwas "dumm" sein sollte.

Ich habe mithilfe der TMediaPlayer-Komponente einen kleinen Player gemacht. Für das Regeln der Lautstärke gibt es genügend Controls, ich würde aber gerne die Stereo-Balance regeln können, bzw. auch mal den rechten oder linken Kanal muten. Jetzt suche ich schon eine Weile, und finde nichts. Vielleicht habe ich auch die falschen Suchbegriffe. In der MMDevApi.pas habe ich auf dies gefunden:

Delphi-Quellcode:
  IAudioEndpointVolume = interface(IUnknown)
    ['{5CDF2C82-841E-4546-9722-0CF74078229A}']
    ....
    function SetMasterVolumeLevel(fLevelDB: Single; pguidEventContext: PGuid): HRESULT; stdcall;
    function SetMasterVolumeLevelScalar(fLevel: Single; pguidEventContext: PGuid): HRESULT; stdcall;
    function GetMasterVolumeLevel(var pfLevelDB: Single): HRESULT; stdcall;
    function GetMasterVolumeLevelScalar(var pfLevel: Single): HRESULT; stdcall;
    function SetChannelVolumeLevel(nChannel: UINT; fLevelDB: Single; pguidEventContext: PGuid): HRESULT; stdcall;
    function SetChannelVolumeLevelScalar(nChannel: UINT; fLevel:Single; pguidEventContext: PGuid): HRESULT; stdcall;
    function GetChannelVolumeLevel(nChannel: UINT; fLevelDB: Single): HRESULT; stdcall;
    function GetChannelVolumeLevelScalar(nChannel: UINT; fLevel: Single): HRESULT; stdcall;
    function SetMute(bMute: BOOL; pguidEventContext: PGuid): HRESULT; stdcall;
    function GetMute(var pbMute: BOOL): HRESULT; stdcall;
    function GetVolumeStepInfo(var pnStep: UINT; var pnStepCount: UINT): HRESULT; stdcall;
    function VolumeStepUp(pguidEventContext: PGuid): HRESULT; stdcall;
    function VolumeStepDown(pguidEventContext: PGuid): HRESULT; stdcall;
    function QueryHardwareSupport(var pdwHardwareSupportMask: UINT): HRESULT; stdcall;
    function GetVolumeRange(var pflVolumeMindB: Single; var pflVolumeMaxdB: Single;
                            var pflVolumeIncrementdB: Single): HRESULT; stdcall;
SetChannelVolumeLevel könnte doch vielleicht das richtige "Objekt meiner Begierde" sein, oder? Und wenn ja, wie setzt man das dann ein?

Auf Stackoverflow hab ich ein Beispiel gefunden. Das Interface scheint noch zu funktionieren (initialization läuft durch)...

Delphi-Quellcode:
...
var
  pEndpointVolume : IAudioEndpointVolume;
  LDeviceEnumerator: IMMDeviceEnumerator;
  Dev : IMMDevice;

procedure SetMasterVolume(fLevelDB: single);
function GetMasterVolume(): single;
function GetNumberOfChannels: Integer;
function GetChannelVolume(Channel: DWORD): single;
procedure SetVolumeChannel(fLevelDB: single; Channel: uint);
procedure SetMute(mute: Boolean);
function GetMute(): Boolean;

implementation
.....
initialization

if not Succeeded(CoCreateInstance(CLASS_IMMDeviceEnumerator, nil, CLSCTX_INPROC_SERVER, IID_IMMDeviceEnumerator, LDeviceEnumerator)) then
  RaiseLastOSError;
if not Succeeded(LDeviceEnumerator.GetDefaultAudioEndpoint(eRender, eConsole, Dev)) then
  RaiseLastOSError;
if not Succeeded(Dev.Activate(IID_IAudioEndpointVolume, CLSCTX_INPROC_SERVER, nil, pEndpointVolume)) then
  RaiseLastOSError;
...aber beim Zugriff (z.B. über SetVolumeChannel) hagelt es exceptions (ntdll.dll) und darum ist das debuggen auch nicht einfach. Vielleicht hat ja jemand einen Tipp oder ein funktionierendes Beispiel.
Gruss Otto
Wenn du mit Gott reden willst, dann bete.
Wenn du ihn treffen willst, schreib bei Tempo 220 eine SMS
  Mit Zitat antworten Zitat
mm1256

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

AW: Audiovolume - Balance bzw. Kanal-Lautstärke setzen

  Alt 24. Jan 2017, 06:18
Das Problem ist gelöst bzw. die Ursache gefunden. Die Implementation des IAudioEndpointVolume ist von Microsoft wohl irgendwann mal geändert worden. D.h. das Beispiel ist schlichtweg veraltet. Für die Deklarationen der Interfaces MMDevApi.pas verwenden, dann funktioniert es.
Gruss Otto
Wenn du mit Gott reden willst, dann bete.
Wenn du ihn treffen willst, schreib bei Tempo 220 eine SMS
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.332 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Audiovolume - Balance bzw. Kanal-Lautstärke setzen

  Alt 24. Jan 2017, 07:04
Da hat sich nichts geändert. Die Definition, die im Internet für Delphi oft kursiert, ist schlicht falsch.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#4

AW: Audiovolume - Balance bzw. Kanal-Lautstärke setzen

  Alt 24. Jan 2017, 07:30
Da hat sich nichts geändert. Die Definition, die im Internet für Delphi oft kursiert, ist schlicht falsch.
Aber nicht die in TAudioVolume.

Zitat:
Für die Deklarationen der Interfaces MMDevApi.pas verwenden, dann funktioniert es.
Und woher kommt die?

gruss
  Mit Zitat antworten Zitat
samso

Registriert seit: 29. Mär 2009
439 Beiträge
 
#5

AW: Audiovolume - Balance bzw. Kanal-Lautstärke setzen

  Alt 24. Jan 2017, 07:40
Und woher kommt die?
Berechtigte Frage. Nach den postings von mm1256 und jaenicke habe ich den Eindruck gewonnen, als würde MMDevApi.pas mit Delphi mitgeliefert werden. Das ist bei mir nicht der Fall. Habe ich einen Fehler in der Installation?
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#6

AW: Audiovolume - Balance bzw. Kanal-Lautstärke setzen

  Alt 24. Jan 2017, 07:48
Und woher kommt die?
Berechtigte Frage. Nach den postings von mm1256 und jaenicke habe ich den Eindruck gewonnen, als würde MMDevApi.pas mit Delphi mitgeliefert werden. Das ist bei mir nicht der Fall. Habe ich einen Fehler in der Installation?
NÖ denke nicht die kommt garantiert von TAudioVolume. (Denke ich mal)

gruss
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.332 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Audiovolume - Balance bzw. Kanal-Lautstärke setzen

  Alt 24. Jan 2017, 08:20
Da hat sich nichts geändert. Die Definition, die im Internet für Delphi oft kursiert, ist schlicht falsch.
Aber nicht die in TAudioVolume.
Nein, in der dort mitgelieferten Version ist alles korrekt.

Aber unter dem oben geposteten Link zu Stackoverflow wird z.B. bei SetChannelVolumeLevel als Typ für fLevelDB double benutzt. Laut Dokumentation ist es aber ein float und kein double, d.h. in Delphi auch Single und nicht double.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
t.roller
(Gast)

n/a Beiträge
 
#8

AW: Audiovolume - Balance bzw. Kanal-Lautstärke setzen

  Alt 24. Jan 2017, 23:02
Mit der TWindowsMediaPlayer-Komponente geht das auch:
MUTE, BALANCE, VOLUME.

Delphi-Quellcode:
type
    WMP1: TWindowsMediaPlayer;
...
procedure TForm1.bnMUTEClick(Sender: TObject);
begin
if WMP1.settings.mute then WMP1.settings.mute:=FALSE else WMP1.settings.mute:= TRUE;
end;

procedure TForm1.tbBALANCEChange(Sender: TObject); // TrackBar -10000 to 10000
begin
WMP1.settings.balance:= tbBALANCE.Position;
tbBALANCE.SelStart:= tbBALANCE.Position -500;
tbBALANCE.SelEnd:= tbBALANCE.Position +500;
end;

procedure TForm1.tbVOLUMEChange(Sender: TObject); // TrackBar 0 to 100
begin
WMP1.settings.volume:= tbVOLUME.Position;
tbVOLUME.SelStart:= 0;
tbVOLUME.SelEnd:= tbVOLUME.Position;
end;
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#9

AW: Audiovolume - Balance bzw. Kanal-Lautstärke setzen

  Alt 26. Jan 2017, 15:29
Das Problem ist gelöst bzw. die Ursache gefunden. Die Implementation des IAudioEndpointVolume ist von Microsoft wohl irgendwann mal geändert worden. D.h. das Beispiel ist schlichtweg veraltet. Für die Deklarationen der Interfaces MMDevApi.pas verwenden, dann funktioniert es.
Ehrlich gesagt wundert es mich das es bei dir funktionieren soll.
Denn definitiv ist etwas nicht in Ordnung. (Was ich gefixt habe in der MMDevApi von TAudioVolume)

Hier kracht es nicht? GetChannelVolumeLevelScalar, sollte aber nach dem alten Code.
Wenn du die IAudioEndpointVolume vom obigen Code verwendest.

gruss

Geändert von EWeiss (26. Jan 2017 um 15:37 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


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 11:46 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