2010-07-10 3 views
1

J'ai utilisé les classes audio SpeakHere dans une application que je crée et qui doit lire & Enregistrement simultané. J'utilise le SDK le plus récent avec une cible 3.2 dans une application universelle (ciblant l'iPad & iPhone).Le code AudioQueue de SpeakHere échoue sur l'iPad

L'application lit des films en streaming en utilisant MPMoviePlayerController et enregistre des données audio simultanément.

Cela fonctionne 100% parfaitement sur un iPhone.

Cependant, il échoue 100% sur mes clients iPad. Les logs montrent! Act les erreurs que l'AudioSession refuse simplement d'activer! Et chaque fichier journal que j'ai reçu de lui contient de nombreuses interruptions & Les modifications d'itinéraire (à savoir la catégorie) renvoyées aux fonctions de rappel. ** Sur un iPhone, je ne vois rien du tout. Les journaux montrent seulement que l'enregistrement a été créé et enregistré dans le fichier spécifié. Pas d'interruptions, pas de changement de route, pas de bêtises.

est ici les journaux pertinents:

Jul 10 07:15:21 iPad mediaserverd[15502] <Error>: [07:15:21.464 <0x1207000>] AudioSessionSetClientPlayState: Error adding running client - session not active 
Sat Jul 10 07:15:21 iPad mediaserverd[15502] <Error>: [07:15:21.464 <AudioQueueServer>] AudioQueue: Error '!act' from AudioSessionSetClientPlayState(15642) 

J'ai écrasa mes deux fonctions de rappel pour vous connecter uniquement les occurrences des interruptions et des changements d'itinéraire (avec raisons). Donc, je ne vais pas déranger l'affichage du code, car il ne fait littéralement rien. Je vois ces journaux de nombreuses fois au cours d'une seule tentative pour commencer à enregistrer sur l'iPad si. J'ai lu pratiquement tous les messages que je peux trouver dans le forum Apple Dev et StackOverflow, mais je n'arrive pas à trouver quelqu'un avec le même problème ou des notes pertinentes dans les Apple Docs qui expliquent la différence de comportement de l'iPad. --Note: L'iPad présentait d'autres comportements défectueux qui ont été corrigés, tels que les appels Begin Interruption qui ne se sont jamais terminés (donc je ne désactive jamais la session).

Je ne reçois jamais de journaux indiquant des appels d'initialisation ou d'activation qui ont échoué à partir du code AudioQueue ou AudioSession. Il échoue simplement lorsque je tente de commencer l'enregistrement. - J'ai même tenté de forcer AudioSessionSetActive (true); appels avant chaque tentative d'utilisation du système de son et je reçois toujours ces erreurs.

Voici le code correspondant pour les appels d'initialisation:

//Initialize the Sound System 
    OSStatus error = AudioSessionInitialize(NULL, NULL, interruptionListener, self); 
    if (error){ printf("ERROR INITIALIZING AUDIO SESSION! %d\n", (int)error); } 
    else { 
     //must set the session active first according to devs talking about some defect....   
     error = AudioSessionSetActive(true); 
     if (error) NSLog(@"AudioSessionSetActive (true) failed"); 

     UInt32 category = kAudioSessionCategory_PlayAndRecord; 
     error = AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(category), &category); 
     if (error) printf("couldn't set audio category!\n"); 

     error = AudioSessionAddPropertyListener(kAudioSessionProperty_AudioRouteChange, propListener, self); 
     if (error) printf("ERROR ADDING AUDIO SESSION PROP LISTENER! %d\n", (int)error); 

     //Force mixing! 
     UInt32 allowMixing = true; 
     error = AudioSessionSetProperty(kAudioSessionProperty_OverrideCategoryMixWithOthers, sizeof (allowMixing), &allowMixing); 
     if (error) printf("ERROR ENABLING MIXING PROPS! %d\n", (int)error); 

     UInt32 inputAvailable = 0; 
     UInt32 size = sizeof(inputAvailable);   
     // we do not want to allow recording if input is not available 
     error = AudioSessionGetProperty(kAudioSessionProperty_AudioInputAvailable, &size, &inputAvailable); 
     if (error) printf("ERROR GETTING INPUT AVAILABILITY! %d\n", (int)error); 
     isInputAvailable = (inputAvailable) ? YES : NO; 


     //iPad doesn't require the routing changes, branched to help isolate iPad behavioral issues 
     if(! [Utils GetMainVC].usingiPad){ 
      //redirect to speaker? //this only resets on a category change! 
      UInt32 doChangeDefaultRoute = 1;   
      error = AudioSessionSetProperty(kAudioSessionProperty_OverrideCategoryDefaultToSpeaker, sizeof (doChangeDefaultRoute), &doChangeDefaultRoute); 
      if (error) printf("ERROR CHANGING DEFAULT ROUTE PROPS! %d\n", (int)error); 

      //this resets with interruption and/or route changes 
      UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker; 
      error = AudioSessionSetProperty(kAudioSessionProperty_OverrideAudioRoute,sizeof (audioRouteOverride),&audioRouteOverride); 
      if (error) printf("ERROR SPEAKER ROUTE PROPS! %d\n", (int)error); 
     } 

     // we also need to listen to see if input availability changes 
     error = AudioSessionAddPropertyListener(kAudioSessionProperty_AudioInputAvailable, propListener, self); 
     if (error) printf("ERROR ADDING AUDIO SESSION PROP LISTENER! %d\n", (int)error); 

     error = AudioSessionSetActive(true); 
     if (error) NSLog(@"AudioSessionSetActive (true) failed"); 
    } 

    // Allocate our singleton instance for the recorder & player object 
    myRecorder = new AQRecorder(); 
    myPlayer = new AQPlayer(); 

Plus tard dans le rappel de loadstate pour la vidéo que je simplement tenter de commencer l'enregistrement à un filepath prédéterminé:

myRecorder->StartRecord((CFStringRef)myPathStr); 

Et l'enregistrement audio échoue complètement.

Merci pour votre temps et votre aide sur ce point.

Répondre

0

Il s'avère que c'est un problème étrange.

1) Utilisez uniquement l'enregistrement sonore et la lecture et le code fonctionne parfaitement sur iPad.

2) Ajoutez la lecture du film et n'appelez AUCUN changement de routage et les choses fonctionnent bien sur l'iPad.D'une manière ou d'une autre, la présence de la lecture du lecteur vidéo suffit pour modifier l'AudioSession d'une manière qui oblige à modifier les itinéraires (comme utiliser le haut-parleur de l'appareil au lieu d'un casque).

Questions connexes