1

在工作中,我们无法使用alSourcePause()暂停声音,并且无论如何我们可能希望以偏移量开始声音。

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

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

流声音在较慢的机器上跳过;我们在实现多线程播放时遇到了麻烦。

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

源代码可在我们的 Sourceforge 存储库中获得。

4

1 回答 1

4

我最近在 OS X (10.6.8) 上的游戏引擎中遇到了同样的问题。在恢复播放具有给定样本偏移量的静态缓冲区时,我们按以下顺序执行了以下步骤:

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

源在此之前停止,并且所有缓冲区都已取消排队。根据 AL 1.1 规范,应该可以

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

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

在上面的序列中反转后两个调用(即在发出 alSourcePlay() 调用后设置缓冲区偏移量)在我们的例子中起到了作用。从技术上讲,这应该是一个完全有效的方法;但是,如果音频线程在这两个调用之间被中断的时间过长,这可能会导致可听见的故障。

于 2011-07-08T12:20:39.827 回答