Come si salta a un determinato offset più di una volta?
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é?
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);
}