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

Discussion :

Problème avec QAudioInput

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2010
    Messages : 17
    Par défaut Problème avec QAudioInput
    Bonjour,

    je prétend utiliser QAudioInput pour pouvoir accéder au microfone de mon ordinateur. Le problème avec lequel je me trouve, est le suivant, au moment de écrire sur le buffer, le debuggeur donne une erreur de segmentation fault parce qu'il n'y a rien pour mettre sur buffer.

    Voilà le code de mon cpp:
    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
     
    #include "audio.h"
    #include <QDebug>
     
    AudioInput::AudioInput( QAudioInput* device )
    {
        input = device;
    }
     
    AudioInput::~AudioInput()
    {
        delete input;
    }
     
    void AudioInput::start()
    {
        open( QIODevice::WriteOnly );
    }
     
    void AudioInput::stop()
    {
        close();
    }
     
    qint64 AudioInput::readData( char *data, qint64 maxlen )
    {
        Q_UNUSED( data )
        Q_UNUSED( maxlen )
     
        return 0;
    }
     
    qint64 AudioInput::writeData( const char *data, qint64 len )
    {
        int samples = len/2;
     
        qint16* s = (qint16*)data;
     
        for(int i=0;i<samples;i++)
        {
            qint16 sample = *s;
            s++;
     
            qDebug() << sample;
        }
     
        return len;
    }
     
     
    Audio::Audio()
    {
        buffer = new char[4096];
     
        format.setFrequency( FREQUENCY );
        format.setChannels( CHANNEL );
        format.setSampleSize( SAMPLE );
        format.setByteOrder( ORDER );
        format.setSampleType( TYPE );
        format.setCodec( "audio/pcm" );
     
        audio = new QAudioInput( format, this );
        audioInput = new AudioInput( audio );
        audioInput->start();
        audio->start(audioInput);
    }
     
    Audio::~Audio()
    {
        delete audio;
        delete audioInput;
        delete buffer;
    }
     
    void Audio::readAudio()
    {
       qint64 length =  audio->bytesReady();
       //qDebug() << "Estado" << audio->state();
       qDebug() << "Tamanho de dados lidos: " << length;
       qint64 l = input->read(buffer, length);
       qDebug() << "Tamanho de dados escritos: " << l;
       audioInput->write(buffer,l);
    }
    Avant de crasher length existe mais de suite l n'existe pas et c'est là où se trouve le problème.

    Merci,
    RCosta.

  2. #2
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    Bonjour RCosta

    Ca serait bien d'avoir aussi l'interface (audio.h) et la ligne à laquelle se produit l'erreur

    Pour le moment, si je comprend bien :
    * AudioInput hérite de QIODevice, audio est de type QAudioInput* (les noms de tes classes sont mal choisit, ils portent à confusion : regarde ta variable QAudioInput* : tu la nommes "audio" dans le constructeur de Audio, tu la renommes "device" dans le constructeur de QAudioInput puis l'affecte à la variable membre "input"...)
    * Audio::readAudio() n'est pas appelée
    * vérifie le succès de l'ouverture de ton fichier après bool IODevice::open()
    * pour libérer un tableau initialisé par new char[4096], il faut écrire delete buffer[];
    * as tu essayé avec l'entrée par défaut AudioDeviceInfo::defaultInputDevice ()
    * a quel moment initialises-tu la variable Audio::input ?
    * que souhaites-tu faire avec des données lues ? tu les envoies au QIODevice mais je comprend pas très bien ce qu'il fait. Tu devrais plutôt utiliser une des classes héritant de QIODevice : QFile pour écrire dans fichier, QBuffer pour mettre les données dans un tampon, etc.

    Corrige le code et re-teste puis donne les informations manquent pour qu'on puisse t'aider

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2010
    Messages : 17
    Par défaut
    Bonjour gbdivers,

    voici audio.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
     
    #ifndef AUDIO_H
    #define AUDIO_H
     
    #include <QAudioFormat>
    #include <QAudioInput>
    #include <QBuffer>
     
    #define FREQUENCY 8000
    #define CHANNEL  1    
    #define SAMPLE   16
    #define ORDER    QAudioFormat::LittleEndian
    #define TYPE     QAudioFormat::SignedInt
     
    class AudioInput : public QIODevice
    {
        public:
            QAudioInput* input;
     
            AudioInput( QAudioInput* );
            ~AudioInput();
     
            void start();
            void stop();
     
            qint64 readData(char *data, qint64 maxlen);
            qint64 writeData(const char *data, qint64 len);
     
    };
     
    class Audio : QObject
    {
        public:
            char*             buffer;
            QAudioInput*     audio;
            QAudioFormat     format;
            QAudioDeviceInfo device;
            AudioInput*      audioInput;
            QIODevice*       input;
     
        public:
            Audio();
            ~Audio();
     
            void readAudio();
    };
     
    #endif // AUDIO_H
    LA ligne ou se produit l'erreur est celle ci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    qint64 l = input->read(buffer, length);
    * Audio::readAudio() est appelée dans mon QMainWindow.
    * les données lues je veux les avoir dans un tampon pour après les processer.

    Je viens d'arriver chez moi, et dans quelques instant j'irais effectuer les changements. Merci pour ta réponse.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2010
    Messages : 17
    Par défaut
    Je viens d'essayer quelques trucs et les résultats sont les suivant:

    - IODevice::open() est vrai,
    - AudioDeviceInfo::defaultInputDevice () ça ne fait rien,

    Je viens de vérifier qu'il y a un truc qui me parait moche, c'est à dire, les lignes suivantes font des initialisations qui se tournent dépendantes entre elles.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    audio = new QAudioInput( format, this );
    audioInput = new AudioInput( audio );
    audioInput->start();
    audio->start(audioInput);
    Ce que j'ai fait avec ces deux fichier c'est une transformation d'un exemple de QtCreator (audioinput). Maintenant je vais essayer réaliser une seule classe et utiliser QBuffer comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    QBuffer buffer = audio->start();
    pour voir si j'arrive à avoir des données dans mon tampon.

Discussions similaires

  1. Problème avec QAudioInput
    Par MasterNico dans le forum Qt
    Réponses: 4
    Dernier message: 25/05/2012, 19h03
  2. VC++ Direct3D8, problème avec LPD3DXFONT et LPD3DTEXTURE8
    Par Magus (Dave) dans le forum DirectX
    Réponses: 3
    Dernier message: 03/08/2002, 11h10
  3. Problème avec le type 'Corba::Any_out'
    Par Steven dans le forum CORBA
    Réponses: 2
    Dernier message: 14/07/2002, 18h48
  4. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

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