작성중인 앱에서 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);
그리고 오디오 녹음이 완전히 실패합니다.
시간 내 주셔서 감사합니다.