ラズパイをUSB-DACとしてWindows10に認識させる方法 gadget mode(OTG Mode)
実は、RaspberryPi ZEROの頃から、ラズパイのUSBをパソコンにつなげると、USB経由のEthernetや、シリアルポートして認識するgadget mode(OTG Mode)というのがありました。詳しくはこちら。
当時、私も試してみたのですが、Windows7とは相性が悪くEthernetもシリアルも認識しなくて諦めていました。
最近になって知ったのですが、ラズパイ4に電源を入力するUSB type-Cポートがこのgadget modeに対応しているとのこと。早速試してみました。もちろんUSB-Audioデバイスとして認識させることが出来る「g_audio」での挑戦です。成功すれば、上の図のようにUSBケーブル1本でラズパイをUSB-DAC代わりに使うことが出来るようになります。
その前に基礎的なお話ですが、USB Audioには大きく2つのバージョンが存在しています。
USB1.1、USB2.0、USB3.0、USB3.1などUSBのバージョンとは異なります。
デバイスクラスというもので、
USB Audio Class 1.0 とUSB Audio Class 2.0 です。Usb.org本家の説明はこちら
略してUAC1.0とUAC2.0と書くこともあります。
UAC2.0は簡単に言うとハイレゾ対応&USB-DAC側をマスタークロックにできるアシンクロナス転送対応したものでUSB2.0以降で使用することが出来ますが、Windowsでは積極的に採用しておらず、Win10の途中から対応し始めました。当然、win8やvista,win7では対応していません。(UAC2ドライバが標準搭載していなくても、各メーカーのUSB-DAC専用ドライバを入れればアシンクロナス転送+ハイレゾ再生が可能です。)
macOSやLinuxでは結構早い時点で対応していたようです。そして、ラズパイのgadget Modeでちゃんと音が出るそうです。
さて、問題は、Win10での実装が完全じゃないというところ。
ラズパイ4のg_audioモードは、UAC2で音を出すどころか認識さえ上手く出来ませんでした。
行けたじゃん! と思ったのですが。。。
これは、一筋縄では行きませんね。。。
解析も大変ですし。。。全ディスクリプタは以下です。
という訳で、こちら(48kHzで認識)や、こちら(ps4問題)、こちら(i2s-dac)、こちら(Multifunction)など参考しにて、あれこれ試して、ちゃんと音が出るようになりましたので、備忘録として残しておこうと思います。
UAC2.0はWindows10問題、ラズパイ側にもバグがあって認識できないので、UAC1.0を使います。
SDカードの準備
OSは、2020-08-20-raspios-buster-armhf-lite です。現時点で最新版の公式OSです。
Etcherを使ってSDカードにデータを焼いたあと、/bootフォルダに ssh という空ファイルを置きます。
SSH接続
SDカードをラズパイ4に挿して、普通にUSB電源から供給して起動します。起動したらEthernet経由でssh接続します。PCのUSBポートに挿すのは、もう少し後のお楽しみ。
ホスト= raspberrypi.local
ユーザ名 = pi
パスフレーズ = raspberry
です。
/boot/config.txt 編集
sudo nano /boot/config.txt でファイルを開いて、下記を追記します。※SB32+PRO DoPの場合で書いてます。
dtparam=i2c_arm=on
dtparam=i2s=on
dtoverlay=hifiberry-dacplus <- 適時必要なドライバに変更してください。
dtoverlay=dwc2
[pi4]と書いてある行の上側に記述しておきます。
また、
#dtparam=audio=on コメントアウトしておきます。(先頭に#を追記)
ついでに、Pi4の供給電力がすさまじいので、PCのUSBポートの電流を減らすために下記を追記しておきます。(先頭の#を取って「700」を「800」に変更)
arm_freq=800
強制的にCPUクロックを800MHzに落としています。
ctrl+o エンター で保存。ctrl+x エンター で終了します。
/etc/modules 編集
sudo nano /etc/modules でファイルを開いて下記を追記します。
dwc2
libcomposite
以上の2行を追記したら、ctrl+o エンターで保存。ctrl+x エンター で終了します。
UAC1.0で認識させるスクリプト作成 44.1kHz編
多くのソースが44.1kHzですから、できるだけサンプリングレート変換しない44.1kHzにしたいと思います。
sudo nano uac1_gadget.sh でファイルを新規作成。下記の青文字部を追記します。
#!/bin/bash
cd /sys/kernel/config/usb_gadget/
mkdir -p audio
cd audio
echo 0x0104 > idProduct # Multifunction Composite Gadget
echo 0x1d6b > idVendor # Linux Foundation
echo 0x0100 > bcdDevice # v1.0.0
echo 0x0200 > bcdUSB # USB2
mkdir strings/0x409
echo "000000000" > strings/0x409/serialnumber
echo "Linux Foundation" > strings/0x409/manufacturer
echo "Linux USB Audio Gadget" > strings/0x409/product
mkdir -p configs/c.1/strings/0x409
echo "Audio Gadget" > configs/c.1/strings/0x409/configuration
echo 250 > configs/c.1/MaxPower
N="uac1.usb0"
mkdir -p functions/$N
echo 3 > functions/$N/c_chmask
echo 44100 > functions/$N/c_srate
echo 2 > functions/$N/c_ssize
echo 3 > functions/$N/p_chmask
echo 44100 > functions/$N/p_srate
echo 2 > functions/$N/p_ssize
echo 2 > functions/$N/req_number
ln -s functions/$N configs/c.1
ls /sys/class/udc > UDC
ここまで。ctrl+o エンター で保存。ctrl+x エンター で終了します。
このスクリプトに実行権限を与えます。
sudo chmod +x uac1_gadget.sh
いざ、PCに挿して起動
sudo poweroff で一度電源を落として、今度はUSBケーブルをPCからPi4へ接続します。
起動すると、こんなメッセージが出ますが気にしません。まだデバイスディスクリプタなど返信をしていないからです。とりあえずWindowsがラズパイ4のOTGモードを認識したというメッセージです。
再びSSH接続します
ssh接続は上の方法と一緒です。接続後、先ほど作ったスクリプトを実行します。
sudo ./uac1_gadget.sh
そうすると、初めてUSB-AUDIOデバイスが認識されます。(Windowsの画面にポップアップが出ますが、キャプチャ逃しました。)
これで音がでるのかと思ったのですが、まだです。
alsaloop
実は、Windows10から見えているUSB-DACはラズパイの中のAlsaのキャプチャデバイスなのです。(図中のAlsa REC)
Raspberry上で aplay -L コマンド、 arecord -L コマンドで認識しているALSAデバイスを確認することが出来ます。
ここで arecord -v -D hw:UAC1Gadget -c2 -r 44100 -f S16_LE -t wav -V stereo /tmp/rec.wav なんてことするとwin側から出力した音声を録音出来ちゃったりするらしいです。
脱線してしまいましたが、Alsa RECを Alsa Play(再生デバイス)へと接続してあげるのがalsaloopです。(下記コマンドは1行です)
alsaloop -C hw:CARD=UAC1Gadget,DEV=0 -P hw:CARD=sndrpihifiberry,DEV=0 --rate=44100 -S 0
キャプチャーデバイスは arecord -L、再生デバイスは aplay -L で表示されるサウンドカードのデバイス名を使います。hw:CARD***というのが素のハードウェアにアクセスするデバイス名ですので、これを使います。I2S-DACドライバが違う場合はデバイス名も違っているはずです。
これで、音が出るようになります。Windowsからは44.1kHz 16bitのUSB-DACが繋がっているようになります。
foober2000のWASAPIモードで44.1k/16bit出力。フォーマットが異なるとエラーで再生できなくなるのでちゃんと動作していることが証明できます。
自動起動
さて、ここまで確認できたらUSBケーブルを挿すだけで自動認識するようにしておきましょう。
sudo nano /etc/rc.local でファイルを編集
sleep 10
/home/pi/uac1_gadget.sh
sleep 3
alsaloop -C hw:CARD=UAC1Gadget,DEV=0 -P hw:CARD=sndrpihifiberry,DEV=0 --rate=44100 -S 0
を exit 0 の前に追記します。
ctrl+o エンター で保存。ctrl+x エンター で終了します。
sudo poweroff で電源を切ります。
これで、次からPi4のUSB type-CポートからPCにUSBケーブルを挿すだけでUSB-DACとして機能するようになります。
めでたしめでたし。
電源OFF
電源OFFは、本当はちゃんとシャットダウンしたいところですが、ブチっとUSBケーブルを抜いてます(笑)
GPIOにボタンでも増設してボタンを押したらシャットダウンするようにしておくと安心かもしれないですね。まあ、設定項目がそんなに多くないので、SDカードが壊れて起動できなくなったら、また同じ作業をすればよいだけです。
ちなみに、96kHzや192kHzで認識しないか試しているのですが今のところ上手くいってません。24bit/32bitも同様。知っている方がいらしたらご教授願います。多くの音楽ソースは44.1kHzではあるのですが、USB-DACとしてはハイレゾ対応の方が良いですからね。
LinuxやmacOSで認識するUAC2.0の設定方法は、もっと簡単です。Linuxマシン?(Soundgenic NAS)で認識できることは確認済みですのですので近いうちにまとめます。
にほんブログ村
ブログランキングに参加中です。 めざせ1位!
もしよろしければ「ぽちっと」お願いします。
« 平面磁界駆動型のヘッドホン(2)HIFIMAN Arya | トップページ | ラズパイをUSB-DACとしてSoundgenic-NAS、Linuxに認識させる方法 gadget mode(USB Audio Class 2.0) »
「PCオーディオ」カテゴリの記事
- RaspberryPi Pico USB-DDC化 I2SとMSBファースト後詰め出力対応(2022.03.21)
- RaspberryPi Pico USB-DDC化? I2S出力調査(2022.03.20)
- efuさんのWaveSpectraが公開停止していた(2022.03.09)
- ラズパイをUSB-DACとしてスマホに認識させる方法 gadget mode(USB Audio Class 2.0)(2020.10.16)
- PCに組み込むヘッドホンアンプ Sound RABBIT & 900万PVありがとう企画(2020.10.10)
「Raspberry Pi」カテゴリの記事
- MotionEyeと余っているラズパイで監視カメラ(2024.11.21)
- 秋の夜長にはRaspberryPi5 RT-linux セルフビルド(2024.10.13)
- 秋の夜長にはRaspberryPi5 64bit版 Sabreberry32 ドライバコンパイル(2024.10.10)
- RaspberryPi 5 の公式OSは32bit版でも64bit?(2024.10.09)
- 秋の夜長にはRaspberry Pi5 64bit カーネル・セフル・ビルド (2024.10.07)
「SB32+PRO DoP」カテゴリの記事
- SB32+PRO DoP リペア(2024.11.09)
- ラズパイオーディオお手軽インストーラー[MUTE](2022.07.08)
- ラズパイをUSB-DACとしてスマホに認識させる方法 gadget mode(USB Audio Class 2.0)(2020.10.16)
- ラズパイをUSB-DACとしてSoundgenic-NAS、Linuxに認識させる方法 gadget mode(USB Audio Class 2.0)(2020.09.24)
- ラズパイをUSB-DACとしてWindows10に認識させる方法 gadget mode(OTG Mode)(2020.09.22)
コメント
« 平面磁界駆動型のヘッドホン(2)HIFIMAN Arya | トップページ | ラズパイをUSB-DACとしてSoundgenic-NAS、Linuxに認識させる方法 gadget mode(USB Audio Class 2.0) »
たかじんさん
私にとってタイムリーな情報をありがとうございます。
私もRapberryPiでUAC2.0を有効にしようと、この方の方法(https://mzyy94.com/blog/2020/04/17/nintendo-switch-audio-uac-gadget/)で実施していましたが挫折していたところです。
現在は、Amazon Music HDを何とか高音質で聞きたいがために、RapberryPiを諦めてUPBoardに変えてHQPlayerEmbedded(HQPe)を導入して、HQPeに組み込まれているUAC2.0機能を使っています。
機器構成は下記のとおりです。
iPhone(Amazon Music HD) →(UAC2.0)→ UPBoard(HQPe) → Pi4(NAA)+Sabreberry+
とかく「Amazon Music HDはライブラリーは多いが音質が?」と言われますが、Amazon Music HDはソースを提供するだけで、音質は構成する機器と再生ソフトで決まるように思います。
上記の構成ですと音質はHQPlayer+Sabreberryそのものだと思っています。また、iPhoneをPCに変えてPCのUAC2.0のプロパティーを変更すると最大384kHz/24bitが再生できます。
Amazon Music HDをUAC2.0→パパリウスさんのrtAlsa→SabreBerry32またはSB32+PRO DoPで聞けるようになれば、「NASも要らない、ネットワークも要らない(携帯があれば...)、音質が良い」で最高なんですけどと期待妄想しています。
投稿: minuree | 2020年9月24日 (木) 13時44分
minureeさん
UPBoardなんていうボードがあるんですね。知りませんでした。
ネットワークを介して負荷分散しながら再生する環境は、非常に凝ったSystemだと思います。ただ、敷居が高く手軽ではないですね。
よりシンプルに、そして高音質に再生できる環境が作れるのであればその方が良いような気がしています。
Amazon Music HDを有効活用する究極の形は1BOXタイプなのでしょうけども、USBケーブル1本でつなぐ2BOXでも十分シンプルですね。iPhone本体のハイレゾ化、iTunseのハイレゾ化が望まれて久しいですが、Appleの中での優先順位は低いっぽいです。。。
投稿: たかじん | 2020年9月25日 (金) 01時11分
たかじんさん
raspberrypiのUAC2.0をWindowsに対応させるのは困難なようです。この方(https://www.labohyt.net/blog/microsoft/post-4979/)の様にusb_f_uac2.koの改変が必要なようです。コンパイルに際したかじんさんの手法を引用されておられました。世の中、巡ってますね?
>Amazon Music HDを有効活用する究極の形は1BOXタイプなのでしょう
その内発売されるでしょうが、DAC込みの形態になるでしょうから高額で好みのDACが使用できないのではと思っています。
拙宅では主にAmazon Music HDをWindowsPC→UAC2.0→HQPeで聴く時間が殆どになり、NASライブラリーを聴くこともなくなりました。
iPhoneも96kHz/24bitで出力可能であるのでドライブ時に車の中でもAmazon Music HDを聴いています。RasPiがUAC2.0の受信に使えるようになれば応用範囲も広がるかなと思っていますが、残念ながら皆さんUAC2.0には興味無い様で中々情報もありません。
投稿: minuree | 2020年9月25日 (金) 18時00分
minuree さん
>(https://www.labohyt.net/blog/microsoft/post-4979/)の様にusb_f_uac2.koの改変
おおぉ。 ドライバを改変してUAC2でwin10に認識させているんですね。
改変パッチソースを読んだら、
- .bmAttributes = USB_ENDPOINT_XFER_ISOC | USB_ENDPOINT_SYNC_ASYNC,
+ .bmAttributes = USB_ENDPOINT_XFER_ISOC | USB_ENDPOINT_SYNC_ADAPTIVE,
と、少し残念な改変かもしれないですね。
UAC1とUAC2の決定的な差は、転送の同期方法(Adaptive/Asynchronous)にあると、私は思っています。
Asynchronousが、USBデバイス側のクロックをマスターに使って、ホスト側で送り出し量の調整をしてもらうタイプです。上記パッチはUAC2ながらAdaptiveにしてしまうという改変に見えますね。
Pi4 gadget mode でUAC2設定時のディスクリプタ情報は下記のようになっています。
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x01 EP 1 OUT
bmAttributes 5
Transfer Type Isochronous
Synch Type Asynchronous
Usage Type Data
wMaxPacketSize 0x0300 1x 768 bytes
bInterval 4
Windowsでは、UAC-DAC付録の専用ドライバを入れることが前提になっていて、UAC1とUAC2の違いはみんな気にしていないのかもしれないですね。それよりもUSB-DACそのものの仕様が気になるということで。
投稿: たかじん | 2020年9月26日 (土) 08時52分
たかじんさん
Amazon Music HDをUAC2.0伝送でRasPi+i2sDacで聴くの続報です。
前回報告したの通り、usb_f_uac2.koの改変することによりUAC2.0でWindowsPCと通信出来るようになりました。
出来たシステムは
Raspberry Pi4 5.4.68-v8+ aarch64 です。
Amazon Music HDをインストールしたWindowsPCにPi4(+Sabreberry)を接続して立ち上げるとPC側で認識され、サンプリングレートが異なるAmazon Music HDの曲がPiで設定変更することなくノイズ感無く聴くことが出来ました。
また、DC-ArrowまたはモバイルバッテリーからPi4に電源を供給してUSB TypeC端子にiPhoneを接続してもAmazon Music HDを聴くこともできました。
音質はそれなりに良いと感じています。
今後は
①余計なモジュール等を削って軽量なシステムにする。
②Sabreberry32のドライバーを入れる。(たかじんさんご指導をお願いいたします。)
③donuts.shop73さんのsmpdplayerにncatで接続する。
が目標です。③についてはSMPDフォーラムでお聞きしようと思っています。
投稿: minuree | 2020年9月30日 (水) 17時02分
minuree さん
それは凄いです。
aarch64 は、セルフでビルドできるようになったのでしょうか。Sabreberry32ドライバはメールを頂ければソースコードをお渡しできます。
ドライバのコンパイルの方法は、以下の方法で行けると思います。
https://nw-electric.way-nifty.com/blog/2016/03/sabreberry32sab.html
場合によってはkernel buildをする必要があるのですが、既にUAC2対応でやられているので問題ないと思います。
投稿: たかじん | 2020年10月 1日 (木) 21時28分