#0 

22-05-2017 14:09:36

jonath313
Abonné
Date d'inscription: 28-12-2009
Messages: 240

Bonjour!

J'ai un problème avec un pointeur et je ne comprends pas l'origine de soucis.
Ce qu'il se passe c'est que je crée mon pointeur ISound* via ma classe CGameSound.
Pour l'exemple je l'ai déclaré en private par ISound* sound3D[2];

Quand j'initialise dans le main je fais load_game_engine() qui me crée le SoundEngine.
Ensuite j'utilise une strucure SOUND_3D_t pour créer une config de son 3D.

Le soucis c'est que si je fais  sound3D[0] = SoundEngine->play3D(...) dans la fonction load_game_engine(), mon pointeur est bien créé et il contient une valeur.
Mais mon but c'est de le créer dans la fonction create_sound3D(SOUND_3D_t &userSound), et pour le même sound3D[0] = SoundEngine->play3D(...), je constate quand je fais if (this->sound3D[userSound.id]) que mon pointeur vaut 0 alors que le son est joué et le programme se lance.
C'est bloquant car si je veut faire un sound3D[0]->setVolume(...), le programme plante littéralement.

J'ai essayé pleins de choses, j'ai même tout recodé plusieurs fois et de plusieurs façons mais rien n'y fais, il y a quelque chose que je fais mal mais je ne vois pas.
Si quelqu'un peut m'éclairer ...

Code de CGameSound.cpp

Code c++ :


int CGameSound::load_game_engine()
{
     ///**** Initialisation de Irrklang
    #ifdef _DEBUG
    printf("CREATION DES POINTEURS IRRKLANG V 1.4.0\n");
    #endif // _DEBUG
    this->SoundEngine = createIrrKlangDevice();
    if (!SoundEngine){
        printf("ERROR : Sound Engine Not Started\n");
        return false; // error starting up the engine
    }
    else{
        printf("SUCCES : Sound Engine Started\n");
    }

    /// ICI çà FONCTIONNE
    sound3D[0] = SoundEngine->play3D("media/sound/guitar2.ogg",
                                  vec3df(0,0,0), true, false, true);
    if (sound3D[0])
    {
      sound3D[0]->setMinDistance(5.0f);
      sound3D[0]->setVolume(0.2f);
      std::cout<< "HAAAAAAAAAAAAAAA "<< sound3D[0] <<std::endl;
    }
}


void CGameSound::create_sound3D(SOUND_3D_t &userSound)
{
    if(this->SoundEngine != NULL)
    {
        // Creation du son
        sound3D[userSound.id] = this->SoundEngine->play3D(  GAME_SOUNDS[userSound.SOUND_NAME],  // sound file
                                                            userSound.position,                 // position
                                                            userSound.loop,                     // loop
                                                            userSound.startPaused,              // startPaused
                                                            false,                              // track
                                                            ESM_AUTO_DETECT,                    // streamMode
                                                            false);                             // enableSoundEffects
        if (this->sound3D[userSound.id])    // ICI LE POINTEUR ISOUND VAUT 0
        {
            std::cout<< "Sound EXISTE "<<std::endl;
            this->sound3D[userSound.id] -> setVolume(userSound.Volume);
            ///userSound.sound->drop(); // release music stream.
        }else
        {
            std::cout<< "Sound EXISTE PAS "<< this->sound3D[userSound.id] <<std::endl;
        }


    }

}


Code de CGameSound.h

Code c++ :


class CGameSound
{
    public:                                                                      //! CLASSE ...................................................... |
        CGameSound(IVideoDriver* driver,ISceneManager* smgr,IGUIEnvironment* env);//| Constructeur ................................................ |
        ~CGameSound();                                                           //| Destructeur ................................................. |

        int load_game_engine();
        void create_sound3D(SOUND_3D_t &userSound);
        void setListenerPosition(vector3df Position, vector3df Orientation);
        void create_sound2D(SOUND_2D_t &userSound);

    private:
        IVideoDriver* Driver;
        ISceneManager* Smgr;
        IGUIEnvironment* Env;

        ISoundEngine* SoundEngine;

        ISound* sound3D[2];
        ISound* sound2D[2];

    protected:
};



Structure sound

Code c++ :


struct SOUND_3D_t
{
    int id                  = 0;
    GAME_SOUND_e SOUND_NAME = SOUND_CAISSE;
    vector3df position      = vector3df(0.0f,0.0f,0.0f);
    bool    startPaused     = false;
    bool    play            = false;
    bool    loop            = false;
    bool    debug           = false;
    float   Volume          = 0.5f;

};


Code du main

Code c++ :


#include <iostream>
#include <irr/irrlicht.h>
#include <stdio.h>
#include <time.h>

#include "CGameSound.h"
#include "HGameSound.h"

using namespace std;
using namespace irr;
using namespace core;
using namespace scene;
using namespace video;
using namespace io;
using namespace gui;

IrrlichtDevice *device;
IVideoDriver* driver;
ISceneManager* smgr;
IGUIEnvironment* guienv;

int fps;
s32 now = 0;
s32 lastFPS = -1;
u32 lastTime = 0;

int main( int argc, char** argv )
{
    /// Initialisation
    device = createDevice( EDT_OPENGL, dimension2d<u32>(1280,920), 32, false, false, false,0); //EDT_SOFTWARE EDT_OPENGL
    if (!device)    return 1;
    driver  = device->getVideoDriver();
    smgr    = device->getSceneManager();
    guienv  = device->getGUIEnvironment();

    //CGameSound GameSound(driver,smgr,guienv);

    CGameSound* GameSound = new CGameSound(driver,smgr,guienv);

    GameSound->load_game_engine();

     ICameraSceneNode * CAM = smgr->addCameraSceneNodeFPS (
                                 0,       // le noeud parent de la caméra
                                 20.0f,    // la vitesse de rotation de la caméra
                                 0.01f,    // la vitesse de déplacement
                                 -1,      // numéro d'identification du noeud
                                 0,       // une map permettant de re-affecter les touches
                                 5,       // taille de la keyMap
                                 false,   // autorise ou non les mouvements sur l'axe vertical
                                 0.1f,    // vitesse de déplacement lors d'un saut
                                 false,   // inverse ou non la rotation de la caméra
                                 true);   // indique si la caméra doit être active ou non
    CAM->setFarValue(1000000.0f);

    /// TEST SON 3D
    /// Creation d'un son test
    SOUND_3D_t  testSon;
    testSon.id          = 0;
    testSon.SOUND_NAME  = SOUND_CAISSE;
    testSon.startPaused = false;
    testSon.loop        = true;
    testSon.play        = true;
    testSon.position    = CAM -> getPosition();
    testSon.debug       = true;
    testSon.Volume      = 0.1f;

    GameSound->create_sound3D(testSon);

    while(device->run())
    {
        driver->beginScene(true, true, SColor(255,100,101,140));

        //! Mise à jour son 3d
        GameSound->setListenerPosition(CAM->getPosition(),CAM->getRotation() );

        smgr->drawAll();
        guienv->drawAll();
        driver->endScene();

        fps = driver->getFPS();
        if (lastFPS != fps)
        {
            core::stringw str = L"CREATION DES POINTEURS IRRKLANG V 1.4.0\n";
            str += driver->getName();
            str += "ERROR : Sound Engine Not Started\n";
            str += fps;
            device->setWindowCaption(str.c_str());
            lastFPS = fps;
        }

        // controle de l'attente jusqu'à la prochaine frame
        u32 Time = device->getTimer()->getTime();
        u32 TimeLimite = lastTime + 17;
        if(Time >= TimeLimite) lastTime = Time;
        else
        {
            device->sleep( TimeLimite - Time );
            lastTime = TimeLimite;
        }
    }
    device->drop();
    return 0;
}

Hors ligne


#1 

22-05-2017 23:21:09

jonath313
Abonné
Date d'inscription: 28-12-2009
Messages: 240

Problème résolu !

Ne me demandez pas pourquoi, mais dans la fonction play3D il faut activer le paramètre "track" (=true) pour que çà fonctionne.

Voila merci qd même wink

Hors ligne


#2 

22-05-2017 23:32:25

Magun
SleekThink Producer
Lieu: Punakha
Date d'inscription: 18-11-2007
Messages: 904
Corrections: 2
Site web

edit: ok ! smile
ps:

You don't check if play2D returns a valid pointer. According to the docs Only returns a pointer to an ISound if the parameters 'track', 'startPaused' or 'enableSoundEffects' have been set to true. Note: if this method returns an ISound as result, you HAVE to call ISound::drop() after you don't need the ISound interface anymore. Otherwise this will cause memory waste. This method also may return 0 altough 'track', 'startPaused' or 'enableSoundEffects' have been set to true, if the sound could not be played.

Dernière modification par Magun (22-05-2017 23:35:43)

Hors ligne


#3 

22-05-2017 23:50:47

jonath313
Abonné
Date d'inscription: 28-12-2009
Messages: 240

Avec l'explication c'est mieux.
Oui mais j'aurais jamais imaginé que çà puisse éxister ainsi !!
Merci bien!

Hors ligne


Options Liens officiels Caractéristiques Statistiques Communauté
Corrections
irrlicht
irrklang
irredit
irrxml
xhtml 1.0
css 2.1
Propulsé par FluxBB
Traduit par FluxBB.fr
Analysé par
880 membres
1424 sujets
11113 messages
Dernier membre inscrit: mandrifidy
18 invités en ligne
Aucun membre connecté
RSS Feed