EspoirX/StarrySky

播放回调状态不对

jp0533 opened this issue · 2 comments

你好,我在使用StarrySky框架加载本地文件的时候使用了拦截器对本地文件进行处理,然后在播放处理后的文件时出现播放正常但StarrySky框架回调不对导致页面未刷新的情况,我的代码如下:

  1. 拦截器处理本地文件:
    `
    class MyInfoInterceptor() : StarrySkyInterceptor {

    override fun process(
    songInfo: SongInfo?,
    mainLooper: MainLooper,
    callback: InterceptorCallback
    ) {
    log { "MusicPlayerDetailActivity --> 处理前的音频文件路径: ${songInfo?.songUrl}" }
    // 此处对文件进行处理,操作是下载网络文件,具体过程代码忽略,完成后将本地文件路径赋值给SongInfo
    val filePath = ""
    log { "MusicPlayerDetailActivity --> 处理后的音频文件路径: ${filePath}" }
    songInfo?.apply { songUrl = filePath }
    log { "MusicPlayerDetailActivity --> 文件已下载 ${songInfo?.toJson()}" }
    callback.onContinue(songInfo)
    }
    }
    `

  2. 在ExoPlayback回调中断点调试
    `
    private inner class ExoPlayerEventListener : Player.EventListener {
    ... // 未处理的回调
    override fun onPlayerStateChanged(playWhenReady: Boolean, playbackState: Int) {
    when (playbackState) {
    Player.STATE_IDLE, Player.STATE_BUFFERING, Player.STATE_READY ->
    mCallback?.onPlaybackStatusChanged(currPlayInfo, playbackState)
    Player.STATE_ENDED -> mCallback?.onPlaybackCompletion()
    }
    if (playbackState == Player.STATE_READY) {
    sourceTypeErrorInfo.clear()
    }
    }

     override fun onPlayerError(error: ExoPlaybackException) {
         val what: String = when (error.type) {
             ExoPlaybackException.TYPE_SOURCE -> error.sourceException.message.toString()
             ExoPlaybackException.TYPE_RENDERER -> error.rendererException.message.toString()
             ExoPlaybackException.TYPE_UNEXPECTED -> error.unexpectedException.message.toString()
             else -> "Unknown: $error"
         }
         mCallback?.onPlaybackError(currPlayInfo, "ExoPlayer error $what")
         if (error.type == ExoPlaybackException.TYPE_SOURCE) {
             sourceTypeErrorInfo.happenSourceError = true
             sourceTypeErrorInfo.seekToPositionWhenError = sourceTypeErrorInfo.seekToPosition
             sourceTypeErrorInfo.currPositionWhenError = currentStreamPosition
         }
     }
    
     ... // 未处理的回调
    

    }
    其中onPlayerStateChanged回调中我看框架代码并没有区别处理,而ExoPlayer中的说明如下:
    /**

    • The player is able to immediately play from its current position. The player will be playing if
    • {@link #getPlayWhenReady()} is true, and paused otherwise.
      */
      int STATE_READY = 3;
      `
      此处应该是如果playbackState为3时要区分playWhenReady,如果playWhenReady为true时应该会立即播放,playWhenReady为false的话播放器应该会暂停, 然后我追踪代码到PlaybackManager类中第110行updatePlaybackState方法,此处因为对框架代码不熟悉,有点看不懂调用关系,我看框架没有提供自定义IPlaybackManager的功能,不知道这里如果要调试修改的话应该怎么处理,或者这里框架内部已经处理了上述的不同情况。
      如方便的话可否指点下应该怎么修改代码,或者框架的处理逻辑是对的,我哪里没有配置对么?盼回复,谢谢。
      PS:使用的框架版本号是2.4.4

好,不久后会更新一个版本,到时候通知

请用2.4.5版本,有问题欢迎进行反馈