2013-08-30 4 views
3

주제에 대한 게시물을 많이 읽었지만 답변이 100 % 명확하지 않습니다. 나는 여기서 명확성을 찾고있다.iOS AVAudioPlayer 볼륨 컨트롤

내 앱은 주기적으로 짧은 AVAudioPlayer 사운드를 재생합니다. 문제는 첫 번째 사운드가 재생 된 후에 만 ​​볼륨을 설정할 수 있다는 것입니다.

stackoverflow를 읽은 후, 모든 사람들이 "앱 볼륨"에 장치의 볼륨 버튼을 "연결"하기 위해 앱의 시작 부분에 더미 (무음) AVAudioPlayer 사운드를 재생할 것을 제안합니다.

다른 말로하면, 앱이 시작될 때 기본적으로 제어되는 "벨소리"볼륨이며 첫 번째 사운드가 재생 된 후에 만 ​​기기의 볼륨 버튼이 "앱 볼륨"(AVAudioPlayer 볼륨)을 최종적으로 제어합니다 레이블이없는 이미지). 불행히도 이러한 일이 발생할 때까지 사용자는 첫 번째 소리를 듣지 못하고 이제는 앱이 고장난 것으로 간주합니다.

제 질문은 대답입니까? 앱 시작시 한 번 짧게 더미 사운드를 재생하여 기기의 볼륨 버튼을 앱에 '연결'할 수 있습니까?

Reference Image

답변

4

당신은 더미 사운드를 재생 할 필요가 없습니다. AudioToolbox 프레임 워크를 사용하면 AudioSessionActive를 다음과 같이 설정할 수 있습니다.

AudioSessionInitialize (NULL, NULL, NULL, NULL); 
UInt32 sessionCategory = kAudioSessionCategory_AmbientSound; 
AudioSessionSetProperty (kAudioSessionProperty_AudioCategory, sizeof (sessionCategory), &sessionCategory); 
AudioSessionSetActive (true); 

이렇게하면 볼륨 버튼으로 응용 프로그램 볼륨을 제어 할 수 있습니다.

이 방법에 대한 자세한 내용은 Cannot Control Volume of AVAudioPlayer via Hardware Buttons when AudioSessionActive is NO을 참조하십시오.

1

향후 답변 검색자를위한 안녕하세요, AudioSessionInitializeAudioSessionSetActive은 iOS7에서 사용되지 않으므로 하드웨어 오디오를 처리하고 콜백을받는 방법은 AVAudioSession 개체를 사용하는 것이 좋습니다. 세션의 @"outputVolume" 속성에서 앱 및 KVO에 대해 세션을 활성으로 설정합니다.

- (id)init 
{ 
    self = [super init]; 
    if (self) 
    { 

     self.audioSession = [AVAudioSession sharedInstance]; 
     [_audioSession setActive:YES error:nil]; 
     [_audioSession addObserver:self forKeyPath:@"outputVolume" options:NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew context:NULL]; 
    } 
    return self; 
} 

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context 
{ 
    if ([keyPath isEqualToString:@"outputVolume"]) 
    { 
     [self setVolume:[change[@"new"] floatValue]]; 
    } 
} 

- (void)dealloc 
{ 
    [_audioSession removeObserver:self forKeyPath:@"outputVolume"]; 
    [_audioSession setActive:NO error:nil]; 
}