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?

Était-ce utile?

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);
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top