想象一下这个函数:
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调用它一样。
为什么?
发布于 2018-06-13 09:25:52
可以先播放音频文件,然后调用setOffset
像这样
- (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);
}
发布于 2018-06-13 11:02:17
尽管api声称设置偏移量在任何状态下都适用于源,但问题是我应该调用alSourceRewind
而不是alSourceStop
。
设置偏移只适用于AL_INITIAL
状态。
https://stackoverflow.com/questions/-100000266
复制相似问题