DAC Displays 32-bit when playing 24-bit file

Core Machine (Operating system/System info/Roon build number)

  • Roon OS Version 1.0 (build 227) stable
  • Intel NUC 10 i7
  • Roon Server Version 1.8 (build 783) stable

Network Details (Including networking gear model/manufacturer and if on WiFi/Ethernet)

  • BT FTTP 1Gbit/s
  • BT SmartHub and BT Disc
  • 5 GHz WIFI connection

Audio Devices (Specify what device you’re using and its connection type - USB/HDMI/etc.)

Playback

  • SMSL M6 Mini DAC
  • USB Connection
  • Raspberry Pi 4B
  • DietPi
  • Roon Bridge Version 1.7 (build 571) stable

Remotes

*MacBook Pro (13-inch, 2020)/Big Sur: Roon Version 1.8 (build 783) stable
*iPhone 8: Roon Version 1.8 (build 783) stable

Description Of Issue

Any 16-bit file plays and the SMSL displays 16-bit (44.1kHz and 48kHz files)
Any 24-bit file, whether Qobuz or Local File, plays and the SMSL displays 32 bit (48kHz, 88.1kHz, 96kHz and 192kHz files)

Why doesn’t it show 32-bit?
Is it Roon Bridge, ALSA or my SMSL M6?

Thanks for your help.

Signal path and SMSL screen for 16-bit:


RAAT Server Log for 16-bit:

 > 04/09 15:28:35 Trace: [RAAT::SMSL M6] [lua@0xb19245c4] [192.168.1.40:58804]  GOT [219] {"request":"setup","format":{"sample_type":"pcm","sample_rate":44100,"bits_per_sample":16,"channels":2,"sample_subtype":"none"}}
>     04/09 15:28:35 Trace: [RAAT::SMSL M6] alsa output setup: format is pcm 44100/16/2
>     04/09 15:28:35 Trace: [RAAT::SMSL M6] opening [hw:CARD=M6,DEV=0] 44100/16/2
>     04/09 15:28:35 Trace: [RAAT::SMSL M6] prefer larger samples = 0
>     04/09 15:28:35 Trace: [RAAT::SMSL M6] [ALSA] [hw:CARD=M6,DEV=0] using hw pcmformat S16_LE bitspersample 16
>     04/09 15:28:35 Trace: [RAAT::SMSL M6] [ALSA] [hw:CARD=M6,DEV=0] Requesting 2 periods
>     04/09 15:28:35 Trace: [RAAT::SMSL M6] [ALSA] [hw:CARD=M6,DEV=0] Requesting 1764 frames/buffer (882 frames/period)
>     04/09 15:28:35 Trace: [RAAT::SMSL M6] [ALSA] [hw:CARD=M6,DEV=0] Initialized with 2 periods with 882 frames/period and 1764 frames/buffer
>     04/09 15:28:35 Trace: [RAAT::SMSL M6] sched_setscheduler succeeded
>     04/09 15:28:35 Trace: [RAAT::SMSL M6] [lua@0xb19245c4] [192.168.1.40:58804]  got output message {"signal_path": [{"alsa_device": {"longname": "SMSL SMSL M6 at usb-0000:01:00.0-1.4, high speed", "id": "M6", "name": "SMSL M6", "usbid": "0d8c:0004", "mixername": "USB Mixer", "dri
>     04/09 15:28:35 Trace: [RAAT::SMSL M6] samples per buf 882 ns per buf 20000000 samplerate 44100
>     04/09 15:28:35 Trace: [RAAT::SMSL M6] 882 samples per buf, 3528 bytes per buf, 3528 bytes per hwbuf
>     04/09 15:28:35 Trace: [RAAT::SMSL M6] [output/alsa] [hw:CARD=M6,DEV=0] waiting for device to be ready
>     04/09 15:28:35 Trace: [RAAT::SMSL M6] [output/alsa] [hw:CARD=M6,DEV=0] device is ready
>     04/09 15:28:35 Trace: [RAAT::SMSL M6] [lua@0xb19245c4] [192.168.1.40:58804]  SENT [219] {"message":{"signal_path":[{"type":"output","quality":"lossless","method":"alsa","alsa_device":{"longname":"SMSL SMSL M6 at usb-0000:01:00.0-1.4, high speed","id":"M6","usbid":"0d8c:0004","
>     04/09 15:28:35 Trace: [RAAT::SMSL M6] [lua@0xb19245c4] [192.168.1.40:58804]  SENT [219] {"audio_port_tcp":44573,"audio_port":0,"clock_port":57178,"status":"Success"}
>     04/09 15:28:35 Trace: [RAAT::SMSL M6] [lua@0xb19245c4] [192.168.1.40:58804]  GOT [220] {"request":"stream","stream_id":1043304442,"first_seq":-1,"nak_port":-1,"buffer_size":10,"ready_threshold":0.2}
>     04/09 15:28:35 Trace: [RAAT::SMSL M6] [lua@0xb19245c4] [192.168.1.40:58804]  SENT [220] {"status":"Buffering"}
>     04/09 15:28:35 Trace: [RAAT::SMSL M6] [lua@0xb19245c4] [192.168.1.40:58804]  SENT [220] {"status":"Ready"}
>     04/09 15:28:35 Trace: [RAAT::SMSL M6] [lua@0xb19245c4] [192.168.1.40:58804]  GOT [221] {"request":"start","min_offset":60884353,"stream_sample":0}
>     04/09 15:28:35 Trace: [RAAT::SMSL M6] [lua@0xb19245c4] [192.168.1.40:58804]  Doing ASAP start based on current device clock (min_offset=60884353)
>     04/09 15:28:35 Trace: [RAAT::SMSL M6] [lua@0xb19245c4] [192.168.1.40:58804]  SENT [220] {"status":"Playing"}
>     04/09 15:28:35 Trace: [RAAT::SMSL M6] [lua@0xb19245c4] [192.168.1.40:58804]  SENT [221] {"time":48902007184514,"status":"Success"}
>     04/09 15:28:35 Trace: [RAAT::SMSL M6] starting playback: now (48901997142857ns) + ns_per_buf(20000000ns) = 48902017142857ns > 48902007184514ns streamsample=0
>     04/09 15:28:45 Trace: [RAAT::SMSL M6] [lua@0xb19245c4] [192.168.1.40:58804]  GOT [222] {"request":"stop"}
>     04/09 15:28:45 Trace: [RAAT::SMSL M6] [lua@0xb19245c4] [192.168.1.40:58804]  SENT [220] {"status":"Stopped"}
>     04/09 15:28:45 Trace: [RAAT::SMSL M6] [lua@0xb19245c4] [192.168.1.40:58804]  SENT [222] {"status":"Success"}
>     04/09 15:28:50 Trace: [RAAT::SMSL M6] [lua@0xb19245c4] [192.168.1.40:58804]  GOT [223] {"request":"end_stream"}
>     04/09 15:28:50 Trace: [RAAT::SMSL M6] [lua@0xb19245c4] [192.168.1.40:58804]  SENT [220] {"status":"Ended"}
>     04/09 15:28:50 Trace: [RAAT::SMSL M6] [lua@0xb19245c4] [192.168.1.40:58804]  SENT [223] {"status":"Success"}
>     04/09 15:28:50 Trace: [RAAT::SMSL M6] [lua@0xb19245c4] [192.168.1.40:58804]  GOT [224] {"request":"teardown"}
>     04/09 15:28:50 Trace: [RAAT::SMSL M6] [alsa] teardown
>     04/09 15:28:50 Trace: [RAAT::SMSL M6] [lua@0xb19245c4] [192.168.1.40:58804]  SENT [219] {"status":"Teardown"}

Signal path and SMSL screen for 24-bit (Qobuz and Local Files):

image

RAAT Server Log for 24-bit:

> 04/09 15:28:14 Trace: [RAAT::SMSL M6] [lua@0xb19245c4] [192.168.1.40:58804]  GOT [213] {"request":"setup","format":{"sample_type":"pcm","sample_rate":96000,"bits_per_sample":24,"channels":2,"sample_subtype":"none"}}
> 04/09 15:28:14 Trace: [RAAT::SMSL M6] alsa output setup: format is pcm 96000/24/2
> 04/09 15:28:14 Trace: [RAAT::SMSL M6] opening [hw:CARD=M6,DEV=0] 96000/24/2
> 04/09 15:28:14 Trace: [RAAT::SMSL M6] prefer larger samples = 0
> 04/09 15:28:14 Trace: [RAAT::SMSL M6] [ALSA] [hw:CARD=M6,DEV=0] using hw pcmformat S32_LE bitspersample 24
> 04/09 15:28:14 Trace: [RAAT::SMSL M6] [ALSA] [hw:CARD=M6,DEV=0] Requesting 2 periods
> 04/09 15:28:14 Trace: [RAAT::SMSL M6] [ALSA] [hw:CARD=M6,DEV=0] Requesting 3840 frames/buffer (1920 frames/period)
> 04/09 15:28:14 Trace: [RAAT::SMSL M6] [ALSA] [hw:CARD=M6,DEV=0] Initialized with 2 periods with 1920 frames/period and 3840 frames/buffer
> 04/09 15:28:14 Trace: [RAAT::SMSL M6] sched_setscheduler succeeded
> 04/09 15:28:14 Trace: [RAAT::SMSL M6] samples per buf 1920 ns per buf 20000000 samplerate 96000
> 04/09 15:28:14 Trace: [RAAT::SMSL M6] 1920 samples per buf, 11520 bytes per buf, 15360 bytes per hwbuf
> 04/09 15:28:14 Trace: [RAAT::SMSL M6] [lua@0xb19245c4] [192.168.1.40:58804]  got output message {"signal_path": [{"alsa_device": {"longname": "SMSL SMSL M6 at usb-0000:01:00.0-1.4, high speed", "id": "M6", "name": "SMSL M6", "usbid": "0d8c:0004", "mixername": "USB Mixer", "dri
> 04/09 15:28:14 Trace: [RAAT::SMSL M6] [output/alsa] [hw:CARD=M6,DEV=0] waiting for device to be ready
> 04/09 15:28:14 Trace: [RAAT::SMSL M6] [output/alsa] [hw:CARD=M6,DEV=0] device is ready
> 04/09 15:28:14 Trace: [RAAT::SMSL M6] [lua@0xb19245c4] [192.168.1.40:58804]  SENT [213] {"message":{"signal_path":[{"type":"output","quality":"lossless","method":"alsa","alsa_device":{"longname":"SMSL SMSL M6 at usb-0000:01:00.0-1.4, high speed","id":"M6","usbid":"0d8c:0004","
> 04/09 15:28:14 Trace: [RAAT::SMSL M6] [lua@0xb19245c4] [192.168.1.40:58804]  SENT [213] {"audio_port_tcp":44573,"audio_port":0,"clock_port":57178,"status":"Success"}
> 04/09 15:28:14 Trace: [RAAT::SMSL M6] [lua@0xb19245c4] [192.168.1.40:58804]  GOT [214] {"request":"stream","stream_id":1043304441,"first_seq":-1,"nak_port":-1,"buffer_size":10,"ready_threshold":0.2}
> 04/09 15:28:14 Trace: [RAAT::SMSL M6] [lua@0xb19245c4] [192.168.1.40:58804]  SENT [214] {"status":"Buffering"}
> 04/09 15:28:14 Trace: [RAAT::SMSL M6] [lua@0xb19245c4] [192.168.1.40:58804]  SENT [214] {"status":"Ready"}
> 04/09 15:28:14 Trace: [RAAT::SMSL M6] [lua@0xb19245c4] [192.168.1.40:58804]  GOT [215] {"request":"start","min_offset":60875000,"stream_sample":0}
> 04/09 15:28:14 Trace: [RAAT::SMSL M6] [lua@0xb19245c4] [192.168.1.40:58804]  Doing ASAP start based on current device clock (min_offset=60875000)
> 04/09 15:28:14 Trace: [RAAT::SMSL M6] [lua@0xb19245c4] [192.168.1.40:58804]  SENT [214] {"status":"Playing"}
> 04/09 15:28:14 Trace: [RAAT::SMSL M6] [lua@0xb19245c4] [192.168.1.40:58804]  SENT [215] {"time":22453008533500,"status":"Success"}
> 04/09 15:28:14 Trace: [RAAT::SMSL M6] starting playback: now (22453003062500ns) + ns_per_buf(20000000ns) = 22453023062500ns > 22453008533500ns streamsample=0
> 04/09 15:28:21 Trace: [RAAT::SMSL M6] [lua@0xb19245c4] [192.168.1.40:58804]  GOT [216] {"request":"stop"}
> 04/09 15:28:21 Trace: [RAAT::SMSL M6] [lua@0xb19245c4] [192.168.1.40:58804]  SENT [214] {"status":"Stopped"}
> 04/09 15:28:21 Trace: [RAAT::SMSL M6] [lua@0xb19245c4] [192.168.1.40:58804]  SENT [216] {"status":"Success"}
> 04/09 15:28:26 Trace: [RAAT::SMSL M6] [lua@0xb19245c4] [192.168.1.40:58804]  GOT [217] {"request":"end_stream"}
> 04/09 15:28:26 Trace: [RAAT::SMSL M6] [lua@0xb19245c4] [192.168.1.40:58804]  SENT [214] {"status":"Ended"}
> 04/09 15:28:26 Trace: [RAAT::SMSL M6] [lua@0xb19245c4] [192.168.1.40:58804]  SENT [217] {"status":"Success"}
> 04/09 15:28:26 Trace: [RAAT::SMSL M6] [lua@0xb19245c4] [192.168.1.40:58804]  GOT [218] {"request":"teardown"}
> 04/09 15:28:26 Trace: [RAAT::SMSL M6] [alsa] teardown
> 04/09 15:28:26 Trace: [RAAT::SMSL M6] [lua@0xb19245c4] [192.168.1.40:58804]  SENT [213] {"status":"Teardown"}

Hello @Johnny_Maelstrom,

ALSA prefers using S32_LE transport with “zero-padding” when playing 24-bit content to UAC2 devices.

Zero-padding works by adding eight "0"s to the least significant bits of a 24-bit signal.

Any modern device will recognize a 32-bit zero-padded stream, remove the empty bits, and then process it as it were the original 24-bit signal.

-John

3 Likes

Thanks @john that makes sense and is something I’ve heard about, but didn’t know about. I’m happy to continue now.

This topic was automatically closed 36 hours after the last reply. New replies are no longer allowed.