Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Audiovolume - Balance bzw. Kanal-Lautstärke setzen (https://www.delphipraxis.net/191517-audiovolume-balance-bzw-kanal-lautstaerke-setzen.html)

mm1256 23. Jan 2017 18:24

Audiovolume - Balance bzw. Kanal-Lautstärke setzen
 
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.

mm1256 24. Jan 2017 06:18

AW: Audiovolume - Balance bzw. Kanal-Lautstärke setzen
 
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.

jaenicke 24. Jan 2017 07:04

AW: Audiovolume - Balance bzw. Kanal-Lautstärke setzen
 
Da hat sich nichts geändert. Die Definition, die im Internet für Delphi oft kursiert, ist schlicht falsch. ;-)

EWeiss 24. Jan 2017 07:30

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

Zitat von jaenicke (Beitrag 1359782)
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

samso 24. Jan 2017 07:40

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

Zitat von EWeiss (Beitrag 1359787)
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?

EWeiss 24. Jan 2017 07:48

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

Zitat von samso (Beitrag 1359788)
Zitat:

Zitat von EWeiss (Beitrag 1359787)
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

jaenicke 24. Jan 2017 08:20

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

Zitat von EWeiss (Beitrag 1359787)
Zitat:

Zitat von jaenicke (Beitrag 1359782)
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.

t.roller 24. Jan 2017 23:02

AW: Audiovolume - Balance bzw. Kanal-Lautstärke setzen
 
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;

EWeiss 26. Jan 2017 15:29

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

Zitat von mm1256 (Beitrag 1359780)
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


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:42 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