openal:获取源的当前播放位置

时间:2012-04-15 07:54:56

标签: audio streaming core-audio openal

如何获得公开播放源的当前位置?我想我的意思是,在通过缓冲区,openal缓冲区,硬件缓冲区等之后,音频中的哪个位置正在硬件上播放。

我已经简要介绍了api,但我不太确定AL_SAMPLE_OFFSET / AL_BYTE_OFFSET / AL_SEC_OFFSET是什么意思。如果我正在播放流媒体源,我似乎没有得到一个不断增加的数字,似乎我可能在当前的播放缓冲区中获得一个位置? (或所有缓冲区?)

例如,在播放时,我循环并运行此代码:

alGetSourcef( sources[0], AL_SAMPLE_OFFSET, &secoffset );
printf(" - %f samples\n", secoffset);

并获取

 - 0.000000 samples
 - 8192.000000 samples
 - 9216.000000 samples
 - 5632.000000 samples

似乎没有增加。

这是在带有最新xcode 4.3的macos 10.7上,但我认为它应该在其他平台上类似。

更新

我尝试增加缓冲区大小,它实际上看起来只是当前播放缓冲区中的当前位置:

 - 0.000000 bytes
 - 18432.000000 bytes
 - 20480.000000 bytes
 - 36864.000000 bytes
 - 36864.000000 bytes
 - 55296.000000 bytes
 - 55296.000000 bytes
 - 73728.000000 bytes
refilling buffer 2408
re-queued buffer 2408
 - 16384.000000 bytes
 - 34816.000000 bytes
 - 34816.000000 bytes
 - 51200.000000 bytes
 - 51200.000000 bytes
 - 69632.000000 bytes
refilling buffer 2409
re-queued buffer 2409

因此,有没有一种可靠的方法可以通过多个不同的缓冲区将轨道保持为开放式播放?

1 个答案:

答案 0 :(得分:1)

这些偏移量来自排队缓冲区的开头。您需要手动计算已经排队的缓冲区的大小并添加到此数字。

在此,如果您阅读documentation,请参阅第40页:

  

该位置相对于所有排队缓冲区的开头   对于源,并且set调用遍历的任何排队缓冲区将是   标记为已处理。