mirror of
https://github.com/austinried/subtracks.git
synced 2026-11-10 15:11:58 +01:00
The app-thread transition callback was only ever a stopgap: media3 posts it after the playback thread has already rendered, so the first buffers of a new item could be scaled by the previous item's gain. media3 forwards the playback timeline and the current period to AudioProcessor.flush, and DefaultAudioSink flushes the processors on every sink configuration, which happens at each media item transition even when the format is unchanged. That is early enough to set the gain before any of the new item's buffers are processed, on the playback thread. See androidx/media#418. The processor resolves the period back to its MediaItem and reports it, so the gain maths and the preferences stay in ReplayGainController. That controller is now written from two threads, so its state is volatile. The transition callback stays as the fallback for a flush that carries no period: without it a stale gain would persist for a whole track rather than for a few milliseconds.