Régler le volume du son

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
cage
Messages : 604
Inscription : ven. 16/oct./2015 18:22
Localisation : France
Contact :

Régler le volume du son

Message 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
■ Win10 Pro 64-bit (Intel Celeron CPU N2920 @ 1.86GHz, 4,0GB RAM, Intel HD Graphics) & PB 6.12 LTS
■ Vivre et laisser vivre.
■ PureBasic pour le fun
■ Gérard sur le forum Anglais
■ Mes sites: http://pbcage.free.fr - http://yh.toolbox.free.fr
Avatar de l’utilisateur
JohnJohnsonSHERMAN
Messages : 648
Inscription : dim. 13/déc./2015 11:05
Localisation : Allez, cherche...
Contact :

Re: Régler le volume du son

Message 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
"Le bug se situe entre la chaise et le clavier"
Votre expert national en bogage et segfaults.

CPU : AMD A8 Quad core - RAM 8Gb - HDD 2To
  • Windows 10 x64 - PB 5.61 x64
  • Linux Ubuntu 16.04 LTS x64 (dual boot) - PB pas encore réinstallé
Avatar de l’utilisateur
cage
Messages : 604
Inscription : ven. 16/oct./2015 18:22
Localisation : France
Contact :

Re: Régler le volume du son

Message par cage »

Merci pour les liens. Je vais regarder cela.
■ Win10 Pro 64-bit (Intel Celeron CPU N2920 @ 1.86GHz, 4,0GB RAM, Intel HD Graphics) & PB 6.12 LTS
■ Vivre et laisser vivre.
■ PureBasic pour le fun
■ Gérard sur le forum Anglais
■ Mes sites: http://pbcage.free.fr - http://yh.toolbox.free.fr
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Régler le volume du son

Message 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
~~~~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
Avatar de l’utilisateur
Zorro
Messages : 2186
Inscription : mar. 31/mai/2016 9:06

Re: Régler le volume du son

Message 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 ;)
Avatar de l’utilisateur
cage
Messages : 604
Inscription : ven. 16/oct./2015 18:22
Localisation : France
Contact :

Re: Régler le volume du son

Message 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
■ Win10 Pro 64-bit (Intel Celeron CPU N2920 @ 1.86GHz, 4,0GB RAM, Intel HD Graphics) & PB 6.12 LTS
■ Vivre et laisser vivre.
■ PureBasic pour le fun
■ Gérard sur le forum Anglais
■ Mes sites: http://pbcage.free.fr - http://yh.toolbox.free.fr
Répondre