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.
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