2

想象一下这个函数:

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 调用它一样。

任何想法为什么?

4

2 回答 2

7

解决了!

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

似乎设置偏移量仅适用于该AL_INITIAL州的来源。

于 2009-01-12T07:08:22.500 回答
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);
}
于 2015-04-30T11:38:34.873 回答