2010-07-10 4 views
1

작성중인 앱에서 SpeakHere 오디오 클래스를 사용했습니다. 동시에 재생을 수행해야합니다 (&).iPad에서 SpeakHere의 AudioQueue 코드가 실패합니다.

유니버셜 앱 빌드 (iPad & iPhone 타겟팅)에서 3.2 기기 타겟이있는 최신 SDK를 사용하고 있습니다.

앱은 MPMoviePlayerController를 사용하여 스트리밍 영화를 재생하고 오디오를 동시에 녹음합니다.

이것은 iPhone에서 완벽하게 작동합니다.

그러나 내 고객의 iPad에서는 100 % 실패합니다. Logs는 AudioSession이 단순히 활성화를 거부하고있는 에러를 보여줍니다! 그리고 그에게서받은 모든 로그 파일에는 수많은 방해가 포함되어 있습니다. & 라우트 변경 (즉, 카테고리)이 콜백 함수에 반환됩니다. ** iPhone에서는 이와 같은 내용이 전혀 보이지 않습니다. 로그에는 teh 레코드가 작성된 것으로 표시되고 지정된 파일에 기록됩니다. 방해받지 않고, 경로를 변경하지 않으며, 말도 안돼.

여기에 관련 로그입니다 :

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) 

나는 단지 중단하고 (사유) 경로 변경의 발생을 기록 모두 내 콜백 기능을 스텁했습니다. 그래서 나는 문자 그대로 아무 것도하지 않기 때문에 코드 게시에 신경 쓰지 않을 것입니다. 나는이 기록을 iPad에서 기록을 시작하려는 단일 시도 동안 여러 번 본다.

저는 Apple Dev 포럼과 StackOverflow에서 찾을 수있는 모든 게시물을 읽었지만 iPad 문제의 차이점을 설명하는 Apple Docs에서 같은 문제 또는 관련 메모를 찾지 못한 것 같습니다. - 참고 : iPad는 결코 끝나지 않은 불규칙한 시작 방해 호출과 같이 해결 된 다른 결함있는 동작을 표시했습니다. 따라서 세션을 절대로 비활성화하지 않습니다.

AudioQueue 또는 AudioSession 코드에서 실패한 초기화 또는 활성화 호출을 나타내는 로그를받지 못했습니다. 녹음을 시작하려고하면 실패합니다. - 강제로 AudioSessionSetActive를 시도했습니다 (true). 사운드 시스템을 사용하려고 시도하기 전에 전화를 걸고이 오류가 계속 발생합니다.

여기에 초기화 호출에 대한 관련 코드입니다 :

//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(); 

나중에 내가 단순히 소정 파일 경로에 녹화를 시작하려고 비디오의 LoadState에서 콜백에서 :

myRecorder->StartRecord((CFStringRef)myPathStr); 

그리고 오디오 녹음이 완전히 실패합니다.

시간 내 주셔서 감사합니다.

답변

0

이것은 이상한 문제입니다.

1) 사운드 녹음 만 사용하고 재생하면 코드가 iPad에서 완벽하게 실행됩니다.

2) 동영상 재생을 추가하고 라우팅 변경 사항을 호출하지 마세요. iPad에서 정상적으로 작동합니다.

어쨌든 무비 플레이어 재생 기능으로 AudioSession을 변경하면 어떤 경로 변경 (헤드폰 대신 장치 스피커 사용)이 강제 실행되는 방식으로 AudioSession이 비활성화됩니다.

관련 문제