Set get volume système avec event utilisateur

Partagez votre expérience de PureBasic avec les autres utilisateurs.
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Set get volume système avec event utilisateur

Message par nico »

C'est pas fini, faut que je scinde des procédures.

Ajout du Peak meter.

Code : Tout sélectionner

#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

Enumeration ; Flow
  #eRender  ; se connecter sur audio
  #eCapture ; capturer audio
  #eAll     ; tous
EndEnumeration

Enumeration ;Role
  #eConsole ; system
  #eMultimedia ; (haut parleur ...)
  #eCommunications ; (micro...)
EndEnumeration

CompilerIf  #PB_Compiler_Thread = 0
  MessageRequester("Info", "Ce code se compile avec la Gestion des Threads cochée!")
  End 
CompilerEndIf

Interface IMMDeviceEnumerator Extends IUnknown
  EnumAudioEndpoints(Flow.l, dwStateMask.l, IMMDeviceCollection.i)
  GetDefaultAudioEndpoint(Flow.l, role.l, IMMDevice.i)       
  GetDevice(pwstrId.i, IMMDevice.i)        
  RegisterEndpointNotificationCallback(IMMNotificationClient.i) 
  UnregisterEndpointNotificationCallback(IMMNotificationClient.i)
EndInterface

Interface IAudioEndpointVolume Extends IUnknown
  RegisterControlChangeNotify(pNotify.i)
  UnregisterControlChangeNotify(pNotify.i)
  GetChannelCount(puchannelCount.i)
  SetMasterVolumeLevel(levelDB.f, *context.Guid)
  SetMasterVolumeLevelScalar(level.f, *context.Guid)
  GetMasterVolumeLevel(pflevelDB.i)
  GetMasterVolumeLevelScalar(pflevel.i)
  SetChannelVolumeLevel(uchannel.l, levelDB.f, *context.Guid)
  SetChannelVolumeLevelScalar(uchannel.l, level.f, *context.Guid)
  GetChannelVolumeLevel(uchannel.l, plevelDB.i)
  GetChannelVolumeLevelScalar(uchannel.l, pflevel.i)
  SetMute(mute.l, *context.Guid)
  GetMute(pmute.i)
  GetVolumeStepInfo(puStep.i, pustepCount.i)
  VolumeStepUp(*context.Guid)
  VolumeStepDown(*context.Guid)
  QueryHardwareSupport(pdwHardwareSupportMask.i)
  GetVolumeRange(pflVolumeMindB.i, pflVolumeMaxdB.i, pflVolumeIncrementdB.i)
EndInterface

Interface IMMDevice Extends IUnknown
  Activate(iid.i, dwClsCtx.l, pActivationParams.i, ppInterface.i)
  OpenPropertyStore(stgmAccess.i, IPropertyStore.i) 
  GetId(ppstrId.i)
  GetState(pdwState.i)
EndInterface  

; ("C02216F6-8C67-4B5B-9D00-D008E73E0064")
Interface IAudioMeterInformation Extends IUnknown
  GetPeakValue(pfPeak.i)
  GetMeteringChannelCount(pnChannelCount.i)
  GetChannelsPeakValues(u32ChannelCount.l, afPeakValues.i)
  QueryHardwareSupport(pdwHardwareSupportMask.i)
EndInterface 
         
Structure AUDIO_VOLUME_NOTIFICATION_DATA Align #PB_Structure_AlignC
  guidEventContext.GUID
  bMuted.l
  fMasterVolume.f
  nChannels.l
  afChannelVolumes.f[1]
EndStructure 

Interface IAudioEndpointVolumeCallback Extends IUnknown
  OnNotify(*pNotify.AUDIO_VOLUME_NOTIFICATION_DATA)
EndInterface

Structure AudioEndpointVolumeCallback Align #PB_Structure_AlignC
  *pointerAudioEndpointVolumeCallback
  QueryInterface.i
  AddRef.i
  Release.i
  OnNotify.i
  pAudioEndpointVolumeCallback.IAudioEndpointVolumeCallback
  Refcount.i
  Event.l
  MyGuid.GUID
EndStructure

Global AudioEndpointVolumeCallback.AudioEndpointVolumeCallback
Global pAudioMeterInformation.IAudioMeterInformation

Procedure.i ConvertToUnicode(AsciiOrUnicode.s)
  Protected *UnicodeString
  Protected LenMemoryUnicode.l
  
  LenMemoryUnicode = StringByteLength(AsciiOrUnicode , #PB_Unicode)
  *UnicodeString = AllocateMemory(LenMemoryUnicode + 2)
  If *UnicodeString <> 0
    PokeS(*UnicodeString, AsciiOrUnicode, Len(AsciiOrUnicode), #PB_Unicode)
    ProcedureReturn *UnicodeString
  EndIf
  
  ProcedureReturn 0
EndProcedure

Procedure.i CLSIDFromString(ClsidString.s, *CLSID.CLSID)
  Protected *UnicodeString
  
  If *CLSID <> 0
    If ClsidString <> ""
      CompilerIf #PB_Compiler_Unicode =0
        *UnicodeString = ConvertToUnicode(ClsidString)
      CompilerElse
        *UnicodeString = @ClsidString
      CompilerEndIf 
      If *UnicodeString <> 0
        If CLSIDFromString_(*UnicodeString, @REFIID.CLSID) >= #S_OK
          CopyMemory(REFIID, *CLSID, SizeOf(CLSID))
          ProcedureReturn *CLSID
        EndIf 
        CompilerIf #PB_Compiler_Unicode =0
          FreeMemory(*UnicodeString)
        CompilerEndIf
      EndIf
    EndIf
  Else
    ProcedureReturn 0
  EndIf
  
  FillMemory(*CLSID, SizeOf(CLSID),  #Null)
  ProcedureReturn *CLSID
EndProcedure

Procedure InterlockedCompareExchange(*Destination.Integer, Exchange.i, Comparand.i)
  EnableASM
  CompilerIf #PB_Compiler_Processor=#PB_Processor_x86
    !mov ecx,[p.p_Destination]
    !mov eax,[p.v_Comparand]
    !mov edx,[p.v_Exchange]
    !lock cmpxchg [ecx],edx 
  CompilerEndIf
  CompilerIf #PB_Compiler_Processor=#PB_Processor_x64
    !mov rcx,[p.p_Destination]
    !mov rax,[p.v_Comparand]
    !mov rdx,[p.v_Exchange]
    !lock cmpxchg [rcx],rdx
  CompilerEndIf
  ProcedureReturn
  DisableASM 
EndProcedure

Procedure InterlockedExchange(*Destination.Integer, Value.i)
  EnableASM
  CompilerIf #PB_Compiler_Processor=#PB_Processor_x86
    !mov ecx,[p.p_Destination]
    !mov eax,[p.v_Value]
    !xchg [ecx],eax
  CompilerEndIf
  CompilerIf #PB_Compiler_Processor=#PB_Processor_x64
    !mov rcx,[p.p_Destination]
    !mov rax,[p.v_Value]
    !xchg [rcx],rax
  CompilerEndIf
  DisableASM 
  ProcedureReturn
EndProcedure

Procedure.i AudioEndpointVolumeCallback_AddRef(*pObject.AudioEndpointVolumeCallback)
  Protected Ref.i
  
  Debug "AudioEndpointVolumeCallback_AddRef"
  
  Repeat 
    Ref = *pObject\Refcount
  Until InterlockedCompareExchange(@*pObject\Refcount, Ref + 1, Ref) <> *pObject\Refcount
  Debug "*pObject\Refcount = " + Str(*pObject\Refcount)
  
  ProcedureReturn Ref + 1
EndProcedure

Procedure.l AudioEndpointVolumeCallback_QueryInterface(*pObject.AudioEndpointVolumeCallback, *REFIID.CLSID, *ppvObj.INTEGER)
  Protected REFIID.CLSID, Null.CLSID
  
  Debug "AudioEndpointVolumeCallback_QueryInterface +++++++++++++++++++++++++++++++++++"
  
  If *ppvObj = 0
    ProcedureReturn #E_POINTER 
    
  ElseIf CompareMemory(CLSIDFromString("{657804fa-d6ad-4496-8a60-352752af4f89}", @REFIID), *REFIID, 16)
    *pObject\pAudioEndpointVolumeCallback\AddRef()
    *ppvObj\i = *pObject
  ElseIf CompareMemory(CLSIDFromString("{00000000-0000-0000-0000-000000000000}", @Null), *REFIID, 16)
    *pObject\pAudioEndpointVolumeCallback\AddRef()
    *ppvObj\i = *pObject
  Else
    *ppvObj\i = #Null
    ProcedureReturn #E_NOINTERFACE
  EndIf
  
  ProcedureReturn #S_OK
EndProcedure

Procedure.i AudioEndpointVolumeCallback_Release(*pObject.AudioEndpointVolumeCallback)
  Protected Ref.i
  
  Debug "AudioEndpointVolumeCallback_Release"
  
  Repeat 
    Ref = *pObject\Refcount
  Until InterlockedCompareExchange(@*pObject\Refcount, Ref - 1, Ref) <> *pObject\Refcount
  
  Debug "*pObject\Refcount = " + Str(*pObject\Refcount)
  
  If Ref -1 = 0
    *pObject\pAudioEndpointVolumeCallback = 0
    Debug "delete element --------------------------------"
    *pObject\Refcount = 0
    *pObject = 0
  EndIf
  
  ProcedureReturn Ref - 1
EndProcedure

Procedure.l AudioEndpointVolumeCallback_OnNotify(*pObject.AudioEndpointVolumeCallback, *pNotify.AUDIO_VOLUME_NOTIFICATION_DATA)
  Debug "AudioEndpointVolumeCallback_OnNotify"
  
  ;   Debug *pNotify\fMasterVolume
  ;   Debug "----------------------------------------------------"
  ;   Debug *pObject\MyGuid\Data1
  ;   Debug *pObject\MyGuid\Data2
  ;   Debug *pObject\MyGuid\Data3
  ;   Debug *pObject\MyGuid\Data4
  ;   Debug "----------------------------------------------------"
  ;   
  ;   Debug *pNotify\guidEventContext\Data1
  ;   Debug *pNotify\guidEventContext\Data2
  ;   Debug *pNotify\guidEventContext\Data3
  ;   Debug *pNotify\guidEventContext\Data4
  ;   Debug "----------------------------------------------------"
  
  If CompareMemory(*pObject\MyGuid, *pNotify\guidEventContext, 16) = 0
    SetGadgetState(0, 100 * *pNotify\fMasterVolume)
    
    If *pNotify\bMuted = 0
      SetGadgetText(1, "Mute Off")
    ElseIf *pNotify\bMuted = 1
      SetGadgetText(1, "Mute On") 
    EndIf
  EndIf 
  
  ;guidEventContext.GUID
;   Debug *pNotify\bMuted.l
;   Debug *pNotify\nChannels
  ; afChannelVolumes.f[1]
  ProcedureReturn #S_OK
EndProcedure

Procedure.i DataAudioEndPointVolume(Option.l, InterfaceCom.i=0)
  Static AudioEndPointVolume.i
  
  If Option = 1
    If InterfaceCom <> 0
      AudioEndPointVolume = InterfaceCom
      ProcedureReturn #True
    EndIf 
  ElseIf Option = 2
    If AudioEndPointVolume <> 0
      ProcedureReturn AudioEndPointVolume
    EndIf 
  ElseIf Option = 3
    AudioEndPointVolume = 0
    ProcedureReturn 0
  EndIf 
  
  ProcedureReturn #False 
EndProcedure

Procedure.i DataAudioMeterInformation(Option.l, InterfaceCom.i=0)
  Static AudioMeterInformation.i
  
  Debug "DataAudioMeterInformation"
  
  If Option = 1
    If InterfaceCom <> 0
      AudioMeterInformation = InterfaceCom
      ProcedureReturn #True
    EndIf 
  ElseIf Option = 2
    If AudioMeterInformation <> 0
      ProcedureReturn AudioMeterInformation
    EndIf 
  ElseIf Option = 3
    AudioMeterInformation = 0
    ProcedureReturn 0
  EndIf 
  
  ProcedureReturn #False 
EndProcedure

Procedure Com_GetAudioMeterInformation()
  Protected pdeviceEnumerator.IMMDeviceEnumerator
  Protected pAudioMeterInformation.IAudioMeterInformation
  Protected pdefaultDevice.IMMDevice
  Protected RET.l=-1
  
  If  CoCreateInstance_(?uuidof_MMDeviceEnumerator, #Null, #CLSCTX_INPROC_SERVER, ?uuidof_IMMDeviceEnumerator,@pdeviceEnumerator) < #S_OK
    Goto error
  ElseIf pdeviceEnumerator = 0
    Goto error
  EndIf
  
  If  pdeviceEnumerator\GetDefaultAudioEndpoint(#eRender, #eMultimedia, @pdefaultDevice) < #S_OK
    Goto error:
  ElseIf pdefaultDevice = 0
    Goto error
  EndIf
  
  If pdefaultDevice\Activate(?uuidof_IAudioMeterInformation, #CLSCTX_INPROC_SERVER, #Null, @pAudioMeterInformation.IAudioMeterInformation) < #S_OK
    Debug "error"
    Goto error
  ElseIf pAudioMeterInformation = 0
    Debug "error"
    Goto error
  Else
    Debug "ok---"
    RET = #S_OK
    Goto NoError
  EndIf
  
  Error:
  If pAudioMeterInformation <> 0
    pAudioMeterInformation\Release()
  EndIf 
  
  NoError:
  Debug "NoError"
  Debug pAudioMeterInformation
  DataAudioMeterInformation(1, pAudioMeterInformation)
  
  If pdefaultDevice <> 0
    pdefaultDevice\Release()
  EndIf
  
  If pdeviceEnumerator <> 0
    pdeviceEnumerator\Release()
  EndIf
  
  ProcedureReturn RET
EndProcedure

Procedure.l Com_FreeAudioMeterInformation()
  Protected AudioMeter.IAudioMeterInformation
  
  AudioMeter = DataAudioEndPointVolume(2)
  If AudioMeter <> 0
    AudioMeter\release()
    DataAudioMeterInformation(3)
    ProcedureReturn #S_OK
  EndIf
  ProcedureReturn -1
EndProcedure

Procedure.l ComEvent_SetAudioEndpointVolumeCallback()
  Protected Volume.IAudioEndpointVolume
  Protected Guid.GUID
  
  Volume = DataAudioEndPointVolume(2)
  If Volume <> 0
    If AudioEndpointVolumeCallback <> 0
      If AudioEndpointVolumeCallback\Refcount = 0
        
        CopyMemory(CLSIDFromString("{00000000-1111-5555-0000-000000000000}", @Guid), AudioEndpointVolumeCallback\MyGuid, 16)
        
        AudioEndpointVolumeCallback\QueryInterface = @AudioEndpointVolumeCallback_QueryInterface()
        AudioEndpointVolumeCallback\AddRef = @AudioEndpointVolumeCallback_AddRef()
        AudioEndpointVolumeCallback\Release = @AudioEndpointVolumeCallback_Release()
        AudioEndpointVolumeCallback\OnNotify = @AudioEndpointVolumeCallback_OnNotify()
        
        AudioEndpointVolumeCallback\pointerAudioEndpointVolumeCallback = @AudioEndpointVolumeCallback\QueryInterface
        AudioEndpointVolumeCallback\pAudioEndpointVolumeCallback = @AudioEndpointVolumeCallback\pointerAudioEndpointVolumeCallback
        
        AudioEndpointVolumeCallback\pAudioEndpointVolumeCallback\AddRef()
      EndIf
      
      If Volume\RegisterControlChangeNotify(@AudioEndpointVolumeCallback) >= #S_OK
        ProcedureReturn #S_OK
      EndIf 
      
    EndIf 
  EndIf
  
  ProcedureReturn -1
EndProcedure

Procedure.l ComEvent_FreeAudioEndpointVolumeCallback()
  Protected Volume.IAudioEndpointVolume
  
  Volume = DataAudioEndPointVolume(2)
  If Volume <> 0
    If Volume\UnregisterControlChangeNotify(AudioEndpointVolumeCallback) >= #S_OK
      ProcedureReturn #S_OK
    EndIf 
  EndIf 
  
  ProcedureReturn -1 
EndProcedure

Procedure.l Com_GetDefaultAudioEndPointVolume()
  Protected pdeviceEnumerator.IMMDeviceEnumerator
  Protected pAudioEndpointVolume.IAudioEndpointVolume
  Protected pdefaultDevice.IMMDevice
  Protected AudioEndpointVolumeCallback.IAudioEndpointVolumeCallback, RET.l=-1
  
  If  CoCreateInstance_(?uuidof_MMDeviceEnumerator, #Null, #CLSCTX_INPROC_SERVER, ?uuidof_IMMDeviceEnumerator,@pdeviceEnumerator) < #S_OK
    Goto error
  ElseIf pdeviceEnumerator = 0
    Goto error
  EndIf
  
  If  pdeviceEnumerator\GetDefaultAudioEndpoint(#eRender, #eMultimedia, @pdefaultDevice) < #S_OK
    Goto error:
  ElseIf pdefaultDevice = 0
    Goto error
  EndIf
  
  
  If pdefaultDevice\Activate(?uuidof_IAudioEndpointVolume, #CLSCTX_INPROC_SERVER, #Null, @pAudioEndpointVolume.IAudioEndpointVolume) < #S_OK
    Goto error
  ElseIf pAudioEndpointVolume = 0
    Goto error
  Else
    RET = #S_OK
    Goto NoError
  EndIf
  
  Error:
  If pAudioEndpointVolume <> 0
    pAudioEndpointVolume\Release()
  EndIf 
  
  NoError:
  DataAudioEndPointVolume(1, pAudioEndpointVolume)
  
  If pdefaultDevice <> 0
    pdefaultDevice\Release()
  EndIf
  
  If pdeviceEnumerator <> 0
    pdeviceEnumerator\Release()
  EndIf
  
  ProcedureReturn RET
EndProcedure

Procedure.l Com_FreeDefaultAudioEndPointVolume()
  Protected Volume.IAudioEndpointVolume
  
  Volume = DataAudioEndPointVolume(2)
  If Volume <> 0
    Volume\release()
    DataAudioEndPointVolume(3)
    ProcedureReturn #S_OK
  EndIf
  ProcedureReturn -1
EndProcedure

Procedure.l MediaSystemGetPeak()
  Protected AudioMeter.IAudioMeterInformation
  Protected Meter.f
  
  AudioMeter = DataAudioMeterInformation(2)
  If AudioMeter <> 0
    If AudioMeter\GetPeakValue(@Meter) >= #S_OK
      Meter = Round(Meter * 100, #PB_Round_Nearest)
      ProcedureReturn Int(Meter)
    EndIf 
  EndIf 
  ProcedureReturn -1 
EndProcedure

Procedure.l MediaSystemGetVolume()
  Protected Volume.IAudioEndpointVolume
  Protected volf.f
  
  Volume = DataAudioEndPointVolume(2)
  If Volume <> 0
    If Volume\GetMasterVolumeLevelScalar(@volf) >= #S_OK
      volf = Round(volf * 100, #PB_Round_Nearest)
      ProcedureReturn Int(volf)
    EndIf 
  EndIf 
  ProcedureReturn -1 
EndProcedure

Procedure.l MediaSystemGetMute()
  Protected Volume.IAudioEndpointVolume
  Protected mute.l
  
  Volume = DataAudioEndPointVolume(2)
  If Volume <> 0
    If Volume\GetMute(@mute) >= #S_OK
      ProcedureReturn mute
    EndIf 
  EndIf 
  ProcedureReturn -1 
  
EndProcedure

Procedure.l MediaSystemSetVolume(vol.l)
  Protected Volume.IAudioEndpointVolume
  Protected volf.f
  
  If vol < 0 : vol = 0 : EndIf
  If vol > 100 : vol = 100 : EndIf
  
  Volume = DataAudioEndPointVolume(2)
  If Volume <> 0
    volf = vol / 100
    If Volume\SetMasterVolumeLevelScalar(volf, AudioEndpointVolumeCallback\MyGuid) >= #S_OK
      ProcedureReturn #True
    EndIf 
  EndIf 
  ProcedureReturn -1 
EndProcedure

Procedure.l MediaSystemSetMute(value.l)
  Protected Volume.IAudioEndpointVolume
  Protected mute.l=1
  
  Volume = DataAudioEndPointVolume(2)
  If Volume <> 0
    If Volume\SetMute(value, AudioEndpointVolumeCallback\MyGuid) >= #S_OK
      ProcedureReturn #True
    EndIf 
  EndIf 
  ProcedureReturn -1 
EndProcedure

; Procedure test()
;   Protected Volume.IAudioEndpointVolume
;   
;   ;test fonction queryinterface
;     Volume2 = DataAudioEndPointVolume(2)
;     AudioEndpointVolumeCallback_QueryInterface(Volume2, @REFIID.CLSID, @Volume)
;     
;     Volume\AddRef()
; EndProcedure

CoInitialize_(#Null)


If OpenWindow(0, 100, 200, 400, 400, "PureBasic Window", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget)
  
  TrackBarGadget(0, 40, 40, 20, 200, 0, 100, #PB_TrackBar_Vertical | #PB_TrackBar_Ticks)
  ButtonGadget(1, 20, 280, 60, 60, "Mute Off")
  ButtonGadget(2, 100, 10, 100, 20,"Set Event")
  ButtonGadget(3, 100, 40, 100, 20,"Free Event")
  TextGadget(4, 200, 120, 20, 100, "")
  TextGadget(5, 240, 120, 20, 100, "")
  
  SetGadgetColor(4, #PB_Gadget_BackColor, RGB(255,0,0))
  SetGadgetColor(5, #PB_Gadget_BackColor, RGB(255,0,0))
  
  If Com_GetDefaultAudioEndPointVolume() = #S_OK
    Vol = MediaSystemGetVolume()
    SetGadgetState(0, Vol)
    
    Mute = MediaSystemGetMute()
    If Mute = 1
      SetGadgetText(0, "Mute On")
    EndIf 
    
    If ComEvent_SetAudioEndpointVolumeCallback() = #S_OK
      DisableGadget(2, 1)
    Else
      DisableGadget(2, 1)
      DisableGadget(3, 1)
    EndIf
    
  Else
    DisableGadget(0, 1)
    DisableGadget(1, 1)
    DisableGadget(2, 1)
    DisableGadget(3, 1)
  EndIf
  
  If Com_GetAudioMeterInformation() = #S_OK
  AddWindowTimer(0, 123, 250)
EndIf

  Repeat
    Event = WaitWindowEvent()
    
    Select Event 
          Case #PB_Event_Timer 
            Select EventTimer()
              Case  123
                Peak = MediaSystemGetPeak()
                Debug Peak
                  ResizeGadget(4, #PB_Ignore, 220 - Peak, #PB_Ignore, Peak)
            EndSelect
            
      Case #PB_Event_Gadget
        Select EventGadget()      
          Case 0
            MediaSystemSetVolume(GetGadgetState(0))
            
          Case 1
            If Mute = 0
              If  MediaSystemSetMute(1)
                Mute = 1
                SetGadgetText(1, "Mute On")
              EndIf 
            ElseIf Mute = 1
              If MediaSystemSetMute(0) 
                Mute = 0
                SetGadgetText(1, "Mute Off")
              EndIf 
            EndIf 
            
          Case 2
            If ComEvent_SetAudioEndpointVolumeCallback() = #S_OK
              DisableGadget(2, 1)
              DisableGadget(3, 0)
            EndIf
            
          Case 3
            If ComEvent_FreeAudioEndpointVolumeCallback() = #S_OK
              DisableGadget(3, 1)
              DisableGadget(2, 0)     
            EndIf
            
        EndSelect
        
      Case #PB_Event_CloseWindow 
        Quit = 1
    EndSelect
    
  Until Quit = 1
  
EndIf

Com_FreeDefaultAudioEndPointVolume()
CoUninitialize_()


DataSection
  ;"C02216F6-8C67-4B5B-9D00-D008E73E0064")
  uuidof_IAudioMeterInformation:
  Data.l $C02216F6
  Data.w $8C67,$4B5B
  Data.b $9D,$00,$D0,$08,$E7,$3E,$00,$64
  
  
  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 
Dernière modification par nico le lun. 11/janv./2016 17:10, modifié 1 fois.
Mesa
Messages : 1093
Inscription : mer. 14/sept./2011 16:59

Re: Set get volume système avec event utilisateur

Message par Mesa »

Dommage que ça ne fonctionne pas avec XP. :(

M.
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Re: Set get volume système avec event utilisateur

Message par nico »

Voir le premier post.
Dernière modification par nico le lun. 11/janv./2016 17:11, modifié 2 fois.
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Re: Set get volume système avec event utilisateur

Message par nico »

Mise à jour du code précédent avec procédure InterlockedExchange64 trouvé sur le Forum En.
Si des codeurs asm peuvent me confirmer que c'est correct, voici la procédure utiliser!

Code : Tout sélectionner

Procedure InterlockedExchange64(*Destination.Integer, Value.i)
  EnableASM 
  CompilerIf #PB_Compiler_Processor = #PB_Processor_x64
    !mov rcx, [p.p_Destination]
    !mov rax, [p.v_Value]
    !lock xchg [rcx], rax
  CompilerElse
    !mov ecx, [p.p_Destination]
    !mov eax, [p.v_Value]
    !lock xchg [ecx], eax
  CompilerEndIf 
  DisableASM 
  ProcedureReturn Value
EndProcedure

Pour incrémenter:
ulRef = InterlockedExchange64(@*pObject\Refcount, *pObject\Refcount + 1)

Pour décrémenter:
ulRef = InterlockedExchange64(@*pObject\Refcount, *pObject\Refcount - 1)
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Re: Set get volume système avec event utilisateur

Message par nico »

je ne sais pas si xchg fonctionne de la même façon pour du 32 bit et du 64 bit ou s'il faut une autre instruction.

Et aussi je ne sais pas ce qu'il en est des registres rcx et rax, peut t'i y avoir conflit si je crée des threads qui utilises ces registres, du moins en ce qui concerne les instructions PureBasic?
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Re: Set get volume système avec event utilisateur

Message par nico »

Ajout du Peak meter, le master, on peut aussi avoir les différentes voies en rajoutant des procédures.

Une fois le code commencé, il est très simple de rajouter des trucs et si vous vouliez seulement contrôler le son de votre session, le code serait quasiment le même en travaillant non plus sur IAudioEndpointVolume mais sur IAudioSessionManager..
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Set get volume système avec event utilisateur

Message par Kwai chang caine »

Marche niquel sur W7 et v5.23
Merci pour le partage 8)
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Shadow
Messages : 1373
Inscription : mer. 04/nov./2015 17:39

Re: Set get volume système avec event utilisateur

Message par Shadow »

Salut,

J'y comprends rien mais....
Whaaaa, méchamment whaaaouuu, ça marche ! :D

Bon ya un tas de code incompréhensible mais j'ai compris le principale.

En gros avec tous ça il serra possible de faire un programme que je voulais faire.
Un espèce de lisseur de son en temps réel.

Dans certain film par exemple ou les dialogue son bas et les musique et les effets trop fort.

Je vais attendre que t'es fini.
Je me servirais que de "Peak = MediaSystemGetPeak()" pour mon programme je pense.

Enfin si j'ai bien compris.

Tous ça n'aurait pas été possible si tu ne t'était pas cassé la tête sur ça.
Donc évidement tous le mérite t'en reviens à toi ça va de sois :)
Processeur: Intel Core I7-4790 - 4 Cœurs - 8 Thread: 3.60 Ghz.
Ram: 32 GB.
Disque: C: SDD 250 GB, D: 3 TB.
Vidéo: NVIDIA GeForce GTX 960: 2 GB DDR5.
Écran: Asus VX248 24 Pouces: 1920 x 1080.
Système: Windows 7 64 Bits.

PureBasic: 5.60 x64 Bits.
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Re: Set get volume système avec event utilisateur

Message par nico »

Les interfaces Com, oui c'est compliqué, j'y arrive parce que je passe beaucoup de temps à essayer de comprendre comment le tout fonctionne, mais c'est toujours une galère; PureBasic n'est pas adapté pour des appels Com, avec Comate le code devient plus simple mais le problème c'est qu'il faut qu'il soit maintenu, ne l'est plus vraiment maintenant.

Si PureBasic pouvait intégrer Comate mais en bazardant le passage des arguments qui est du texte en plusieurs arguments, ce serait super intéressant pour le développement des interfaces Com.

Les interfaces Com diffère de beaucoup par rapport aux API Window, il faut imbriqué souvent un nombre croissant d'interfaces Com pour créer des les fonctions qui nous intéresse, Sapi est pénible pour ça.
Avatar de l’utilisateur
Ar-S
Messages : 9472
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Set get volume système avec event utilisateur

Message par Ar-S »

En tout cas ton travail est remarquable, merci encore.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Shadow
Messages : 1373
Inscription : mer. 04/nov./2015 17:39

Re: Set get volume système avec event utilisateur

Message par Shadow »

Oui merci beaucoup Nico, tu est très fort :wink:
Processeur: Intel Core I7-4790 - 4 Cœurs - 8 Thread: 3.60 Ghz.
Ram: 32 GB.
Disque: C: SDD 250 GB, D: 3 TB.
Vidéo: NVIDIA GeForce GTX 960: 2 GB DDR5.
Écran: Asus VX248 24 Pouces: 1920 x 1080.
Système: Windows 7 64 Bits.

PureBasic: 5.60 x64 Bits.
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Set get volume système avec event utilisateur

Message par Kwai chang caine »

Les interfaces Com, oui c'est compliqué
Tu l'as dit, même avec COMATE, je sais jamais si il faut invoquer ou non.
J'adore cette librairie, depuis des années je l'utilise au boulot, (because OFFICE et son VBA, mais aussi tous les giciels AUTOMATION)
Tu as raison, c'est vraiment dommage que FRED ne fasse pas un petit effort pour l'intégrer, je pense que SROD ne serait pas contre...enfin j'espere...
l'OLE est vraiment une fonction interessante dans le domaine de la bureautique professionnel, ce serait donc un grand plus pour PB

En tout cas bravo, tu m'épates encore plus si tu arrives à comprendre quelque chose au code de SROD 8O
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Re: Set get volume système avec event utilisateur

Message par nico »

En tout cas bravo, tu m'épates encore plus si tu arrives à comprendre quelque chose au code de SROD 8O
Franchement, j'ai regardé, et je me suis dit c'est très compliqué, en fait tout ce qu'il y a autour car le concept en lui même est plutôt simple, il est décrit ici:
https://msdn.microsoft.com/fr-fr/librar ... s.85).aspx

et ici:
https://msdn.microsoft.com/en-us/librar ... s.85).aspx

Si comme dans d'autre langage, on pouvait importer les déclaration des interfaces avec les constantes et structure, on n'aurait même pas a se soucier de savoir si c'est une méthode ou une propriété.
Répondre