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);
}