TTMusic采用了分层架构设计,主要包含以下核心组件:
应用启动时:
UnifiedPlayerService.getInstance() 获取单例实例initialize(context) 进行初始化播放器初始化:
PlayerManager.initialize() 初始化ijkplayersetupIjkPlayerOptions() 配置播放器选项setupPlayerCallbacks() 设置播放器回调AVSession初始化:
AvSessionController.getInstance() 获取系统媒体会话控制器initAvSession() 初始化系统媒体会话registerControlCommands() 注册系统控制命令用户触发播放:
服务就绪检查:
isAllServicesReady() 检查所有服务是否就绪waitForAllServicesReady() 等待服务初始化完成获取当前歌曲:
playlistModel.getCurrentSong() 获取当前歌曲播放器状态检查:
canResumeFromPause() 检查是否可以从暂停状态恢复resumeFromPause()设置播放器:
setupPlayerForSong() 为当前歌曲配置播放器ijkPlayer.reset() 重置播放器状态ijkPlayer.setDataSource() 设置数据源ijkPlayer.setDataSourceHeader() 设置HTTP请求头准备播放:
ijkPlayer.prepareAsync() 异步准备播放器onPrepared() 回调开始播放:
onPrepared() 回调中ijkPlayer.start() 开始播放onPlaybackStarted() 回调状态更新:
stateModel.updatePlayingState(true) 更新播放状态startProgressTimer() 启动进度定时器saveCurrentState() 保存当前状态updateSessionPlayState() 更新系统媒体会话状态用户触发暂停:
保存播放位置:
savePlaybackPosition() 保存当前播放位置暂停播放器:
playerManager.pausePlayback() 暂停播放器ijkPlayer.pause()更新状态:
stateModel.updatePlayingState(false) 更新播放状态为暂停stopProgressTimer() 停止进度定时器saveCurrentState() 保存播放状态updateSessionPlayState() 更新系统媒体会话状态用户触发下一首:
服务就绪检查:
isAllServicesReady() 检查服务是否就绪播放列表导航:
playlistModel.hasNext() 检查是否有下一首playlistModel.moveToNext() 移动到下一首更新状态模型:
停止当前播放:
stopSilently() 静默停止当前播放播放新歌曲:
playNewSongDirectly() 直接播放新歌曲setupPlayerForSong() 和 ijkPlayer.prepareAsync()用户触发上一首:
流程与下一首类似:
playlistModel.hasPrevious() 和 playlistModel.moveToPrevious())PlayerManager回调:
onPrepared(): 播放器准备完成onPlaybackStarted(): 播放开始onPlaybackCompleted(): 播放完成onPlaybackError(): 播放错误PlayerStateModel状态更新:
updatePlayingState(): 更新播放状态updateLoadingState(): 更新加载状态updateProgress(): 更新播放进度updateCurrentSong(): 更新当前歌曲状态监听通知:
notifyStateChanged(): 通知状态变化notifyProgressChanged(): 通知进度变化notifySongChanged(): 通知歌曲变化进度定时器:
setupProgressTimer() 设置进度定时器updateProgress() 更新进度进度获取:
ijkPlayer.getCurrentPosition() 获取当前播放位置ijkPlayer.getDuration() 获取总时长进度保存:
savePlaybackPosition() 保存播放位置创建会话:
avSession.createAVSession() 创建系统媒体会话设置元数据:
setAVMetadataMusic() 设置音乐元数据设置播放状态:
setAvSessionPlayState() 设置播放状态命令监听:
setAvSessionListener() 设置系统控制监听器命令处理:
startPlayOrResumePlay()添加歌曲:
addSong() 添加单首歌曲addSongs() 添加多首歌曲移除歌曲:
removeSong() 移除歌曲替换播放列表:
replaceSongs() 替换整个播放列表播放模式类型:
PlayMode.SEQUENCE: 顺序播放PlayMode.SINGLE_REPEAT: 单曲循环PlayMode.NORMAL: 正常播放PlayMode.RANDOM: 随机播放播放模式切换:
setPlayMode() 设置播放模式getPlayMode() 获取当前播放模式播放状态保存:
saveCurrentState() 保存当前播放状态播放位置保存:
savePlaybackPosition() 保存播放位置从内存恢复:
fastRestoreFromMemory() 从AppStorage快速恢复从持久化存储恢复:
restorePersistedState() 从持久化存储恢复状态播放位置恢复:
restorePlaybackPosition() 恢复播放位置PlayerErrorType.INITIALIZATION_ERROR: 初始化错误PlayerErrorType.PLAYBACK_ERROR: 播放错误PlayerErrorType.NETWORK_ERROR: 网络错误PlayerErrorType.FILE_NOT_FOUND: 文件未找到PlayerErrorType.AUDIO_FOCUS_ERROR: 音频焦点错误错误处理:
handlePlaybackError() 处理播放错误executeRecoveryAction() 执行恢复动作恢复动作:
TTMusic的播放流程采用了分层架构设计,通过UnifiedPlayerService提供统一的播放控制接口,底层使用ijkplayer进行实际的音频解码和播放。整个播放流程包括初始化、播放控制、状态管理、系统媒体会话控制、播放列表管理、数据持久化和错误处理等环节,形成了一个完整的音乐播放器系统。
系统通过状态模型、播放列表模型和播放器管理器的协同工作,实现了复杂的播放控制逻辑,同时通过AVSessionController与系统媒体控制进行集成,提供了系统级的媒体控制体验。