В этой статье рассматривается поддержка Android цифрового аудио через USB и связанных с ним протоколов на основе USB.
Аудитория
Целевой аудиторией этой статьи являются производители устройств Android, поставщики SoC, поставщики периферийных USB-аудио, продвинутые разработчики аудиоприложений и другие лица, которым требуется детальное понимание внутреннего устройства цифрового аудио через USB на Android.
Конечным пользователям устройств Nexus следует вместо этого просмотреть статью «Запись и воспроизведение звука в режиме USB-хоста» в Справочном центре Nexus . Хотя эта статья не ориентирована на конечных пользователей, некоторые аудиофилы могут найти в ней интерес.
Обзор USB
Универсальная последовательная шина (USB) неофициально описана в статье USB в Википедии и формально определяется стандартами, опубликованными USB Implementers Forum, Inc. Для удобства мы суммируем здесь ключевые концепции USB, однако авторитетным справочником являются стандарты.
Основные понятия и терминология
USB — это шина с единственным инициатором операций передачи данных, называемым хостом . Хост взаимодействует с периферийными устройствами через шину.
Примечание. Термины «устройство» и «аксессуар» являются общими синонимами периферийного устройства . Мы избегаем здесь этих терминов, поскольку их можно спутать с устройством Android или специфичной для Android концепцией, называемой режимом аксессуаров .
Важнейшей ролью хоста является перечисление : процесс обнаружения периферийных устройств, подключенных к шине, и запроса их свойств, выраженных через дескрипторы .
Периферийное устройство может быть одним физическим объектом, но фактически выполнять несколько логических функций . Например, периферийное устройство веб-камеры может иметь как функцию камеры, так и функцию звука микрофона.
Каждая периферийная функция имеет интерфейс , определяющий протокол взаимодействия с этой функцией.
Хост связывается с периферийным устройством через канал с конечной точкой , источником данных или приемником, предоставляемым одной из функций периферийного устройства.
Существует два типа каналов: сообщения и потоки . Канал сообщений используется для двунаправленного управления и статуса. Потоковый канал используется для однонаправленной передачи данных.
Хост инициирует всю передачу данных, поэтому термины ввод и вывод выражаются относительно хоста. Операция ввода передает данные от периферийного устройства к хосту, а операция вывода передает данные от хоста к периферийному устройству.
Существует три основных режима передачи данных: прерывание , пакетный и изохронный . Изохронный режим будет обсуждаться далее в контексте аудио.
Периферийное устройство может иметь терминалы , которые подключаются к внешнему миру, за пределами самого периферийного устройства. Таким образом, периферийное устройство служит для преобразования между протоколом USB и сигналами «реального мира». Терминалы являются логическими объектами функции.
USB-режимы Android
Режим разработки
Режим разработки присутствует с момента первого выпуска Android. Устройство Android отображается как периферийное USB-устройство на главном компьютере под управлением настольной операционной системы, например Linux, Mac OS X или Windows. Единственная видимая периферийная функция — это Android fastboot или Android Debug Bridge (adb) . Протоколы fastboot и adb накладываются на режим массовой передачи данных через USB.
Режим хоста
Режим хоста представлен в Android 3.1 (уровень API 12).
Поскольку устройство Android должно выступать в качестве хоста, а большинство устройств Android имеют разъем micro-USB, который не позволяет напрямую работать с хостом, обычно требуется мобильный адаптер ( OTG ), такой как этот:
Устройство Android может не обеспечивать достаточную мощность для работы определенного периферийного устройства в зависимости от того, сколько энергии требуется периферийному устройству и сколько устройство Android способно обеспечить. Даже если имеется достаточная мощность, заряд батареи устройства Android может значительно сократиться. В таких ситуациях используйте такой концентратор с питанием:
Режим аксессуаров
Режим аксессуаров был представлен в Android 3.1 (уровень API 12) и обратно перенесен на Android 2.3.4. В этом режиме устройство Android работает как периферийное USB-устройство под управлением другого устройства, например док-станции, которое выступает в качестве хоста. Разница между режимом разработки и режимом аксессуаров заключается в том, что хосту видны дополнительные функции USB, помимо adb. Устройство Android сначала находится в режиме разработки, а затем переходит в режим аксессуара посредством процесса повторного согласования.
В Android 4.1 режим аксессуаров был расширен дополнительными функциями, в частности звуком, описанным ниже.
USB-аудио
USB-классы
С каждой периферийной функцией связан документ класса устройства , в котором указан стандартный протокол для этой функции. Это позволяет хостам , совместимым с классом , и периферийным функциям взаимодействовать без детального знания работы друг друга. Соответствие классу имеет решающее значение, если хост и периферийное устройство предоставляются разными организациями.
Термин « без драйверов» является распространенным синонимом термина «совместимый с классом» , указывая на то, что можно использовать стандартные функции такого периферийного устройства, не требуя установки драйвера , специфичного для операционной системы. Можно предположить, что периферийное устройство, рекламируемое как «драйвер не требуется» для основных настольных операционных систем, будет соответствовать классу, хотя могут быть и исключения.
USB-аудиокласс
Здесь нас интересуют только периферийные устройства, которые реализуют аудиофункции и, таким образом, соответствуют классу аудиоустройств. Существует две редакции спецификации класса USB-аудио: класс 1 (UAC1) и класс 2 (UAC2).
Сравнение с другими классами
USB включает в себя множество других классов устройств, некоторые из которых можно спутать с классом аудио. Класс запоминающего устройства (MSC) используется для секторно-ориентированного доступа к носителю, а протокол передачи мультимедиа (MTP) — для полного доступа к файлам к носителю. И MSC, и MTP можно использовать для передачи аудиофайлов, но только класс USB-аудио подходит для потоковой передачи в реальном времени.
Аудио терминалы
Разъемы периферийного аудиоустройства обычно являются аналоговыми. Аналоговый сигнал, поступающий на входной разъем периферийного устройства, преобразуется в цифровой с помощью аналого-цифрового преобразователя (АЦП) и передается по протоколу USB для использования хостом. ADC является источником данных для хоста. Аналогично, хост отправляет цифровой аудиосигнал по протоколу USB на периферийное устройство, где цифро-аналоговый преобразователь (ЦАП) преобразует его и передает на аналоговый выходной терминал. ЦАП является приемником для хоста.
Каналы
Периферийное устройство с функцией аудио может включать в себя терминал источника, терминал приемника или оба. Каждое направление может иметь один канал ( моно ), два канала ( стерео ) или более. Периферийные устройства с более чем двумя каналами называются многоканальными . Обычно стереопоток интерпретируется как состоящий из левого и правого каналов, а в более широком смысле интерпретируется как многоканальный поток, имеющий пространственные местоположения, соответствующие каждому каналу. Однако также вполне уместно (особенно для USB-аудио, а не для HDMI ) не назначать каждому каналу какое-либо конкретное стандартное пространственное значение. В этом случае приложение и пользователь должны определить, как будет использоваться каждый канал. Например, четырехканальный входной поток USB может иметь первые три канала, подключенные к различным микрофонам в комнате, а последний канал принимает входной сигнал от AM-радио.
Изохронный режим передачи
USB-аудио использует изохронный режим передачи для своих характеристик в реальном времени за счет восстановления ошибок. В изохронном режиме гарантируется полоса пропускания, а ошибки передачи данных обнаруживаются с помощью проверки циклическим избыточным кодом (CRC). Но в случае ошибки не происходит подтверждения или повторной передачи пакета.
Изохронные передачи происходят каждый период начала кадра (SOF). Период SOF составляет одну миллисекунду для полной скорости и 125 микросекунд для высокой скорости. Каждый полноскоростной кадр несет до 1023 байт полезной нагрузки, а высокоскоростной кадр — до 1024 байт. Объединив эти значения, мы вычисляем максимальную скорость передачи как 1 023 000 или 8 192 000 байт в секунду. Это устанавливает теоретический верхний предел объединенной частоты дискретизации звука, количества каналов и разрядности. Практический предел ниже.
В изохронном режиме есть три подрежима:
- Адаптивный
- Асинхронный
- синхронный
В адаптивном подрежиме периферийный приемник или источник адаптируется к потенциально изменяющейся частоте дискретизации хоста.
В асинхронном подрежиме (также называемом неявной обратной связью) приемник или источник определяет частоту дискретизации, а хост ее подстраивается. Основное теоретическое преимущество асинхронного подрежима заключается в том, что тактовый сигнал источника или приемника USB физически и электрически ближе (и действительно может быть таким же, как или получен из тактового сигнала, который управляет ЦАП или АЦП). Эта близость означает, что асинхронный подрежим должен быть менее восприимчив к дрожанию тактовой частоты. Кроме того, тактовый сигнал, используемый ЦАП или АЦП, может быть рассчитан на более высокую точность и меньший дрейф, чем главный тактовый сигнал.
В синхронном подрежиме за каждый период SOF передается фиксированное количество байтов. Частота дискретизации звука фактически определяется тактовой частотой USB. Синхронный подрежим обычно не используется со звуком, поскольку и хост, и периферийное устройство зависят от тактовой частоты USB.
В таблице ниже приведены изохронные подрежимы:
Подрежим | Количество байтов за пакет | Частота дискретизации определяется | Используется для аудио |
---|---|---|---|
адаптивный | переменная | хозяин | да |
асинхронный | переменная | периферийный | да |
синхронный | зафиксированный | USB-часы | нет |
На практике подрежим, конечно, имеет значение, но следует учитывать и другие факторы.
Поддержка Android для аудиокласса USB
Режим разработки
USB-аудио не поддерживается в режиме разработки.
Режим хоста
Android 5.0 (уровень API 21) и выше поддерживает подмножество функций USB-аудио класса 1 (UAC1):
- Устройство Android должно выступать в качестве хоста
- Аудиоформат должен быть PCM (тип интерфейса I).
- Разрядность должна составлять 16, 24 или 32 бита, при этом 24 бита полезных аудиоданных выравниваются по левому краю в пределах старших бит 32-битного слова.
- Частота дискретизации должна быть 48, 44,1, 32, 24, 22,05, 16, 12, 11,025 или 8 кГц.
- Количество каналов должно быть 1 (моно) или 2 (стерео).
При просмотре исходного кода платформы Android может обнаружиться дополнительный код, превышающий минимум, необходимый для поддержки этих функций. Но этот код не прошел валидацию, поэтому более продвинутые функции пока не заявлены.
Режим аксессуаров
В Android 4.1 (уровень API 16) на хосте добавлена ограниченная поддержка воспроизведения звука. В режиме аксессуара Android автоматически направляет аудиовыход на USB. То есть Android-устройство служит источником данных для хоста, например док-станции.
Аудио в режиме аксессуаров имеет следующие особенности:
- Устройство Android должно управляться знающим хостом, который может сначала перевести устройство Android из режима разработки в режим аксессуара, а затем хост должен передать аудиоданные из соответствующей конечной точки. Таким образом, устройство Android не кажется хосту «без драйвера».
- Направление должно быть указано относительно хоста.
- Аудиоформат должен быть 16-битный PCM.
- Частота дискретизации должна составлять 44,1 кГц.
- Количество каналов должно быть 2 (стерео).
Аудио в дополнительном режиме не получило широкого распространения и в настоящее время не рекомендуется для новых разработок.
Применение цифрового аудио через USB
Как следует из названия, цифровой аудиосигнал USB представляет собой поток цифровых данных, а не аналоговый сигнал, используемый обычным разъемом мини-гарнитуры TRS. В конце концов, любой цифровой сигнал необходимо преобразовать в аналоговый, прежде чем его можно будет услышать. При выборе места размещения конверсии приходится идти на компромиссы.
История двух ЦАП
На приведенном ниже примере диаграммы мы сравниваем две конструкции. Сначала у нас есть мобильное устройство с прикладным процессором (AP), встроенным ЦАП, усилителем и аналоговым разъемом TRS, подключенным к наушникам. Мы также рассматриваем мобильное устройство с USB, подключенное к внешнему USB ЦАПу и усилителю, тоже с наушниками.
Какой дизайн лучше? Ответ зависит от ваших потребностей. У каждого есть преимущества и недостатки.
Примечание. Это искусственное сравнение, поскольку на реальном устройстве Android, вероятно, будут доступны оба варианта.
Первая конструкция A проще, дешевле, потребляет меньше энергии и будет более надежной, если в остальном компоненты будут одинаково надежными. Однако обычно существует компромисс между качеством звука и другими требованиями. Например, если это устройство массового рынка, оно может быть разработано с учетом потребностей обычного потребителя, а не аудиофила.
Во втором варианте внешнее аудиопериферийное устройство C может быть рассчитано на более высокое качество звука и большую выходную мощность, не влияя при этом на стоимость базового Android-устройства B для массового рынка. Да, это более дорогая конструкция, но стоимость покрывается только за счет те, кто этого хочет.
Мобильные устройства известны тем, что имеют печатные платы высокой плотности, что может привести к увеличению возможностей для перекрестных помех , которые ухудшают качество соседних аналоговых сигналов. Цифровая связь менее восприимчива к шуму , поэтому перемещение ЦАП с устройства Android A на внешнюю печатную плату C позволяет физически и электрически изолировать конечные аналоговые каскады от плотной и шумной печатной платы, что приводит к более высокому качеству звука.
С другой стороны, вторая конструкция более сложна, и с увеличением сложности появляется больше возможностей для сбоя. Также существует дополнительная задержка со стороны USB-контроллеров.
Приложения режима хоста
Типичные аудиоприложения в режиме USB-хоста включают в себя:
- прослушивание музыки
- телефония
- обмен мгновенными сообщениями и голосовой чат
- запись
Для всех этих приложений Android обнаруживает совместимое цифровое аудиопериферийное USB-устройство и автоматически маршрутизирует воспроизведение и захват звука соответствующим образом в соответствии с правилами аудиополитики. Стереоконтент воспроизводится на первых двух каналах периферийного устройства.
Специальных API-интерфейсов для цифрового аудио USB не существует. При расширенном использовании автоматическая маршрутизация может мешать работе приложений, поддерживающих USB. Для таких приложений отключите автоматическую маршрутизацию через соответствующий элемент управления в разделе «Медиа» в «Настройки»/«Параметры разработчика» .
Отладка в режиме хоста
В режиме USB-хоста отладка adb через USB недоступна. Альтернативный вариант см. в разделе « Беспроводное использование Android Debug Bridge» .
Реализация USB-аудио
Рекомендации для производителей аудиопериферии
Для взаимодействия с устройствами Android поставщики аудиопериферийных устройств должны:
- дизайн соответствует аудиоклассу; в настоящее время Android ориентирован на класс 1, но разумно запланировать класс 2.
- избегайте причуд
- тест на совместимость с эталонными и популярными устройствами Android
- четко документируйте поддерживаемые функции, соответствие классам звука, требованиям к электропитанию и т. д., чтобы потребители могли принимать обоснованные решения.
Рекомендации для производителей устройств Android и поставщиков SoC
Для поддержки цифрового звука USB OEM-производители устройств и поставщики SoC должны:
- разработать аппаратное обеспечение для поддержки режима USB-хоста
- включите общую поддержку USB-хоста на уровне платформы с помощью функционального флага
android.hardware.usb.host.xml
- включить все необходимые функции ядра: режим USB-хоста, USB-аудио, режим изохронной передачи; см. Конфигурацию ядра Android
- быть в курсе последних выпусков ядра и исправлений; несмотря на благородную цель соответствия классу, существуют существующие аудиопериферийные устройства с особенностями , и в последних ядрах есть обходные пути для таких особенностей.
- включите политику USB-аудио, как описано ниже.
- добавьте audio.usb.default в PRODUCT_PACKAGES в device.mk
- проверка совместимости с распространенными периферийными USB-аудиоустройствами
Включить политику USB-аудио
Чтобы включить звук USB, добавьте запись в файл конфигурации политики звука. Обычно это находится здесь:
device/oem/codename/audio_policy.conf
Компонент пути «oem» следует заменить именем OEM-производителя устройства Android, а «кодовое имя» следует заменить кодовым именем устройства.
Пример записи показан здесь:
audio_hw_modules { ... usb { outputs { usb_accessory { sampling_rates 44100 channel_masks AUDIO_CHANNEL_OUT_STEREO formats AUDIO_FORMAT_PCM_16_BIT devices AUDIO_DEVICE_OUT_USB_ACCESSORY } usb_device { sampling_rates dynamic channel_masks dynamic formats dynamic devices AUDIO_DEVICE_OUT_USB_DEVICE } } inputs { usb_device { sampling_rates dynamic channel_masks AUDIO_CHANNEL_IN_STEREO formats AUDIO_FORMAT_PCM_16_BIT devices AUDIO_DEVICE_IN_USB_DEVICE } } } ... }
Исходный код
Реализация уровня аппаратной абстракции звука (HAL) для USB-аудио находится здесь:
hardware/libhardware/modules/usbaudio/
USB-аудио HAL в значительной степени опирается на tinyalsa , описанную в разделе Аудио терминология . Хотя USB-аудио полагается на изохронную передачу, это абстрагируется реализацией ALSA. Таким образом, USB-аудио HAL и tinyalsa не должны беспокоиться об этой части протокола USB.
Проверка USB-аудио
Информацию о тестировании CTS для USB-аудио см. в разделе «Проверочные тесты USB Audio CTS» .