Domanda

Immagina questa funzione:

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

L'idea sta chiamando playSource (x, 0.5f) salterebbe (approssimativamente) a metà del buffer, ecc.

Funziona bene la prima volta che lo chiamo, ma se lo chiamo di nuovo sulla stessa fonte (sia che la sorgente stia riproducendo o meno) inizia a suonare come se l'avessi chiamato con offset 0.

Qualche idea sul perché?

È stato utile?

Soluzione

Risolto!

Anche se l'API afferma che l'impostazione degli offset funziona su origini in qualsiasi stato, il problema era che avrei dovuto chiamare alSourceRewind anziché alSourceStop all'inizio.

Sembra che l'impostazione degli offset funzioni solo su sorgenti nello stato AL_INITIAL .

Altri suggerimenti

puoi prima riprodurre il file audio, quindi chiamare setOffset in questo modo, non è necessario chiamare 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);
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top