USB-цифровое аудио

В этой статье рассматривается поддержка Android для цифрового аудио USB и связанных с ним протоколов на основе USB.

Аудитория

Целевой аудиторией этой статьи являются OEM-производители 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, либо Android Debug Bridge (adb) . Протоколы fastboot и adb накладываются на режим массовой передачи данных USB.

Режим хоста

Режим хоста представлен в Android 3.1 (уровень API 12).

Поскольку устройство Android должно выступать в качестве хоста, а большинство устройств Android имеют разъем micro-USB, который напрямую не разрешает работу хоста, обычно требуется мобильный адаптер ( OTG ), такой как этот:

ОТГ

Рис. 1. Адаптер «на ходу» (OTG)

Устройство Android может не обеспечивать достаточную мощность для работы определенного периферийного устройства, в зависимости от того, сколько энергии требуется периферийному устройству и сколько устройство Android может обеспечить. Даже при достаточном питании заряд батареи Android-устройства может значительно сократиться. В этих ситуациях используйте концентратор с питанием, такой как этот:

Концентратор с питанием

Рис. 2. Концентратор с питанием

Режим аксессуаров

Режим аксессуаров был представлен в 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 ЦАПу и усилителю, тоже с наушниками.

Сравнение ЦАП

Рисунок 3. Сравнение двух ЦАП

Какой дизайн лучше? Ответ зависит от ваших потребностей. У каждого есть преимущества и недостатки.

Примечание. Это искусственное сравнение, поскольку на реальном Android-устройстве, вероятно, будут доступны обе опции.

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

Во втором варианте внешнее звуковое периферийное устройство C может быть разработано для обеспечения более высокого качества звука и большей выходной мощности, не влияя при этом на стоимость базового массового Android-устройства B. Да, это более дорогая конструкция, но затраты покрываются только за счет те, кто этого хочет.

Мобильные устройства печально известны тем, что имеют печатные платы высокой плотности, что может привести к большему количеству перекрестных помех , которые ухудшают соседние аналоговые сигналы. Цифровая связь менее чувствительна к шуму , поэтому перенос ЦАП с устройства Android A на внешнюю печатную плату C позволяет физически и электрически изолировать конечные аналоговые каскады от плотной и шумной печатной платы, что приводит к более точному воспроизведению звука.

С другой стороны, второй дизайн более сложен, и с добавлением сложности появляется больше возможностей для неудачи. Существует также дополнительная задержка от контроллеров USB.

Приложения режима хоста

Типичные аудиоприложения в режиме USB-хоста включают:

  • прослушивание музыки
  • телефония
  • обмен мгновенными сообщениями и голосовой чат
  • запись

Для всех этих приложений Android обнаруживает совместимое цифровое аудиопериферийное устройство USB и автоматически направляет воспроизведение и захват звука соответствующим образом на основе правил политики аудио. Стереоконтент воспроизводится на первых двух каналах периферийного устройства.

Для цифрового аудио USB не существует специальных API. При расширенном использовании автоматическая маршрутизация может мешать приложениям, поддерживающим USB. Для таких приложений отключите автоматическую маршрутизацию через соответствующий элемент управления в разделе «Медиа» в « Настройках»/«Параметры разработчика ».

Отладка в режиме хоста

В режиме хоста USB отладка adb через USB недоступна. Альтернативный вариант см. в разделе Использование Android Debug Bridge в беспроводном режиме.

Реализация USB-аудио

Рекомендации для поставщиков аудиопериферии

Для обеспечения взаимодействия с устройствами Android поставщики периферийных аудиоустройств должны:

  • дизайн для соответствия классу аудио; в настоящее время Android нацелен на класс 1, но разумно планировать класс 2
  • избегать причуд
  • тест на совместимость с эталонными и популярными Android-устройствами
  • четко документировать поддерживаемые функции, соответствие классам аудио, требования к питанию и т. д., чтобы потребители могли принимать обоснованные решения.

Рекомендации для OEM-производителей 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, а «codename» — на кодовое имя устройства.

Пример записи показан здесь:

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 audio HAL сильно зависит от tinyalsa , описанного в Audio Terminology . Хотя USB-аудио основано на изохронных передачах, реализация ALSA абстрагируется от этого. Таким образом, USB audio HAL и tinyalsa не должны заботиться об этой части протокола USB.

Тестирование USB-аудио

Информацию о тестировании CTS для USB-аудио см. в разделе Тесты USB Audio CTS Verifier .