1

プログラムが正しく動作しません。boost::asio を使用してネットワークから取得したサウンドを再生する必要があります。その音は正しいです。なぜなら、それをファイルに渡すと、サウンド ファイルがあるからです。しかし、スピーカーでは、クリック音が繰り返されます。それが私のコードです:

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();
    //
}

私を助けてください。このコードを機能させるために必要なこと。このバッファの操作方法がわかりません:(

4

1 に答える 1

0

alSourcei(alSource, AL_BUFFER, alSampleSet[0])またはのいずれかを使用する必要がありますalSourceQueueBuffers(alSource, 1, alSampleSet)が、両方を一緒に使用することはできません。ストリーミングする場合は、後者を使用してください。

アンキューする前に、処理されたバッファを確認します。

alGetSourcei(alSource, AL_BUFFERS_PROCESSED, out p)

空きバッファがある場合にのみ、次のチャンクをバッファしてキューに入れます。

于 2013-06-28T12:47:22.300 に答える