ビット拡張について

729 views
Skip to first unread message

karas...@gmail.com

unread,
Jan 27, 2016, 3:32:43 PM1/27/16
to lightMPD
いつもお世話になっております。

件名なのですが、現在apu.1dをメインで使っていてビット拡張だけをしたのですが、
mpd.confに

audio_output_format "X1L1:32:2"

と記入しているのですが、どうも拡張してくれません。
試しに、

audio_output_format "X4L4:32:2"

とかではちゃんと拡張してくれるようです。
記述がまちがっているのでしょうか?

Message has been deleted

digi...@gmail.com

unread,
Jan 28, 2016, 8:46:16 AM1/28/16
to lightMPD
karasawa998さん

プログラム的には16->32,24->32とも左にシフトしてLSB側に0が埋められます。
サンプリング周波数の変換が行われる場合は、サンプリング周波数の変換でfloatのpcmに変換されfloatから32bit整数への変換が行われます。
ソース上はちゃんと変換ルーチンを通っているのですが。

ところで、bit長の確認はどのようにされましたか。確認する方法があるともっと調査しやすいのですが。


karas...@gmail.com

unread,
Jan 28, 2016, 11:15:50 AM1/28/16
to lightMPD
digififan 様

レスポンスありがとうございます。

>ところで、bit長の確認はどのようにされましたか。確認する方法があるともっと調査しやすいのですが。

新しく導入したMytek Brooklyn DACにて確認しております。
ファームウェアのバグも考えたのですが、それだと

audio_output_format "X4L4:32:2"

の時にちゃんと32bitと表示されるのが不思議です。
頭を悩ませている最中です。

digi...@gmail.com

unread,
Jan 29, 2016, 8:56:18 AM1/29/16
to lightMPD
karasawa998さん

> 新しく導入したMytek Brooklyn DACにて確認しております。
了解しました。

lightMPD側では telnet  で接続して下記のコマンドで確認できます。(失念してました)

# cat /proc/asound/card0/pcm0p/sub0/hw_params
DIYINHKのxmosベースのDDCだと
access: MMAP_INTERLEAVED
format: S16_LE
subformat: STD
channels: 2
rate: 44100 (44100/1)
period_size: 1654
buffer_size: 6615

のように表示されます。これは44100/16のデータを再生した時の物です。
これをaudio_output_format   "X1L1:32:2"や"x1L1:32:2"とすると

access: MMAP_INTERLEAVED
format: S32_LE
subformat: STD
channels: 2
rate: 44100 (44100/1)
period_size: 1654
buffer_size: 6615

のようになります。

format:がS16_LE からS32_LEになってます。S16は符号付き16bit,S32は符号付き32bitになります。(LEは無視して下さい。DDCの機種によってはBEになることもあります)
"X1"でもちゃんと32bitになっています。

lightMPDで確認できるのはここまででです。

一度、# cat /proc/asound/card0/pcm0p/sub0/hw_paramsで確認して頂けますか。




karas...@gmail.com

unread,
Feb 1, 2016, 10:35:26 AM2/1/16
to lightMPD
16bit/44.1のファイルを再生したときです。

audio_output_formatをコメントアウトした時、

access: RW_INTERLEAVED
format: S32_LE
subformat: STD
channels: 2
rate: 44100 (44100/1)
period_size: 1654
buffer_size: 6615

DAC 16Bit 44.1K


audio_output_format "X1L1:32:2"の時、

format: S32_LE
subformat: STD
channels: 2
rate: 44100 (44100/1)
period_size: 1654
buffer_size: 6615

DAC 16bit 44.1K

で、同じ結果になってしまいます。

digi...@gmail.com

unread,
Feb 2, 2016, 10:28:16 AM2/2/16
to lightMPD
karasawa998さん

cat /proc/asound/card0/stream0

の結果を教えて下さい。

ちなみに、私の使っているXMOS系のDDCだと

# cat /proc/asound/card0/stream0
DIYINHK DIYINHK USB Audio 2.0 at usb-0000:00:12.2-1, high speed : USB Audio

Playback:
  Status: Running
    Interface = 1
    Altset = 2
    Packet Size = 28
    Momentary freq = 44100 Hz (0x5.8330)
    Feedback Format = 16.16
  Interface 1
    Altset 1
    Format: S32_LE
    Channels: 2
    Endpoint: 1 OUT (ASYNC)
    Rates: 44100, 48000, 88200, 96000, 176400, 192000, 352800, 384000
    Data packet interval: 125 us
  Interface 1
    Altset 2
    Format: S16_LE
    Channels: 2
    Endpoint: 1 OUT (ASYNC)
    Rates: 44100, 48000, 88200, 96000, 176400, 192000, 352800, 384000
    Data packet interval: 125 us
  Interface 1
    Altset 3
    Format: SPECIAL DSD_U32_BE
    Channels: 2
    Endpoint: 1 OUT (ASYNC)
    Rates: 44100, 48000, 88200, 96000, 176400, 192000, 352800, 384000
    Data packet interval: 125 us

あと、mpdのbit長の変換は下位に0を詰めるだけなので、16bitを32bitにした場合、下位16bitは全て0になります。
アップサンプリングしないでbit長の変換は意味が無いかもしれません。



karas...@gmail.com

unread,
Feb 2, 2016, 1:02:44 PM2/2/16
to lightMPD
digififan 様

自分の数値は以下のようになりました。

# cat /proc/asound/card0/stream0
Mytek Digital Brooklyn DAC at usb-0000:00:12.2-1.1.1.2, high speed : USB Audio

Playback:
Status: Running
Interface = 2
Altset = 1
Packet Size = 56
Momentary freq = 44094 Hz (0x5.8300)
Feedback Format = 16.16
Interface 2
Altset 1
Format: S32_LE
Channels: 2
Endpoint: 1 OUT (ASYNC)
Rates: 44100, 48000, 88200, 96000, 176400, 192000, 352800, 384000
Data packet interval: 125 us
Interface 2
Altset 2
Format: SPECIAL
Channels: 2
Endpoint: 1 OUT (ASYNC)
Rates: 44100, 48000, 88200, 96000, 176400, 192000, 352800, 384000
Data packet interval: 125 us

Capture:
Status: Stop
Interface 1
Altset 1
Format: S32_LE
Channels: 6
Endpoint: 1 IN (ASYNC)
Rates: 44100, 48000, 88200, 96000, 176400, 192000, 352800, 384000
Data packet interval: 125 us

44100Hzが44094 Hzになってて、ちと気持ちが悪いですね(^_^;

digi...@gmail.com

unread,
Feb 8, 2016, 7:52:57 AM2/8/16
to lightMPD
karasawa998さん

返答が遅れて申し訳ありません。

formatがS32_LEのインターフェイスにS16のデータを流す場合は下位16bitに0 を入れるので,
mpdで16->32を行っても見分けがつかないのかもしれません。

やはり、mpdの様な単に左にbitシフトするようなbit伸張の方法はあまり意味がないと思います。

> 44100Hzが44094 Hzになってて、ちと気持ちが悪いですね(^_^;
これはこれで正しい動きです。
async伝送の場合、DAC 側はDAC内部のクロックにしたがって動作を行っています。
一方、CPU側はCPUのクロックを基準に一定間隔でデータを送ります。CPUとDACのクロックが微妙に異なっているためいずれDACのデータが
アンダーフローまたはオーバーフローします。
それを防ぐためCPU側が送信スピードを早くしたり遅くしたりしてDACに合わせます。
たまたま、44094Hzですが、これは常に変動しています。



karas...@gmail.com

unread,
Feb 12, 2016, 3:07:39 PM2/12/16
to lightMPD
digififan 様

小さな疑問でしたがいろいろとありがとうございました。
もちっと勉強しないとですね。

Reply all
Reply to author
Forward
0 new messages