2010-10-25 45 views
0

,我们无法使用alSourcePause()来暂停声音,并且在任何情况下我们可能都希望以偏移量开始声音。Mac OS X上的OpenAL:设置AL_SAMPLE_OFFSET在工作时不执行任何操作

我们通过执行alSourcei(this->sourceId, AL_SAMPLE_OFFSET, this->sampleOffset);执行“简历”,并使用alGetSourcei()检索到的样本偏移量。我们尝试使用AL_SEC_OFFSET,AL_BYTE_OFFSETAL_SAMPLE_OFFSET - 无济于事。我们已经读过声源需要处于“初始”状态;重新创建源代码并附加缓冲区,然后试图跳过也没有帮助。

更改缓冲区以跳过AL_BYTE_OFFSET不是解决方案,因为它使循环复杂化。

串流声音在较慢的机器上跳过;我们无法实现多线程播放。

由于我们的日程安排紧张,在OS X上的OpenAL上跳过一部分简单声源的最佳方法是什么?

源代码可在our Sourceforge repository

回答

3

我最近在OS X(10.6.8)的游戏引擎中遇到了同样的问题。

alSourceQueueBuffers(mSourceId, 1, mBufferId); 
alSourcei(mSourceId, AL_SAMPLE_OFFSET, mSampleOffset); 
alSourcePlay(mSourceId); 

来源是之前停止,将所有缓冲液未排队:恢复时,给定的样本的静态缓冲区偏移的播放,顺序我们进行下面的步骤。根据AL 1.1规范,应该可能的是:

  1. 指定源处于停止状态时的缓冲区偏移量;这里,偏移量应该应用于下一个alSourcePlay()调用,或者指定已播放源上的偏移量,这会导致直接跳到所需的位置。

(参见http://connect.creativelabs.com/openal/Documentation/OpenAL%201.1%20Specification.htm官方规范的4.3.2部分)

倒车在上述序列后两者的呼叫(即,设置缓冲器发出alSourcePlay()调用之后偏移)并获得成功的我们的情况。从技术上讲,这应该是一个完全有效的途径;但是,如果音频线程在这两个调用之间正好中断了很长时间,这可能会导致可忍受的故障。

+1

我旧工作场所的人们在几天前检查了这一点,他们很满意这个解决方案。所以,差不多两年后,这里是绿色的复选标记! :-) – 2013-04-14 15:13:21

相关问题