Оптимизация приложения для оборудования устройства
Используя аудио свойства сеанса, можно оптимизировать аудио поведение приложения для оборудования устройства во время выполнения. Это позволяет Вашему коду адаптироваться к характеристикам устройства, на котором он работает, а также к изменениям, внесенным пользователем (такое столь же включение гарнитуры или прикрепление устройства) как Ваше выполнение приложения.
Аудио механизм свойства сеанса позволяет Вам:
Укажите предпочтенные аппаратные настройки для частоты дискретизации и буферной продолжительности I/O
Запросите много характеристик оборудования, среди них задержка ввода и вывода, количество каналов ввода и вывода, аппаратная частота дискретизации, аппаратный параметр громкости, и доступен ли аудиовход
Реагируйте на устройство определенные уведомления
Обычно используемое событие изменения значения свойства является изменениями маршрута, покрытыми Ответом на Изменения маршрута. Можно также записать обратные вызовы для прислушиваний к изменениям в аппаратном выходном объеме и изменениям в доступности аудиовхода.
Выбор предпочтительных аудио аппаратных значений
Используйте аудио сеанс APIs для указания предпочтенной аппаратной частоты дискретизации и предпочтенных аппаратных средств буферная продолжительность I/O. Таблица 4-1 описывает преимущества и затраты этих предпочтений.
Установка | Предпочтительная частота дискретизации | Предпочтительный I/O буферизует продолжительность |
---|---|---|
Высокое значение | Пример: 44,1 кГц + Высокое качество звука – Большой размер файла | Пример: 500 мс + Менее - частый доступ к диску – Более длинная задержка |
Низкая стоимость | Пример: 8 кГц + Небольшой размер файла – Низкое качество звука | Пример: 5 мс + Низкая задержка – Частый доступ к диску |
Например, как показано в главной средней ячейке таблицы, Вы могли бы указать предпочтение высокой частоты дискретизации, если качество звука очень важно в Вашем приложении, и если большой размер файла не является значительной проблемой.
Аудио буферная продолжительность I/O по умолчанию (приблизительно 0,02 секунды для аудио на 44,1 кГц) обеспечивает достаточную скорость отклика для большинства приложений. Более низкая продолжительность I/O может быть установлена для критических по отношению к задержке приложений, таких как живой контроль музыкального инструмента, но Вы не должны будете изменять это значение для большинства приложений.
Установка предпочтительных аппаратных значений
Установите предпочтенные аппаратные значения до активации Вашего аудио сеанса. Когда приложение устанавливает предпочтительное значение, оно не вступает в силу, пока аудио сеанс не активируется. Проверьте выбранные значения после того, как будет повторно активирован Ваш аудио сеанс. В то время как Ваше приложение работает, Apple рекомендует деактивировать аудио сеанс прежде, чем изменить любое из значений набора. Перечисление 4-1 показывает, как установить предпочтительные аппаратные значения и как проверить используемые фактические значения.
Перечисление 4-1 Устанавливающие и запрашивающие аппаратные значения
NSError *audioSessionError = nil; |
AVAudioSession *session = [AVAudioSession sharedInstance]; |
[session setCategory:AVAudioSessionCategoryPlayback error:&audioSessionError]; |
if (audioSessionError) { |
NSLog(@"Error %ld, %@, (long)audioSessionError.code, audioSessionError.localizedDescription); |
} |
NSTimeInterval bufferDuration =.005; |
[session setPreferredIOBufferDuration:bufferDuration error:&audioSessionError]; |
if (audioSessionError) { |
NSLog(@"Error %ld, %@, (long)audioSessionError.code, audioSessionError.localizedDescription); |
} |
double sampleRate = 44100.0 |
[session setPreferredSampleRate:samplerate error:&audioSessionError]; |
if (audioSessionError) { |
NSLog(@"Error %ld, %@, (long)audioSessionError.code, audioSessionError.localizedDescription); |
} |
[[NSNotificationCenter defaultCenter] addObserver:self |
selector:@selector(handleRouteChange:) |
name:AVAudioSessionRouteChangeNotification |
object:session]; |
[session setActive:YES error:&audioSessionError]; |
if (audioSessionError) { |
NSLog(@"Error %ld, %@, (long)audioSessionError.code, audioSessionError.localizedDescription); |
} |
sampeRate = session.sampleRate; |
bufferDuration = session.IOBuffferDuration; |
NSLog(@"Sampe Rate:%0.0fHZ I/O Buffer Duration:%f", sampleRate, bufferDuration); |
Запросы характеристик оборудования
В то время как Ваше приложение работает и может отличаться с устройства на устройство, характеристики оборудования устройства на iOS могут измениться. При использовании встроенного микрофона для исходного iPhone, например, записывание частоты дискретизации ограничивается 8 кГц; присоединение гарнитуры и использование микрофона гарнитуры обеспечивают более высокую частоту дискретизации. Более новые устройства на iOS поддерживают более высокие аппаратные частоты дискретизации для встроенного микрофона.
Аудио сеанс Вашего приложения может сказать Вам о многих характеристиках оборудования устройства. Во время выполнения могут измениться эти характеристики. Например, когда пользователь включает гарнитуру, входная частота дискретизации может измениться. Посмотрите Ссылку класса AVAudioSession для полного списка свойств.
Прежде чем Вы укажете предпочтенные характеристики оборудования, гарантируете, что аудио сеанс неактивен. После установления Ваших предпочтений активируйте сеанс и затем запросите его для определения фактических характеристик. Этот последний шаг важен, потому что в некоторых случаях, система не может обеспечить то, что Вы просите.
Два из самых полезных аудио аппаратных свойств сеанса sampleRate
и outputLatency
. sampleRate
свойство содержит аппаратную частоту дискретизации устройства. outputLatency
свойство содержит задержку воспроизведения устройства.
Указание Предпочтительных Аппаратных средств Буферная Продолжительность I/O
Используйте AVAudioSession
класс для указания предпочтенных аппаратных частот дискретизации и предпочтенных аппаратных средств I/O буферизует продолжительности, как показано в Перечислении 4-2. Для установки предпочтенной частоты дискретизации, Вы использовали бы подобный код.
Перечисление 4-2 , Указывающее, предпочло буферную продолжительность I/O с помощью класса AVAudioSession
NSError *setPreferenceError = nil; |
NSTimeInterval preferredBufferDuration = 0.005; |
[[AVAudiosession sharedInstance] |
setPreferredIOBufferDuration: preferredBufferDuration |
error: &setPreferenceError]; |
После установления аппаратного предпочтения всегда просите у аппаратных средств фактическое значение, потому что система может не быть в состоянии обеспечить то, что Вы просите.
Получая и Используя аппаратную частоту дискретизации
Как часть установки для записи аудио, Вы получаете текущую аудио аппаратную частоту дискретизации и применяете его к Вашему формату аудиоданных. Перечисление 4-3 показывает как. Вы обычно помещаете этот код в файл реализации для класса записи. Используйте подобный код для получения других аппаратных свойств, включая число ввода и вывода каналов.
Прежде чем Вы запросите аудио сеанс для текущих характеристик оборудования, гарантируете, что сеанс активен.
Перечисление 4-3 Получая текущую аудио аппаратную частоту дискретизации с помощью класса AVAudioSession
double sampleRate; |
sampleRate = [[AVAudioSession sharedInstance] currentHardwareSampleRate]; |
Выполнение приложения в средстве моделирования
Когда Вы добавляете аудио сеансовую поддержку к своему приложению, можно выполнить приложение в Средстве моделирования или на устройстве. Однако Средство моделирования не моделирует аудио поведение сеанса и не имеет доступа к аппаратным функциям устройства. При выполнении приложения в Средстве моделирования Вы не можете:
Вызовите прерывание
Измените настройки переключателя Silent
Моделируйте экранную блокировку
Моделируйте включение в или отключение гарнитуры
Запросите аудио маршрутную информацию или протестируйте аудио поведение категории сеанса
Протестируйте поведение микширования звука — т.е. играя Ваше аудио вместе с аудио из другого приложения (такого как Музыкальное приложение)
Из-за характеристик Средства моделирования можно хотеть к conditionalize, чтобы код позволил частичное тестирование в Средстве моделирования.
Один подход должен перейти на основе возвращаемого значения вызова API. Гарантируйте, что Вы проверяете и соответственно отвечаете на коды результата от всех Ваших аудио вызовов функции сеанса; коды результата могут указать, почему Ваше приложение работает правильно над устройством, но перестало работать в Средстве моделирования.
В дополнение к корректному использованию аудио сеанса заканчиваются коды, можно использовать условные операторы препроцессора для сокрытия определенного кода, когда это работает в Средстве моделирования. Перечисление 4-4 показывает, как сделать это.
Перечисление 4-4 Используя условные операторы препроцессора
#if TARGET_IPHONE_SIMULATOR |
#warning *** Simulator mode: audio session code works only on a device |
// Execute subset of code that works in the Simulator |
#else |
// Execute device-only code as well as the other code |
#endif |