0

我不明白如何使用 OpenAL 库播放声音。我为 VoIP 编写程序。我得到每 10 毫秒的声音缓冲区。

size_t len = socket.read_some(boost::asio::buffer(buf),error);

缓冲区是

boost::array <char, 441> buf;

我需要用这个缓冲区做什么?我正在阅读示例,但不明白 :(。请帮助我。PS 我在 Visual Studio 2010 上使用 C++。编辑后

    alGenSources(1, &alSource);
    alGenBuffers(1, &alSampleSet);
    alBufferData(alSampleSet, AL_FORMAT_MONO16, buf.data(), sizeof(buf.data()), 44100);
    alSourcei(alSource, AL_BUFFER, alSampleSet);
    //
    alSourcei(alSource, AL_LOOPING, alSampleSet);
    alSourcePlay(alSource);
4

2 回答 2

0

buf.data()返回一个指针,它的大小可能是 32 位或 64 位。

相反的大小是; 请求的大小是缓冲区中的字节数,即数组中的元素数乘以每个元素的大小或。[注意可能有效,至少在当前的 Boost 实现中,但我认为这不能保证]arraybuf.size()alBufferDatabuf.size()sizeof(buf.front())sizeof(char)
sizeof(buf)

您正在指定一种AL_FORMAT_MONO16通道格式,但您使用的是一个奇数大小的 8 字节缓冲区。所以这可能是数组声明或格式规范中的错误。根据您的其余问题,我假设您的意思是AL_FORMAT_MONO8那里。

于 2013-01-31T17:19:36.437 回答
0

你必须保持声音活着,试试这个功能。

void keepItPlay(unsigned int * source)
{
    ALint state;
    alGetSourcei(source, AL_SOURCE_STATE, &state);
    if(state == AL_STOPPED) CleanUp(source);
}
于 2014-12-05T22:48:45.640 回答