Цифровой аудиосигнал через USB

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

Аудитория

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

Конечным пользователям устройств Nexus рекомендуем ознакомиться со статьей Как записывать и воспроизводить аудио в режиме USB-хоста в Справочном центре Nexus. Эта статья предназначена не для конечных пользователей, но некоторые аудиофилы могут найти в ней полезную информацию.

Обзор USB

Стандарт USB (Universal Serial Bus) описан в статье Википедии USB и официально определен в стандартах, опубликованных организацией USB Implementers Forum, Inc. Для удобства мы приводим здесь основные понятия, связанные с USB, но стандарты являются авторитетным источником информации.

Основные понятия и терминология

USB – это шина с одним инициатором операций передачи данных, который называется хостом. Хост обменивается данными с периферийными устройствами по шине.

Примечание. Термины устройство и аксессуар часто используются как синонимы термина периферийное устройство. Мы не используем эти термины, чтобы не путать их с устройством Android или режимом аксессуара, который есть только в Android.

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

Периферийное устройство может быть одним физическим объектом, но при этом выполнять несколько логических функций. Например, у веб-камеры может быть функция камеры и функция микрофона.

У каждой функции периферийного устройства есть интерфейс, который определяет протокол для связи с этой функцией.

Хост взаимодействует с периферийным устройством через канал, подключенный к конечной точке – источнику или приемнику данных, предоставляемому одной из функций периферийного устройства.

Существует два типа каналов: сообщение и поток. Канал сообщений используется для двунаправленного управления и передачи статуса. Канал потока используется для однонаправленной передачи данных.

Хост инициирует все передачи данных, поэтому термины вход и выход используются относительно хоста. Операция ввода передает данные с периферийного устройства на хост, а операция вывода – с хоста на периферийное устройство.

Существует три основных режима передачи данных: прерывание, массовая передача и изохронная передача. Изохронный режим будет рассмотрен подробнее в контексте аудио.

У периферийного устройства могут быть терминалы, которые подключаются к внешнему миру за пределами самого периферийного устройства. Таким образом, периферийное устройство служит для преобразования между протоколом USB и сигналами «реального мира». Терминалы – это логические объекты функции.

Режимы USB на устройствах Android

Режим разработчика

Режим разработчика доступен с момента выпуска первой версии Android. Устройство Android подключается к компьютеру с ОС Linux, Mac OS X или Windows как периферийное устройство USB. Единственная видимая периферийная функция – это Android fastboot или Android Debug Bridge (adb). Протоколы fastboot и adb работают поверх режима передачи данных по USB.

Режим хоста

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

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

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 Audio Class.

Аудиотерминалы

Терминалы периферийных аудиоустройств обычно аналоговые. Аналоговый сигнал, поступающий на входной терминал периферийного устройства, преобразуется в цифровой с помощью аналого-цифрового преобразователя (АЦП) и передается по протоколу USB для обработки хостом. ADC – это источник данных для хоста. Аналогично, хост отправляет цифровой аудиосигнал по протоколу USB на периферийное устройство, где цифро-аналоговый преобразователь (ЦАП) преобразует его и передает на аналоговый выходной терминал. ЦАП является приемником для хоста.

Каналы

Периферийное устройство с функцией аудио может включать терминал источника, терминал приемника или оба терминала. Для каждого направления может быть один канал (моно), два канала (стерео) или больше. Периферийные устройства с более чем двумя каналами называются многоканальными. Обычно стереопоток интерпретируется как состоящий из левого и правого каналов, а многоканальный поток – как имеющий пространственные местоположения, соответствующие каждому каналу. Однако также вполне допустимо (особенно для USB-аудио, а не HDMI) не назначать каждому каналу определенное стандартное пространственное значение. В этом случае приложение и пользователь сами определяют, как использовать каждый канал. Например, в четырехканальном входном потоке USB первые три канала могут быть подключены к разным микрофонам в помещении, а последний канал может принимать входные данные от AM-радио.

Изохронный режим передачи

Для передачи аудио по USB используется изохронный режим, который позволяет передавать данные в реальном времени, но не поддерживает восстановление после ошибок. В изохронном режиме гарантируется пропускная способность, а ошибки передачи данных обнаруживаются с помощью циклической избыточной проверки (CRC). Однако в случае ошибки подтверждение пакета или повторная передача не выполняются.

Изохронная передача данных происходит в начале каждого кадра. Период SOF составляет одну миллисекунду для полной скорости и 125 микросекунд для высокой скорости. Каждый полноскоростной фрейм содержит до 1023 байт полезной нагрузки, а высокоскоростной – до 1024 байт. Таким образом, максимальная скорость передачи данных составляет 1 023 000 или 8 192 000 байт в секунду. Это теоретическое ограничение на частоту дискретизации, количество каналов и разрядность. На практике это значение будет ниже.

В изохронном режиме есть три подрежима:

  • Адаптивный
  • Асинхронный код
  • Синхронная

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

В асинхронном подрежиме (также называемом неявной обратной связью) частоту дискретизации определяет приемник или источник, а хост подстраивается под нее. Основное теоретическое преимущество асинхронного подрежима заключается в том, что источник или приемник USB-частоты физически и электрически ближе к часам, которые управляют ЦАП или АЦП (и даже могут быть теми же самыми или производными от них). Такая близость означает, что асинхронный подрежим должен быть менее восприимчив к дрожанию тактового сигнала. Кроме того, часы, используемые ЦАП или АЦП, могут быть разработаны для более высокой точности и меньшего дрейфа, чем часы хоста.

В синхронном подрежиме в каждый период SOF передается фиксированное количество байтов. Частота дискретизации аудио зависит от тактовой частоты USB. Синхронный подрежим редко используется с аудио, поскольку и хост, и периферийное устройство зависят от тактовой частоты USB.

В таблице ниже приведены сведения об изохронных подрежимах.

Подрежим Количество байтов
на пакет
Частота дискретизации
определяется
Используется для аудио
адаптивный; переменная хост Да
асинхронно переменная периферийное устройство Да
синхронно исправлено USB-часы Нет

На практике подрежим, конечно, имеет значение, но следует учитывать и другие факторы.

Поддержка устройств класса USB Audio в Android

Режим разработчика

USB-аудио не поддерживается в режиме разработки.

Режим хоста

Android 5.0 (уровень API 21) и более поздние версии поддерживают следующие функции USB Audio Class 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 не является "бездрайверным".
  • Направление должно быть input относительно хоста.
  • Аудио должно быть в формате 16-битного PCM.
  • Частота дискретизации должна составлять 44,1 кГц.
  • Количество каналов должно быть равно двум (стерео).

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

Применение цифрового аудио через USB

Как следует из названия, цифровой аудиосигнал USB представлен цифровым потоком данных, а не аналоговым сигналом, который используется обычным разъемом для гарнитуры TRS mini. В конечном итоге любой цифровой сигнал должен быть преобразован в аналоговый, чтобы его можно было услышать. Выбор места для конверсии имеет свои преимущества и недостатки.

Два ЦАП

На диаграмме ниже сравниваются два дизайна. Сначала у нас есть мобильное устройство с процессором приложений (AP), встроенным ЦАП, усилителем и аналоговым разъемом TRS, подключенным к наушникам. Также мы учитываем мобильное устройство с USB, подключенное к внешнему USB-ЦАП и усилителю, а также к наушникам.

Сравнение DAC

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Как реализовать передачу аудио через USB

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

Чтобы периферийные аудиоустройства могли работать с устройствами Android, поставщикам необходимо:

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

Рекомендации для производителей оригинального оборудования и поставщиков процессоров для устройств Android

Чтобы поддерживать цифровой звук через USB, производители устройств и поставщики SoC должны:

  • проектировать оборудование с поддержкой режима хоста USB;
  • включить поддержку универсального хоста USB на уровне фреймворка с помощью флага функции android.hardware.usb.host.xml.
  • включить все необходимые функции ядра: режим хоста USB, USB-аудио, изохронный режим передачи данных;
  • следить за последними выпусками ядра и исправлениями; несмотря на благородную цель соответствия классам, существуют аудиопериферийные устройства с особенностями, и в последних версиях ядра есть обходные пути для таких особенностей.
  • включить правило "Аудио через USB", как описано ниже.
  • добавить audio.usb.default в PRODUCT_PACKAGES в файле device.mk;
  • проверять совместимость с распространенными USB-аудиоустройствами;

Как включить правило для аудио через USB

Чтобы включить аудио через USB, добавьте запись в файл конфигурации правил аудио. Обычно он находится в следующем разделе:

device/oem/codename/audio_policy.conf

Компонент пути "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/

HAL для передачи аудио через USB в значительной степени полагается на tinyalsa, описанную в разделе Аудиотерминология. Хотя передача аудио по USB основана на изохронных передачах, реализация ALSA абстрагирует этот процесс. Поэтому USB audio HAL и tinyalsa не нужно беспокоиться об этой части протокола USB.

Как проверить аудио через USB

Информацию о тестировании CTS для USB-аудио можно найти в статье USB Audio CTS Verifier Tests.