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

FMOD Discussion :

Paramètres PlaySound


Sujet :

FMOD

  1. #1
    Membre averti
    Paramètres PlaySound
    Bonjour,

    J'aimerais savoir comment déterminer "channel" dans FMOD avec la fonction :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int F_API FSOUND_PlaySound(
        int channel,
        FSOUND_SAMPLE *sptr
    );


    Dans la doc:
    The absolute channel number in the channel pool.
    Remember software channels come first, followed by hardware channels.
    You cannot play a software sample on a hardware channel and vice versa.
    FSOUND_FREE
    Chooses a free channel to play in. If all channels are used then it
    selects a channel with a sample playing that has an EQUAL or LOWER priority
    than the sample to be played.
    FSOUND_ALL
    Passing this will cause ALL channels to play. (note this will make things
    VERY noisy!)
    If FSOUND_ALL is used the last channel success flag will be returned.
    Avec "0" ou "1" ou "FSOUND_FREE" le son est très faible.

    Avec "FSOUND_ALL" le son est bruité.

    Comment faire ?

    Merci pour des informations sur le sujet.

  2. #2
    Responsable 2D/3D/Jeux

    Bonjour,

    Je pense qu'il faille utiliser FSOUND_FREE, puis, augmenter le volume avec setVolume().
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Membre actif
    Salut

    Comme expliqué dans la doc FSOUND_ALL fait jouer ton son sur tout les canaux d'où le volume plus fort !
    De plus tu n'auras plus de canal de libre et donc tu ne pourras plus jouer d'autres sons (en générale on a entre 32 et 64 canaux).

    Pour le déterminer il faudrait que tu es un manager de channel si il n'existe pas dans de base dans FMOD.
    Tu pourrais partir sur un pool de 32. Par exemple:

    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
     
    class ChannelManager
    {
        public:
            static const int InvalidChannel = -1;
     
            ChannelManager(int maxChannels)
               :  m_usedChannels(maxChannels)
            {
                  for(int i = 0; i < maxChannels; ++i)
                  {
                         m_freeChannels.push(i);
                  }
            }
     
            int GetFreeChannel()
            {
                  if(m_freeChannels.empty())
                  {
                        return InvalidChannel;
                  }
     
                  int newChannel = m_freeChannels.top();
                  m_freeChannels.pop();
     
                  m_usedChannels.push_back(newChannel);
                  return newChannel;              
            }
     
            void ReleaseChannel(int oldChannel)
            {
                  m_freeChannel.push(oldChannel);          
                  m_usedChannels.remove(oldChannel);    
            }
        private:
            stack<int> m_freeChannels;
            list<int> m_usedChannels;
    };


    Quelques choses comme ça je dirais

  4. #4
    Membre averti
    Salut,

    Merci, j'ai pris la solution de LittleWhite. Cela marche mais j'ai l'impression que je n'ai pas le même relief que le son d'origine.
    J'ai une routine d'enregistrement selon la séquence ci-dessous :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    // Init
    FSOUND_Init(44100,32,0); //   FMOD
    sptr = FSOUND_Sample_Alloc(0,44100*5, FSOUND_NORMAL , 44100, 255, 0, 1);
    FSOUND_Record_SetDriver(2);
    // ...
    FSOUND_Record_StartSample(sptr, 0);
    // ...
    FSOUND_Record_Stop();
    // ...
    FSOUND_SetVolume(FSOUND_ALL,255);
    FSOUND_PlaySound(FSOUND_FREE,sptr);


    Vous ne voyez pas de problème ou des initialisations absentes ?

  5. #5
    Membre averti
    J'ai trouvé l'explication :
    Les drivers d'enregistrement (que ce soit "Stereo Mix" ou "Pilote de capture audio principal" ) dépendent du volume et donc la résolution du sample en dépend aussi.

    Je n'ai pas de solution satisfaisante du coup