我不明白我如何用OpenAL库播放声音。我为VoIP编写程序。我得到每10毫秒的声音缓冲区。
size_t len = socket.read_some(boost::asio::buffer(buf),error);
buf是
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);
答案 0 :(得分:0)
buf.data()
返回一个指针,其 size 可能是32位或64位。
array
的尺寸代替buf.size()
;并且alBufferData
请求的大小是缓冲区中的字节数,即数组buf.size()
中元素的数量乘以每个元素sizeof(buf.front())
或{{1}的大小}。
[注意sizeof(char)
可能会起作用,至少在目前的Boost实施中是如此,但我不认为这是保证的]
您正在指定sizeof(buf)
频道格式,但您使用的是奇数大小的8字节缓冲区。所以这可能是数组声明或格式规范中的错误。根据你提出的其他问题,我认为你的意思是AL_FORMAT_MONO16
。
答案 1 :(得分:0)
你必须让声音保持活力,试试这个功能。
void keepItPlay(unsigned int * source)
{
ALint state;
alGetSourcei(source, AL_SOURCE_STATE, &state);
if(state == AL_STOPPED) CleanUp(source);
}