USBデジタルオーディオ

コレクションでコンテンツを整理 必要に応じて、コンテンツの保存と分類を行います。

この記事では、USB デジタル オーディオおよび関連する USB ベースのプロトコルに対する Android のサポートについて説明します。

観客

この記事の対象読者は、Android デバイスの OEM、SoC ベンダー、USB オーディオ周辺機器のサプライヤー、高度なオーディオ アプリケーション開発者、および Android の USB デジタル オーディオの内部構造を詳しく理解したいと考えているその他の方々です。

Nexus デバイスのエンド ユーザーは、 Nexus ヘルプ センターで記事「 USB ホスト モードを使用してオーディオを録音および再生する」を参照する必要があります。この記事はエンドユーザー向けではありませんが、特定のオーディオファンの消費者は興味のある部分を見つけるかもしれません.

USBの概要

ユニバーサル シリアル バス (USB) は、ウィキペディアの記事USBで非公式に説明されており、 USB インプリメンターズ フォーラムによって公開された標準によって正式に定義されています。便宜上、ここでは主要な USB の概念を要約しますが、規格は信頼できる参考資料です。

基本的な概念と用語

USB は、ホストと呼ばれるデータ転送操作の単一のイニシエーターを持つバスです。ホストは、バスを介して周辺機器と通信します。

注:デバイスアクセサリという用語は、周辺機器の一般的な同義語です。これらの用語は、Androidデバイスまたはアクセサリ モードと呼ばれる Android 固有の概念と混同される可能性があるため、ここでは避けます。

重要なホストの役割は列挙です。これは、バスに接続されている周辺機器を検出し、記述子を介して表現されたそれらのプロパティを照会するプロセスです。

ペリフェラルは 1 つの物理オブジェクトである場合がありますが、実際には複数の論理機能を実装しています。たとえば、Web カメラ周辺機器は、カメラ機能とマイク オーディオ機能の両方を備えている場合があります。

各周辺機能には、その機能と通信するためのプロトコルを定義するインターフェイスがあります。

ホストは、周辺機器の機能の 1 つによって提供されるデータ ソースまたはシンクであるエンドポイントへのパイプを介して、周辺機器と通信します。

パイプには、メッセージストリームの 2 種類があります。メッセージ パイプは、双方向の制御とステータスに使用されます。ストリーム パイプは、単方向のデータ転送に使用されます。

ホストはすべてのデータ転送を開始するため、入力出力という用語はホストに関連して表現されます。入力操作はペリフェラルからホストにデータを転送し、出力操作はホストからペリフェラルにデータを転送します。

主要なデータ転送モードには、 interruptbulk 、およびisochronousの 3 つがあります。アイソクロナス モードについては、オーディオのコンテキストでさらに説明します。

周辺機器には、周辺機器自体を超えて外界に接続する端子がある場合があります。このように、ペリフェラルは USB プロトコルと「実際の」信号との間の変換を行います。端子は関数の論理オブジェクトです。

Android USB モード

開発モード

開発モードは、Android の最初のリリースから存在しています。 Android デバイスは、Linux、Mac OS X、または Windows などのデスクトップ オペレーティング システムを実行しているホスト PC には USB 周辺機器として表示されます。目に見える唯一の周辺機能は、 Android fastbootまたはAndroid Debug Bridge (adb)のいずれかです。 fastboot および adb プロトコルは、USB バルク データ転送モードを介して階層化されます。

ホストモード

ホスト モードは、Android 3.1 (API レベル 12) で導入されました。

Android デバイスはホストとして機能する必要があり、ほとんどの Android デバイスにはホスト操作を直接許可しないマイクロ USB コネクタが含まれているため、通常は次のようなオンザゴー ( OTG ) アダプターが必要です。

OTG

図 1. On-the-Go (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) の 2 つのエディションがあります。

他クラスとの比較

USB には他にも多くのデバイス クラスが含まれており、そのうちのいくつかはオーディオ クラスと混同される可能性があります。マス ストレージ クラス(MSC) はメディアへのセクター指向のアクセスに使用され、メディア転送プロトコル(MTP) はメディアへのフル ファイル アクセスに使用されます。オーディオ ファイルの転送には MSC と MTP の両方を使用できますが、リアルタイム ストリーミングに適しているのは USB オーディオ クラスのみです。

オーディオ端子

オーディオ周辺機器の端子は通常、アナログです。周辺機器の入力端子に供給されるアナログ信号は、 Analog-to-Digital Converter (ADC) によってデジタルに変換され、USB プロトコルを介して運ばれ、ホストによって消費されます。 ADC は、ホストのデータソースです。同様に、ホストは USB プロトコルを介してデジタル オーディオ信号をペリフェラルに送信し、そこでデジタル/アナログ コンバータ(DAC) が変換してアナログ出力端子に出力します。 DAC はホストのシンクです。

チャンネル

オーディオ機能を備えた周辺機器には、ソース端子、シンク端子、またはその両方を含めることができます。各方向には、1 つのチャネル (モノラル)、2 つのチャネル (ステレオ)、またはそれ以上のチャネルがあります。 2 つ以上のチャネルを持つ周辺機器は、マルチチャネル と呼ばれます。ステレオ ストリームを左右のチャネルで構成されていると解釈し、拡張してマルチチャネル ストリームを各チャネルに対応する空間位置を持つと解釈するのが一般的です。ただし、各チャネルに特定の標準的な空間的意味を割り当てないことも非常に適切です (特に USB オーディオの場合はHDMIよりもそうです)。この場合、各チャネルの使用方法を定義するのはアプリケーションとユーザー次第です。たとえば、4 チャネルの USB 入力ストリームでは、最初の 3 つのチャネルが室内のさまざまなマイクに接続され、最後のチャネルが AM ラジオからの入力を受信する場合があります。

アイソクロナス転送モード

USB オーディオは、エラー回復を犠牲にして、そのリアルタイム特性のためにアイソクロナス転送モードを使用します。アイソクロナス モードでは、帯域幅が保証され、Cyclic Redundancy Check (CRC) を使用してデータ伝送エラーが検出されます。ただし、エラーが発生した場合、パケットの確認応答や再送信はありません。

アイソクロナス送信は、フレーム開始 (SOF) 期間ごとに発生します。 SOF 期間は、フルスピードで 1 ミリ秒、ハイスピードで 125 マイクロ秒です。各フルスピード フレームは最大 1023 バイトのペイロードを伝送し、高速フレームは最大 1024 バイトを伝送します。これらを合計すると、最大転送速度は 1,023,000 または 8,192,000 バイト/秒と計算されます。これにより、オーディオ サンプル レート、チャンネル数、およびビット深度の組み合わせに理論上の上限が設定されます。実際の限界はもっと低いです。

アイソクロナス モードには、次の 3 つのサブモードがあります。

  • アダプティブ
  • 非同期
  • 同期

アダプティブ サブモードでは、ペリフェラル シンクまたはソースがホストの変動する可能性のあるサンプル レートに適応します。

非同期 (暗黙的フィードバックとも呼ばれる) サブモードでは、シンクまたはソースがサンプル レートを決定し、ホストが対応します。非同期サブモードの主な理論上の利点は、ソースまたはシンクの USB クロックが物理的および電気的に DAC または ADC を駆動するクロックに近い (実際には同じか、または派生している可能性がある) ことです。この近接性は、非同期サブモードがクロック ジッターの影響を受けにくいことを意味します。さらに、DAC または ADC で使用されるクロックは、ホスト クロックよりも高精度で低ドリフトになるように設計されている場合があります。

同期サブモードでは、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 kHz のいずれかでなければなりません
  • チャンネル数は 1 (モノラル) または 2 (ステレオ) でなければなりません

Android フレームワークのソース コードを精査すると、これらの機能をサポートするために最低限必要なコード以外のコードが表示される場合があります。ただし、このコードは検証されていないため、より高度な機能はまだ要求されていません。

アクセサリーモード

Android 4.1 (API レベル 16) では、オーディオ再生の制限付きサポートがホストに追加されました。アクセサリ モードでは、Android は自動的にオーディオ出力を USB にルーティングします。つまり、Android デバイスは、ドックなどのホストへのデータ ソースとして機能します。

アクセサリ モード オーディオには次の機能があります。

  • Android デバイスは、最初に Android デバイスを開発モードからアクセサリ モードに移行できる知識のあるホストによって制御される必要があります。次に、ホストは適切なエンドポイントからオーディオ データを転送する必要があります。したがって、Android デバイスはホストからは「ドライバーレス」に見えません。
  • 方向は、ホストに対して相対的に表現された入力でなければなりません
  • オーディオ形式は 16 ビット PCM である必要があります
  • サンプルレートは 44.1 kHz でなければなりません
  • チャンネル数は 2 (ステレオ) でなければなりません

アクセサリ モード オーディオは広く採用されておらず、現在、新しい設計には推奨されていません。

USBデジタルオーディオの応用

名前が示すように、USB デジタル オーディオ信号は、一般的な TRS ミニヘッドセット コネクタで使用されるアナログ信号ではなく、デジタルデータ ストリームによって表されます。最終的には、デジタル信号を聞く前にアナログに変換する必要があります。その変換を配置する場所の選択にはトレードオフがあります。

2 つの DAC の物語

以下の例の図では、2 つの設計を比較しています。まず、アプリケーション プロセッサ (AP)、オンボード DAC、アンプ、およびヘッドフォンに接続されたアナログ TRS コネクタを備えたモバイル デバイスがあります。また、外部 USB DAC とアンプに接続された USB を備えたモバイル デバイスと、ヘッドフォンを備えたモバイル デバイスも検討します。

DAC比較

図 3. 2 つの DAC の比較

どちらのデザインが良いですか?答えはニーズによって異なります。それぞれに長所と短所があります。

注:実際の Android デバイスではおそらく両方のオプションが利用可能であるため、これは人為的な比較です。

最初の設計 A は、より単純で、安価で、消費電力が少なく、他の点ではコンポーネントの信頼性が同等であると仮定すると、より信頼性の高い設計になります。ただし、通常、オーディオ品質とその他の要件のトレードオフがあります。たとえば、これがマスマーケット向けのデバイスである場合、オーディオマニア向けではなく、一般消費者のニーズに合わせて設計されている可能性があります。

2 番目の設計では、外部オーディオ周辺機器 C を設計して、基本的な大衆市場の Android デバイス B のコストに影響を与えることなく、より高いオーディオ品質とより大きな電力出力を実現できます。はい、より高価な設計ですが、コストは欲しい人。

モバイル デバイスは、高密度の回路基板を使用することで有名であり、隣接するアナログ信号を劣化させるクロストークの機会が増える可能性があります。デジタル通信はノイズの影響を受けにくいため、DAC を Android デバイス A から外部回路基板 C に移動することで、最終的なアナログ ステージを高密度でノイズの多い回路基板から物理的および電気的に分離できるため、忠実度の高いオーディオが得られます。

一方、2 番目の設計はより複雑であり、複雑さが増すと失敗する機会が増えます。また、USB コントローラーからの追加の遅延もあります。

ホスト モード アプリケーション

一般的な USB ホスト モードのオーディオ アプリケーションには、次のようなものがあります。

  • 音楽鑑賞
  • 電話
  • インスタント メッセージとボイス チャット
  • 録音

これらすべてのアプリケーションについて、Android は互換性のある USB デジタル オーディオ周辺機器を検出し、オーディオ ポリシー ルールに基づいてオーディオの再生とキャプチャを適切にルーティングします。ステレオ コンテンツは、周辺機器の最初の 2 つのチャネルで再生されます。

USB デジタル オーディオに固有の API はありません。高度な使用法では、自動ルーティングが USB 対応のアプリケーションに干渉する場合があります。このようなアプリケーションの場合は、 [設定] / [開発者向けオプション]の [メディア] セクションにある対応するコントロールを介して自動ルーティングを無効にします。

ホスト モードでのデバッグ

USB ホスト モードでは、USB 経由の adb デバッグは使用できません。別の方法については、「 Android Debug Bridgeワイヤレス使用」セクションを参照してください。

USB オーディオの実装

オーディオ周辺機器ベンダーへの推奨事項

Android デバイスと相互運用するために、オーディオ周辺機器ベンダーは次のことを行う必要があります。

  • オーディオ クラスに準拠するための設計。現在、Android はクラス 1 をターゲットにしていますが、クラス 2 を計画するのが賢明です
  • を避ける
  • リファレンスおよび一般的な Android デバイスとの相互運用性のテスト
  • 消費者が十分な情報に基づいて決定できるように、サポートされている機能、オーディオ クラスのコンプライアンス、電力要件などを明確に文書化します。

Android デバイス OEM および SoC ベンダー向けの推奨事項

USB デジタル オーディオをサポートするには、デバイス OEM と SoC ベンダーは次のことを行う必要があります。

  • USB ホスト モードをサポートするハードウェアを設計する
  • android.hardware.usb.host.xml機能フラグを使用して、フレームワーク レベルで汎用 USB ホスト サポートを有効にします。
  • 必要なすべてのカーネル機能を有効にします: USB ホスト モード、USB オーディオ、アイソクロナス転送モード。 Android カーネル構成を参照してください
  • 最近のカーネル リリースとパッチを最新の状態に保ちます。クラス準拠という崇高な目標にもかかわらず、のあるオーディオ周辺機器が現存しており、最近のカーネルにはそのような癖に対する回避策があります。
  • 以下の説明に従って、USB オーディオ ポリシーを有効にします。
  • device.mk の PRODUCT_PACKAGES に audio.usb.default を追加します。
  • 一般的な USB オーディオ周辺機器との相互運用性のテスト

USB オーディオ ポリシーを有効にする方法

USB オーディオを有効にするには、オーディオ ポリシー構成ファイルにエントリを追加します。これは通常、次の場所にあります。

device/oem/codename/audio_policy.conf

パス名コンポーネント「oem」は Android デバイスを製造する OEM の名前に置き換え、「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
      }
    }
  }
  ...
}

ソースコード

USB オーディオ用のオーディオ ハードウェア アブストラクション レイヤー (HAL) の実装は、次の場所にあります。

hardware/libhardware/modules/usbaudio/

USB オーディオ HAL は、オーディオ用語で説明されているtinyalsaに大きく依存しています。 USB オーディオはアイソクロナス転送に依存していますが、これは ALSA 実装によって抽象化されています。したがって、USB オーディオ HAL と tinyalsa は、USB プロトコルのこの部分に関与する必要はありません。

USB オーディオのテスト

USB オーディオの CTS テストについては、「 USB オーディオ CTS 検証ツール テスト」を参照してください。