Repository navigation
主要更新
perf: 播放引擎迁移专用线程并接入官方下一曲预加载(eade37f)
- 新增 SPlayerPlayback HandlerThread(THREAD_PRIORITY_AUDIO)作为 ExoPlayer、MediaSession 与 DefaultPreloadManager 的统一 application looper;引擎交互经 runOnPlaybackThread(异步)/onPlaybackThread(同步 latch)收口,公开方法收敛为薄派发层 +
@Synchronized内部实现 - 跨线程读取播放状态改走快照:cachedIsPlaying/cachedIsBuffering/cachedPlaybackRate/lastKnownPositionMs 由 250ms tick 与各 emit 点维持,getLyricPositionMs/getLyricPlaybackRate/getPositionMs 按线程判定返回
- 接入 media3 DefaultPreloadManager:预载下一曲开头 10s(specifiedRangeLoaded 参数为微秒),URL 就绪即调度;起播按 URL 命中复用 PreloadMediaSource 免首帧缓冲,命中后移出管理器避免条目累积
- PlaybackQueue 新增 peekUpcomingTracks(跳过 skipSong、右缘回绕,与 advanceRaw 选曲口径一致)供预加载取下一曲
- syncApiContext/setFftEnabled/setSpectrumAlgorithm 一并收口到播放线程,修复桥线程触达 preloadManager 的线程违规
fix: Service主线程立即升级前台修复FGS启动超时闪退(8613eaf)
- 问题:播放线程迁移后 attachService 异步派发,startForeground 依赖播放线程空闲。playIndexAtInternal 在播放线程 startForegroundService 后,播放线程正被引擎重初始化(ExoPlayer/DefaultPreloadManager 构建)占用,慢环境下超过 FGS 启动时限(Android 14+ 收紧至约 10s),系统抛 ForegroundServiceDidNotStartInTimeException 直接杀主线程导致闪退与设备卡死
- 修复:PlaybackService.onCreate 在主线程先用占位通知立即 startForeground,再异步挂载播放线程,FGS 启动时限与播放线程拥塞彻底解耦;引擎就绪后 updateNotification 仍替换为带 MediaStyle 的完整通知
- PlaybackManager 新增 ensureNotificationChannel(幂等渠道创建)与 buildStartupNotification(占位通知)
- 验证:模拟器与 x86_64 设备冷启动即点歌 + 连续切歌,FATAL/FGS 超时 0 次,startForegroundCount 正常递增,渠道 splayer_playback 挂载 MediaStyle 通知正常
Full Changelog: v1.1.0...v1.1.1