Mac OS X上的OpenAL:设置AL_SAMPLE_OFFSET什么都不做

时间:2010-10-25 13:33:27

标签: macos openal

在工作中,我们无法使用alSourcePause()来暂停声音,而且在任何情况下我们都可能想要使用偏移来启动声音。

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

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

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

由于我们的时间紧迫,在OS X上跳过OpenAL上一部分简单声源的最佳方法是什么?

源代码位于our Sourceforge repository

1 个答案:

答案 0 :(得分:3)

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

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

在此之前停止了源,并且所有缓冲区都未加入队列。根据AL 1.1规范,应该可以

  1. 指定源处于停止状态时的缓冲区偏移量;这里,偏移应该应用于下一个alSourcePlay()调用,或
  2. 指定已播放源上的偏移量,这应该会立即跳到所需位置。
  3. (参见http://connect.creativelabs.com/openal/Documentation/OpenAL%201.1%20Specification.htm官方规范第4.3.2节)

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