The ask
Ambient soundscapes: rain, a fireplace, room tone, playing UNDER the audiobook.
Split out of #11, which keeps the visual visualizer work. Jeff wants both and
understands the drawbacks.
Why this is its own issue
A visualizer reads the audio. This one ADDS audio. Different pipeline, different
risks, different reasons it could get cancelled. Bundling them would have meant
one of them holding the other hostage.
Jeff's standing rule, 2026-08-24, non-negotiable here
- Ships OFF by default.
- One easy toggle to enable.
- Labeled with what it is, what it does, and what it costs, battery included, in
plain words.
- Disabling it actually stops the work.
The traps, in the order they will bite
1. The sleep timer. This is the one that will ship broken if nobody names it
now. SleepTimerManager pauses the book at zero. If the soundscape is a separate
player, rain keeps falling all night, on someone who fell asleep, draining a
phone that is probably not on a charger. The soundscape has to be bound to the
same lifecycle as playback: book pauses, soundscape pauses. Book stops,
soundscape stops. Including the motion grace window and shake-to-reset paths, not
just the simple one.
2. One media session, not two. PlaybackService is a Media3
MediaLibraryService and it owns the notification, the lock screen, and Android
Auto. The soundscape must NOT be a second MediaSession. Two sessions means two
notifications, a confused lock screen, Bluetooth buttons hitting the wrong one,
and Android Auto showing something nonsensical. Mix it into the existing playback
path or run it as a plain secondary ExoPlayer with no session attached.
3. Licensing, and this project already has a rule about it. Only legally
redistributable audio ships. Same line that governs the demo server at
abs.statichum.studio, where only redistributable audio is allowed because
reviewer credentials go to Google. CC0 or public domain sources, with provenance
recorded in the repo, or it does not ship.
Worth considering instead: synthesize them. Rain and room tone are filtered
noise. A fireplace is filtered noise plus randomized crackle transients. Doing it
procedurally dodges licensing completely, keeps the APK from gaining tens of
megabytes of loops, and never loops audibly. More DSP work, much less legal and
size work.
4. Volume balance. The soundscape needs its own level, independent of the
book, or it is useless. Someone who wants rain at 15% under a narrator does not
want to ride the system volume.
5. APK size, if it ships as files rather than synthesis. Nine Lives is
currently a small app and that is part of the pitch.
Gating
Clean unlock candidate. Pure character, zero access impact, nobody is locked out
of their own library by not having rain. Fits the paywall rule exactly, same as
#11.
Post-2.1.0.
The ask
Ambient soundscapes: rain, a fireplace, room tone, playing UNDER the audiobook.
Split out of #11, which keeps the visual visualizer work. Jeff wants both and
understands the drawbacks.
Why this is its own issue
A visualizer reads the audio. This one ADDS audio. Different pipeline, different
risks, different reasons it could get cancelled. Bundling them would have meant
one of them holding the other hostage.
Jeff's standing rule, 2026-08-24, non-negotiable here
plain words.
The traps, in the order they will bite
1. The sleep timer. This is the one that will ship broken if nobody names it
now.
SleepTimerManagerpauses the book at zero. If the soundscape is a separateplayer, rain keeps falling all night, on someone who fell asleep, draining a
phone that is probably not on a charger. The soundscape has to be bound to the
same lifecycle as playback: book pauses, soundscape pauses. Book stops,
soundscape stops. Including the motion grace window and shake-to-reset paths, not
just the simple one.
2. One media session, not two.
PlaybackServiceis a Media3MediaLibraryServiceand it owns the notification, the lock screen, and AndroidAuto. The soundscape must NOT be a second
MediaSession. Two sessions means twonotifications, a confused lock screen, Bluetooth buttons hitting the wrong one,
and Android Auto showing something nonsensical. Mix it into the existing playback
path or run it as a plain secondary
ExoPlayerwith no session attached.3. Licensing, and this project already has a rule about it. Only legally
redistributable audio ships. Same line that governs the demo server at
abs.statichum.studio, where only redistributable audio is allowed becausereviewer credentials go to Google. CC0 or public domain sources, with provenance
recorded in the repo, or it does not ship.
Worth considering instead: synthesize them. Rain and room tone are filtered
noise. A fireplace is filtered noise plus randomized crackle transients. Doing it
procedurally dodges licensing completely, keeps the APK from gaining tens of
megabytes of loops, and never loops audibly. More DSP work, much less legal and
size work.
4. Volume balance. The soundscape needs its own level, independent of the
book, or it is useless. Someone who wants rain at 15% under a narrator does not
want to ride the system volume.
5. APK size, if it ships as files rather than synthesis. Nine Lives is
currently a small app and that is part of the pitch.
Gating
Clean unlock candidate. Pure character, zero access impact, nobody is locked out
of their own library by not having rain. Fits the paywall rule exactly, same as
#11.
Post-2.1.0.