2013-02-21 1 views
1

Mon programme ne fonctionne pas correctement. J'ai besoin de jouer du son que je prends du réseau avec boost :: asio. Ce son est correct, parce que si je le donne au fichier, j'ai un fichier son. Mais dans les haut-parleurs j'écoute répéter les clics. C'est mon code:Clics dans les tampons de la file d'attente OpenAL

while (!ExitKey) 
{ 
    boost::system::error_code error; 
    size_t len = VoiceSocket->read_some(boost::asio::buffer(buf), error); 
    if (len==0) 
    { 
     continue; 
    } 
    file.write(buf.data(), 882); 
    if (firstit++>=3) 
    { 
     alSourceUnqueueBuffers(alSource, 1, &alUnqueueBuf); 
    } 
    if (iteration <=3) 
    { 
     alBufferData(alSampleSet[iteration++], AL_FORMAT_MONO16, buf.data(), buf.size(), 44100); 
    } 
    else 
    { 
     iteration = 0; 
     alBufferData(alSampleSet[iteration++], AL_FORMAT_MONO16, buf.data(), buf.size(), 44100); 
    } 
    //alSourceQueueBuffers(alSource, 3, alSampleSet); 
    alSourcei(alSource, AL_BUFFER, alSampleSet[0]); 
    alSourcei(alSource, AL_BUFFER, alSampleSet[1]); 
    alSourcei(alSource, AL_BUFFER, alSampleSet[2]); 

    alSourceQueueBuffers(alSource, 1, alSampleSet); 
    // 
    //alSourcei(alSource, AL_LOOPING, alSampleSet); 
    ALenum alErr0 = AL_NO_ERROR; 
    ALenum alErr1 = AL_INVALID_NAME; 
    ALenum alErr2 = AL_INVALID_ENUM; 
    ALenum alErr3 = AL_INVALID_VALUE; 
    ALenum alErr4 = AL_INVALID_OPERATION; 
    ALenum alErr5 = AL_OUT_OF_MEMORY; 
    ALenum alErr = alGetError(); 
    //alGetSourcei(alSource, AL_SOURCE_STATE, &alErr); 
    alSourcePlay(alSource); 
    alErr = alGetError(); 
    // 
} 

Aidez-moi s'il vous plaît. Ce que je dois faire avec ce code pour le faire fonctionner. Je ne comprends pas comment travailler avec ce tamponne :(

Répondre

0

Vous devez utiliser soit alSourcei(alSource, AL_BUFFER, alSampleSet[0]) ou alSourceQueueBuffers(alSource, 1, alSampleSet), mais pas les deux ensemble Lorsque vous diffusez, utilisez ce dernier

Vérifiez les tampons traités avant unqueueing:..

alGetSourcei(alSource, AL_BUFFERS_PROCESSED, out p) 

Seule la mémoire tampon et la file d'attente du segment suivant s'il y a un tampon libre