Linux USB Gadget UAC2 の現状覚え書き

Gadget
Photo by hyt.

Linux USB Gadget UAC2 の現状覚え書きです.

いつもの通り結論から書くと,Linux USB Gadget の UAC2 ですが,

  1. Windows もデフォルトでサポートするようになったみたい
  2. 複数のサンプリングレートの設定にも対応したみたい

です.

Linux USB Gadget UAC2 の設定

本記事で Linux USB Gadget UAC2 の細かな設定の仕方については取り扱いません.これについては以前の記事

Raspberry pi zero を USB to Bluetooth トランスミッターにする備忘録
Raspberry pi zero を USB to Bluetooth トランスミッターにする備忘録です. 前回記事で,Raspberry pi zero の Raspbian を LDAC,apt-X,AAC などの高音質なコーデックに...

をご覧ください.

Windows サポート

Linux USB Gadget 機能とは,Raspberry pi などの SBC をUSBメモリとか,キーボードなどの USB 機器として使えるって機能です.

この中でも特に UAC2 (Universal Audio Class 2)とは,Raspberry pi などの SBC を USB 2.0 対応の USB-DAC として使えるという機能なのですが,残念ながらつい最近まで Windows からは使えませんでした(Windows 以外の macOS などだと問題なく使える).

UAC2 gadget not recognized on Windows 10. · Issue #24 · linux-usb-gadgets/libusbgx
Using gadget-import (initial config retrieved via gadget-uac2 + gadget-export) to initialize a UAC2 audio device, but it...

このため,Windows でも使えるよう個人的に Linux カーネルのパッチを作成して対応していたのですが,これだとカーネルをコンパイルし直すなどの手間がかかり,カーネルのアップデートに追従するのがかなり面倒でした(だから放置したままだった).

Raspberry pi zero WH で作った LDAC 対応 USB to Bluetooth オーディオトランスミッターを Windows にも対応させる備忘録
Raspberry pi zero WH で作った LDAC 対応 USB to Bluetooth オーディオトランスミッターを Windows にも対応させる備忘録です. 2023年10月1日追記:Raspberry pi OS の最新...

しかし,どうも

最新の Raspberry pi OS だと,きちんと Windows からも UAC2 の USB-DAC として使えるようになったっぽい

です.記事執筆時点の Raspberry pi OS の最新安定版は,6.1.54-2 ですが,6.1 のどこかで修正が取り込まれたっぽいです.「ぽい」って書いたのは,どの時点でサポートされたのかがはっきりわからないからです.しかし実際に試してみると(私の持っている機器だと)きちんと動作します.

なお,6.1 系列にカーネルをアップデートしたい場合は,まず,現在実行中の Raspberry pi OS が bullseye 以降である必要があります.前バージョンの buster なら,

第4章 Debian 11 (bullseye) からのアップグレード
Raspberry Pi OS を buster から bullseye に dist-upgrade – matoken's meme

辺りを参考にアップデートしてください.また,アップデートするだけだと,kernel のバージョンは 5.19 系列のままなので,bullseye にしたあとに,

$ sudo rpi-update

しないといけません.

GitHub - Hexxeh/rpi-update: An easier way to update the firmware of your Raspberry Pi
An easier way to update the firmware of your Raspberry Pi - Hexxeh/rpi-update

複数サンプリングレートサポート

複数サンプリングレートの同時有効化もサポートされたっぽいです.

サンプリングレートとは,1秒間をどの程度に分割するのかという値で,一般的には,

  • 44100 (CD音質)
  • 48000 (DVD音質)
  • 88000
  • 96000
  • 176000
  • 192000
  • 384000

などの値が使われているみたい(96000 以上だとハイレゾって言うっぽい)ですが,以前の UAC2 だとこのうちの1つしか同時に有効化できなかったのが,最新のカーネルだと,複数同時に有効化できます.

実際に有効化するには,Linux USB Gadget の UAC2 を有効化するときに定義する値のうち,サンプリングレートを表す c_srate を

c_srate = 44100,48000,96000

のように定義すれば良いだけみたいです(上記は入力の場合,出力は p_srate)

この複数サンプリングレートのサポートもカーネル 6.1 系列のどこかの段階で取り込まれたことみたいですが,実際にどこで取り込まれたまでかは調べていません.

[v4,05/10] usb: gadget: f_uac2: Support multiple sampling rates - Patchwork

なお,複数サンプリングレートには対応しましたが,複数サンプリングサイズにはまだ未対応のようです.なお,サンプリングサイズは(入力の場合,出力は p_ssize),

  • 16bit の場合: c_ssize = 2
  • 24bit の場合: c_ssize = 3
  • 32bit の場合: c_ssize = 4

のように設定すればよいはずです.

以上!

Gadget
スポンサーリンク
Following hyt!
タイトルとURLをコピーしました