Lautstärke regeln? Und evtl. Pegel auslesen (Win7)

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Derren
Beiträge: 558
Registriert: 23.07.2011 02:08

Lautstärke regeln? Und evtl. Pegel auslesen (Win7)

Beitrag 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.
Signatur und so
Benutzeravatar
_JON_
Beiträge: 389
Registriert: 30.03.2010 15:24

Re: Lautstärke regeln? Und evtl. Pegel auslesen (Win7)

Beitrag von _JON_ »

Das wäre wohl MMDevice API

Oder ganz einfach mit nircmd
PureBasic 5.46 LTS (Windows x86/x64) | windows 10 x64 Oktober failure
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Lautstärke regeln? Und evtl. Pegel auslesen (Win7)

Beitrag 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
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Derren
Beiträge: 558
Registriert: 23.07.2011 02:08

Re: Lautstärke regeln? Und evtl. Pegel auslesen (Win7)

Beitrag 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.
Signatur und so
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Re: Lautstärke regeln? Und evtl. Pegel auslesen (Win7)

Beitrag 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]
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
obscura
Beiträge: 4
Registriert: 22.05.2014 20:41

Re: Lautstärke regeln? Und evtl. Pegel auslesen (Win7)

Beitrag von obscura »

Danke für den Code. ts-soft
Funktioniert Optimal unter Win7
Benutzeravatar
dige
Beiträge: 1235
Registriert: 08.09.2004 08:53

Re: Lautstärke regeln? Und evtl. Pegel auslesen (Win7)

Beitrag 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
"Papa, ich laufe schneller - dann ist es nicht so weit."
Antworten