Comment peut-on sauter à un offset particulier plus d'une fois?
Question
Imaginez cette fonction:
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’idée d’appeler playSource (x, 0.5f)
permettrait de passer (approximativement) à mi-chemin dans la mémoire tampon, etc.
Cela fonctionne bien la première fois que je l'appelle, mais si je l'appelle de nouveau sur la même source (que cette source soit en cours de lecture ou non), la lecture commence comme si je l'avais appelée avec le décalage 0.
Des idées pourquoi?
La solution
Résolu!
Même si l'API affirme que la définition des décalages fonctionne sur les sources quel que soit l'état, le problème était que j'aurais dû appeler alSourceRewind
au lieu de alSourceStop
au début.
Il semble que la définition de décalages ne fonctionne que sur les sources dans l'état AL_INITIAL
.
Autres conseils
vous pouvez commencer par lire le fichier audio, puis appelez setOffset
de cette façon, vous n'avez pas besoin d'appeler 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);
}