IARSDR — an RTL-SDR receiver for Android, driver and all
IARSDR is an Android app that turns a phone into a software-defined radio
receiver. Plug an RTL-SDR (RTL2832U) dongle into the USB port, and you get a live
spectrum, a waterfall, and FM/AM/SSB/CW audio. It also speaks rtl_tcp, so it can
receive from a remote server instead of local hardware.
The driver is the interesting part. Talking to an RTL2832U normally means
librtlsdr on top of libusb — C, native code, and usually root or a kernel
detour. Android exposes a USB host API from Kotlin, so I ported the whole thing:
the RTL2832U baseband setup, the resampler and DDC tuning, direct sampling for HF,
and all five tuner drivers — R820T/R828D (including the RTL-SDR Blog V4/V4L with
its built-in upconverter), E4000, FC0012, FC0013 and FC2580. The port is
line-by-line faithful to the RTL-SDR Blog fork of librtlsdr; the tricky parts
were signedness (Kotlin's signed Byte versus C's uint8_t), the 8-bit I2C
addresses in the C headers, and keeping the PLL math in 64-bit where the C uses
uint64_t. No NDK, no libusb, no root.
That driver lives in its own repository,
librtlsdrk, and is pulled into the app
as a git submodule so it can be reused on its own. It is GPL v2, crediting the
original librtlsdr authors in each file.
On top of it, the app. IQ samples flow as interleaved float arrays — never boxed objects on the hot path, which matters when a phone is handling a few megabytes per second and a GC pause turns into an audio dropout. The same buffer feeds the FFT for the display and, when audio is on, a demodulator whose output is fractionally resampled to lock exactly onto the audio clock (integer decimation alone drifts and underruns the track). There is a configurable audio-filter chain — streaming-STFT noise reduction, a noise blanker, an auto-notch — with per-mode presets, plus WAV and raw-IQ recording.
The interface tries to earn its screen: a draggable spectrum/waterfall split, an analog-radio-style tuning dial with flywheel inertia, a clean-screen mode, and light/dark theming that follows the system. It speaks English, Portuguese and Spanish.
It collects no data and shows no ads. The code is on GitHub.