Select Your Language

免責事項

  • 本サイトの情報の利用、内容、サービスによって、利用者にいかなる損害、被害が生じても、著者は一切の責任を負いません。ユーザーご自身の責任においてご利用いただきますようお願いいたします。

    本サイトで頒布している基板およびキットは、技術者、またはそれに準ずる電気的知識をお持ちの電子工作ファンの方のためのものです。一般のオーディオファンの方のためのものではありません。
    また、頒布基板およびキットは、いかなる条件でも動作を保証するものではございませんので、あらかじめご了承ください。

    電子工作では、火傷、感電、火災などの可能性があります。十分に注意をして作業して下さい。

    営利目的のご使用は認めておりません。 記事の転載や、基板・キットの商用利用の方は、ご連絡ください。学生やサークルの学習目的でまとめてご購入する場合は特別価格でご提供させていただきます。

スポンサー

無料ブログはココログ

« 平面磁界駆動型のヘッドホン(2)HIFIMAN Arya | トップページ | ラズパイをUSB-DACとしてSoundgenic-NAS、Linuxに認識させる方法 gadget mode(USB Audio Class 2.0) »

2020年9月22日 (火)

ラズパイをUSB-DACとしてWindows10に認識させる方法 gadget mode(OTG Mode)

実は、RaspberryPi ZEROの頃から、ラズパイのUSBをパソコンにつなげると、USB経由のEthernetや、シリアルポートして認識するgadget mode(OTG Mode)というのがありました。詳しくはこちら。

当時、私も試してみたのですが、Windows7とは相性が悪くEthernetもシリアルも認識しなくて諦めていました。

Gadget01
 < USBケーブル1本でOK、Pi4がUSB-DACになる? >

最近になって知ったのですが、ラズパイ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で音を出すどころか認識さえ上手く出来ませんでした。

Gadget03

行けたじゃん! と思ったのですが。。。

Gadget04

これは、一筋縄では行きませんね。。。

Usbview

解析も大変ですし。。。全ディスクリプタは以下です。

UAC2.0_device_descriptor.txt

 

 

 

という訳で、こちら(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へ接続します。

Gadget05

起動すると、こんなメッセージが出ますが気にしません。まだデバイスディスクリプタなど返信をしていないからです。とりあえずWindowsがラズパイ4のOTGモードを認識したというメッセージです。

 

再びSSH接続します

ssh接続は上の方法と一緒です。接続後、先ほど作ったスクリプトを実行します。

sudo ./uac1_gadget.sh

そうすると、初めてUSB-AUDIOデバイスが認識されます。(Windowsの画面にポップアップが出ますが、キャプチャ逃しました。)

これで音がでるのかと思ったのですが、まだです。

 

alsaloop

実は、Windows10から見えているUSB-DACはラズパイの中のAlsaのキャプチャデバイスなのです。(図中のAlsa REC)

Gadget02

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が繋がっているようになります。

Gadget06

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)で認識できることは確認済みですのですので近いうちにまとめます。

 

続きはこちら

 

にほんブログ村 PC家電ブログ PCオーディオへ にほんブログ村

ブログランキングに参加中です。 めざせ1位! 

もしよろしければ「ぽちっと」お願いします。 

« 平面磁界駆動型のヘッドホン(2)HIFIMAN Arya | トップページ | ラズパイをUSB-DACとしてSoundgenic-NAS、Linuxに認識させる方法 gadget mode(USB Audio Class 2.0) »

PCオーディオ」カテゴリの記事

Raspberry Pi」カテゴリの記事

SB32+PRO DoP」カテゴリの記事

コメント

たかじんさん

私にとってタイムリーな情報をありがとうございます。

私も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さん

UPBoardなんていうボードがあるんですね。知りませんでした。
ネットワークを介して負荷分散しながら再生する環境は、非常に凝ったSystemだと思います。ただ、敷居が高く手軽ではないですね。

よりシンプルに、そして高音質に再生できる環境が作れるのであればその方が良いような気がしています。

Amazon Music HDを有効活用する究極の形は1BOXタイプなのでしょうけども、USBケーブル1本でつなぐ2BOXでも十分シンプルですね。iPhone本体のハイレゾ化、iTunseのハイレゾ化が望まれて久しいですが、Appleの中での優先順位は低いっぽいです。。。

たかじんさん

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 さん

>(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そのものの仕様が気になるということで。

たかじんさん

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 さん

それは凄いです。
aarch64 は、セルフでビルドできるようになったのでしょうか。Sabreberry32ドライバはメールを頂ければソースコードをお渡しできます。
ドライバのコンパイルの方法は、以下の方法で行けると思います。
https://nw-electric.way-nifty.com/blog/2016/03/sabreberry32sab.html

場合によってはkernel buildをする必要があるのですが、既にUAC2対応でやられているので問題ないと思います。

コメントを書く

(ウェブ上には掲載しません)

« 平面磁界駆動型のヘッドホン(2)HIFIMAN Arya | トップページ | ラズパイをUSB-DACとしてSoundgenic-NAS、Linuxに認識させる方法 gadget mode(USB Audio Class 2.0) »

サイト内検索

Sponsors link

2020年10月
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31