Antinode

An Android music player that controls the whole audio path to a pair of Bluetooth earbuds — not just the part before the sound leaves the phone.

Non-oversampling, over Bluetooth. Formerly blueNOS.

An antinode is where a standing wave reaches maximum amplitude. Everything else in the chain is trying to average it away.

The problem

Play a 44.1 kHz file over Bluetooth and something in the chain almost certainly resamples it, silently, every time. Android pins the A2DP stream to a single sample rate when the codec is configured, and with LDAC enabled it defaults to 96 kHz. Every 44.1 kHz file you own is converted on the way out.

That conversion is pure loss. LDAC's bitrate barely moves with the link rate, so doubling it spreads roughly the same budget across twice the bandwidth — halving the bits per unit of audible bandwidth. Everything above the original Nyquist frequency is the interpolation filter's stopband: nothing, encoded expensively.

Some players will tell you this is happening. What they cannot do is stop it — reconfiguring the link itself is not something an ordinary app is normally able to reach. Antinode gets there.

What it does

Matches the link rate to the source. 44.1 kHz files play over a 44.1 kHz link. Hi-res downsamples to its own family's base by integer decimation — 88.2 to 44.1, 96 to 48 — using a half-band filter. It never oversamples, and never crosses the 44.1 / 48 boundary, which is the one conversion genuinely worth eliminating.

Shows the signal path, source through conversion, codec and EQ to the device, with the conversion stage carrying an action rather than just a description. A deliberate downsample is reported as intended rather than as a fault, because the two look identical from the rate alone.

Sets LDAC's bitrate with the figures for the link actually in use, rather than the generic pair Android quotes. Adaptive by default: a fixed top rate is the commonest cause of LDAC stuttering, and it usually gets blamed on something else.

Privacy

Antinode declares no network permission at all — no INTERNET, no ACCESS_NETWORK_STATE, in any module. It is structurally incapable of sending anything anywhere. There are no accounts, no analytics and no crash reporting.

It reads the audio and artwork on your device to play it, connects to Bluetooth to do that, and keeps a foreground service running so playback survives. That is the whole list, and the manifest is the proof rather than this paragraph.

Availability

In testing, and a closed beta is coming. Antinode asks your permission once, the first time you run it, to manage the connection to your earbuds. After that it works whenever they are paired — nothing to re-enable, nothing to restart, and it survives a reboot.

It is built and running against a FiiO UTWS5. Testers on other LDAC hardware are the most useful of all, because that is the part I cannot check myself — one pair of earbuds on one desk.

Ask for a place in the beta →

Three questions, no account needed. You will get a note back saying how many of us there are so far.

Kotlin Jetpack Compose Material 3 A2DP / LDAC Android

Questions

Does Android resample my music over Bluetooth?

Usually, yes. The A2DP stream is pinned to a single sample rate when the codec is configured, and everything you play is converted to it. With LDAC enabled that rate defaults to 96 kHz, so a 44.1 kHz album — which is most music — is resampled every time it plays.

Is 96 kHz better than 44.1 kHz over LDAC?

No, and it is usually worse. LDAC’s bitrate barely changes with the link rate, so doubling the rate spreads roughly the same budget over twice the bandwidth. Everything above the original Nyquist frequency is the interpolation filter’s stopband — silence, encoded at the expense of the part you can hear.

Can I change the Bluetooth sample rate in Developer Options?

There are codec and sample-rate controls there, but they reset when the device reconnects and they do not follow what you are playing. What you want is the link rate matching the file, track by track, without touching a menu.

How can I tell whether it is happening to me?

Some players show a signal path and will name the resampler outright. That is a diagnosis rather than a cure — seeing it does not stop it. Antinode shows the same path and changes it.

Which devices does this apply to?

Any Android phone sending LDAC to Bluetooth earbuds or headphones. Antinode is developed against a FiiO UTWS5 adapter; testing on other LDAC hardware is exactly what the beta is for.