Bonjour,

J'essaie d'utiliser speex afin d'encoder puis de décoder un flux audio provenant de mon micro, puis de le jouer sur mes haut parleur.
Je parviens sans problème à récupérer le flux puis à le lire sur les hauts parleurs.

Voici le QAudioFormat que j'utilise pour mon flux audio
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
 
_audioFormat.setSampleRate(8000);
_audioFormat.setChannelCount(1);
_audioFormat.setSampleSize(16);
_audioFormat.setCodec("audio/pcm");
_audioFormat.setByteOrder(QAudioFormat::LittleEndian);
_audioFormat.setSampleType(QAudioFormat::UnSignedInt);
J'utilise la classe QAudioInput et QAudioOutput pour me "connecter" à mon micro et mes hauts parleurs.
Ces classe retourne un QIODevice quand on appel start afin de pouvoir lire dans le cas du micro et écrire dans le cas du haut parleur.

Voici mon code pour lire puis écrire directement dans le haut parleur:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
 
void        TEST::inputReadyRead(QIODevice *io)
{
    QIODevice *output = LocalAudioManager::shared().outputIO();
    output->write(io->readAll());
}
TEST::inputReadyRead(QIODevice *io) est un slot qui est appelé à chaque fois que des données à lire son disponibles.

Mon problème est lorsque j'utilise ce code au lieu de celui juste au dessus:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
 
void        TEST::inputReadyRead(QIODevice *io)
{
    QIODevice *output = LocalAudioManager::shared().outputIO();
 
    SpeexCodecWrapper& speex = LocalAudioManager::shared().speexWrapper();
 
    QByteArray encodedData = speex.encodeBufferB(io);
    QByteArray decodedData = speex.decodeBufferB(encodedData);
    output->write(decodedData);
}
Voici les fonction encodeBufferB et decodeBufferB
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
 
QByteArray      SpeexCodecWrapper::encodeBufferB(QIODevice *input)
{
    int lFrameSize = 0;
    speex_decoder_ctl(_decState, SPEEX_GET_FRAME_SIZE, &lFrameSize);
 
    QByteArray data(input->readAll());
 
    QAudioFormat const& format = LocalAudioManager::shared().audioFormat();
    qint32 nFrames = format.framesForBytes(data.size());
 
    speex_bits_reset(&_encBits);
    speex_encode_int(_encState, (spx_int16_t*)data.data(), &_encBits);
 
    int nbBytes = speex_bits_nbytes(&_encBits);
 
    QByteArray lSpeexData(nbBytes * 10, 0);
    nbBytes = speex_bits_write(&_encBits, lSpeexData.data(), nbBytes * 10);
    lSpeexData.resize(nbBytes);
 
    return (lSpeexData);
}
 
QByteArray      SpeexCodecWrapper::decodeBufferB(QByteArray pData)
{
    speex_bits_read_from(&_decBits, pData.data(), pData.size());
    int lFrameSize = 0;
    speex_decoder_ctl(_decState, SPEEX_GET_FRAME_SIZE, &lFrameSize);
    QByteArray lDecodedData(lFrameSize * 2, 0);
    /*int nbBytes = */speex_decode_int(_decState, &_decBits, (spx_int16_t*)lDecodedData.data());
 
    return (lDecodedData);
}
Voici mon problème :
Lorsque je met mon sample rate (via mon objet _audioFormat) à 8000, tout fonctionne parfaitement. Speex encode et décode parfaitement puis je recois bien le microphone sur le haut parleur.
Puis je change le sample rate pour passer à du 22050 car on micro supporte seulement : (8000, 11025, 22050, 44100, 48000, 96000).
J'ai essayé avec 48000, 44100 etc.... rien à faire.
Le son est complètement saccadé et cassé avec des bruits bizarres.

Qu'en pensez-vous ?
Avez-vous une idée de solution ?

Merci,