2011-03-12 1 views
2

Speak Here 예제 앱을 기반으로 애플리케이션을 만듭니다. 오디오가 연결되어 있거나 스피커가없는 경우 오디오를 헤드폰을 통해 재생하고 싶습니다.재생 중에 헤드폰이 뽑히면 iPhone 앱에 버그가 발생합니다.

나는 이런 일이 일어나도록 코드의 맨 아래 부분을 사용했으며 재생 중에 헤드폰을 뽑지 않으면 정상적으로 작동합니다. 그 시점에서 재생이 끝나고 괜찮습니다. 문제는 재생을 다시 히트하면 재생이 이상하게 나오고 중지 버튼이 작동을 멈추는 것입니다. 또한 정지 버튼을 눌렀을 때 정상적으로하는 것처럼 처음부터 다시 시작하지 않고 중단 한 부분부터 재생을 시작합니다.

마찬가지로 앱을 열기 전에 헤드폰을 연결하면 이상한 동작이 발생합니다.

어쩌면 '헤드폰 분리됨'이벤트를 가져 와서 '중지 버튼을 누르십시오.' 그것이 지금하고있는 방식이 올바르지 않기 때문에.

간단한 형태로 내 질문에 넣으려면 : 당신에게 스피커와 헤드폰을 통해 재생을위한 아이폰에 제대로 설치 코어 오디오를 수행하는 방법에 대해 설명합니다.

이 문제를 해결할 수있는 코드는 모두입니다. 감사!

OSStatus error = AudioSessionInitialize(NULL, NULL, NULL, NULL); 

if (error) printf("ERROR INITIALIZING AUDIO SESSION! %d\n", error); 
else 
{ 
    UInt32 category = kAudioSessionCategory_PlayAndRecord; 
    // UInt32 category = kAudioSessionCategory_MediaPlayback; 

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


    // It is bugs when I unplug the headphones! 
    UInt32 doChangeDefaultRoute = 1;   
    AudioSessionSetProperty (kAudioSessionProperty_OverrideCategoryDefaultToSpeaker, sizeof (doChangeDefaultRoute), &doChangeDefaultRoute); 




    error = AudioSessionAddPropertyListener(kAudioSessionProperty_AudioRouteChange, propListener, self); 
    if (error) printf("ERROR ADDING AUDIO SESSION PROP LISTENER! %d\n", 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", error); 
    btn_record.enabled = (inputAvailable) ? YES : NO; 

    // 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", error); 

    error = AudioSessionSetActive(true); 
    if (error) printf("AudioSessionSetActive (true) failed"); 

답변

1

추가 조사가 끝나면 본질적으로 두 가지 질문을 던졌습니다. 나는 지금까지 하나를 풀었다. 재생 '중단'보다는 '일시 정지'된다 중단 때때로

. 난 그냥이 '일시 중지'를했고, '정지'오디오에 대한 호출로 대체 코드의 어떤 요소를 제거하고 그것의 큐를 다시 바람.

대신 헤드폰의 스피커에서 나오는 오디오에 관해서는, 나는 아직도 그 일에 찾고 있어요.

0

헤드폰 연결이 해제되었을 때 인터럽트 대리인 메서드를 실행해야하는 AVAudioSessionDelegate 프로토콜을 구현해 보았습니까? Documentation here.

관련 문제