Choosing a player
What Android app should I use with my USB DAC?
Pick one that opens the USB device itself instead of handing your audio to Android's mixer, and that tells you which sample rate the DAC actually negotiated. Those two properties decide whether your dongle is doing the job you bought it for. Meringo is our player, and it adds a third: it hashes the bytes it put on the wire, so you can check the claim instead of believing it. The tests below work on any player, ours included.
What the phone does when nothing takes the DAC off that path
By default, Android resamples your music to 48 kHz. Plugging in a capable DAC does not by itself change that. The phone will play through your dongle quite happily with AudioFlinger still in the middle of the path, converting everything to the mixer's rate on the way out.
CD-rate music is where this bites hardest. 44,100 against 48,000 is a ratio of 147 to 160, so no sample survives that conversion untouched. Nothing on screen announces it, and resampled audio still sounds like music. That is the whole difficulty: the failure is silent, so a player that merely sounds fine has told you nothing.
Three questions worth asking of any player
Does it drive the DAC directly? Meringo parses the DAC's USB Audio Class descriptors, claims the audio-streaming interface, and ships PCM frames through isochronous transfers straight to the DAC's USB endpoint, with no AudioFlinger between the bits and the DAC. Whatever you end up using, the question is whether it opens the USB device itself or plays through the system output like any other app.
Does it show the rate it got, and say so when the path fails? Bit-perfect here means three things at once: sample-rate parity, bit-depth parity, and single-client passthrough. Meringo's format strip goes teal for BIT-IDENTICAL when the pipe is live and the negotiated rate matches the file. It lights an amber warning the moment AudioFlinger resamples or truncates the signal, and it reads INTERNAL SRC when the internal resampler is switched on, because that is what is actually happening. ReplayGain, EQ and concurrent system mixing put explicit suffixes on the badge rather than quietly leaving it green.
Can you check the claim without taking the app's word for it? This is the one most players cannot answer, and it is the reason we built the receipt mechanism. Arm Verified Capture in Settings, Audio Diagnostics. Meringo writes every byte it hands to the isochronous pipe and computes a SHA-256 over the whole stream. Point it back at the same file and it re-decodes, lays the PCM out in the identical pipe format, and hashes that. Matching hashes mean nothing touched a single bit between the file and the pipe.
How to check the app you already have
- Play a 44.1 kHz file, not a hi-res one. A 48 kHz file passes through Android's default path unchanged and will tell you nothing.
- Read whatever the app says about the output rate while that file is playing. If it only reports the file's rate, it is describing the source rather than the wire.
- Check your DAC's own rate indicator if it has one. Many dongles change an LED colour with the negotiated rate. (Unverified here: that behaviour is your DAC's firmware, we hold no receipt for it, and it is a hint rather than a result.)
- Capture and hash, which is the only step that settles it. Our method and a public-domain checker script are published at meringo.app/verify, and the script shares no code with the app.
Our worked example
Three DACs, six receipts, every hash published in full. These are the captures behind the claim on the rest of this site, at 24/96:
| Device | Interface · wire format | Build | Date | SHA-256 |
|---|---|---|---|---|
| Qudelix 5K | UAC1 full-speed sync · 96 kHz · 24-bit · FLAC | Meringo 1.31.0 (130) | 2026-08-01 | 847af9e41aebc5684ce36909f8417ed22d65bb1909b6de05428f160fe32cd4a7 |
| Jcally JM6 Pro | UAC1 high-speed sync, CX31993 + MAX97220 · 96 kHz · 24-bit · FLAC | Meringo 1.31.0 (130) | 2026-08-01 | 847af9e41aebc5684ce36909f8417ed22d65bb1909b6de05428f160fe32cd4a7 |
| Fosi DS2 | UAC2 high-speed async · 24-bit (alt 2) lane · 96 kHz · 24-bit · FLAC | Meringo 1.30.0 (128) | 2026-07-19 | d7eb00c6837375ca1f74c95efc2cea78e02331f66e7111a36b383c3861912538 |
The first two rows are the same hash on purpose. On 2026-08-01 the same 96 kHz, 24-bit FLAC went through two physically different dongles and came out with one SHA-256 between them. We like boring results like that. The other three receipts, including a CD-rate capture and a 16-bit one, are on the registry with their own hashes.
Where the proof stops
A hash covers what Meringo put on the USB wire. Isochronous USB carries no delivery acknowledgement, so no software on any platform can prove what the DAC received, only what was put on the wire for it. Any page that claims more than that is claiming something USB does not report.
We hold receipts for three DACs today. If yours is not one of them, we do not know that it runs bit-perfect and we will not say that it does. There is no compatibility list here assembled from spec sheets, because a spec sheet says what hardware can do and a receipt says what happened. Send us yours if you capture one: NOT BIT-IDENTICAL and INCONCLUSIVE are both published verdicts.
When Meringo is the wrong answer for you
If you mainly stream from Spotify, Tidal or Qobuz, this is not your player. There is no native integration with commercial streaming, by design. Meringo plays local FLAC and ALAC, plus Jellyfin and the Subsonic and OpenSubsonic family.
DSD is not played natively on-device either. Meringo is a PCM-first player; DoP passthrough works only with a capable external USB DAC. The minimum is Android 13, and it is $9.99 once with a 7-day full trial and no subscription.
If those rule us out, the three questions above still hold. They are how you judge any Android player against your own dongle, and the answer you should want from whichever one you pick is a rate you can verify.