想象一下这个功能:
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调用它一样。
任何想法为什么?
答案 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);
}