在OpenAL中播放缓冲区之间是否保持沉默?

时间:2011-03-30 23:01:06

标签: c++ objective-c c openal

我使用alSourceQueueBuffers将缓冲区流式传输到AL声源。我有不同大小的缓冲区需要一个接一个地播放。到目前为止这么好,但是,在某个缓冲区之间我需要一定量的沉默,我该如何添加程序化?

1 个答案:

答案 0 :(得分: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);