7 votes

Comment faire disparaître un AVAudioPlayer dans un fil d'arrière-plan ?

J'ai un fichier audio qui doit disparaître en fondu pendant que l'utilisateur fait défiler une UIScrollView. Cependant, toute performSelector:withObject:afterDelay: est bloquée jusqu'à ce que l'utilisateur ait arrêté le défilement. J'ai donc essayé de créer du code pour effectuer un fondu enchaîné sur un autre fil :

- (void)fadeOut
{
    [NSThread detachNewThreadSelector:@selector(fadeOutInBackground:) toTarget:self withObject:self.audioPlayer];
}

- (void)fadeOutInBackground:(AVAudioPlayer *)aPlayer
{
    NSAutoreleasePool *myPool = [[NSAutoreleasePool alloc] init];
    [self performSelector:@selector(fadeVolumeDown:) withObject:aPlayer afterDelay:0.1]; 
    [myPool release];
}

- (void)fadeVolumeDown:(AVAudioPlayer *)aPlayer
{
    aPlayer.volume = aPlayer.volume - 0.1;
    if (aPlayer.volume < 0.1) {
        [aPlayer stop];         
    } else {
        [self performSelector:@selector(fadeVolumeDown:) withObject:aPlayer afterDelay:0.1];  
    }
}

Il va jusqu'au performSelector, mais ne va pas plus loin, car je suppose qu'il essaie de s'exécuter sur un thread auquel il n'a pas accès. Je ne peux même pas le modifier pour performSelector:onThread:withObject:waitUntilDone: parce qu'il n'y a pas d'option de retard.

Des idées ? Pourquoi est-il si difficile de faire disparaître un son ? gémir

Gracias.

14voto

Martin Cote Points 12762

J'ai résolu un problème similaire en programmant le sélecteur dans un mode de boucle d'exécution différent de celui par défaut. De cette façon, il n'interfère pas avec les événements de défilement. En utilisant l'option NSRunLoopCommonModes a fonctionné pour moi :

[self performSelector:@selector(fadeVolumeDown:) 
           withObject:aPlayer
           afterDelay:0.1 
              inModes:[NSArray arrayWithObject: NSRunLoopCommonModes]];

0voto

Eran Talmor Points 1230

Inspiré par la réponse ci-dessus

   while (theAudio.volume > 0.000000)
        [self fadeVolumeDown];

- (void) fadeVolumeDown{
    theAudio.volume -=0.01;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X