如何多次跳转到特定偏移量?

时间:2009-01-12 06:23:58

标签: audio offset openal

想象一下这个功能:

void SoundManager::playSource(ALuint sourceID, float offset)
{
    alSourceStop(sourceID);

    ALint iTotal = 0;
    ALint iCurrent = 0;
    ALint uiBuffer = 0;
    alGetSourcei(sourceID, AL_BUFFER, &uiBuffer);
    alGetBufferi(uiBuffer, AL_SIZE, &iTotal);
    iCurrent = iTotal * offset;

    alSourcei(sourceID, AL_BYTE_OFFSET, iCurrent);
    alSourcePlay(sourceID);
}

这个想法是调用playSource(x, 0.5f)会跳转到(大致)缓冲区的中途等等。

我第一次调用它时效果很好,但是如果我在同一个源上再次调用它(无论该源是否正在播放),它就会开始播放,就好像我用偏移0调用它一样。

任何想法为什么?

2 个答案:

答案 0 :(得分:7)

解决!

尽管API声称设置偏移量适用于任何州的来源,但问题是我应该在开始时调用alSourceRewind而不是alSourceStop

似乎设置偏移仅适用于AL_INITIAL状态的源。

答案 1 :(得分:1)

您可以先播放音频文件,然后像这样拨打setOffset,不需要拨打alSourcePlay

- (BOOL)setOffset:(float)offset
{
  ALint iTotal = 0;
  ALint iCurrent = 0;
  ALint uiBuffer = 0;
  alGetSourcei(_sourceID, AL_BUFFER, &uiBuffer);
  alGetBufferi(uiBuffer, AL_SIZE, &iTotal);
  iCurrent = iTotal * offset;
  alSourcei(_sourceID, AL_BYTE_OFFSET, iCurrent);
  return ((_error = alGetError()) != AL_NO_ERROR);
}