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.
Bild

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.
Bild

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. :praise: 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