Page 1 sur 1

Régler le volume du son

Publié : mar. 25/avr./2017 18:59
par cage
Bonjour a tous,
Je souhaite créer une petite application PB qui me permettrait de régler le volume sonore a une valeur prédéfinie chaque fois que je me connecte sur un des comptes du PC.
Pour l'instant, j'utilise un petit script vbs (Set-Volume.vbs) qui fait le boulot

Code : Tout sélectionner

Set wshShell = WScript.CreateObject("WScript.Shell")

Volume = "20"

Volume = Volume / 2

for i = 1 to 50
	wshShell.SendKeys(chr(174))
next

for i = 1 to Volume
	wshShell.SendKeys(chr(175))
next
Je n'ai rien vu dans l'aide PB qui puisse gérer le volume sonore de manière globale, aussi je sollicite votre aide pour savoir s'il existe une solution simple (non usine a gaz) qui puisse avantageusement remplacer mon script vbs.
Merci pour vos retours.
cage

Re: Régler le volume du son

Publié : mar. 25/avr./2017 19:13
par JohnJohnsonSHERMAN
C'est un probléme que plusieurs ont déja soulevé, y compris moi, et il extiste des solutions, mais aucune native à PB... Soit il te faut utiliser BASS Wasapi, ou le systéme WASAPI de Windows (par Api), ou utiliser les API Windows. Il y avait eu un sujet à ce sujet :P
En espérant que cela t'aide :)

PS : Il existe possiblement une méthode avec BASS pour le faire (cf mon sujet Soundsense), mais il faut que je vérifie son implémentation en fonction du périphérique de sortie (elle a fonctionné une fois, mais plus moyen sur un autre PC). Je vais refaire des essais

Re: Régler le volume du son

Publié : mar. 25/avr./2017 19:27
par cage
Merci pour les liens. Je vais regarder cela.

Re: Régler le volume du son

Publié : mar. 25/avr./2017 20:03
par Ar-S
Dans mon minuteur coucou :
Tu as MediaGetVolume() et MediaSetVolume().

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

    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: Régler le volume du son

Publié : mar. 25/avr./2017 21:04
par Zorro
oui code paufiné par Nico
http://www.purebasic.fr/french/viewtopi ... volume+son

et retrouvé par myself de je sais plus ou (retrouvé voir plus bas ) , a l'epoque ou j'etais Spock
dans ce topic ,mais mes messages ayant été supprimé ; seul le remerciement de Nico en atteste

http://www.purebasic.fr/french/viewtopi ... on#p179699
nico a écrit :Je cherchais comment changer le volume général pour Sapi et c'était sur le site, merci Spock. :roll: :)
j'aime bien l'archéologie Forumesque :lol:

ps: a l'origine le code viens de joris sur le forum anglais
http://forums.purebasic.com/english/vie ... a7b47a3cd0

ce serai sympath a tous de mettre son pseudo et celui de nico dans les procedures ;)

Re: Régler le volume du son

Publié : mar. 25/avr./2017 22:25
par cage
Merci a tous pour vos réponses.
Beaucoup de lecture que je vais prendre le temps d'étudier.
J'ai retenu pour l'instant une réponse de MachineCode trouvé dans ce lien et qui m’amène au code suivant

Code : Tout sélectionner

Volume = 20

Volume = Volume / 2

For i = 1 To 50
  keybd_event_(#VK_VOLUME_DOWN, 0, 0, 0)
  Delay(20)
Next

For i = 1 To Volume
  keybd_event_(#VK_VOLUME_UP, 0, 0, 0)
  Delay(20)
Next
Même fonctionnement que mon script vbs du départ mais en PB avec utilisation de l'API keybd_event_()
C'est suffisamment simple pour mon utilisation, mais je vais voir si je trouve une solution moins triviale.
cage