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

Audio 如何多次跳转到特定偏移?,audio,offset,openal,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(uiBuffe

想象一下这个功能:

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

知道为什么吗?

解决了

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


设置偏移量似乎只在
AL_INITIAL
状态下的源上起作用。

您可以先播放音频文件,然后像这样调用
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);
}