spotan würde ich mal sagen, du mußt nur noch das richtige Interface abfragen.
defaultDevice.Activate(IID_..., CLSCTX_INPROC_SERVER, nil, ...);
.
Delphi-Quellcode:
var
audioMeterInformation: IAudioMeterInformation;
procedure TForm1.FormCreate(Sender: TObject);
var
deviceEnumerator: IMMDeviceEnumerator;
defaultDevice: IMMDevice;
begin
CoCreateInstance(CLASS_IMMDeviceEnumerator, nil, CLSCTX_INPROC_SERVER, IID_IMMDeviceEnumerator, deviceEnumerator);
deviceEnumerator.GetDefaultAudioEndpoint(eRender, eConsole, defaultDevice);
defaultDevice.Activate(IID_IAudioMeterInformation, CLSCTX_INPROC_SERVER, nil, audioMeterInformation);
end;
var H: HRESULT;
H := audioMeterInformation.GetPeakValue(Peak);
if H = S_OK then Peak_anzeigen else ShowMessage(SysErrorMessage(H));
leider hat sich hier aber jemand viel Arbeit erspart und das Intereface nicht komplett deklariert (den Inhalt einfach weggelassen)
Delphi-Quellcode:
const
IID_IAudioMeterInformation : TGUID = '{C02216F6-8C67-4B5B-9D00-D008E73E0064}';
IAudioMeterInformation = interface(IUnknown)
['{C02216F6-8C67-4B5B-9D00-D008E73E0064}']
...
function GetPeakValue(out Peak: Real): HRESULT; stdcall;
...
end;
Bei Interfaces kommt es aber auf die Reihenfolge der Methoden an
(hier wird meißtens über den Index und nicht über Methodenname gearbeitet)
darum mußt du nur noch den Rest der Interfacedeklaration (oder zumindestens die Anzahl der Methoden vor deiner gewünschten Methode) rausbekommen >
IAudioMeterInformation
Das schon bekannte GetPeakValue ließ sich leicht übersetzen und einfügen.
Delphi-Quellcode:
IAudioMeterInformation = interface(IUnknown)
['{C02216F6-8C67-4B5B-9D00-D008E73E0064}']
procedure dummy_GetChannelsPeakValues; stdcall;
procedure dummy_GetMeteringChannelCount; stdcall;
function GetPeakValue(out Peak: Real): HRESULT; stdcall;
procedure dummy_QueryHardwareSupport; stdcall;
end;
Die Deklaration der restlichen Methoden ist aber auch noch im
MSDN zu finden.
PS:
dort stand auch, wie man dieses Interface bekommt.
Zitat:
The client obtains a reference to the IAudioMeterInformation interface on an endpoint object by calling the IMMDevice::Activate method with parameter iid set to REFIID IID_IAudioMeterInformation.
Und auch die zu erwartenden Wertebereiche des Peak-Parameters kann man
dort finden.