2011-03-30 50 views
0

我使用alSourceQueueBuffers將緩衝流傳輸到AL聲源。我需要一個接一個地播放不同大小的緩衝區。然而,迄今爲止這麼好,在一些緩衝區之間,我需要一個可變數量的沉默,我怎樣才能添加它的編程?在OpenAL中播放緩衝區之間保持沉默?

回答

1

也許最簡單的方法是生成緩衝區,以保持所需長度的靜默並適當排隊。您只需根據採樣率和所需的靜默長度將數組填滿零並將其傳遞到緩衝區。

如果你想讓事情變得更復雜,那麼你不能排隊所有的緩衝區。你需要立即排隊需要播放的節目,並設置一個計時器來完成節目的播放時間(以及靜音時間也已過去)。然後你可以排隊下一個緩衝區。或者您可以輪詢來源以查看它是否已停止,以及何時停止,開始倒計時無聲時間。你也可以使用流媒體功能......


編輯: 這爲我工作。採樣率需要與源中排隊的其他緩衝區相同。你也可以有一個「最大公分母」長度緩衝區,並且多次排隊。

int sampleRate=22050; 
double sTime=2.5;  // How long to maintain silence. 
int sampleCount= int(sTime*sampleRate); 
int byteCount = sampleCount*sizeof(short); 
short* silence = (short*)malloc(byteCount); 
memset(silence,0,byteCount); 

alBufferData(silenceBuffer,AL_FORMAT_MONO16,silence,byteCount,sampleRate); 
alSourceQueueBuffers(mySource,1,&silenceBuffer); 

free(silence); 
+0

我想去第一個想法,但這部分「你只需要根據採樣率**和**期望的寂靜長度**製作一個充滿零的數組** **並且傳遞給緩衝區。「正是我不知道該怎麼做。 :(我現在試圖通過使用alBufferData來實現這一點,希望它的工作原理:D – 2011-03-31 09:28:00

+0

好吧,它以某種方式起作用,我可以控制沉默的持續時間,但是我得到的嘶嘶聲不是沉默......任何想法爲什麼? – 2011-03-31 10:15:35

+1

嘶嘶聲在緩衝區中建議垃圾數據,你是否先將它清零? – JCooper 2011-03-31 15:45:20