![]() |
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:
SetChannelVolumeLevel könnte doch vielleicht das richtige "Objekt meiner Begierde" sein, oder? Und wenn ja, wie setzt man das dann ein?
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; Auf ![]()
Delphi-Quellcode:
...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.
...
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; |
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.
|
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. ;-)
|
AW: Audiovolume - Balance bzw. Kanal-Lautstärke setzen
Zitat:
Zitat:
gruss |
AW: Audiovolume - Balance bzw. Kanal-Lautstärke setzen
Zitat:
|
AW: Audiovolume - Balance bzw. Kanal-Lautstärke setzen
Zitat:
gruss |
AW: Audiovolume - Balance bzw. Kanal-Lautstärke setzen
Zitat:
Aber unter dem oben geposteten Link zu Stackoverflow wird z.B. bei SetChannelVolumeLevel als Typ für fLevelDB double benutzt. Laut ![]() |
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; |
AW: Audiovolume - Balance bzw. Kanal-Lautstärke setzen
Zitat:
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:45 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz