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 :

Contrôle du volume indépendant


Sujet :

C++Builder

  1. #1
    Membre chevronné
    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
    Points : 2 189
    Points
    2 189
    Par défaut Contrôle du volume indépendant
    Salut je voudrais connaître une façon de contrôler le volume d'un jeu sans modifier le son du système (celui dans la barre des tâches). Donc on peut baisser le volume du jeu sans modifier celui de Windows.

    Avant j'utilisait DirectX, mais maintenant je me demande s'il y a un autre moyen. Je sais que je pourrais aussi utiliser SDL Mixer, mais j'aimerais ne pas avoir à distribuer de DLL avec mon logiciel. Je cherche à faire jouer un fichier MIDI en continu.

    Merci

  2. #2
    Membre chevronné
    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
    Points : 2 189
    Points
    2 189
    Par défaut
    Oups, j'ai oublier de dire que je programme avec Borland Developer Studio 2006. Juste au cas ou sa changerais de quoi!!!

  3. #3
    Membre chevronné
    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
    Points : 2 189
    Points
    2 189
    Par défaut
    Je pense que je vais y aller pour les librairies SDL, c'est domage car SDL.dll et SDL_mixer.dll vont ajouter 488 Ko à mon logiciel, malgré qu'une fois compressé sa ne sera jamais plus que 200 Ko. Est-ce que les gens sont près a télécharger 200 Ko de plus pour une option qu'il peuvent ne pas utiliser. Je crois qu'avec le nombre de personne qui utilise maintenant Internet haut débit, qu'il n'y a pas de problème

    Votre avis est la bienvenue

  4. #4
    Membre chevronné
    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
    Points : 2 189
    Points
    2 189
    Par défaut
    J'ai trouver une librairie que je ne connaissais pas, il s'agit de FMOD. En plus, il y a un beau tutorial sur ce site:
    http://lfe.developpez.com/FMODMP3/

    Pour modifier le son on n'a qu'à utiliser la fonction FSOUND_SetVolume.

    Par contre, je dois encore distribuer une DLL

  5. #5
    Membre du Club
    Inscrit en
    Juillet 2004
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 51
    Points : 53
    Points
    53
    Par défaut
    La version 3.x fonctionne bien, en revanche j'ai jamais réussi à faire fonctionner la dernière mouture (FMODex, version 4.x je crois) avec BDS...

  6. #6
    Membre chevronné
    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
    Points : 2 189
    Points
    2 189
    Par défaut
    Enfin de compte, pour ceux que sa intéresse, j'ai décidé de garder mon code DirectX. J'ai corriger la petite erreur qui faisait en sorte que mon code ne fonctionnais pas.
    Avant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
       result = CoInitialize(NULL);
     
       if (result!=S_OK)
              return result;
    Après:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
       result = CoInitialize(NULL);
     
       if (result!=S_OK && result!=S_FALSE)
              return result;
    Je ne savais pas que S_FALSE voulais dire que c'étais déjà initialisé.
    S_OK
    The COM library was initialized successfully on this thread.

    S_FALSE
    The COM library is already initialized on this thread.
    Je ne serais même pas obliger de toute façon de vérifier la valeur de retour de CoInitialize. Du moins, si je me fis au site http://www.gamedev.net/reference/art...rticle1905.asp

  7. #7
    Membre chevronné
    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
    Points : 2 189
    Points
    2 189
    Par défaut
    Je reviens sur ce sujet car je viens de lire sur le site Web de Microsoft que DirectMusic ne serait plus suppoté:
    DirectMusic is deprecated. Deprecated components are considered obsolete. While these components are still supported, they may be removed in the future. When writing new applications, you should avoid using these deprecated components. When modifying existing applications, you are strongly encouraged to remove any dependency on these components.
    Donc, il va falloir que je trouve une nouvelle façon de faire si je veux mettre à jour mon programme. Maintenant j'utilise C++Builder 2010 et les deux fichiers d'en-tête suivants ne sont plus présents:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #include <dmusici.h>
    #include <dmusicf.h>
    Ces fichiers sous inclus pour avoir les types IDirectMusicPerformance, IDirectMusicLoader et IDirectMusicSegment. D'après moi, le ménage a déjà commencé

    Si je trouve de quoi je vous informe, sinon je suis toujours ouvert aux suggestions.

  8. #8
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 390
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 390
    Points : 1 777
    Points
    1 777
    Par défaut
    Salut !

    Ce qui suit suppose travailer avec un dispositif MIDI ouvert parmis ceux disponibles, software ou hardware, et à ce stade celà n'a pas d'importance, pouvant même tous être utilisés à un même instant.
    Et signifie aussi qu'on prend en charge de transmettre les données (fichier MIDI) à ce(s) dispositif(s) MIDI.
    On se situe donc, en terme de programmation, à un bas niveau (utilisation des API Windows).
    La doc : Microsoft Multimedia Programmer's Reference

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    // pour BCB
    #include <mmsystem.h>
    Ne pas oublier qu'à ce stade :

    midiOutGetNumDevs //nombre de dispositifs détectés
    midiOutGetDevCaps // les infos pour chaque dispositif
    midiOutOpen // ouverture d'un distpositif MIDI OUT
    midiOut... // et tout le reste
    Pour le contrôle du volume indépendant (pour chaque dispositif MIDI_OUT) on a donc :

    The midiOutGetVolume function retrieves the current volume setting of a MIDI output device.

    MMRESULT midiOutGetVolume(

    HMIDIOUT hmo, // << le handle du dispositif
    LPDWORD lpdwVolume
    );
    Et celle que tu convoites :

    The midiOutSetVolume function sets the volume of a MIDI output device.

    MMRESULT midiOutSetVolume(

    HMIDIOUT hmo, // << le handle du dispositif
    DWORD dwVolume
    );
    On peut aussi modifier la vitesse d'exécution... etc.

    Donc à ce stade, les dlls ... sont celles du système !

    voir également dans la doc tous ce qui concerne les midiStreamOut ... ...

    A plus !

  9. #9
    Membre chevronné
    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
    Points : 2 189
    Points
    2 189
    Par défaut
    henderson, merci beaucoup pour ta solution. Voici le code que j'ai testé avec un composant TTrackBar qui va de 0 à 255 et un TMediPlayer pour faire jouer la musique. J'ai mis le code dans l'évènement OnChange du TTrackBar:
    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
        UINT DevCount = midiOutGetNumDevs();
        for(UINT i=0; i<DevCount; i++)
        {
            MIDIOUTCAPS devCaps = {0};
            midiOutGetDevCaps(i, &devCaps, sizeof(MIDIOUTCAPS));
            if(devCaps.dwSupport & MIDICAPS_VOLUME)
            {
                HMIDIOUT hdev;
                midiOutOpen(&hdev, i, NULL, NULL, CALLBACK_NULL);
     
                DWORD Volume = MAKEWORD(TrackBar1->Position, TrackBar1->Position);
                midiOutSetVolume(hdev, Volume);
     
                midiOutClose(hdev);
                break;
            }
        }
    Par contre, je n'aime pas que lorsque l'on a deux sources qui joue un MIDI, le volume change dans les deux en même temps. Du moins, c'est ce que arrive avec Windows Media Player.

    En plus, il me reste a utiliser midiOutGetVolume au démarrage de mon application dans le but de restaurer le volume du contrôle de volume du panneau de configuration.

    Je pense quand même que je préfère cette solution à l'utilisation de DLL.

    Pour ceux que sa intéresse, la liste des fonctions pour le MIDI est ici: http://msdn.microsoft.com/en-us/libr...=VS.85%29.aspx

  10. #10
    Membre chevronné
    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
    Points : 2 189
    Points
    2 189
    Par défaut Correction d'une erreur dans mon dernier message
    Oups, j'ai fait une erreur dans mon dernier message, il ne s'agit pas d'une valeur de 0 à 255 mais bien d'une valeur de 0 à 65535. J'aivais mal interprété la documentation:
    A value of 0xFFFF represents full volume, and a value of 0x0000 is silence.
    Voici donc ma fonction:
    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
    void __fastcall TForm1::SetVolume(const WORD Volume, DWORD *PrevVolume)
    {
        UINT DevCount = midiOutGetNumDevs();
        for(UINT i=0; i<DevCount; i++)
        {
            MIDIOUTCAPS devCaps = {0};
            midiOutGetDevCaps(i, &devCaps, sizeof(MIDIOUTCAPS));
            if(devCaps.dwSupport & MIDICAPS_VOLUME)
            {
                HMIDIOUT hdev;
                midiOutOpen(&hdev, i, NULL, NULL, CALLBACK_NULL);
     
                if(PrevVolume)
                    midiOutGetVolume(hdev, PrevVolume);
     
                midiOutSetVolume(hdev, MAKELONG(Volume, Volume));
     
                midiOutClose(hdev);
                break;
            }
        }
    }
    Avec ma déclaration:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       void __fastcall SetVolume(const WORD Volume, DWORD *PrevVolume = NULL);
    Les paramètres sont le volume, une valeur de 0 à 0xFFFF qui sera appliqué de façon égal au canal gauche et droite; la valeur précédente du volume, 0 à 0xFFFFFFFF qui est facultative comme deuxième paramètre en sortie.

  11. #11
    Membre chevronné
    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
    Points : 2 189
    Points
    2 189
    Par défaut
    Au lieu d'utiliser un fichier MIDI j'ai décidé d'utilisé un fichier Impulse Tracker (.it). J'utiliserai la librairie MikMod qui permet aussi de faire jouer des MOD, S3M et XM. Mon fichier MIDI original a été converti avec l'aide de MODPlug Tracker.

    Lorsque la librairie est utilisé sous Windows, c'est DirectSound qui s'occupe de la musique, c'est pour cette raison qu'il faut ajouter dsound.lib au projet. Le contrôle du volume est assez simple d'utilisation, on lui passe une valeur de 0 à 128:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        Player_SetVolume(TrackBar1->Position);

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [BPW] Contrôle du volume de la carte SB16
    Par Alcatîz dans le forum Codes sources à télécharger
    Réponses: 0
    Dernier message: 16/11/2010, 21h08
  2. Contrôle de volume
    Par yosyl dans le forum ActionScript 1 & ActionScript 2
    Réponses: 2
    Dernier message: 25/05/2008, 23h47
  3. Contrôle du volume
    Par mateuil dans le forum Débuter
    Réponses: 1
    Dernier message: 24/04/2008, 21h17
  4. Réponses: 10
    Dernier message: 08/09/2007, 14h33
  5. [FLASH MX] Contrôle du volume
    Par Chucky69 dans le forum Flash
    Réponses: 12
    Dernier message: 07/07/2005, 17h06

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