2020年9月5日土曜日

STM32でDCC/DDCを作る方向で (59) AK4495でDSDを聴こう! 改造ポイント

告知です.
コミケ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について詳しくないのでこんなところでおしまい.

それに加え、サウンドデバマネの排他設定は必須のようです.これをやらないとfoobarがDoPしてくれないみたいです.砂の嵐になって危険ですからね.
これでwindows10がDoP DSDを出してくれるはずです.


STM32で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 件のコメント:

コメントを投稿