在工作中,我们无法使用alSourcePause()
来暂停声音,而且在任何情况下我们都可能想要使用偏移来启动声音。
我们通过使用alSourcei(this->sourceId, AL_SAMPLE_OFFSET, this->sampleOffset);
检索到的样本偏移量alGetSourcei()
来执行“简历”。我们尝试使用AL_SEC_OFFSET
,AL_BYTE_OFFSET
和AL_SAMPLE_OFFSET
- 无济于事。我们已经读过声源需要处于“初始”状态;重新创建源并附加缓冲区,然后尝试跳过也无济于事。
将缓冲区更改为跳过AL_BYTE_OFFSET
不是解决方案,因为它会使循环变得复杂。
流媒体声音在较慢的机器上跳过;我们在实现多线程播放方面遇到了麻烦。
由于我们的时间紧迫,在OS X上跳过OpenAL上一部分简单声源的最佳方法是什么?
答案 0 :(得分:3)
我最近在OS X(10.6.8)的游戏引擎中遇到了同样的问题。当按照以下顺序恢复具有给定样本偏移的静态缓冲区的回放时,我们执行了以下步骤:
alSourceQueueBuffers(mSourceId, 1, mBufferId);
alSourcei(mSourceId, AL_SAMPLE_OFFSET, mSampleOffset);
alSourcePlay(mSourceId);
在此之前停止了源,并且所有缓冲区都未加入队列。根据AL 1.1规范,应该可以
(参见http://connect.creativelabs.com/openal/Documentation/OpenAL%201.1%20Specification.htm官方规范第4.3.2节)
在上面的序列中反转后两个调用(即在发出alSourcePlay()调用后设置缓冲区偏移量)在我们的例子中完成了这个技巧。从技术上讲,这应该是一个非常有效的方法;但是,如果音频线程在这两个调用之间被中断太长时间,这可能会导致可听到的故障。