feedbackの実装は判らないことがいろいろあって難航中.でも一応動いてはいる.でもこれはたぶん最終的解ではないと思う.
これがfeedbackが(かろうじて)動いている証拠動画だっっ!
画面を解説しよう.
矩形波が2つある.バッファライトとバッファリードを示している.
バッファライトとは、HOSTから到来するUSB audio streamがバッファに積まれるサイクルを表している.
バッファリードとは、DACがバッファを読みだすサイクルを表している.
2つの矩形波の位相がロックされているので、HOSTへfeedbackが掛かっている様を表している.プルプルと震えているのはイマイチである.
feedbackを切るとこのようにライトとリードが流れてしまう.これではNG.
feedbackについて改めて解説しよう.
master DAC systemではDACが独自のレートを持つので、USB deviceはHOSTに対してレート上げ下げを命令する必要がある=feedback.
USB deviceからHOSTへfeedback dataを送る.するとHOSTは送信データレートをmaster DACの要求するdata rateに鞘寄せしてくれる.
feedbackについてUSB規格書から読み取ったことを以前書いた. →こちら
1)マイクロフレーム(125uSec)=Tm
2)masterサンプリング周期=Fs
3)feedback値=Fs x Tm
4)feedback data=4BYTEs=整数16bit+小数点未満16bit
1234を実行するには、STM32のtimerでhardware的に行えばよい.512Fs=24.576MHzをtimer clockへ入力する.SOF割り込み毎にtimer値を採取する.feedback値=timer値(N+1)ーtimer値(N) 位取りをちょいと操作すれば出来上がり.
feedback dataをHOSTへ送信する方法は、
5)Isochronous EndPoint (must)
6)私が知る事例では4mSec毎 (mustではないはず)
7)USB規格的には明示的feedbackでも暗黙的feedbackでもどちらでもよいが、windows10標準のUAC2.0デバドラは明示的feedbackのみに対応しているらしい
8)audio data streamがEP1だとしたらfeedbackはEP81のように同一EPのIN/OUTでなくちゃいけないとどこかで読んだがガセネタかもしれない.わたしのSTM32ではEP1とEP82の組み合わせだとfeedbackが動かないのは確認した.
疑問がある.
feedback値=timer(N+1)ーtimer(N) の計算をしても、原理的にレート偏差をゼロには出来ないと思うんだ.
レート偏差をゼロに追い込むには、バッファのライト/リードポインタの追い掛けっこを調整しないと決着しないのではないかとわたしは思っている.上の動画はそうゆう実装にしてある.
さらなる検討が必要.
かしこ
0 件のコメント:
コメントを投稿