【问题标题】:How does one jump to a particular offset more than once?一个人如何多次跳转到特定的偏移量?
【发布时间】:2009-01-12 06:23:57
【问题描述】:

想象一下这个函数:

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

有什么想法吗?

【问题讨论】:

    标签: audio offset openal


    【解决方案1】:

    解决了!

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

    似乎设置偏移量仅适用于AL_INITIAL 状态的源。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-09
        • 2013-08-24
        • 2023-03-18
        • 2020-01-08
        • 1970-01-01
        相关资源
        最近更新 更多