2013-01-31 295 views
0

我不明白我如何使用OpenAL庫播放聲音。我爲VoIP編寫程序。我得到每10ms聲音緩衝區。使用OpenAL播放聲音

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

BUF是

boost::array <char, 441> buf; 

而且,我需要這個緩衝區呢?我讀的例子,但不明白:(。 請幫幫我。 PS我用C++在Visual Studio 2010中 編輯

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

最後我試過了。 – EXTRAM

回答

0

buf.data()返回一個指針後,其大小可能是要麼32或64位

大小arraybuf.size()代替;以及由alBufferData要求的尺寸是在緩衝器中的字節數,即元件陣列buf.size()在數乘以每個元素的大小sizeof(buf.front())sizeof(char)
[注sizeof(buf)大概可以工作,至少與目前的加速實現,但我不認爲這是保證]

您指定AL_FORMAT_MONO16聲道格式,但您使用的是奇數大小的8個字節的緩衝區。所以這可能是數組聲明或格式規範中的錯誤。基於你的問題的其餘部分,我假設你的意思是AL_FORMAT_MONO8

+0

好的。我使用buf.size()。但我沒有聲音。起初我以爲我得到錯誤的緩衝區,但如果我寫緩衝區文件,在這我有聲音。 – EXTRAM

+0

@EXTRAM:你以前能玩過任何**聲音嗎?即通過嘗試一個樣本?錯誤(s)可能在代碼中的任何地方 –

0

你必須保持聲音活着,試試這個功能。

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