Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#15

AW: Peak vom Audioausgang

  Alt 15. Jul 2010, 07:24
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 > MSDN-Library durchsuchenIAudioMeterInformation
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.
$2B or not $2B
  Mit Zitat antworten Zitat