Seite 1 von 1
Lautstärke regeln? Und evtl. Pegel auslesen (Win7)
Verfasst: 20.02.2014 20:02
von Derren
Hallo
Kennt jemand zufällig einen API-Weg um die Systemlautstärke zu regeln? Idealerweise einzelne Softwarekanäle. Aber die Gesamtlautstärke würde zur Not auch genügen.
Hintergrund ist eine "Talkover"-Funktion, die automatisch den Pegel runterregeln soll, sobald ins Mikro gesprochen wird, und danach wieder rauf.
Meine derzeitige Lösung ist alles andere als elegant, funktioniert aber für meinen Zweck. Der Mikropegel wird über die Pixelfarbe der Pegelanzeige in der Systemkontrolle ermittelt.
Und dann wird der Cursor entsprechend positioniert und bewegt den Regler im "Mixer".
Wie gesagt, funktioniert für meinen Zweck, da der PC nur diese eine Funktion hat. Aber eine API-Lösung, die im Hintergrund läuft wär auch nicht schlecht.
Re: Lautstärke regeln? Und evtl. Pegel auslesen (Win7)
Verfasst: 20.02.2014 20:12
von _JON_
Das wäre wohl
MMDevice API
Oder ganz einfach mit
nircmd
Re: Lautstärke regeln? Und evtl. Pegel auslesen (Win7)
Verfasst: 20.02.2014 20:22
von ts-soft
Code: Alles auswählen
EnableExplicit
#CLSCTX_INPROC_SERVER = $01
#CLSCTX_INPROC_HANDLER = $02
#CLSCTX_LOCAL_SERVER = $04
#CLSCTX_REMOTE_SERVER = $10
#CLSCTX_ALL = #CLSCTX_INPROC_SERVER|#CLSCTX_INPROC_HANDLER|#CLSCTX_LOCAL_SERVER|#CLSCTX_REMOTE_SERVER
#CLSCTX_INPROC = #CLSCTX_INPROC_SERVER|#CLSCTX_INPROC_HANDLER
#CLSCTX_SERVER = #CLSCTX_INPROC_SERVER|#CLSCTX_LOCAL_SERVER|#CLSCTX_REMOTE_SERVER
Interface IMMDeviceEnumerator Extends IUnknown
EnumAudioEndpoints(dataFlow, dwStateMask, *ppDevices);
GetDefaultAudioEndpoint(dataFlow, role, ppEndpoint);
GetDevice(pwstrId, ppDevice);
RegisterEndpointNotificationCallback(pClient);
UnregisterEndpointNotificationCallback(pClient);
EndInterface
Interface IAudioEndpointVolume Extends IUnknown
RegisterControlChangeNotify( *pNotify)
UnregisterControlChangeNotify( *pNotify)
GetChannelCount( *pnChannelCount)
SetMasterVolumeLevel( fLevelDB.f)
SetMasterVolumeLevelScalar( fLevel.f,pguidEventContext)
GetMasterVolumeLevel(*pfLevelDB)
GetMasterVolumeLevelScalar(*pfLevel)
SetChannelVolumeLevel(nChannel,fLevelDB.f,pguidEventContext)
SetChannelVolumeLevelScalar( nChannel,fLevel.f,pguidEventContext)
GetChannelVolumeLevel( nChannel,*pfLevelDB.f)
GetChannelVolumeLevelScalar( nChannel,*pfLevel.f)
SetMute( bMute, pguidEventContext)
GetMute( *pbMute)
GetVolumeStepInfo( *pnStep, *pnStepCount)
VolumeStepUp( pguidEventContext)
VolumeStepDown( pguidEventContext)
QueryHardwareSupport( *pdwHardwareSupportMask)
GetVolumeRange( *pflVolumeMindB, *pflVolumeMaxdB, *pflVolumeIncrementdB)
EndInterface
Interface IMMDevice Extends IUnknown
Activate(iid, dwClsCtx, pActivationParams, ppInterface);
OpenPropertyStore( stgmAccess, ppProperties);
GetId(ppstrId);
GetState(pdwState);
EndInterface
Procedure GetEndPointVolume(*endpointvolume)
Protected deviceEnumerator.IMMDeviceEnumerator
Protected hr, defaultDevice.IMMDevice
CoInitialize_(#Null)
hr = CoCreateInstance_(?uuidof_MMDeviceEnumerator, #Null, #CLSCTX_INPROC_SERVER, ?uuidof_IMMDeviceEnumerator,@deviceEnumerator);#CLSCTX_ALL
hr = deviceEnumerator\GetDefaultAudioEndpoint(0, 1, @defaultDevice)
deviceEnumerator\Release()
hr = defaultDevice\Activate(?uuidof_IAudioEndpointVolume, #CLSCTX_INPROC_SERVER, #Null, *endpointVolume);
defaultDevice\release()
ProcedureReturn *endpointvolume
EndProcedure
Procedure FreeEndPointVolume(*endpointvolume.IAudioEndpointVolume)
*endpointvolume\release()
CoUninitialize_()
EndProcedure
Procedure MediaGetVolume()
Protected Volume.IAudioEndpointVolume
Protected volf.f
GetEndPointVolume(@Volume)
Volume\GetMasterVolumeLevelScalar(@volf)
volf = Round(volf * 100, #PB_Round_Nearest)
FreeEndPointVolume(Volume)
ProcedureReturn Int(volf)
EndProcedure
Procedure MediaSetVolume(vol)
Protected Volume.IAudioEndpointVolume
Protected volf.f
If vol < 0 : vol = 0 : EndIf
If vol > 100 : vol = 100 : EndIf
GetEndPointVolume(@Volume)
volf = vol / 100
Volume\SetMasterVolumeLevelScalar(volf, #Null)
FreeEndPointVolume(Volume)
EndProcedure
DataSection
uuidof_IAudioEndpointVolume:
Data.l $5CDF2C82
Data.w $841E,$4546
Data.b $97,$22,$0C,$F7,$40,$78,$22,$9A
uuidof_MMDeviceEnumerator:
Data.l $BCDE0395
Data.w $E52F,$467C
Data.b $8E,$3D,$C4,$57,$92,$91,$69,$2E
uuidof_IMMDeviceEnumerator:
Data.l $A95664D2
Data.w $9614
Data.w $4F35
Data.b $A7,$46,$DE,$8D,$B6,$36,$17,$E6
EndDataSection
Re: Lautstärke regeln? Und evtl. Pegel auslesen (Win7)
Verfasst: 21.02.2014 17:50
von Derren
Boah, die machen's einem ja nicht gerade einfach -_-
Danke euch beiden.

Wenn man den code von ts-soft irgendwie auf einen speziellen Programmregler umbasteln könnte wäre das schon cool. Aber bis dahin nehm ich wie von _JON_ vorgeschlagen nircmd.
Der API-Code hätte noch den Vorteil, dass die Werte absolut sind und nicht nur relativ wie bei nircmd. Oh well.
Aber hat alles geklappt, wenn auch ein wenig gefrickelt, weil ich mir immernoch nicht den ganzen Threads-Kram angeschaut habe.
Re: Lautstärke regeln? Und evtl. Pegel auslesen (Win7)
Verfasst: 21.02.2014 18:02
von bobobo
[mein-ot-senf]
den Flashplayer braucht man an sich nicht mehr, wenn man den
google-chrome-browser nutzt, da der das von sich aus kann.
Stichwort Pepper-Flash
[/mein-ot-senf]
Re: Lautstärke regeln? Und evtl. Pegel auslesen (Win7)
Verfasst: 03.06.2014 23:02
von obscura
Danke für den Code. ts-soft
Funktioniert Optimal unter Win7
Re: Lautstärke regeln? Und evtl. Pegel auslesen (Win7)
Verfasst: 12.06.2014 11:11
von dige
@TS-Soft: Kennst du auch einen Weg, den aktuellen Lautstärke Pegel oder die Frequenz zu ermitteln, vom Sound der
über die Boxen rausgeht?
Im englischen Forum ist das bisher nur für den Mikrofon Kanal gelungen. Ich würde gern für einen Musikplayer eine
Pegelanzeige ohne externe Dll realiseren.
Ciao dige