2013-08-30 4 views
3

Я прочитал несколько сообщений по этому вопросу, но ответы не на 100% понятны. Я ищу ясность здесь.iOS AVAudioPlayer Volume Control

Мое приложение периодически воспроизводит звук 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

Эй для будущих искателей ответа, С AudioSessionInitialize и AudioSessionSetActive осуждаются в iOS7 рекомендуемый способ обработки аппаратного аудио и получать спины вызова заключается в использовании AVAudioSession объекта. Установите сеанс как активный для вашего приложения и 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]; 
} 
Смежные вопросы