2010-09-12 23 views
2

J'ai une application audio dans le magasin. Cela fonctionne bien avec les versions de l'iPhone OS avant iOS 4.0. Je travaille sur une nouvelle version, en commençant par mettre l'application en conformité avec les nouvelles capacités multitâches d'iOS. (J'ai iOS 4.0 sur mon iPhone, et j'ai mis à niveau vers le dernier xCode et SDK.)Essayer d'identifier le problème avec l'exécution de l'arrière-plan du noyau audio vs iPhone

Le résultat a été un spectacle-bouchon. O Lorsque j'installe l'application sur l'iPhone et que je la lance dans le débogueur, ou que je lance l'application après la mise hors tension de l'iPhone, l'application fonctionne très bien: lecture audio lorsque j'appuie sur des boutons ou redémarrage cela a été enregistré la fois précédente, l'application a été exécutée.

o Si j'essaie d'appuyer sur le bouton principal, puis de redémarrer l'application depuis l'arrière-plan, l'audio - a et le mélange de flux audio 1-n sortent avec un son saccadé que je pouvais seulement reconnaître.

o Si - alors que l'audio est propre - j'appelle l'iPhone, je peux répondre ou refuser l'appel. Dans les deux cas, l'application revient proprement, en jouant comme il se doit.

Notez que je n'essaie pas de jouer quoi que ce soit en mode d'arrière-plan. Je veux simplement fermer les choses et les rapporter quand on me le demande. Technologie: Toute la logique audio utilise RemoteIO. (J'ai des plans pour un jour faire un traitement de signal assez sophistiqué.)

Veuillez excuser le pseudo code narratif - une partie du code réel est assez vaste.

MainViewController:

o viewDidLoad - rien ensemble spécial

o didBecomeActive auto en tant que délégué de la session audio; définissez AudioSessionCategory sur MediaPlayback; définir l'AudioSessionActive; créer un joueur (voir ci-dessous); Redémarrer tous les sons précédemment joués;

o willResignActive enregistrer l'état de ce qui était en cours de lecture; stopAllSounds; arrêter le lecteur; définir la session audio inactive;

o didEnterBackground - rien (méthode est enregistré, mais pas de contenu.)

o willEnterForeground - rien (méthode est enregistré, mais pas de contenu.)

Aperçu du joueur - ma classe: Le joueur est un singleton. Je m'assure que l'instance singleton est détruite, et une nouvelle créée, dans didBecomeActive. L'instanciation du singleton démarre réellement l'AudioUnit.

constructeur setupRemoteIO; commencer AudioOutputUnitStart; stop AudioOutputUnitStop; rappel du joueur le truc habituel;

>

Voici quelques méthodes de mon MainViewController:

(void)willResignActive:(NSNotification *)note { 
    [ self saveState ]; 
    [ [ NaturePlayer getInstance ] stopAllSounds ]; 
    [ [ NaturePlayer getInstance ] stop ]; 
    NSError *activationError = nil; 
    [[AVAudioSession sharedInstance] setActive: NO error: &activationError]; 
    [NaturePlayer destroy]; 

} 

- (void)didBecomeActive:(NSNotification *)note { 
    [ self setupAudioSession ]; 

    NSError *activationError = nil; 
    [[AVAudioSession sharedInstance] setActive: YES error: &activationError]; 
    [ self restartSounds ]; 
    [ self setViewState ]; 
} 

- (void)didEnterBackground:(NSNotification *)note { 
    int xxx = 1; 
} 

- (void)willEnterForeground:(NSNotification *)note { 
    int xxx = 1; 
} 

- (void) applicationWillTerminate: (NSNotification*) notification { 
    int xxx = 1; 
} 

Voici une méthode de la NaturePlayer:

/** 
* Stop the playback process. 
*/ 
void NaturePlayerDelegate::stop() { 
    if (isPlaying_) { 
     AudioOutputUnitStop(outputUnit_); 
     isPlaying_ = FALSE ;   
    } 

}

J'ai vérifié: stop() est appelé, et à son tour appelle AudioOutputUnitStop(); Également vérifié: Le document sur AudioOutputUnitStop dit qu'il bloque jusqu'à ce que toute l'activité soit terminée.

Répondre

0

Difficile à dire sans plus de détails sur le code audio. Mais je suggère que vous pourriez vouloir examiner votre code de démontage d'objet de joueur pour vous assurer que l'unité audio et la session audio sont complètement arrêtées (le fil de rappel de mémoire tampon a été drainé) avant de relâcher des choses.

+0

hotpaw2, merci pour les commentaires. Jusqu'à présent, pas de chance. Vous avez suggéré de voir du code qui pourrait vous aider. Donc, voici les méthodes de a) le MainViewController, et b) le joueur. – wjs

0

Etes-vous en train d'initialiser et de désinitialiser AudioUnits dans votre code? J'ai récemment trouvé un problème que AudioUnits étant créé et détruit alors laissant et revenant à votre application causera le bégaiement.

J'ai été en mesure de résoudre ce problème dans mon application en ne désinitialisant jamais les AudioUnits.

More info sur mon problème et mon code AudioUnit.

0

J'ai eu le même problème dans un projet de la mine. Je trouve que si j'ai appelé AudioOutputUnitStop() à partir d'un bouton clic avant de suspendre l'application, puis appelé AudioOutputUnitStart() lorsque l'application a repris, j'ai eu aucun problème. Mais si j'appelé AudioOutputUnitStop() automatiquement à partir du gestionnaire viewDidUnload ou en tant que réponse à la UIApplicationWillResignActiveNotification, j'eu le bégaiement, le son de rétroaction de type décrit ci-dessus.

J'ai également remarqué que si j'ai arrêté l'unité audio manuellement, puis suspendu l'application, l'écouteur d'interruption a été appelé. Mais si j'ai suspendu l'application alors que l'unité audio était encore en cours d'exécution, l'écouteur d'interruption n'a pas été appelé. L'auditeur d'interruption est supposé arrêter l'unité audio, donc ça ne me fait pas grand chose. Après plusieurs heures de traçage, j'ai trouvé un moyen de terminer ma tâche sans unités audio, et les ai retirés de mon application. J'ai donc peur de ne pas avoir de réponse complète. Mais j'espère que ces indices aideront quelqu'un. Il se peut que je doive recommencer à l'avenir, alors je reviendrai ici pour voir si quelqu'un d'autre l'a compris.