[Vista/Win7] Master Volume einstellen/Abfragen

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
GPI
Beiträge: 1511
Registriert: 29.08.2004 13:18
Kontaktdaten:

[Vista/Win7] Master Volume einstellen/Abfragen

Beitrag von GPI »

Mit Vista wurde ja die Lautsprecher-Mixer völlig geändert. Jeder bisherige Code zum einstellen der maximalen Lautstärke versagt da leider völlig, weil man dann nur noch das eigene Programm kontrollieren kann.

Hiermit gehts dann:

Code: Alles auswählen

#CLSCTX_INPROC_SERVER = $1
#CLSCTX_INPROC_HANDLER = $2
#CLSCTX_LOCAL_SERVER = $4
#CLSCTX_REMOTE_SERVER = $10
#CLSCTX_SERVER =   (#CLSCTX_INPROC_SERVER | #CLSCTX_LOCAL_SERVER | #CLSCTX_REMOTE_SERVER)
#CLSCTX_ALL    =   (#CLSCTX_INPROC_HANDLER | #CLSCTX_SERVER)

Enumeration; EDataFlow
  #eRender
  #eCapture
  #eAll
  #EDataFlow_enum_count 
EndEnumeration
Enumeration;ERole
  #eConsole
  #eMultimedia
  #eCommunications
  #ERole_enum_count 
EndEnumeration



Interface IMMDeviceEnumerator Extends IUnknown
  EnumAudioEndpoints(dataFlow, dwStateMask, *ppDevices);
  GetDefaultAudioEndpoint(dataFlow, role, ppEndpoint);
  GetDevice(pwstrId, ppDevice);
  RegisterEndpointNotificationCallback(pClient);
  UnregisterEndpointNotificationCallback(pClient);
EndInterface
Interface IMMDevice Extends IUnknown
  Activate(iid, dwClsCtx, pActivationParams, ppInterface);
  OpenPropertyStore( stgmAccess, ppProperties);
  GetId(ppstrId);
  GetState(pdwState);
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


Procedure GetEndPointVolume(*endpointvolume)
  CoInitialize_(#Null);, #COINIT_APARTMENTTHREADED | #COINIT_DISABLE_OLE1DDE) 
  
  deviceEnumerator.IMMDeviceEnumerator
  hr=CoCreateInstance_(?uuidof_MMDeviceEnumerator, #Null, #CLSCTX_INPROC_SERVER, ?uuidof_IMMDeviceEnumerator,@deviceEnumerator);#CLSCTX_ALL 
  
  defaultDevice.IMMDevice
  hr = deviceEnumerator\GetDefaultAudioEndpoint(#eRender, #eConsole, @defaultDevice);
  deviceEnumerator\Release()
  
  ;endpointVolume.IAudioEndpointVolume
  hr = defaultDevice\Activate(?uuidof_IAudioEndpointVolume, #CLSCTX_INPROC_SERVER, #Null, *endpointVolume);
  defaultDevice\release()
  
  ProcedureReturn *endpointvolume
EndProcedure
;currentVolume.f
;hr=endpointVolume\GetMasterVolumeLevel(@currentVolume)
;Debug hr
;Debug StrF(currentVolume)

;hr=endpointVolume\getVolumeRange(@min.f,@max.f,@inc.f)
;Debug StrF(min)+" "+StrF(max)+" "+StrF(inc)+" "+StrF((max - min) / inc)


;endpointVolume\SetMasterVolumeLevel(0)

;endpointVolume\GetMute(@mute)
;Debug mute
;endpointvolume\setmute(1,#Null)

;endpointVolume\GetMute(@mute)
;Debug mute
;Delay(1000)
;endpointvolume\setmute(0,#Null)
Procedure FreeEndPointVolume(*endpointvolume.IAudioEndpointVolume)  
  *endpointvolume\release()
  CoUninitialize_()
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
Anwendungsbeispiel aus meinen Programm:

Code: Alles auswählen

Case #action_VolUp,#action_VolDown;{ Leiser/lauter
          Volume.IAudioEndpointVolume
          getendpointvolume(@volume)
          volume\GetMasterVolumeLevelScalar(@volf.f)
          If action=#action_voldown
            volf-#debugVolStep
            If volf<0 : volf=0 : EndIf
          Else
            volf+#debugVolStep
            If volf>1 : volf=1 : EndIf
          EndIf
          showinfo("Volume "+Str(volf*100)+"%",volf*100)
          volume\SetMasterVolumeLevelScalar(volf,#Null)
          volume\setmute(0,#Null)
          FreeEndPointVolume(volume)
          ;}
        Case #action_VolMute;{ Mute
          Volume.IAudioEndpointVolume
          getendpointvolume(@volume)
          mute.l
          volume\GetMute(@Mute.l)
          mute=1-Mute
          
          volume\GetMasterVolumeLevelScalar(@volf.f)
          
          vol=Int(volf*100)
          
          showinfo("Volume "+StringField(Str(vol)+"%,(mute)",mute+1,","),(1-mute)*vol)
          
          volume\setmute(mute,#Null)
          FreeEndPointVolume(Volume)
          ;}    
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!