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

FMOD Discussion :

FMOD to FMOD ex


Sujet :

FMOD

  1. #1
    Expert éminent sénior

    Avatar de snake264
    Homme Profil pro
    Datascientist chez Leboncoin
    Inscrit en
    Novembre 2006
    Messages
    2 914
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Datascientist chez Leboncoin
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2006
    Messages : 2 914
    Points : 13 312
    Points
    13 312
    Par défaut FMOD to FMOD ex


    J'ai retrouvé un vieux code que j'avais fait pour un petit jeu il y a quelques années qui utilisait FMOD 3 et auquel je n'ai jamais retouchée.

    Et j'aimerai pouvoir le recompiler avec FMOD ex, or le problème c'est que j'ai beaucoup de mal à arriver à comprendre la correspondance de FMOD ex par rapport à son ancienne version.

    Voici ma classe de gestionnaire de son que j'avais fais :

    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
    #ifndef CTRL_SON_H
    #define CTRL_SON_H
     
    #include "fmod/fmod.h"
     
    // Liste des canaux utilisés pour jouer de la musique ou des sons
    typedef enum
    {
    	CANAL_NULL = 0,
    	CANAL_MUSIQUE = 0,
    	CANAL_ENNEMI,
    	CANAL_BONUS,
    	CANAL_ARME,
    	CANAL_JOUEUR1,
    	CANAL_JOUEUR2,
    	CANAL_MAX
    } ECanaux;
     
    // Gestionnaire de lectures de sons
    class CSoundManager
    {
    private:
    	// La préciseuse et unique instance de CSoundManager
    	static CSoundManager *m_pSoundManager;
     
    	// Liste des sons, un son disponible pour chaque canal.
    	FSOUND_STREAM* m_pSon[CANAL_MAX];
     
    	// Etat actif ou non des canaux déduiés au jeu lui-même
    	bool m_bCanauxJeu;
     
    	CSoundManager ();
    	~CSoundManager ();
     
    public:
    	// Creation ou récupération de l'instance du gestionnaire de lectures de sons
    	static CSoundManager* Instance ();
    	// Suppression de l'instance de gestionnaire de lectures de sons si elle existe.
    	static void	Kill ();
     
    	// Lecture d'un son
    	void Jouer (const char* szFilename, ECanaux Canal, bool bLoop = false);
    	// Active les canaux de jeux
    	void ActiverCanauxJeu () {m_bCanauxJeu = true;}
    	// Desactive les canaux de jeux
    	void DeactiverCanauxJeu () {m_bCanauxJeu = false;}
    };
     
    #endif //CTRL_SON_H
    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
    #include "ctrl_son.h"
     
    CSoundManager* CSoundManager::m_pSoundManager = 0;
     
    CSoundManager::CSoundManager ()
    {
    	m_bCanauxJeu = true;
     
    	// On initialise Fmod : Fréquence de sortie, nombre de canaux utilisés et option (non util pour nous)
    	FSOUND_Init (44100, CANAL_MAX, 0);
    	FSOUND_SetSFXMasterVolume (64);
     
    	// On initialise tous les canaux de sons à 0 pour pouvoir vérifier qu'ils sont utilisés ou non.
    	for (int Canal = CANAL_NULL; Canal < CANAL_MAX; Canal++)
    		m_pSon[Canal] = 0;
    }
     
    CSoundManager::~CSoundManager ()
    {
    	// On libère tous les canaux
    	for (int Canal = CANAL_NULL; Canal < CANAL_MAX; Canal++)
    		if (m_pSon[Canal])
    			FSOUND_Stream_Close (m_pSon[Canal]);
    }
     
    // Creation ou récupération de l'instance du gestionnaire de sons.
    // Si l'instance n'existe pas (m_pSoundManager == 0), on la créé.
    CSoundManager* CSoundManager::Instance ()
    {
    	if (m_pSoundManager == 0)
    		m_pSoundManager = new CSoundManager;
    	return m_pSoundManager;
    }
     
    // Suppression de l'instance du gestionnaire de sons si elle existe.
    void CSoundManager::Kill ()
    {
    	if (m_pSoundManager != 0)
    	{
    		delete m_pSoundManager;
    		m_pSoundManager = 0;
    	}
    }
     
    #include <stdio.h>
     
    // Lecture des sons. Ils sont lu par streaming c'est à dire qu'ils sont chargés pendant la lecture.
    void CSoundManager::Jouer (const char* szFilename, ECanaux Canal, bool bLoop)
    {
    	if (!m_bCanauxJeu && Canal != CANAL_MUSIQUE)
    		return;
     
    	if (m_pSon[Canal])
    		FSOUND_Stream_Close (m_pSon[Canal]);
     
    	// Si bLoop == true alors le son boucle.
    	if (bLoop)
    	{
    		FSOUND_SetLoopMode (0, FSOUND_LOOP_NORMAL);
    		m_pSon[Canal] = FSOUND_Stream_Open (szFilename, FSOUND_LOOP_NORMAL, 0, 0);
    		FSOUND_SetVolume (Canal, 64);
    		FSOUND_SetVolumeAbsolute (Canal, 64);
    	}
    	// Sinon il est jouer une seule fois.
    	else
    	{
    		m_pSon[Canal] = FSOUND_Stream_Open (szFilename, FSOUND_NORMAL, 0, 0);
    		FSOUND_SetVolume (Canal, 255);
    		FSOUND_SetVolumeAbsolute (Canal, 255);
    	}
     
    	FSOUND_Stream_Play (Canal, m_pSon[Canal]);
    }
    Si vous avez une idée de ce que je dois remplacer et avec quoi, ça m'aiderai beaucoup.


  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 69
    Points : 142
    Points
    142
    Par défaut
    Je me rappelle plus trop comment c'était avec les vieilles versions de Fmod, mais dans les versions récentes (> 4.38 au moins) le SDK est pas mal fait, avec énormément d'exemples.
    Pour faire ce que tu sembles vouloir faire ici (du streaming), il y a un exemple..."Playstream", je te conseille de regarder de ce côté-là.

    En gros ce que tu devras probablement faire, dans l'ordre.
    - initialiser comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        FMOD::System *system;
        FMOD_RESULT result = FMOD::System_Create(&system);
        ERRCHECK(result);
     
        result = system->init(nom, FMOD_INIT_NORMAL, 0);
        ERRCHECK(result);
    - Charger, jouer un son streamé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        FMOD::Sound *sound;
        FMOD::Channel *channel = 0;
        result = system->createStream(filename, FMOD_HARDWARE | FMOD_LOOP_NORMAL | FMOD_2D, 0, &sound);
        result = system->playSound(FMOD_CHANNEL_FREE, sound, false, &channel);
    - Nettoyer en sortant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        result = sound->release();
        ERRCHECK(result);
        result = system->close();
        ERRCHECK(result);
        result = system->release();
        ERRCHECK(result);
    Hésite pas à fouiller le SDK en particulier pour la séquence d'initialisation/nettoyage, il me semble que la séquence "officielle" préconisée par Fmod est légèrement différente, mais elle est documentée.


    Enfin je te conseille de te méfier parce que la prochaine version (Fmod Studio) devrait sortir très bientôt et va peut-être changer quelques petites choses.

  3. #3
    Expert éminent sénior

    Avatar de snake264
    Homme Profil pro
    Datascientist chez Leboncoin
    Inscrit en
    Novembre 2006
    Messages
    2 914
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Datascientist chez Leboncoin
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2006
    Messages : 2 914
    Points : 13 312
    Points
    13 312
    Par défaut
    Merci pour ta réponse Je vois déjà un peu plus clair.

    Et comme tu as pu le remarquer j'utilise plusieurs canaux. Comment je pourrai faire avec cette nouvelle version pour définir un stream pour chaque canaux et en faire la gestion ?

  4. #4
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    Août 2006
    Messages
    4 086
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 086
    Points : 8 003
    Points
    8 003
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    result = system->playSound(FMOD_CHANNEL_FREE, sound, false, &channel);
    Ici tu donne ton Sound et ton Channel (crée au prelable), en utilisant un canal libre. Apres tu px gerer et ton son et ton canal si necessaire.

  5. #5
    Expert éminent sénior

    Avatar de snake264
    Homme Profil pro
    Datascientist chez Leboncoin
    Inscrit en
    Novembre 2006
    Messages
    2 914
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Datascientist chez Leboncoin
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2006
    Messages : 2 914
    Points : 13 312
    Points
    13 312
    Par défaut


    Je vais tenter de faire la modification et je reviendrai si j'ai des problèmes

  6. #6
    Expert éminent sénior

    Avatar de snake264
    Homme Profil pro
    Datascientist chez Leboncoin
    Inscrit en
    Novembre 2006
    Messages
    2 914
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Datascientist chez Leboncoin
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2006
    Messages : 2 914
    Points : 13 312
    Points
    13 312
    Par défaut
    J'ai utilisé l'interface C car j'utilise MinGW pour compiler. Mais ça marche parfaitement

    à tous pour votre aide

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 976
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 976
    Points : 221 711
    Points
    221 711
    Billets dans le blog
    131
    Par défaut
    Bonjour,

    Euh, MinGW permet de compiler aussi le C++ , du coup, je ne comprends pas trop le rapport.

  8. #8
    Expert éminent sénior

    Avatar de snake264
    Homme Profil pro
    Datascientist chez Leboncoin
    Inscrit en
    Novembre 2006
    Messages
    2 914
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Datascientist chez Leboncoin
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2006
    Messages : 2 914
    Points : 13 312
    Points
    13 312
    Par défaut
    Oui mais l'interface C++ n'est pas compatible avec MinGW. J'ai au départ choisis l'interface C++ en ajoutant "#include fmod/fmod.hpp" puis utilisé les fonctions et types C++ comme l'on m'a indiqué mais au moment du "link" g++ ne trouvait aucune référence aux fonctions et types C++ utilisés.

    Ensuite j'ai fait un peu de recherche sur le net et je suis tombé sur un post qui indiquait que sous Windows si on voulait utiliser C++ pour FmodEx il fallait le faire sous Visual Studio sinon il fallait utiliser l'interface C.

Discussions similaires

  1. FMOD FSOUND_DSP_GetSpectrum()
    Par Amine78 dans le forum C++Builder
    Réponses: 2
    Dernier message: 05/08/2008, 15h17
  2. Compilation d'un programme sous Linux
    Par Tymk dans le forum FMOD
    Réponses: 6
    Dernier message: 03/07/2008, 09h41
  3. Égalisateur de fréquences
    Par will11 dans le forum FMOD
    Réponses: 4
    Dernier message: 04/01/2006, 20h26
  4. [GTK/FMOD] Erreur entre les deux
    Par titor dans le forum GTK+ avec C & C++
    Réponses: 6
    Dernier message: 28/12/2005, 21h23
  5. FMod et DirectSound
    Par Freakazoid dans le forum DirectX
    Réponses: 3
    Dernier message: 13/07/2004, 10h22

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