[AudioQueue] implémenter une méthode seek()

tom42

Membre enregistré
24 Septembre 2008
3
0
Bonjour,
je m'essaye au développement d'application pour iphone.
j'ai créé une class LecteurAudio qui permet de jouer des fichiers audio à l'aide de la classe "Audio Queue Services".
J'ai déjà implémenté les méthodes play(), pause(), resume(), stop() et changerVolume() qui marchent très bien.
Maintenant je cherche à écrire une méthode seek() permettant d'avancer ou de reculer la lecture.
Voici ce que je fais :
Bloc de code:
- (void) seek:(float)pos{
    // [U]pos[/U] : nombre entre 0 et 1
    // [U]numPacketsInFile[/U] : nombre total de packets à lire
    // [U]startingPacketNumber[/U] : index du packet à lire par la méthode callBack de mon AudioQueue
    //     ce nombre est incrémenter au cours de la lecture
    UInt32 newStartingPacketNumber = self.numPacketsInFile * pos;
    [self setStartingPacketNumber:newStartingPacketNumber];
}
Ceci fonctionne mais avec un temps entre l'appel de la méthode et le changement de la lecture (certainement le temps que le buffer courant de mon AudioQueue soit lu).
J'aimerais savoir si je suis sur la bonne voie et quelle la marche à suivre pour réaliser ceci ?
 
Bonjour,
je m'essaye au développement d'application pour iphone.
j'ai créé une class LecteurAudio qui permet de jouer des fichiers audio à l'aide de la classe "Audio Queue Services".
J'ai déjà implémenté les méthodes play(), pause(), resume(), stop() et changerVolume() qui marchent très bien.
Maintenant je cherche à écrire une méthode seek() permettant d'avancer ou de reculer la lecture.
Voici ce que je fais :
Bloc de code:
- (void) seek:(float)pos{
    // [U]pos[/U] : nombre entre 0 et 1
    // [U]numPacketsInFile[/U] : nombre total de packets à lire
    // [U]startingPacketNumber[/U] : index du packet à lire par la méthode callBack de mon AudioQueue
    //     ce nombre est incrémenter au cours de la lecture
    UInt32 newStartingPacketNumber = self.numPacketsInFile * pos;
    [self setStartingPacketNumber:newStartingPacketNumber];
}
Ceci fonctionne mais avec un temps entre l'appel de la méthode et le changement de la lecture (certainement le temps que le buffer courant de mon AudioQueue soit lu).
J'aimerais savoir si je suis sur la bonne voie et quelle la marche à suivre pour réaliser ceci ?

tu dois stopper et surtout locker, mais tu es sur la bonne voie
UIKit est assez capricieux donc maybe not :D
 
Qu'entends tu par locker ?
Pour régler le problème je ferme le fichier son, je stop l'AudioQueue, je ré-ouvre le fichier son, je re-crée l'AudioQueue, je réinitialise les buffers et je redémarre l'AudioQueue.
Ca marche mais n'y a t-il pas une autre méthode ? Lorsque je ne ferme pas le fichier son la lecture s'arrête pourquoi ?
Enfin si quelqu'un a déjà fait ça, je ne suis pas contre un petit exemple.
 
tu devrais plutot seek into your data

lock / flux de lecture/ utilisateur / sortie audio
start seek audio data to the right offset
release lock -> l'utilisateur peut lire / sortie audio

ton fichier son est deja en memoire c'est idiot de reouvrir / refermer // perf houillyouye
 
Merci tatouille.
J'ai résolu tous mes problèmes.
Je fais :
1) libére les buffers (AudioQueueFreeBuffer)
2) stop l'audioQueue (AudioQueueStop)
3) change le packet courant
4) Initalise les buffers (AudioQueueAllocateBuffer et playbackCallback sur tous les buffers)
5) demare l'audioQueue (AudioQueueStart)