使用 OpenAL 播放声音

Play sound with OpenAL

本文关键字:播放声音 OpenAL 使用      更新时间:2023-10-16

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

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

布夫是

boost::array <char, 441> buf;

我需要用这个缓冲区做什么?我正在阅读示例,但不明白:(。请帮助我。附言:我在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);

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

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

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

你必须

保持声音的活力,试试这个功能。

void keepItPlay(unsigned int * source)
{
    ALint state;
    alGetSourcei(source, AL_SOURCE_STATE, &state);
    if(state == AL_STOPPED) CleanUp(source);
}