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

Bibliothèques Discussion :

[OpenAL] invalid value


Sujet :

Bibliothèques

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2011
    Messages : 32
    Par défaut [OpenAL] invalid value
    Bonjour,

    Je suis entrain de faire un programme pour lire et éditer des fichiers audio pour mon projet de fin d'année. Je me suis largement inspiré du cours "Premiers pas avec l'API audio OpenAL" et j'essaye d'adapter le code au mien.
    Dans mon programme, je créer un objet PlayerAL dans ma partie graphique. Cet objet va s’occuper de tout ce qui est lecture et édition de fichiers. Dans le constructeur, je créer un device, un context, un buffer vide et une source. L'idée est de remplir le buffer à chaque fois que l'utilisateur change de musique (mais ça me parait pas terrible, je vais peut-être faire une liste de buffers à la place).
    Mon souci arrive au moment où je veux remplir le buffer. Je récupère l'erreur invalid_value mais je vois pas se qui cloche.

    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
     
     
    #include "PlayerAL.h"
     
    #include <al.h>
    #include <alc.h>
    #include <sndfile.h>
    #include <vector>
    #include <stdexcept>
    #include <iostream>
    using namespace std;
     
    PlayerAL::PlayerAL() throw(runtime_error){
        // We open the device. NULL = default device
        device = alcOpenDevice(NULL);
        if (device==false)
            throw ("ERROR : could not open the device");
     
        // We create the context
        context = alcCreateContext(device, NULL);
        if (context==false)
            throw ("ERROR : could not create the context");
     
        // We activate it
        if (alcMakeContextCurrent(context)==false)
            throw ("ERROR : could not activate the context");
     
        //We create the buffer and the source
        alGenBuffers(1,&buffer);
        alGenSources(1,&source);
        //gain=volume
        alSourcef(source,AL_MIN_GAIN,0);
        alSourcef(source,AL_MAX_GAIN,100);
        alSourcef(source,AL_GAIN,100);
        //We connect the source and the buffer
        alSourcei(source,AL_BUFFER,buffer);
    }
     
    void PlayerAL::loadBuffer(const string & str) throw (invalid_argument){
        SF_INFO fileInfos;
        SNDFILE* audFile = sf_open(str.c_str(), SFM_READ, &fileInfos);
        if (audFile==NULL)
            throw ("null pointer");
     
        // We fetch the bit rate and the number of samples
        ALsizei nbSamples  = static_cast<ALsizei>(fileInfos.channels * fileInfos.frames);
        ALsizei sampleRate = static_cast<ALsizei>(fileInfos.samplerate);
     
        // We read the file
        vector <ALshort> samples(nbSamples);
        if (sf_read_short(audFile, &samples[0], nbSamples) < nbSamples)
            printf("File corrupted");
     
        sf_close(audFile);
        // We choose the format which depends on the number of channels
        ALenum format;
        switch (fileInfos.channels)
        {
            case 1 :  format = AL_FORMAT_MONO16;
                    printf("mono");
                    break;
            case 2 :  format = AL_FORMAT_STEREO16;
                    printf("stereo");
                    break;
            default : printf("Bad format");
        }
        alGetError();
        // We fill the buffer with the samples
        alBufferData(buffer, format, &samples[0], nbSamples * sizeof(ALushort), sampleRate);
     
         // We check the errors
        ALenum error = alGetError();
        switch (error){
        case AL_INVALID_NAME : printf("invalid name");
            break;
        case AL_INVALID_ENUM : printf("invalid enum");
            break;
        case AL_INVALID_VALUE : printf("invalid value");
            break;
        case AL_INVALID_OPERATION : printf("invalid operation");
            break;
        case AL_OUT_OF_MEMORY : printf("out of memory");
            break;
        default:printf("ok");
        }
    }
     
    void PlayerAL::changeVolume(int value){
        alSourcef(source,AL_GAIN,value);
    }
     
    void PlayerAL::play(){
        alSourcePlay(source);
        ALint status;
        do{
            ALfloat seconds;
            alGetSourcef(source,AL_SEC_OFFSET, &seconds);
            cout<<"reading..."<<std::fixed<<seconds;
            alGetSourcei(source, AL_SOURCE_STATE, &status);
        }while(status==AL_PLAYING);
    }
     
    void PlayerAL::pause(){
        alSourcePause(source);
    }
     
    void PlayerAL::stop(){
        alSourceStop(source);
    }
    Quand je débug, les valeurs des variables m'ont l'air cohérentes.

    J'ai fait un mix entre les exceptions et les printf mais c'est temporaire

    Merci d'avance
    Olivier

  2. #2
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2011
    Messages : 32
    Par défaut
    Bonjour,

    Je me permet de faire un double-post pour dire où j'en suis.
    J'ai repris le programme instruction par instruction et j'ai déjà une erreur au moment où je veux changer le gain minimum et maximum de ma source. J'ai mis cette partie en commentaire. Ensuite j'arrive sur l'instruction pour remplir le buffer où j'ai toujours la même erreur.

    Je suis vraiment à court d'idée là. Le fait de mettre la source et le buffer en champs privées ne posent pas de problèmes, non ?

    Merci d'avance
    Olivier

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2011
    Messages : 32
    Par défaut
    Bonjour,

    Si d'autres ont le même problèmes, voilà comment j'ai fait.

    Apparemment créer un buffer en champs privé, le construire dans le constructeur de l'objet et le remplir dans une autre méthode ne fonctionne pas très bien.

    Finalement j'ai crée une liste de buffers en champs privé et j'ajoute les buffers dedans au fur et à mesure. (on créer et rempli donc le buffer dans la même méthode)

    Olivier

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

Discussions similaires

  1. [XML] Probleme WSDL: the part has an invalid value
    Par Kyozo dans le forum XML/XSL et SOAP
    Réponses: 5
    Dernier message: 08/02/2012, 17h10
  2. java.sql.SQLException: Invalid value for getInt()
    Par maeva13 dans le forum Développement de jobs
    Réponses: 3
    Dernier message: 31/08/2011, 15h52
  3. Réponses: 3
    Dernier message: 27/10/2010, 22h46
  4. Thread : Invalid value for shared scalar
    Par ITCsoft54 dans le forum Langage
    Réponses: 3
    Dernier message: 02/03/2010, 11h46
  5. Réponses: 0
    Dernier message: 20/01/2010, 17h57

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