![]() |
Peak vom Audioausgang
Hi,
gibt es eine Möglichkeit den Peak des Audioausgangs eines Rechners zu bekommen, so ähnlich wie beim Bassdllplayer? Oder eben den Auschlag, den Win 7 bei den Audiogeräten angezeigt wird(Levelmeter am Mischpult)? Wenn das nicht geht wäre es auch okay, wenn man ihn vom Aufnahmeeingang einlesen kann, ich müsste halt nur an den Peak kommen, der von ITunes, WMP o.ä ausgegeben wird. Gibt es da eine Möglichkeit, am besten nicht zu umständlich aber jede Lösung wäre okay. Gruß Masteric |
AW: Peak vom Audioausgang
Liste der Anhänge anzeigen (Anzahl: 2)
Joa, es gibt da ein paar Möglichkeiten...
mit der Bass.dll, siehe in den Beispielen nach (livefx.dpr) oder über die WinAPI per "Fuss" ;) (irgend ein User aus der DP hat dies Demo erstellt.. wer, weis ich leider nicht mehr ) |
AW: Peak vom Audioausgang
Unter Windows 7/Vista solltest du relativ einfach über die "Core Audio"-Schnittstelle an diese Daten herankommen. Leider ist für WASAPI kein Header für Pascal vorhanden - im Notfall einfach mit Microsoft Visual Studio C eine kleine Bibliothek schreiben, die das kann.
Hier sind die nötigen Sachen detailiert beschrieben: ![]() |
AW: Peak vom Audioausgang
hallo und danke für die tipps schon mal!
so habe mir nun die Vorschläge angeschaut und habe gesehen, dass es doch etwas komplizierter ist mit dem Programm, da dieses die frequenzen noch aufteilt. Nun habe ich mir auch den 2. Vorschlag angeschaut und bemerkt, dass es da etwas einfach zu sein scheint. Da gibt es auf der MSDN sogar einen Vorschlag für ein Levelmeter, nur da ich leider kein VS habe und noch weniger c kann, wodurch das erstellen einer dll noch schwieriger ist wollte ich fragen, ob mir jemand eine dll erstellen kann mit dem Bsp. hier: ![]() Gruß Masteric |
AW: Peak vom Audioausgang
Du kannst da auch auf DirectShow zugreifen...
|
AW: Peak vom Audioausgang
Zitat:
|
AW: Peak vom Audioausgang
Vermutlich meint er DirectSound oder gleich XAudio 2? (sind alles Teile von DirectX)
|
AW: Peak vom Audioausgang
Da hier nun neue begriffe im raum stehen, gibt es eine möglichkeit an die daten des levelmeters zu kommen? Am besten eine, die mir prozent oder einen wert ausgibt, mit dem ich die prozent ausrechnen kann? Vielleicht schon eine fertige dll?
Gruß Masteric |
AW: Peak vom Audioausgang
Ich habe eben nochmal auf MSDN ein bisschen gestöbert und das hier
![]() gruß masteric |
AW: Peak vom Audioausgang
Wie man das ganze mit DirectShow lösen kann wird
![]() Möchtest du jetzt angezeigt bekommen, wie der Pegel direkt am Ausgang ist oder wie er in Windows ist? Wenn du zb einen Film in Windows auf volle Lautstärke abspielst, kannst du am Ausgang auch keinen Ausschlag haben, wenn in Windows der "Main-Pegel" auf null steht. |
AW: Peak vom Audioausgang
GetPeakValue ist eine Methode des Interfaces IAudioMeterInformation.
IAudioMeterInformation müßtest du also irgendwie importieren. ![]() ![]() ![]() |
AW: Peak vom Audioausgang
Mit himitsus Bsp. konnte ich jetzt auf die schnelle das hier finden:
Zitat:
Edit: Nicht getestet :) |
AW: Peak vom Audioausgang
mich würde es direkt am ausgang interessieren, also was auf die lautsprecher rausgeht,
|
AW: Peak vom Audioausgang
Zitat:
|
AW: Peak vom Audioausgang
spotan würde ich mal sagen, du mußt nur noch das richtige Interface abfragen.
Delphi-Quellcode:
.
defaultDevice.Activate(IID_..., CLSCTX_INPROC_SERVER, nil, ...);
Delphi-Quellcode:
leider hat sich hier aber jemand viel Arbeit erspart und das Intereface nicht komplett deklariert (den Inhalt einfach weggelassen)
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));
Delphi-Quellcode:
Bei Interfaces kommt es aber auf die Reihenfolge der Methoden an
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; (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 > ![]() Das schon bekannte GetPeakValue ließ sich leicht übersetzen und einfügen.
Delphi-Quellcode:
Die Deklaration der restlichen Methoden ist aber auch noch im MSDN zu finden.
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; PS: ![]() Zitat:
![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:48 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