告知です.
コミケ99にて当社のDDC/DACを頒布いたします.
日付 2021年12月31日(金) 東地区 テ-40b 東5ホール
サークル名 bangflat
コミケにお越しの際はお立ち寄りいただけますとありがたいです.
商品紹介ページを作りました.
ーーーー
STM32でDCCを作ろう! INDEXページへHOSTがstreamを送って来るレートが早すぎて困っている.feedbackを実装しないとうまく動かないみたい.
ここでLinux/windowのUAC2デバドラの挙動違いを指摘しておく.
Linux: descriptorからfeedback EPを除外しても気にしないみたい
Win10: descriptorからfeedback Epを除外するとデバドラが停止する
やっぱ作法にうるさいなぁwin10はよ.
feedbackを実装するためにfeedbackの仕様をUSB2.0規格から調べた.理解できたように思ふ.
基本的に英訳の引用だけど英文和訳だとよく判らないのでひら意訳を多く含む.
【5.12.4.2 feedback】
非同期転送モードにおいて、HOSTが送って来るaudio streamのレートを適切に保つためにfeedbackを使う.HOSTが送って来るaudio streamのレートを以下の仕様で測定し、HOSTへ返信する.それがfeedback.
feedback値の定義は大雑把には、1フレーム当たりのサンプル個数 である.サンプル個数といっても整数値だと精度不足なので少数点以下の数値も含む.
だが上のコトバは何を語っているのか判らないと思うので情報を補足する.
1)フレーム周期TFはPCが決める (1mSec,125uSec)
2)サンプル周期TSはマスタークロックが決める(48kHzなど)
3)非同期転送モードではTFとTSが同期してない
4)TFとTSを同期させる必要がある(さもないと音にプツッとノイズが混じる)
5)feedback値=Ff=TF/TS (=1フレーム当たりのサンプル個数)
6)ブロック図で表現するとこんなかんじ
具体的な数値をいくつか試算してみる.
A)48kHz FullSpeed TF=1mSec=1kHz Ff=48個
B)384kHz FullSpeed TF=1mSec=1kHz Ff=384個
C)192kHz HighSpeed Tf=125uSec=8kHz Ff=192/8=24個
↓小数点以下を得るために平均化する.USB2.0規格書には1秒間ぐらい平均化したらどうですか?と書かれている.
↓平均化時間を短縮したければ、48kHzの源発振clockをカウントするようにすれば良い.そうすれば小数点以下がポロポロ出てくるので平均化時間を短縮できる.この例では、24.576MHzは48kHzの512倍なので平均化時間を1/100ぐらいにしてもOKとなる.
FfはHOSTへfeedbackされる.binaryの位取りはFSとHSで異なる.
FS: 3bytes (整数.少数)=(10.14)
HS: 4bytes (整数.少数)=(16.16) ただし整数部の上位4bitはゼロ
FfをどのようにしてHOSTへ送信するのか?
Isochronous転送する.descriptorにisochronous feedback EPを登録すればいい.この例はUAC2のHSモードで、4ms毎に4bytesを送信する
bLength : 0x07 (7 bytes)
bDescriptorType : 0x05 (Endpoint Descriptor)
bEndpointAddress : 0x82 (Direction=IN EndpointID=2)
bmAttributes : 0x11 (Isochronous SyncType=None Feedback)
wMaxPacketSize : 0x0004 (4 bytes per packet)
bInterval : 0x04 (4 ms)
余談だがHOSTは次の計算をしてaudio stream量を増減させる.
1)Ff(N) = Ff(N) + 少数部分( Ff(N-1) )
2)整数部分( Ff(N) )をHOSTが送信するaudio streamの個数にする
以上.
これを元に実装して動かしてみます.
かしこ
0 件のコメント:
コメントを投稿