Skip to content

Audiophile's Dream 0.4.2 · Vistāra

Choose a tag to compare

@kaurav99 kaurav99 released this 21 Jun 20:20
0fb4163

Audiophile's Dream — 0.4.2 · Vistāra · expansion

versionCode 16 · minSdk 31 · targetSdk 36 · same keystore as 0.4.1 — installs as an update over 0.4.0 / 0.4.1 without losing your library, playlists, favorites or settings.

This release combines everything since 0.4.0 (Vyāpti) and 0.4.1 (Dṛṣṭi) into one expansion: Qobuz streaming, a per-output picker, casting, DSD512 / DSD1024, DAC tools, scan-speed improvements, the volume rewrite, and a long fix list.


✨ New — 🎵 Qobuz streaming

  • 🎵 Stream the Qobuz catalogue with your own Studio or Sublime account. Search tracks and play them lossless (FLAC) or Hi-Res (24-bit) over Wi-Fi or mobile data. On a USB DAC running Android 14+, playback uses Media3's bit-perfect mixer attribute to reclock the DAC to the exact track rate; older Android or non-USB outputs go through the standard high-quality mixer (still lossless, not down-mixed). Note: track search only — album / artist / playlist browsing and favorites sync are not in this release.
  • 🔐 Browser-based sign-in via WebView — "Sign in with Qobuz" opens play.qobuz.com/login inside the app, you type your Qobuz email and password into Qobuz's own page, and the app captures your user_auth_token from the response. No password is ever stored; only the auth token is persisted, encrypted at rest in DataStore. App ID and app secret are auto-fetched from Qobuz's web-player bundle on every login (cached per session), so there's nothing to copy-paste — manual override fields are still available in the source settings for power users.
  • 🎚️ Per-source quality picker — MP3 320 kbps, FLAC 16/44.1, Hi-Res 24/96 or Hi-Res 24/192. Your choice drives both streaming and downloads; the engine reclocks the DAC to the exact decoded rate.
  • ⬇️ Download tracks into your own library at your chosen quality. One tap saves the file to Music/AudiophilesDream/Qobuz/<Artist>/<Album>/, embeds full tags (title, artist, album, year, genre, track #, disc #) and the highest-resolution cover art Qobuz offers, and registers it with MediaStore. The library scanner picks it up automatically, so it becomes just another offline track. The downloaded format matches your quality picker setting (MP3 320 for the MP3 tier, FLAC for the others).

✨ New — 🔊 Output, casting & DSD

  • 🎛️ UAPP-style "Audio Output" picker. Settings → Audio Output lets you choose between Internal Hi-Res, Android, Bluetooth and USB. It shows exactly which path is live, and applies the right exclusive / sample-rate strategy for each — so you always know whether you're getting the phone's mixer or the bit-perfect tunnel.
  • 📏 Cap the sample rate per output. A new "Maximum sample rate" setting (No limit / 192 / 96 / 48 kHz) lets you stop the system from up-sampling 44.1 kHz tracks for the phone speaker or Bluetooth — useful on devices that mishandle 192 kHz. The USB bit-perfect path always plays at the true source rate, unaffected.
  • 📡 Cast to TVs, AVRs and network speakers. Sources → "Cast" (or the cast icon on Now Playing) discovers UPnP / DLNA renderers on your Wi-Fi and streams the current track to them — pair it with the existing DLNA Renderer mode to use this phone as a hub.
  • 🔉 "Allow volume on DSD" toggle. Off by default to protect both the bit-perfect DSD path and your ears from full-blast playback on DACs without a useful hardware volume. Turn it on to decode DSD to high-res PCM so the volume keys and slider take effect.
  • 🎛️ DSD output mode selector. Auto, Native, DoP or PCM (Settings → DSD output mode), with a "Force selected mode" override for purists who'd rather hear a fallback than have the engine reroute around it.
  • 🚀 DSD512 and DSD1024 now play. Previously they failed on USB DACs with two error toasts; they're now decoded to high-res PCM through the engine's high-quality DSD-to-PCM path.

✨ New — 🔌 USB & DAC tools

  • 🛡️ Per-DAC quirks table. A single VID:PID line can now override the default DSD mode or hardware-volume choice for a specific model — so one user reporting "my DAC only likes DoP" can fix it for everyone with that DAC in the next build.
  • 📨 "Send DAC report" action (Settings → Logs). One tap composes an email with your DAC's USB descriptor fingerprint (vendor, product, USB Audio class, hardware capabilities, current volume mode) plus the most recent native-engine logs. A model-specific fix can land without you copy-pasting adb logcat.
  • 🔌 "Open automatically when a USB DAC is connected" toggle (Settings → USB Tweaks). Turn it off so plugging in USB-C earphones for a phone call no longer prompts you to open the app or grant access while it's closed — manual playback still picks up the DAC as soon as you start a track.

✨ New — 🎨 UI, widgets & library

  • 🌌 Two new visualizer styles. Aurora paints flowing, layered colour hills across the spectrum; Particles renders a glowing dot-field that follows the music. Tap the visualizer to cycle through all styles.
  • ▶️ Compact Now Playing widget. A slim one-line player for the smallest home-screen cells, with larger, easier-to-tap play / skip / favorite controls so you don't have to aim with a magnifying glass.
  • 🧹 Find and remove duplicate songs. Home → All → ⋯ → "Remove duplicates" detects genuine duplicate recordings (same title, artist and length — not naive filename matches), keeps the highest-quality copy of each, and shows a confirm list of exactly what will be deleted before doing anything.
  • 🎚️ One Now Playing volume slider that always tells the truth. It drives the DAC's hardware volume when present, scales the stream in software when not, and hides only for bit-perfect 1-bit DSD (where you should use the DAC's own control). The slider, the volume keys and the on-screen level always agree.
  • 🗑️ Image-cache control. Settings → Storage shows the current image-cache size with a one-tap "Clear image cache" that frees online-cover thumbnails. Your tracks, edited covers and downloaded art stay untouched.
  • ⬆️ In-app updates. When a newer build is published on GitHub the app offers to download and install it for you with a progress bar. "Skip" silences that one version; "Later" re-asks on next launch.
  • 🗂️ Filter and sort every source. Folders/files only, radio by quality (128 / 320 kbps+), and sort by type, name, size, duration or bitrate. Your preference is remembered per source.
  • 📋 File size in Track Details on every screen that opens the sheet.

⚡ Improved — 📚 Library scan

  • Rescan is near-instant after the first one. The manual Rescan button now does the same incremental diff the background watcher already does: unchanged tracks are reused as-is, only added / modified / removed ones do real work. A 5,000-track library that hasn't changed finishes in the blink of an eye.
  • 🧠 External tag edits are detected too. If you re-tag a file in another editor and its modified time bumps, the next rescan picks up the new metadata instead of stubbornly serving the old cached values.
  • ⏱️ First-run scan is meaningfully faster. Embedded cover art is skipped when Android already has album art cached (same image, no quality loss); the tag-read pool now uses up to 8 cores on modern phones; the auto-watcher reacts to new files in under half a second instead of 1.5 s.

⚡ Improved — 🎚️ Volume & loudness

  • 🎚️ The slider finally attenuates Qobuz, Tidal and every other streamed track on a USB DAC. Previously the bit-perfect AudioTrack ignored everything except near-zero, so the slider behaved like a step function — silent below ~12 %, full above. The taper now lives inside the audio chain as per-sample software gain on 16-, 24-, 32-bit integer PCM and 32-bit float, so every position from mute to unity is honoured. 100 % is still strict passthrough — bit-perfect at unity is preserved.
  • 📐 Natural perceptual (dB-linear) volume law across both the USB and Android paths. Quiet settings finally feel quiet instead of mostly-silent-then-blast, and 100 % is always exact bit-perfect unity.
  • 🎛️ Reliable USB volume on every DAC. The app now scales in software by default — deterministic, identical on the left and right channels — so DACs whose volume control does nothing, only mutes, or unbalances the channels behave correctly out of the box. A new "Use DAC hardware volume" opt-in (off by default) routes through the DAC's own bit-perfect analog volume for models known to do it well.

⚡ Improved — 📊 Visualizer, scrobbling & UI

  • 📊 Butter-smooth, frame-synced visualizer. It now redraws on every display frame (90 / 120 Hz aware) and eases between audio frames, so motion never looks laggy or steppy — with snappier attack on transients.
  • ❤️ Pano Scrobbler / Simple Last.fm / Web Scrobbler can flip your Like from inside their own UI. When they fire a Like back at the song they detected playing, the in-app heart flips locally to match. (The in-app Like stays local-only — it does not push outward to scrobblers.)
  • 🔍 Tapping a search icon focuses the field and opens the keyboard so you can start typing immediately.
  • 📱 Landscape is usable everywhere. Navigation moves to a side rail (freeing vertical space) and the Now Playing screen scrolls with a right-sized cover instead of clipping its controls off-screen.

🛠️ Fixed — ▶️ Playback reliability

  • ▶️ Play / Pause no longer gets stuck after a local-to-streaming handoff. After playing a local FLAC (native USB engine) and then switching to a Qobuz / SoundCloud / WebDAV stream (Exo engine), the next tap on the play button was routing to a torn-down native engine and doing nothing — the button looked dead until you killed the app. It now consults live engine state, so subsequent taps drive the right player every time. Bonus: tapping play on an empty queue no longer flips the icon to "playing" for half a second.
  • ▶️ Play sometimes did nothing right after opening the app. Skip would change the displayed track but it stayed paused, no sound, until you force-closed and reopened. The player now re-prepares itself when it was left idle by a cold start or a transient media error.
  • 👆 No more next / prev races. Rapid taps are now serialised so the last tap always lands on the right track, instead of leap-frogging or skipping past your destination.
  • 💥 Safer handling of corrupt files. Malformed DSF / DFF / WAV / AIFF / ALAC files are rejected cleanly instead of risking a native crash, and engine teardown no longer races the decoder thread on fast track switches.

🛠️ Fixed — 🎵 DSD & USB

  • 🎵 DSD on narrow-clock USB DACs no longer crackles or plays white noise. The engine now checks each candidate PCM rate against the DAC's reported clock sub-ranges before asking it to reprogram, so picking a DSD-to-PCM rate no longer rapidly reclocks (and glitches) budget DACs — they settle straight on a supported rate.
  • 🎚️ DSD64 decoded to 44.1 kHz no longer crackles on DACs that only accept 44.1 kHz output. The anti-alias filter is now twice as long when DSD64 lands on a low PCM rate, so its in-band noise shaping is suppressed cleanly instead of leaking through as audible crackle.
  • 🎵 DSD256 over USB no longer crackles. The engine now services the DAC's asynchronous feedback endpoint and paces playback to the DAC's true clock instead of the phone's nominal one.
  • 🔇 DSD256 plays cleanly on DACs that render native DSD256 as noise. Auto mode now decodes it to high-res PCM through the engine's high-quality path, while still preferring native DSD for DSD64 / DSD128.
  • Bit-perfect, guaranteed. If your DAC can't lock to a track's exact rate the engine falls back cleanly instead of streaming harsh noise; the bit-perfect badge only lights when the DAC truly is; EQ and tone effects are bypassed while bit-perfect so the DAC gets untouched audio.
  • 🔌 Clean USB unplug. Pulling the DAC mid-track now stops playback cleanly and releases the USB interface, instead of leaving the player wedged with the connection still held.

🛠️ Fixed — 🎚️ Volume & DSD volume

  • 🔉 All playback no longer too quiet without a USB DAC. The in-app volume now only attenuates on a USB DAC (whose exclusive route bypasses the phone's volume); on the phone speaker and Bluetooth, your normal Android volume keys govern loudness at full quality. A level set while a DAC was attached can no longer silently quiet internal playback later.
  • 🧹 Duplicate volume control on DSD (and other tracks) without a DAC removed. The in-app slider no longer appears alongside the system volume bar for phone-speaker / Bluetooth output — exactly one control, and the volume keys respond instantly.
  • 🎚️ DSD tracks no longer stuck at a low level (or full blast) when the volume slider was hidden — output level, slider visibility and key handling are now decided once from a single source of truth, so a level set on one DAC no longer carries over silently to a different stream.
  • 🔉 Volume control on DSD (with "Allow volume on DSD" on) had no effect between 1 % and 100 % on DACs whose hardware volume is cosmetic — only 0 was silent. The decoded-to-PCM stream is now attenuated in software so the slider and volume keys work across the whole range.

🛠️ Fixed — 📚 Library, navigation & UI

  • 🗑️ Deleting a track no longer crashes the app, and the file actually leaves internal storage. The Delete action was routing every URI through MediaStore.createDeleteRequest, which threw IllegalArgumentException: All requested items must be referenced by specific ID for SAF tree-document URIs (the kind you get when you point the app at a folder via the system picker), taking the whole library screen down. Delete now handles all three URI types — MediaStore audio items via the OS delete dialog, SAF documents via DocumentsContract.deleteDocument, plain file:// paths via direct file removal — and each branch is wrapped so one bad URI can never crash the UI again. Multi-select delete and the duplicate-finder cleanup use the same path.
  • 🔀 Shuffle no longer stops after only a handful of tracks. The fresh shuffle order now pins the track you tapped at position 0 and randomises the rest behind it. Previously DefaultShuffleOrder(count, seed) built a random permutation where the tapped track could land anywhere — including near the end — so ExoPlayer's auto-advance ran off the end after the few tracks that happened to sit to its right.
  • 🔁 Up Next panel no longer "shrinks" or appears to delete the songs above the playing track when shuffle is on. The panel was rendering queue.drop(currentIndex), so every random forward jump made the list look shorter. With shuffle on it now rotates the full queue with the playing track at the top; non-shuffle keeps the linear current-and-below view. Manual reorder is suppressed in shuffle mode (the visible rotation isn't the play order).
  • 📑 Library tab survives opening an album or artist and pressing back. The tab was stored in a plain remember slot, which is destroyed when Library leaves composition for the album/artist route — so back-nav always landed on "All". It now uses rememberSaveable, so the last-viewed tab (and configuration changes) are restored.
  • ☑️ Multi-select on the Smart tab. Select all, Play, Play next, Add to queue and Add to playlist now act on the smart picks instead of doing nothing.
  • ⬅️ Back from Lyrics returns to the player, not all the way out to the library — both the system back-gesture and the top-left arrow.
  • 📂 "Internal Storage" in Sources now opens the Folders browser when tapped (it was a no-op).
  • 📈 Stats counts your plays, listening time and top artists / tracks even when scrobbling is turned off.
  • 💬 DSD fallback notice is now a real dialog — readable, dismissible, silenceable — instead of a toast flying past.
  • 📋 Readable file names in Track Details. The "File name" row now shows just the file (e.g. 01 Song.flac) instead of a raw content:// URI or a cryptic /proc/self/fd/N path.
  • 📁 Track Details "Location" shows the real on-device folder path instead of a content:// link.

📦 Artifacts (sha256)

APK Size SHA-256
AudiophilesDream-0.4.2-arm64-v8a.apk 66.86 MB eac75bffa5e694cdedc481ab11f3a190504ea273baaa647f28549f632db4b803
AudiophilesDream-0.4.2-armeabi-v7a.apk 66.30 MB 9c8d4e57a0c46b96ffc6e5b5d9873c0bdd3a58ed5f760c5d7c02bd8e3ddac86d
AudiophilesDream-0.4.2-universal.apk 68.13 MB 2a65d9a29f69b5ed251a9cd539f095e3dcbb7c4be7a68aff5a4bde4d9cd01a14

Pick arm64-v8a for any phone made since 2017 (smaller, faster). Use universal only if you're unsure of your device's CPU. armeabi-v7a is for legacy 32-bit-only devices.

Same signing key as 0.4.0 / 0.4.1 — Android will install this directly on top with no data loss.