2009-01-12 106 views
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调用它一样。

任何想法为什么?

回答

7

解决!

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

看起来设置偏移量仅适用于AL_INITIAL状态中的源。

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