IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Discussion :

Récupérer, mémoriser, modifier la valeur du volume son système


Sujet :

Windows

  1. #1
    Membre éclairé
    Inscrit en
    Mai 2009
    Messages
    587
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 587
    Par défaut Récupérer, mémoriser, modifier la valeur du volume son système
    Bonjour, joyeux confinés !

    Ce que je cherche à faire est décrit dans l'intitulé de ce message.

    Je veux faire ça dans un projet écrit en VB6, mais cela n'a pas beaucoup d'importance : pour l'essentiel de ce qui est déjà écrit, je me suis largement inspiré d'exemples trouvés ici ou là, principale ment en C++.

    Je veux faire cela car j'ai déjà écrit l'essentiel de ce qui est spécifique à mon application : générer un son à une fréquence bien précise, le jouer avec un volume bien précis, à gauche, à droite ou les deux : ça marche, mais le réglage du volume est très complexe sous Windows : la gamme de réglages disponible pour mon application va de 0 à la valeur du volume système (si j'ai bien compris).

    Pour disposer de toute la fonctionnalité de mon application, j'ai donc besoin de mettre le volume système au maximum. Mais si je veux faire ça, il faut aussi qu'en sortant, je remette le volume système à sa valeur d'origine.

    La documentation µ$ sur les API est incroyablement compliquée à lire, alors que si j'avais un exemple de code (qui va faire comporter deux ou trois appels dans une ou deux librairies) j'aurai toute l'information dont j'ai besoin en une dizaine de minutes...

    Alors merci d'avance de votre aide.

    AMIcalement (et joyeux Noël !)

  2. #2
    Membre éclairé
    Inscrit en
    Mai 2009
    Messages
    587
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 587
    Par défaut
    Re-bonjour.

    Je suis un peu déçu du manque de réponse... Sans doute ma question était-elle mal posée.

    Quelqu'un peut-il m'indique une lecture claire et compréhensible sur les concepts, l'organisation et l'utilisation des fonctions "MIXER" et "WAVE" de l'API Winmm. Je suis déjà passé plusieurs fois sur le baratin de µ$, mais j'ai l'impression de comprendre un peu moins bien à chaque passage.

    En espérant être encore plus clair dans ma demande, je précise que j'ai réussi (en m'aidant de sources C et C++ trouvées avec Google) à programmer la génération d'un son dont je contrôle le volume, la fréquence et la voie de sortie, à l'aide des fonctions "WAVE".

    Pour aller plus loin, je désire contrôler le "volume son système", et j'ai donc besoin d'identifier le composant "MIXER" associé à la voie de sortie sélectionnée précédemment : c'est là que je bloque.

    En espérant un meilleur succès.

    AMIcalement.

  3. #3
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 127
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 127
    Par défaut
    Bonsoir,
    Citation Envoyé par L'AMI Yves Voir le message
    Je suis un peu déçu du manque de réponse...
    Peut-être plus de chance en postant dans le forum du langage que tu utilises ? https://www.developpez.net/forums/f2...b-6-anterieur/ ou http://www.developpez.net/forums/f14...3d-jeux/audio/

  4. #4
    Membre éclairé
    Inscrit en
    Mai 2009
    Messages
    587
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 587
    Par défaut
    [@Jipété] Merci de ta suggestion, mais je me pose la question, car mon problème n'est pas un problème de langage, mais de compréhension et d'utilisation des API de Windows : il me semble que ça n'est pas une question de langage. Effectivement, je programme en VB6, mais je me suis (largement) inspiré jusqu'ici d'exemples en C ou C++, comme dit plus tôt.

    Mon problème est que je comprends pas bien les concepts de "Line" et de "Mixer", s'il est possible de les enchaîner à volonté, ou si le chaînage est imposé par le hard.

    Pour ce qui est déjà fait, je peux choisir entre deux "line", car "waveOutGetNumDevs" m'en a listé deux. "mixerGetNumDevs" m'en liste deux aussi, mais à partir de là, je ne sais plus quoi faire...

    C'est pourquoi j'ai pensé que le plus à propos était la programmation système de Windows. J'ai pas bon ?

  5. #5
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 127
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 127
    Par défaut
    Citation Envoyé par L'AMI Yves Voir le message
    [@Jipété] Merci de ta suggestion, mais je me pose la question, car mon problème n'est pas un problème de langage,
    Je sais bien, mais vu le peu de réponses que ton post a attirées, j'ai pensé qu'il fallait chasser ailleurs.

    Citation Envoyé par L'AMI Yves Voir le message
    C'est pourquoi j'ai pensé que le plus à propos était la programmation système de Windows. J'ai pas bon ?
    On dirait que non, ou alors c'est à cause de la période des fêtes, + l'ambiance morose de cette année pourrie.

    Si tu regardes bien les deux liens que je t'ai donnés, le second comporte le mot "audio" dans son titre : si quelqu'un a déjà travaillé là-dessus, en C, tu sauras ensuite traduire.

  6. #6
    Membre Expert
    Femme Profil pro
    ..
    Inscrit en
    Décembre 2019
    Messages
    668
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 95
    Localisation : Autre

    Informations professionnelles :
    Activité : ..

    Informations forums :
    Inscription : Décembre 2019
    Messages : 668
    Par défaut
    Bonjour,

    Citation Envoyé par Jipété Voir le message
    On dirait que non
    Je dirais plutôt que si, mais le problème est que, dès le moment où tu lis VB6, ça fait peur. Je suis certaine que s'il fait l'effort de passer à Delphi par exemple, un langage donc assez proche, il se sentira tout de suite moins seul.

    Cela étant dit, la recherche suivante devrait aboutir sur quelque chose d'exploitable duckduckgo.com|MIXERCONTROL_CONTROLTYPE_VOLUME

  7. #7
    Membre éclairé
    Inscrit en
    Mai 2009
    Messages
    587
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 587
    Par défaut
    J'ai dit plus haut (ou ailleurs ?) que j'avais (assez mollement) essayé de passer à des choses plus modernes, mais que je n'avais jamais rien trouvé d'aussi génial que la facilité avec laquelle on crée une IHM avec VB6.

    C'est vrai que je n'ai jamais regardé Delphi. Ce sera donc ma prochaine mission.

    C'est quand même dommage que le cours de la discussion m'ait amené à avouer que je programmais en VB6, puisqu'il n'y avait aucune raison de faire peur à qui que ce soit.

    En attendant qu'un courageux qui maitrise winmm.dll éclaire ma lanterne, je continue à chercher chez mon ami Google, mais j'ai l'impression que c'est de plus en plus brumeux. Je me demande même si c'est bien ce qu'il faut utiliser sous Windows 10 : Google parle souvent de "deprecated"...

    En tout cas, merci de ne pas me laisser seul.

    AMIcalement.

  8. #8
    Membre Expert
    Femme Profil pro
    ..
    Inscrit en
    Décembre 2019
    Messages
    668
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 95
    Localisation : Autre

    Informations professionnelles :
    Activité : ..

    Informations forums :
    Inscription : Décembre 2019
    Messages : 668
    Par défaut
    Google n'est l'ami de personne ! Et vb6 est le chemin vers le côté obscur il mène à la colère, à la solitude, et à la souffrance... !

    Sinon as-tu essayé le lien donné plus haut ? As-tu consulté cette page par exemple https://forum.lazarus.freepascal.org...?topic=35859.0 ? Montre ton code aussi, ce que tu as déjà fait.

  9. #9
    Membre éclairé
    Inscrit en
    Mai 2009
    Messages
    587
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 587
    Par défaut
    Hey Kaitlyn, t'as l'air forte ! Google a en effet de plus en plus tendance à devenir mon ennemi, mais j'ai gardé cette habitude en zonant sur les forums : "Google est ton ami"

    "VB6 conduit à la colère", là, tu y vas fort. Pas toujours à la satisfaction, d'accord, mais la colère...

    J'avoue que je n'avais pas vu ton lien : je vais l'explorer à fond. Merci.

    C'est quoi, ce duckduckgo.com ?

    AMIcalement

  10. #10
    Membre Expert
    Femme Profil pro
    ..
    Inscrit en
    Décembre 2019
    Messages
    668
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 95
    Localisation : Autre

    Informations professionnelles :
    Activité : ..

    Informations forums :
    Inscription : Décembre 2019
    Messages : 668
    Par défaut
    Peut-être que refoulée est la colère
    duckduckgo? Une alternative.

    Voilà de quoi t'aider un peu, mais vraiment dans les grandes grandes lignes. Je n'ai rien pour compiler.
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    #include <windows.h> //+: winmm.lib
     
     
    int main() {
     
        UINT nmx= mixerGetNumDevs();
        //if (nmx < 1) ... error, there's no sound card device, exit
        //==================================================================
     
        UINT mxid= 0;//default sound card id
        HMIXER  mxh;
        MMRESULT ret;
        DWORD fdwOpen= MIXER_OBJECTF_MIXER;
     
        ret= mixerOpen(
            &mxh //LPHMIXER phmx
          , mxid //UINT uMxId
          , 0 //DWORD_PTR dwCallback//without callback
          , 0 //DWORD_PTR dwInstance//Reserved. Must be zero.
          , fdwOpen //DWORD fdwOpen
          );
        //if (ret != MMSYSERR_NOERROR) ... error, api fail, exit
     
        HMIXEROBJ mxobjh= (HMIXEROBJ)mxh;
        //==================================================================
     
        MIXERLINE mxl= {0}; 
        mxl.cbStruct= sizeof(mxl);
        mxl.dwComponentType= 
            MIXERLINE_COMPONENTTYPE_DST_SPEAKERS; 
            //or MIXERLINE_COMPONENTTYPE_SRC_WAVEOUT
        DWORD fdwInfo= MIXER_GETLINEINFOF_COMPONENTTYPE;
     
        ret= mixerGetLineInfo(
            mxobjh //HMIXEROBJ hmxobj,
          , &mxl //LPMIXERLINE pmxl,
          , fdwInfo //DWORD fdwInfo
          );
        //if (ret != MMSYSERR_NOERROR) ... error, api fail, mixerClose(mxh);
        //==================================================================
     
        MIXERLINECONTROLS mxlc= {0};
        mxlc.cbStruct= sizeof(mxlc);
        mxlc.dwLineID= mxl.dwLineID;
        mxlc.dwControlType= 
            MIXERCONTROL_CONTROLTYPE_VOLUME; 
            //or MIXERCONTROL_CONTROLTYPE_MUTE
        MIXERCONTROL mxc= {0};
        mxlc.cControls= 1;
        mxlc.cbmxctrl= sizeof(mxc);
        mxlc.pamxctrl= &mxc;
        DWORD fdwControls= MIXER_GETLINECONTROLSF_ONEBYTYPE;
     
        ret= mixerGetLineControls(
            mxobjh //HMIXEROBJ hmxobj
          , &mxlc //LPMIXERLINECONTROLS pmxlc
          , fdwControls //DWORD fdwControls
          );
        //if (ret != MMSYSERR_NOERROR) ... error, api fail, mixerClose(mxh);
        //==================================================================
     
        MIXERCONTROLDETAILS mxcd= {0};
        mxcd.cbStruct= sizeof(mxcd);
        mxcd.dwControlID= mxc.dwControlID;
        mxcd.cChannels= 1;
        mxcd.cMultipleItems= 0;
        MIXERCONTROLDETAILS_UNSIGNED mxcdu= {0};
        mxcd.cbDetails= sizeof(mxcdu);
        mxcd.paDetails= &mxcdu;
        DWORD fdwDetails= MIXER_GETCONTROLDETAILSF_VALUE;
     
        ret= mixerGetControlDetails(
            mxobjh//HMIXEROBJ hmxobj
          , &mxcd//LPMIXERCONTROLDETAILS pmxcd
          , fdwDetails//DWORD fdwDetails
          );
        //if (ret != MMSYSERR_NOERROR) ... error, api fail, mixerClose(mxh);
        //save or print mxcdu.dwValue;
        //==================================================================
     
        //change mxcdu.dwValue= ;
        ret= mixerSetControlDetails(
            mxobjh//HMIXEROBJ hmxobj
          , &mxcd//LPMIXERCONTROLDETAILS pmxcd
          , fdwDetails//DWORD fdwDetails
          );
        //if (ret != MMSYSERR_NOERROR) ... error, api fail, mixerClose(mxh);
        //==================================================================
     
        mixerClose(mxh);
        //==================================================================
     
    }

  11. #11
    Membre éclairé
    Inscrit en
    Mai 2009
    Messages
    587
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 587
    Par défaut
    Merci de ta réponse.

    J'ai un peu avancé, depuis l'autre jour. Le programme que tu me présentes là ressemble beaucoup (pour autant que j'aie bien vu...) à celui dont tu m'as donné le lien. Et ces deux programmes ... comment dire sans froisser les gens... me déçoivent un peu. Il me semble que ce que j'ai compris des explications de µ$ sur winmm.dll me permettrait de les écrire (bien que, de les voir écrits, ça fixe bien les idées et ça évite les tâtonnements, c'est vrai).

    Mais ça ne répond pas à mon besoin sur deux points : le premier (que j'ai d'ailleurs résolu tout seul comme un grand), c'est qu'ils considèrent qu'il n'y a qu'une seule voie audio sur l'ordinateur (ou en tout cas, ils ne s'intéressent qu'à la première de la liste) : mixid=0.

    Sur mon PC, j'ai une carte son sur la carte mère, et je peux brancher une paire de haut-parleurs sur las prises jack "qui va bien", et j'ai aussi une sortie HDMI sur laquelle j'ai branché une télé qui me sert de deuxième écran, et qui a une voie son : cela en fait bien deux. Je pourrais donc utiliser "mixid=1".

    Mais c'est là que ça se corse, et où j'ai une question : sur mon ordinateur, j'ai donc deux mixer et deux voies wave. Est-ce que je peux brancher n'importe quelle voie wave sur n'importe quel mixer ? Vous me direz : "t'as qu'à essayer", et c'est frappé au coin du bon sens.

    Mais j'ai une deuxième question : j'ai vu que le volume du son qui sort des haut-parleurs est le produit de QUATRE paramètres. La voie wave et la voir mixer n'en font que deux. Quels sont les deux autres ? Je n'ai pas réussi à assez bien comprendre tout ce que google m'a indiqué pour répondre.

    J'ai demandé aujourd'hui (jour de fête !) à mes enfants ce qu'ils pensaient de duckduckgo, et ils n'ont pas été si enthousiastes...

    A bientôt...

    AMIcalement.

  12. #12
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 127
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 127
    Par défaut
    Bonjour,
    Citation Envoyé par L'AMI Yves Voir le message
    j'ai vu que le volume du son qui sort des haut-parleurs est le produit de QUATRE paramètres.
    Tu as vu ça où ?

    Citation Envoyé par L'AMI Yves Voir le message
    J'ai demandé aujourd'hui (jour de fête !) à mes enfants ce qu'ils pensaient de duckduckgo, et ils n'ont pas été si enthousiastes...
    Tu peux essayer https://www.ecosia.org/

  13. #13
    Membre Expert
    Femme Profil pro
    ..
    Inscrit en
    Décembre 2019
    Messages
    668
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 95
    Localisation : Autre

    Informations professionnelles :
    Activité : ..

    Informations forums :
    Inscription : Décembre 2019
    Messages : 668
    Par défaut
    Citation Envoyé par L'AMI Yves Voir le message
    La documentation µ$ sur les API est incroyablement compliquée à lire, alors que si j'avais un exemple de code (qui va faire comporter deux ou trois appels dans une ou deux librairies) j'aurai toute l'information dont j'ai besoin en une dizaine de minutes
    plus
    Citation Envoyé par L'AMI Yves Voir le message
    ces deux programmes ... comment dire sans froisser les gens... me déçoivent un peu. Il me semble que ce que j'ai compris des explications de µ$ sur winmm.dll me permettrait de les écrire
    égale ingratitude ou crachat dans la soupe ?

    Le mixer id 0 semble correspondre au périphérique de sortie sélectionné par défaut dans les propriétés son (exécutez mmsys.cpl): hp, casque, hdmi ...

    J'ai finalement téléchargé un compilateur sur un win10 pour tester le code, avec quelques modifs pour voir ce qui se passe.

    Ici la "nouvelle" api audio
    https://docs.microsoft.com/en-us/win...-windows-vista
    avec des exemples dans le sdk (chemin \Microsoft SDKs\Windows\v7.0\Samples\Multimedia\Audio\)
    https://www.microsoft.com/en-us/down...s.aspx?id=8442

  14. #14
    Membre éclairé
    Inscrit en
    Mai 2009
    Messages
    587
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 587
    Par défaut
    Au secours, kaitlyn, ne me dis pas que tu as compris que je crachais dans la soupe ! Je me suis sans doute exprimé avec la maladresse qui m'est hélas si habituelle, mais ça n'était absolument pas mon idée.

    A vrai dire, en ce moment, j'ai l'impression de pédaler dans la choucroute, je trouve la documentation de Microsft absolument abjecte. Jipété me demande où j'avais vu qu'il y avait QUATRE endroits où l'on pouvait régler le volume, et je suis incapable de le retrouver ! Etait-ce en rêve ? Mais si ça n'est pas vrai, combien y en a-t-il, et quels sont-ils ?

    Ce que j'ai déjà réalisé : un programme qui prend en compte deux voies pour produire des sons, et le moyen de choisir l'une ou l'autre, qui génère une forme d'onde à la fréquence voulue, et qui l'envoie au haut parleur droit ou gauche, au choix, et avec une intensité réglable.

    Ce que je voudrais en plus : être capable de régler le volume au maximum permis par mon hardware (donc connaître tous les paramètres et y accéder) et remettre le réglage du volume à sa valeur d'origine en sortant de mon application.

    Et je ne demande pas que l'on fasse le boulot pour moi, juste où trouver l'information pour le faire (avec winmm.dll de préférence, si c'est possible).

    Je fais mes plus plates excuses à tous ceux que j'ai pu vexer ou contrarier, et je souhaite de bonnes fêtes à tout le monde

    AMIcalement.

  15. #15
    Membre Expert
    Femme Profil pro
    ..
    Inscrit en
    Décembre 2019
    Messages
    668
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 95
    Localisation : Autre

    Informations professionnelles :
    Activité : ..

    Informations forums :
    Inscription : Décembre 2019
    Messages : 668
    Par défaut
    Ne t’inquiète pas

    Sinon j'ai testé et on voit bien le curseur du volume bouger dans le mixer (sndvol.exe), ça semble correspondre à ce que tu demandes.

    Regarde ceci aussi https://premius.net/blog/cpp-mfc/97-...windows-7.html

Discussions similaires

  1. Réponses: 6
    Dernier message: 01/08/2020, 11h09
  2. Réponses: 5
    Dernier message: 27/06/2017, 21h25
  3. Réponses: 5
    Dernier message: 05/11/2014, 15h42
  4. Modifier une valeur d'un controle ActiveX avant son initialisation
    Par Krysalgir dans le forum Windows Forms
    Réponses: 0
    Dernier message: 20/01/2011, 16h56
  5. [AC-2003] Récupérer la Lettre d'un lecteur par son nom de volume
    Par vversaveau dans le forum VBA Access
    Réponses: 1
    Dernier message: 29/07/2010, 12h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo