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 で呼び出したように再生が開始されます。

理由はありますか?

4

2 に答える 2

7

解決しました!

APIは、オフセットの設定はどの状態のソースでも機能すると主張していますが、問題は、最初からではalSourceRewindなく、呼び出す必要があったことalSourceStopでした。

オフセットの設定は、AL_INITIAL州内のソースでのみ機能するようです。

于 2009-01-12T07:08:22.500 に答える
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);
}
于 2015-04-30T11:38:34.873 に答える