告知です.
コミケ99にて当社のDDC/DACを頒布いたします.
日付 2021年12月31日(金) 東地区 テ-40b 東5ホール
サークル名 bangflat
コミケにお越しの際はお立ち寄りいただけますとありがたいです.
商品紹介ページを作りました.
ーーーー
STM32でDCC/DDCを作ろう! AK4495でDSDを聴こう! INDEXページへ
もう深夜ですが本日の進捗報告をしようそうしよう.
STM32からDSDを出す、その改造ポイントが判明しました.結構めんどくさい.
やりたいのはDoP DSDです.ASIO DSDではありません.
windows10からDoPのDSDを出させるにはどうするか?
現状判明しているのはfoobar2000 Rev1.6を使います.foobarのcomponentが必要です.compnent状況はこんなです.
foobarの出力Deviceを「DSD WASAPI」にします.
さらに↓この設定も必要みたいよ.
ま、foobarについて詳しくないのでこんなところでおしまい.
これでwindows10がDoP DSDを出してくれるはずです.
audio stream packetの入り口関数であるところの、USBD_AUDIO_DataOut()で検出します.
audio dataに内挿されたDSD markerはこうなってますのでこれをチェックします.
要するに、32bit wordあるいは24bit wordの、端っこのbyteがDSD markerです.そしてmarkerは、05かFAです.
T=i DSDマーカLch=05h DSDマーカRch=05h
T=i+1 DSDマーカLch=FAh DSDマーカRch=FAh
そういうわけで、こんなcodeでDSD検出できました.packet先頭の連続する6wordの4byte目の並びが{5,5,fa,fa,5,5}または{fa,fa,5,5,fa,fa}だったらDSDである.
uint8_t x0,x1,x2,x3,x4,x5;
x0 = buffer_packet0[3]; // L(1)
x1 = buffer_packet0[3+4]; // R(1)
x2 = ~buffer_packet0[3+8]; // L(2)
x3 = ~buffer_packet0[3+12]; // R(2)
x4 = buffer_packet0[3+16]; // L(3)
x5 = buffer_packet0[3+20]; // R(3)
if(x0==5 && x1==5 && x2==5 && x3==5 && x4==5 && x5==5 ) dsd=1;
if(x0==FA && x1==FA && x2==FA && x3==FA && x4==FA && x5==FA ) dsd=1;
else dsd=0;
これでいま来ているaudio packetはDSDだと判ります.
DSD dataをどうやってSTM32から出すのか?
PCMを通すI2SはLch/Rchがinterleaveされています.ブロック図で表しますと、PCM再生においてはUSB入口~DACまで全部がinterleavedです.現状のSTM32 codeもこの構造で作ってあります.
DSDの信号仕様は非interleavedです.しかしUSB入口とpacket bufferはinterleavedです.Lch用リングバッファとRch用リングバッファを独立して設けます.packet bufferからL/Rに分けてコピーします.SPIもL/R独立に用意します.DSDはL線とR線がDACへ接続されます.
う~ん、、、この改造はかったるい.ぐひー
SPIのbit rateを考えてみます.
まずPCMの最高bit rateは、384kHz x 32bit x 2ch = 24.576MHz と結構高い.
DSDのbit rateは、PCMよりも遅いです.これなら速度が遅いSPI2やSPI3でもOKです.
2.8M DSDの場合は、44.1kHz x 16bit x 4 = 2.8224MHz
5.6M DSDの場合は、44.1kHz x 16bit x 8 = 5.6448MHz
I2SだけでなくDAC制御も追加が必要
DSDであると判ったら、DACのregisterもPCM→DSDへ変更しなくてはいけません.
かしこ
0 件のコメント:
コメントを投稿