# Android DAC bit-perfect playback – (chroot for rooted android)

> Bit-perfect playback to a USB DAC from a rooted Android phone: run Debian/Devuan with ALSA and MPD in a Linux Deploy chroot, leaving the phone's audio stack alone.

- URL: https://guillaumeplayground.net/android-dac-bit-perfect-playback-chroot-on-any-rooted-android/
- Author: Guillaume (https://guillaumeplayground.net/about/)
- Published: 2016-10-30
- Updated: 2017-01-10
- Section: Computing & hacking
- Topics: android, dac, debian, bit perfect
- Source: Guillaume playground

Last week, I bought a new pair of in-ear earphones [Jays q-Jays](https://www.jaysheadphones.com/q-jays) to challenge my old Ultimate Ears 700 I own since six years.  
I already resolder two times a new jack cable. That’s the problem only when you repair… it lasts too long.

With these really good q-Jays, I looked to bring perfect to my cyanogenmod android phone with a portable dac like the S.M.S.L M2 (Sabre).  
It is quite simple in fact, since we don’t want to mess up with the audio stack of the phone, let’s chroot:

-   a vanilla linux distribution – debian/devuan
-   alsa
-   mpd

To get a running linux distribution running in a chroot, I suggest [Linux Deploy](https://play.google.com/store/apps/details?id=ru.meefik.linuxdeploy), running smoothly with a single ‘.img’ file. The distribution takes at most 2GB on a sdcard.  
There’s many tutorials to help you on this.

You should had mountpoints from android, like the add-in sdcard if you have one. Mine is in “/storage/3530-6635” for example. I simply added it to LinuxDeploy mountpoints.

Next, you just need to log on your new chrooted linux, and make the config:

```
# apt-get install mpd mpc alsa-base alsa-oss alsa-utils
```

Configure your alsa gear:

```
# aplay -l
**** List of PLAYBACK Hardware Devices ****
card 0: rt5647audio [rt5647-audio], device 0: Saltbay Audio (*) []
  Subdevices: 0/1
  Subdevice #0: subdevice #0
card 0: rt5647audio [rt5647-audio], device 1: Deep Buffer Audio (*) []
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 0: rt5647audio [rt5647-audio], device 2: Low Latency Audio (*) []
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 0: rt5647audio [rt5647-audio], device 4: Saltbay Voip (*) []
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 0: rt5647audio [rt5647-audio], device 5: Saltbay Probe snd-soc-dummy-dai-5 []
  Subdevices: 8/8
  Subdevice #0: subdevice #0
  Subdevice #1: subdevice #1
  Subdevice #2: subdevice #2
  Subdevice #3: subdevice #3
  Subdevice #4: subdevice #4
  Subdevice #5: subdevice #5
  Subdevice #6: subdevice #6
  Subdevice #7: subdevice #7
card 1: DAC [SMSL M2 DAC], device 0: USB Audio [USB Audio]
  Subdevices: 0/1
  Subdevice #0: subdevice #0
```

Edit /etc/asound.conf, we are only interested by our DAC here:

```
pcm.!default { type hw card DAC }
ctl.!default { type hw card DAC }
```

Edit /etc/mpd.conf, bit-perfect:

```
# My mountpoint
music_directory "/storage"

....
# It is a dedicated chroot... run as root to simplify
use     "root"

...
audio_output {
	type "alsa"
        # Output from aplay -L, 'default' should work anyway
	#device "plughw:CARD=DAC,DEV=0"
	device "default"
        # The name of the card
	name "DAC"
	use_mmap "yes"
        # bit perfect
	auto_resample "no"
	auto_channels "no"
	auto_format "no"
        # Volume control from the S.M.S.L M2
	mixer_type "disabled"
	period_time "50000"
  	buffer_time "2500000"
        # No DSD for the M2.
        # dsd_usb "yes"
}

input {
	plugin "curl"
}

And it's done.

# mpc update
Updating DB (#1) ...
```

`   Be sure to configure linuxdeploy to start mpd when activating the chroot, you can also activate the 'auto_update' option in mpd.conf.   In LinuxDeploy, I am using the sysv init to start services. This way is more elegant to start/stop your services in the chroot.   The init level at 3 for my running level (which means /etc/rc3.d/S* scripts will be executed).   You have to remove at least the K09halt from /etc/rc6.d... or your android phone will reboot when you close the chroot.  The beauty in all this is having you own dedicated chrooted linux server running mpd.  Once the chroot loaded (LinuxDeploy>start), you can access your mpd player via any mpd client from your android (mine is [M.A.L.P](https://play.google.com/store/apps/details?id=org.gateshipone.malp&hl=fr)), targeting host: localhost.  ``` # mpc Miles Davis - Yesternow [playing] #2/2  11:45/25:34 (45%) volume: n/a   repeat: off   random: off   single: off   consume: off  # cat /proc/asound/DAC/pcm0p/sub0/hw_params  access: MMAP_INTERLEAVED format: S24_3LE subformat: STD channels: 2 rate: 96000 (96000/1) period_size: 4800 buffer_size: 174762 ```  PS: To activate the S.M.S.L M2 with android OTG mode, [USB Host Diagnostics](https://play.google.com/store/apps/details?id=eu.chainfire.usbhostdiagnostics) is doing the job.  PS2: I just received a hidizs ap60, with latest firmware, and it works perfectly without any OTG problem. Sound is great and the AP60 is displaying the right rate - bit-perfect - iso with the flac file you are playing. You can check it against a default player on android which indicates the upscaling provided by the audio layer of android (fixed 192k).   `
