Einzelnen Beitrag anzeigen

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