Технические вопросы и ответы QA1631

AVAudioSession - Запрос аудио предпочтений сеанса

Q: Могу я устанавливать предпочтительное значение для AVAudioSessionбуферная продолжительность или частота дискретизации когда-либо?

A: В то время как безопасно установить AVAudioSession аудио категория (setCategory:error:) или слушатели уведомления как AVAudioSessionRouteChangeNotification например, независимо от состояния активации, обычно лучше выполнить предпочтительные запросы, такие как предпочтенная продолжительность аппаратного буфера (setPreferredIOBufferDuration:error:) или предпочтенная аппаратная частота дискретизации (setPreferredSampleRate:error:) когда AVAudioSession не активно.

Так как эти предпочтительные значения являются подсказками к операционной системе, фактическая буферная продолжительность или частота дискретизации могут отличаться один раз AVAudioSession был активирован. Поэтому прося текущую продолжительность аппаратного буфера или частоту дискретизации прежде AVAudioSession активация могла возвратить неправильные значения.

Установка предпочтительных значений до активации

Следуйте этим инструкциям:

Перечисление 1  

// Configure the audio session for playback and recording
NSError *audioSessionError = nil;
 
AVAudioSession *session = [AVAudioSession sharedInstance];
 
[session setCategory:AVAudioSessionCategoryPlayback error:&audioSessionError];
if (audioSessionError) {
    NSLog(@"Error %ld, %@",
          (long)audioSessionError.code, audioSessionError.localizedDescription);
}
 
// Set some preferred values
NSTimeInterval bufferDuration = .005; // I would prefer a 5ms buffer duration
[session setPreferredIOBufferDuration:bufferDuration error:&audioSessionError];
if (audioSessionError) {
    NSLog(@"Error %ld, %@",
          (long)audioSessionError.code, audioSessionError.localizedDescription);
}
 
double sampleRate = 44100.0; // I would prefer a sample rate of 44.1kHz
[session setPreferredSampleRate:sampleRate error:&audioSessionError];
if (audioSessionError) {
    NSLog(@"Error %ld, %@",
          (long)audioSessionError.code, audioSessionError.localizedDescription);
}
 
// Register for Route Change notifications
[[NSNotificationCenter defaultCenter] addObserver: self
                                         selector: @selector(handleRouteChange:)
                                             name: AVAudioSessionRouteChangeNotification
                                           object: session];
 
// *** Activate the audio session before asking for the "Current" values ***
[session setActive:YES error:&audioSessionError];
if (audioSessionError) {
    NSLog(@"Error %ld, %@",
          (long)audioSessionError.code, audioSessionError.localizedDescription);
}
 
// Get current values
sampleRate = session.sampleRate;
bufferDuration = session.IOBufferDuration;
 
NSLog(@"Sample Rate:%0.0fHz I/O Buffer Duration:%f", sampleRate, bufferDuration);
 
...

Начиная с AVAudioSession в Перечислении 1 был активирован до выяснения текущей аппаратной частоты дискретизации и текущей продолжительности аппаратного буфера, возвращенные значения точно отразят то, что аппаратные средства представят клиенту. Эти значения могут отличаться тогда, что было предпочтено клиентом.

Изменение предпочтительных значений после активации

Когда приложение установит предпочтительное значение, оно не вступит в силу, пока аудио сеанс не был активирован. В большинстве случаев, где установка предпочтительного значения вызывает своего рода реконфигурирование аудиосистемы с активным аудио сеансом, аудиоданные, I/O будет остановлен и затем перезапущен. Поэтому, если приложение планирует установить многократные предпочтительные значения, обычно желательно деактивировать сеанс сначала, установить предпочтения, повторно активировать сеанс и затем проверить фактические значения.

Существует несколько случаев, однако, где приложение должно сначала активировать аудио сеанс (после установки надлежащей категории, опций категории и режима), для склонности о возможностях текущей конфигурации перед способностью установить «предпочтительное» значение.

Например:

Рекомендуется НЕ использовать AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation опция при движении неактивный в целях изменения некоторых предпочтительных значений.

Ссылка

Аудио руководство по программированию сеанса



История версии документа


ДатаПримечания
29.10.2013

Обновленный для AVAudioSession

07.02.2013

Добавленный раздел «Note»

08.12.2008

Новый документ, описывающий, когда запросить предпочтения сеанса, такие как Предпочтительные Аппаратные средства Буферная Продолжительность I/O.