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

C++Builder Discussion :

FAQ Gestion du volume


Sujet :

C++Builder

  1. #1
    Membre éclairé Avatar de Mangacker
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    452
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2006
    Messages : 452
    Par défaut FAQ Gestion du volume
    hello tout le monde apres un problème il y en a toujours un autre donc voila...

    j'ai navigué un peu dans la et j'ai trouvé une fonction que je trouve assez intéressante

    gérer le volume sous windows
    FAQ
    Comment régler le volume du son dans Windows ?
    [haut]
    auteur : Bibmari
    Pour régler le volume du son dans Windows, il va falloir utiliser deux fonctions de l'API Win32 : waveOutGetVolume pour récupérer le volume courant, et waveOutSetVolume pour le positionner.
    Ces deux fonctions sont déclarées dans le header mmsystem.h.
    Le Handle utilisé sera NULL pour impacter le son dans son intégralité. Cette usage n'est pas documenté dans la MSDN, mais il semble qu'il l'ait été dans une version précédente.

    Le code suivant montre comment récupérer le volume actuel du mixer, le modifier, et retourner à la valeur précédente.


    #include <mmsystem.h>
    ...
    unsigned long volume;
    waveOutGetVolume(NULL, (LPDWORD) &volume);
    waveOutSetVolume(NULL, (DWORD)0x0);
    waveOutSetVolume(NULL, volume);

    le problème c'est que je ne comprends pas comment utiliser cette fonction pour augmenter, baisser ou fixer le volume à ma convenance

    est-ce que quelqun peut m'éclairer svp??

    merci
    Mangacker

  2. #2
    Membre Expert
    Avatar de bakaneko
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 268
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 268
    Par défaut
    Si on regarde l'aide Win32 au sujet de waveOutSetVolum, on obtient ceci :
    The waveOutSetVolume function sets the volume level of the specified waveform-audio output device.

    MMRESULT waveOutSetVolume(

    HWAVEOUT hwo,
    DWORD dwVolume
    );


    Parameters

    hwo

    Handle of an open waveform-audio output device. This parameter can also be a device identifier.

    dwVolume

    New volume setting. The low-order word contains the left-channel volume setting, and the high-order word contains the right-channel setting. A value of 0xFFFF represents full volume, and a value of 0x0000 is silence.
    If a device does not support both left and right volume control, the low-order word of dwVolume specifies the volume level, and the high-order word is ignored.



    Return Values

    Returns MMSYSERR_NOERROR if successful or an error otherwise. Possible error values include the following:

    MMSYSERR_INVALHANDLE Specified device handle is invalid.
    MMSYSERR_NODRIVER No device driver is present.
    MMSYSERR_NOMEM Unable to allocate or lock memory.
    MMSYSERR_NOTSUPPORTED Function is not supported.
    Donc le code proposé dans l'aide peut être commenté comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    waveOutGetVolume(NULL, (LPDWORD) &volume);//volume courant
    waveOutSetVolume(NULL, (DWORD)0x0);//je coupe le son
    waveOutSetVolume(NULL, volume);//je remets l'ancien volume

  3. #3
    Membre éclairé Avatar de Mangacker
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    452
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2006
    Messages : 452
    Par défaut
    ok dans ce cas on doit pouvoir modifier le volume de cette manière non??
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    	volume = 50;
    	waveOutSetVolume(NULL, volume);
    ou d'une manière un peu différente (comme ça ça marche pas )

  4. #4
    Membre Expert
    Avatar de bakaneko
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 268
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 268
    Par défaut
    Si on regarde l'aide précisément, on trouve ceci :
    The low-order word contains the left-channel volume setting, and the high-order word contains the right-channel setting
    Je comprends donc que le poids faible de ta variable correspond au volume de canal gauche et le poids fort de ta variable correspond au volume de canal droit, le tout en hexadécimal.
    Après je n'ai pas testé mais on trouve de nombreux codes VB sur le net qui appuie ma théorie.
    Par contre, je n'ai pas réussi à traduire les exemples d'augmentation de volume que j'ai trouvé en VB en C++...
    Désolé.

  5. #5
    Membre éclairé Avatar de Mangacker
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    452
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2006
    Messages : 452
    Par défaut
    j'ai essayé de mettre ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    waveOutSetVolume(NULL, 0xFFFF);
    le problème c'est que ça n'agit que sur la partie "Wave" de la table de mixage

    ya t-il une solution pour que le volume général soit modifié??

    ++

  6. #6
    Membre Expert
    Avatar de bakaneko
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 268
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 268
    Par défaut
    En fouillant sur le net, je suis tombé sur la méthode mixerOpen de l'API Win32 qui pourrait correspondre mais je ne sais pas comment elle marche

  7. #7
    Membre Expert
    Avatar de Crayon
    Inscrit en
    Avril 2005
    Messages
    1 811
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 811
    Par défaut
    bakaneko je pense que tu as raison il faut utiliser mixerOpen:
    http://msdn2.microsoft.com/en-us/library/ms712134.aspx

    J'ai trouvé un exemple en C++ sur le site:
    http://www.codeguru.com/cpp/g-m/mult...cle.php/c1575/
    Il faut regarder l'exemple "Master Volume"

    La partie du code qui est intéressante est celle-ci:
    Code : 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
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    BOOL CVolumeDlg::amdInitialize()
    {
    	ASSERT(m_hMixer == NULL);
     
    	// get the number of mixer devices present in the system
    	m_nNumMixers = ::mixerGetNumDevs();
     
    	m_hMixer = NULL;
    	::ZeroMemory(&m_mxcaps, sizeof(MIXERCAPS));
     
    	m_strDstLineName.Empty();
    	m_strVolumeControlName.Empty();
    	m_dwMinimum = 0;
    	m_dwMaximum = 0;
    	m_dwVolumeControlID = 0;
     
    	// open the first mixer
    	// A "mapper" for audio mixer devices does not currently exist.
    	if (m_nNumMixers != 0)
    	{
    		if (::mixerOpen(&m_hMixer,
    						0,
    						reinterpret_cast<DWORD>(this->GetSafeHwnd()),
    						NULL,
    						MIXER_OBJECTF_MIXER | CALLBACK_WINDOW)
    			!= MMSYSERR_NOERROR)
    		{
    			return FALSE;
    		}
     
    		if (::mixerGetDevCaps(reinterpret_cast<UINT>(m_hMixer),
    							  &m_mxcaps, sizeof(MIXERCAPS))
    			!= MMSYSERR_NOERROR)
    		{
    			return FALSE;
    		}
    	}
     
    	return TRUE;
    }
     
    BOOL CVolumeDlg::amdUninitialize()
    {
    	BOOL bSucc = TRUE;
     
    	if (m_hMixer != NULL)
    	{
    		bSucc = (::mixerClose(m_hMixer) == MMSYSERR_NOERROR);
    		m_hMixer = NULL;
    	}
     
    	return bSucc;
    }
     
    BOOL CVolumeDlg::amdGetMasterVolumeControl()
    {
    	if (m_hMixer == NULL)
    	{
    		return FALSE;
    	}
     
    	// get dwLineID
    	MIXERLINE mxl;
    	mxl.cbStruct = sizeof(MIXERLINE);
    	mxl.dwComponentType = MIXERLINE_COMPONENTTYPE_DST_SPEAKERS;
    	if (::mixerGetLineInfo(reinterpret_cast<HMIXEROBJ>(m_hMixer),
    						   &mxl,
    						   MIXER_OBJECTF_HMIXER |
    						   MIXER_GETLINEINFOF_COMPONENTTYPE)
    		!= MMSYSERR_NOERROR)
    	{
    		return FALSE;
    	}
     
    	// get dwControlID
    	MIXERCONTROL mxc;
    	MIXERLINECONTROLS mxlc;
    	mxlc.cbStruct = sizeof(MIXERLINECONTROLS);
    	mxlc.dwLineID = mxl.dwLineID;
    	mxlc.dwControlType = MIXERCONTROL_CONTROLTYPE_VOLUME;
    	mxlc.cControls = 1;
    	mxlc.cbmxctrl = sizeof(MIXERCONTROL);
    	mxlc.pamxctrl = &mxc;
    	if (::mixerGetLineControls(reinterpret_cast<HMIXEROBJ>(m_hMixer),
    							   &mxlc,
    							   MIXER_OBJECTF_HMIXER |
    							   MIXER_GETLINECONTROLSF_ONEBYTYPE)
    		!= MMSYSERR_NOERROR)
    	{
    		return FALSE;
    	}
     
    	// store dwControlID
    	m_strDstLineName = mxl.szName;
    	m_strVolumeControlName = mxc.szName;
    	m_dwMinimum = mxc.Bounds.dwMinimum;
    	m_dwMaximum = mxc.Bounds.dwMaximum;
    	m_dwVolumeControlID = mxc.dwControlID;
     
    	return TRUE;
    }
     
    BOOL CVolumeDlg::amdGetMasterVolumeValue(DWORD &dwVal) const
    {
    	if (m_hMixer == NULL)
    	{
    		return FALSE;
    	}
     
    	MIXERCONTROLDETAILS_UNSIGNED mxcdVolume;
    	MIXERCONTROLDETAILS mxcd;
    	mxcd.cbStruct = sizeof(MIXERCONTROLDETAILS);
    	mxcd.dwControlID = m_dwVolumeControlID;
    	mxcd.cChannels = 1;
    	mxcd.cMultipleItems = 0;
    	mxcd.cbDetails = sizeof(MIXERCONTROLDETAILS_UNSIGNED);
    	mxcd.paDetails = &mxcdVolume;
    	if (::mixerGetControlDetails(reinterpret_cast<HMIXEROBJ>(m_hMixer),
    								 &mxcd,
    								 MIXER_OBJECTF_HMIXER |
    								 MIXER_GETCONTROLDETAILSF_VALUE)
    		!= MMSYSERR_NOERROR)
    	{
    		return FALSE;
    	}
     
    	dwVal = mxcdVolume.dwValue;
     
    	return TRUE;
    }
     
    BOOL CVolumeDlg::amdSetMasterVolumeValue(DWORD dwVal) const
    {
    	if (m_hMixer == NULL)
    	{
    		return FALSE;
    	}
     
    	MIXERCONTROLDETAILS_UNSIGNED mxcdVolume = { dwVal };
    	MIXERCONTROLDETAILS mxcd;
    	mxcd.cbStruct = sizeof(MIXERCONTROLDETAILS);
    	mxcd.dwControlID = m_dwVolumeControlID;
    	mxcd.cChannels = 1;
    	mxcd.cMultipleItems = 0;
    	mxcd.cbDetails = sizeof(MIXERCONTROLDETAILS_UNSIGNED);
    	mxcd.paDetails = &mxcdVolume;
    	if (::mixerSetControlDetails(reinterpret_cast<HMIXEROBJ>(m_hMixer),
    								 &mxcd,
    								 MIXER_OBJECTF_HMIXER |
    								 MIXER_SETCONTROLDETAILSF_VALUE)
    		!= MMSYSERR_NOERROR)
    	{
    		return FALSE;
    	}
     
    	return TRUE;
    }
    Il y a 5 fonctions:
    • amdInitialize()
    • amdUninitialize()
    • amdGetMasterVolumeControl()
    • amdGetMasterVolumeValue()
    • amdSetMasterVolumeValue()


    On remercie Chensu, l'auteur de ce code

  8. #8
    Membre éclairé Avatar de Mangacker
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    452
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2006
    Messages : 452
    Par défaut
    moi je veux bien le remercier Chensu le problème c'est que je commence à avoir un niveau moyen (et heureusement que ne me contente pas des cours à l'école) et je ne comprends pas vraiment son code

    ya vraiment pas une instruction simple je voudrais pas surcharger le code de mon application pour cette option (le but de cette partie serait juste de mettre le son au max pour qu'on entende bien) car c'est pas indispensable

  9. #9
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738

  10. #10
    Membre éclairé Avatar de Mangacker
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    452
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2006
    Messages : 452
    Par défaut
    merci Blondelle je crois que je vais utiliser ta solution même si ce n'était pas ce que j'avais prévu au début

    merci aux autres aussi pour vos pistes

    bonne nuit

  11. #11
    Membre éclairé Avatar de Mangacker
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    452
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2006
    Messages : 452
    Par défaut
    le problème c'est que c'est pas compatible vista...

    et moi j'ai vista!!

  12. #12
    Membre Expert
    Avatar de Crayon
    Inscrit en
    Avril 2005
    Messages
    1 811
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 811
    Par défaut
    Dans Vista je crois qu'il faut mettre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ShellExecute(0, "open", "sndvol.exe", 0, 0, SW_SHOW);

  13. #13
    Membre éprouvé
    Avatar de Sunchaser
    Homme Profil pro
    OPNI (Objet Programmant Non Identifié)
    Inscrit en
    Décembre 2004
    Messages
    2 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : OPNI (Objet Programmant Non Identifié)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 059
    Par défaut
    Citation Envoyé par Mangacker Voir le message
    et moi j'ai vista!!
    Dis comme ca, on dirait une maladie !

  14. #14
    Membre émérite
    Avatar de Interruption13h
    Inscrit en
    Août 2005
    Messages
    603
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 603
    Par défaut
    Citation Envoyé par Sunchaser Voir le message
    Dis comme ca, on dirait une maladie !
    +1
    Et surtout si c'est pas une version englaise

    ++

  15. #15
    Membre éclairé Avatar de Mangacker
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    452
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2006
    Messages : 452
    Par défaut
    Citation Envoyé par Sunchaser Voir le message
    Dis comme ca, on dirait une maladie !
    c'est un peu le cas je dois dire

    depuis que j'ai vista sur mon tout nouveau portable (6 mois environ) j'ai eu 3 blue screen (ce que j'avais jamais eu sur xp!!), j'ai du réinstaller 1 fois, j'ai pas pu réinstallé xp dessus à cause de problèmes hardware et drivers...

    donc oui c'est bien une sorte de maladie
    (pas contagieuse j'espere mais ça c'est pas encore sûre, la preuve y'en a de plus en plus qui ont vista....)

  16. #16
    Membre éclairé Avatar de Mangacker
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    452
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2006
    Messages : 452
    Par défaut
    Citation Envoyé par Crayon Voir le message
    Dans Vista je crois qu'il faut mettre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ShellExecute(0, "open", "sndvol.exe", 0, 0, SW_SHOW);
    merci ça fonctionne

Discussions similaires

  1. cherche lib de gestion de volume
    Par Arcyno dans le forum Bibliothèques
    Réponses: 0
    Dernier message: 05/01/2015, 09h54
  2. Gestion du volume de deux sons distincts
    Par nebverg dans le forum ActionScript 1 & ActionScript 2
    Réponses: 2
    Dernier message: 26/05/2008, 11h47

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