summaryrefslogtreecommitdiff
path: root/app/build.gradle.kts
diff options
context:
space:
mode:
authorPeter Stone <thepeterstone@gmail.com>2026-10-05 08:57:59 +0000
committerPeter Stone <thepeterstone@gmail.com>2026-10-05 08:57:59 +0000
commit7cc88394458e9d03e3a6a6e58cdff9c8dd4ad7a3 (patch)
tree7e9980f718b10c49895d1df673001e058f2af117 /app/build.gradle.kts
parent4fb118b2db32f269c5aeb217644dc5e80640c885 (diff)
Find why Tier 3 never confirmed, and port detection to Go
Peter's report: the phone runs hot, uses a lot of battery, playback takes a moment to start, and intelligent skipping has never done anything. **The hot phone and the dead detection were one bug.** The candidate search correlated 117 window positions against the whole of the other clip, re-transforming that unchanged clip every time -- 199 seconds per episode end, measured on a desktop, so minutes more on a phone. FingerprintWorker is a plain WorkManager worker, Android stops one at ten minutes, and nothing was persisted until a comparison returned. So it was killed mid-flight, saved nothing, and was re-enqueued to start over, forever. IntroOutroDetectorScaleTest is the tripwire whose absence allowed this: the unit tests ran on 300-sample clips while production ran on 1,920,000. Fixed coarse-to-fine, plus AudioCorrelation.prepareTarget so the target clip is transformed once per search rather than 117 times. 10.6x, and a test asserts the chosen reference window is byte-identical to what a full-resolution search picks. **Midroll detection could never have run at all.** decodeFull buffered a whole episode at its native rate -- 434MB for a 13-minute episode, no largeHeap -- to produce 6MB of 8kHz mono. It threw OutOfMemoryError into a swallowing runCatching and the episode was then marked checked forever. MonoResampler now streams the decode so the peak allocation is the output, and maxDecodableMs skips a longer episode before spending anything and without marking it checked. **Detection is moving to a server**, Peter's call, in Go to match podkit and doot. server/ holds the ported core, verified three ways because this is the second port of this maths and the first shipped a normalization bug: numpy's literals extracted mechanically from AudioCorrelationTest, the FFT against a direct DFT, and the whole correlation path against a brute-force Pearson. On four real Radiolab episodes it confirms the intro on 4 of 4, at 48.0s, 8.65s, 8.65s and 65.15s -- the varying pre-roll, observed in working code at last. skips.SelfCheck verifies located segments against *each other* rather than against the reference, which is a different claim: correlation is not transitive, so two segments can each clear 0.6 against a reference and be unrelated. It rejected the outro on its first real run (r=0.746), withholding offsets that would have ended three episodes early. Offsets are published only when they verify. Also: the episode screen gets a working scrubber with ad-break marks and a declared-versus-measured length readout, queue rows open the episode instead of doing nothing, PrepareTrace logs playback-start timing against episode length for the still-open pause question, and -PphoneOnly drops the emulator's CPython from a sideload build (114MB -> 99MB). Full history and numbers in docs/detection-findings.md. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_018AwnALZL6bD4VBtATDVv3B
Diffstat (limited to 'app/build.gradle.kts')
-rw-r--r--app/build.gradle.kts15
1 files changed, 14 insertions, 1 deletions
diff --git a/app/build.gradle.kts b/app/build.gradle.kts
index bc8c4bd..36d6038 100644
--- a/app/build.gradle.kts
+++ b/app/build.gradle.kts
@@ -65,7 +65,20 @@ android {
ndk {
// CPython ships as native code, so every ABI included multiplies the APK size.
// arm64 is the phone; x86_64 is the emulator.
- abiFilters += listOf("arm64-v8a", "x86_64")
+ //
+ // `-PphoneOnly` drops the emulator's copy: measured at 114MB -> 99MB, so 15MB and
+ // not the halving it looks like it should be. The APK is dominated by 72MB of
+ // unminified debug dex, with Chaquopy's assets and one ABI's CPython adding ~25MB
+ // between them; shrinking it meaningfully means R8 on a debug build, not ABIs.
+ //
+ // Not the default: a build with no flag has to stay installable on the emulator too,
+ // or it stops being usable by whoever forgets. Pass it for a build only the phone
+ // will ever install.
+ abiFilters += if (project.hasProperty("phoneOnly")) {
+ listOf("arm64-v8a")
+ } else {
+ listOf("arm64-v8a", "x86_64")
+ }
}
}