2013-05-10 1 views
3

주기적인 짧은 클립 소리를 재생하는 단계별 내비게이션 앱을 구축 중입니다. 화면이 잠겨 있는지 여부와 상관없이 사운드는 재생되어야하며 다른 음악 재생과 섞여야하며이 오디오가 재생되면 다른 음악을 재생해야합니다.AudioSessionActive가 NO 일 때 하드웨어 버튼을 통해 AVAudioPlayer의 볼륨을 제어 할 수 없음

Apple은 29 분 20 초에 "WWDC 2010 세션 412 오디오 개발 for iPhone OS part 1"비디오에서 세부 정보 턴 바이 바이 사례를 논의합니다. 구현은 훌륭하게 작동하지만 한 가지 문제가 있습니다. 앱이 실행 중일 때 하드웨어 볼륨 컨트롤을 누르면 앱 볼륨이 아니라 벨소리 볼륨이 조정됩니다. 앱 볼륨을 변경하려면 프롬프트가 재생되는 동안 볼륨 버튼을 눌러야합니다.

Apple은 AVAudioSession을 활성 상태로 두어서는 안되며, AVAudioSession이 비활성 상태이면 볼륨 버튼이 내 앱 볼륨을 제어하지 않습니다. 여기

내가 일을 설정하는 데 사용하고 코드입니다 :

UInt32 sessionCategory = kAudioSessionCategory_MediaPlayback; 
propertySetError = AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(sessionCategory), &sessionCategory); 

UInt32 allowMixing = true; 
propertySetError = AudioSessionSetProperty(kAudioSessionProperty_OverrideCategoryMixWithOthers, sizeof(allowMixing), &allowMixing); 

UInt32 shouldDuck = true; 
propertySetError = AudioSessionSetProperty(kAudioSessionProperty_OtherMixableAudioShouldDuck, sizeof(shouldDuck), &shouldDuck); 

OSStatus activationResult = AudioSessionSetActive(true); 

NSError* err = nil; 
_player = [[AVAudioPlayer alloc] initWithData:audioData error:&err]; 
_player.delegate = self; 
[_player play]; 

을 애플이 권장 나는이 말에 NO로 활성 세션을 설정합니다

OSStatus activationResult = AudioSessionSetActive(false); 
NSAssert(activationResult == kAudioSessionNoError, @"Error deactivating audio session"); 

인가 뭔가를 내가 누락되었거나 비디오에서 추천 한 것에 반대해야합니까?

+0

사용자가 활성 오디오를 보거나들을 때 사용자가 신호기를 제어한다고 가정해야 할 가능성이 있습니까? 앱이 아닌가요? – hotpaw2

+1

@ hotpaw2 좋은 질문입니다. Core Audio 개발자는이 동작을 설계 할 때이 점을 염두에 두었을 수도 있지만, Apple Maps가 탐색 모드에서 작동하는 방식을 연구하면 프롬프트가 재생되지 않을 때 하드웨어 버튼이 앱 볼륨을 제어합니다. 분명히 할 수있는 방법이 있습니다. Apple은 turn-by-turn 앱이 작동하는 방식대로 올바른 행동이라고 생각합니다. –

+0

WWDC에서 작성한 코드를 사용하는 github 프로젝트를 만들었습니다. 실제 하드웨어에서 실행하고 싶습니다. https://github.com/marcregan/core-audio-volume-problems/tree/master/AudioVolumeProblems –

답변

7

오디오 세션을 비활성으로 설정하지 않으려는 경우입니다. 당신이해야 할 일은 사운드 재생을 위해 세션을 설정하는 방법과 유휴 상태로 설정하는 두 가지 방법을 사용하는 것입니다. 첫 번째 방법은 믹스 + 오리 오디오 모드를 설정하고 두 번째 방법은 앰비언트 + 백그라운드 오디오와 같은 친숙한 모드를 사용합니다. 이 같은

뭔가 :

다음
- (void)setActive { 
    UInt32 mix = 1; 
    UInt32 duck = 1; 
    NSError* errRet; 

    AVAudioSession* session = [AVAudioSession sharedInstance]; 
    [session setActive:NO error:&errRet]; 

    [session setCategory:AVAudioSessionCategoryPlayback error:&errRet]; 
    NSAssert(errRet == nil, @"setCategory!"); 

    AudioSessionSetProperty(kAudioSessionProperty_OverrideCategoryMixWithOthers, sizeof(mix), &mix); 
    AudioSessionSetProperty(kAudioSessionProperty_OtherMixableAudioShouldDuck, sizeof(duck), &duck); 

    [session setActive:YES error:&errRet]; 
} 

- (void)setIdle { 
    NSError* errRet; 

    AVAudioSession* session = [AVAudioSession sharedInstance]; 
    [session setActive:NO error:&errRet]; 

    [session setCategory:AVAudioSessionCategoryAmbient error:&errRet]; 
    NSAssert(errRet == nil, @"setCategory!"); 

    [session setActive:YES error:&errRet]; 
} 

그것을 전화 :

[self setActive]; 
[self _playAudio:nil]; 

이 재생 후 청소하려면 :

- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer*)player 
        successfully:(BOOL)flag { 
[self setIdle]; 

}

은 좋은 시민하려면 , 앱에서 오디오를 설정해야합니다. (즉, 주요 기능을 수행하면서) 탐색하지 않을 때 비활성 상태이지만,있을 때 오디오 세션을 활성 상태로 유지하고 다른 응용 프로그램과 평화롭게 공존 할 수있는 모드를 사용하는 데는 아무런 문제가 없습니다. 위 코드를 사용하여 Apple의 탐색 기능을 복제 할 수 있습니다.

+0

멋지게 작동합니다. 정말 고맙습니다! –

+0

그레이트 - 내 기쁨 :) –

관련 문제