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 будет остановлен и затем перезапущен. Поэтому, если приложение планирует установить многократные предпочтительные значения, обычно желательно деактивировать сеанс сначала, установить предпочтения, повторно активировать сеанс и затем проверить фактические значения.
Существует несколько случаев, однако, где приложение должно сначала активировать аудио сеанс (после установки надлежащей категории, опций категории и режима), для склонности о возможностях текущей конфигурации перед способностью установить «предпочтительное» значение.
Например:
Для вызова
setPreferredInput:error:, активный аудио сеанс требуется прежде, чем запроситьavailableInputsсвойство.До вызова
setPreferredOutputNumberOfChannels:error:, активный аудио сеанс требуется прежде, чем попроситьmaximumOutputNumberOfChannels.
Если
AVAudioSessionCategoryOptionDuckOthersбыл установлен, хождение неактивного закончит ныряние. Как только Ваш аудио сеанс повторно активирует, ныряние другого аудио возобновится. Когда ныряние было установлено, Ваш сеанс всегда mixable. Это вызвано тем, что установкаAVAudioSessionCategoryOptionDuckOthersкtrueавтоматически также установитAVAudioSessionCategoryOptionMixWithOthersкtrue.Используя
AVAudioSessionSetActiveOptionNotifyOthersOnDeactivationопция, когда деактивация повторно активирует другие non-mixable приложения.
Рекомендуется НЕ использовать AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation опция при движении неактивный в целях изменения некоторых предпочтительных значений.
Ссылка
История версии документа
| Дата | Примечания |
|---|---|
| 29.10.2013 | Обновленный для AVAudioSession |
| 07.02.2013 | Добавленный раздел «Note» |
| 08.12.2008 | Новый документ, описывающий, когда запросить предпочтения сеанса, такие как Предпочтительные Аппаратные средства Буферная Продолжительность I/O. |