@@ -22,6 +22,7 @@ import kohii.v1.core.MemoryMode.HIGH
2222import kohii.v1.core.MemoryMode.INFINITE
2323import kohii.v1.core.MemoryMode.LOW
2424import kohii.v1.core.MemoryMode.NORMAL
25+ import kohii.v1.debugOnly
2526import kohii.v1.internal.PlayerParametersChangeListener
2627import kohii.v1.logInfo
2728import kohii.v1.logWarn
@@ -41,7 +42,7 @@ abstract class AbstractPlayable<RENDERER : Any>(
4142 private var playRequested: Boolean = false
4243
4344 override fun toString (): String {
44- return " Playable([t=$tag ][b=$bridge ][h=${super . hashCode()} ])"
45+ return " Playable([t=$tag ][b=$bridge ][h=${hashCode()} ])"
4546 }
4647
4748 // Ensure the preparation for the playback
@@ -89,6 +90,7 @@ abstract class AbstractPlayable<RENDERER : Any>(
8990 }
9091
9192 override fun isPlaying (): Boolean {
93+ " Playable#isPlaying $this " .logInfo()
9294 return bridge.isPlaying()
9395 }
9496
@@ -102,12 +104,12 @@ abstract class AbstractPlayable<RENDERER : Any>(
102104 val newManager = field
103105 if (oldManager == = newManager) return
104106 " Playable#manager $oldManager --> $newManager , $this " .logInfo()
107+ oldManager?.removePlayable(this )
108+ newManager?.addPlayable(this )
109+ // Setting Manager to null.
105110 if (newManager == null ) {
106111 master.trySavePlaybackInfo(this )
107- master.tearDown(
108- playable = this ,
109- clearState = if (oldManager is Manager ) ! oldManager.isChangingConfigurations() else true
110- )
112+ master.tearDown(playable = this )
111113 } else if (oldManager == = null ) {
112114 master.tryRestorePlaybackInfo(this )
113115 }
@@ -120,15 +122,7 @@ abstract class AbstractPlayable<RENDERER : Any>(
120122 val newPlayback = field
121123 if (oldPlayback == = newPlayback) return
122124 " Playable#playback $oldPlayback --> $newPlayback , $this " .logInfo()
123- if (oldPlayback != null ) {
124- bridge.removeErrorListener(oldPlayback)
125- bridge.removeEventListener(oldPlayback)
126- oldPlayback.removeCallback(this )
127- if (oldPlayback.playable == = this ) oldPlayback.playable = null
128- if (oldPlayback.playerParametersChangeListener == = this ) {
129- oldPlayback.playerParametersChangeListener = null
130- }
131- }
125+ oldPlayback?.let (::detachFromPlayback)
132126
133127 this .manager = if (newPlayback != null ) {
134128 newPlayback.manager
@@ -150,30 +144,50 @@ abstract class AbstractPlayable<RENDERER : Any>(
150144 }
151145 }
152146
153- if (newPlayback != null ) {
154- newPlayback.playable = this
155- newPlayback.playerParametersChangeListener = this
156- newPlayback.addCallback(this )
157- newPlayback.config.callbacks.forEach { callback -> newPlayback.addCallback(callback) }
158-
159- bridge.addEventListener(newPlayback)
160- bridge.addErrorListener(newPlayback)
161-
162- if (newPlayback.tag != Master .NO_TAG ) {
163- if (newPlayback.config.controller != null ) {
164- master.plannedManualPlayables.add(newPlayback.tag)
165- } else {
166- master.plannedManualPlayables.remove(newPlayback.tag)
167- }
168- }
169- }
147+ newPlayback?.let (::attachToPlayback)
170148
171149 master.notifyPlaybackChanged(this , oldPlayback, newPlayback)
172150 }
173151
174152 override val playerState: Int
175153 get() = bridge.playerState
176154
155+ private fun attachToPlayback (playback : Playback ) {
156+ playback.playable = this
157+ playback.playerParametersChangeListener = this
158+ playback.addCallback(this )
159+ playback.config.callbacks.forEach { callback -> playback.addCallback(callback) }
160+
161+ bridge.addEventListener(playback)
162+ bridge.addErrorListener(playback)
163+
164+ if (playback.tag != Master .NO_TAG ) {
165+ if (playback.config.controller != null ) {
166+ master.plannedManualPlayables.add(playback.tag)
167+ } else {
168+ master.plannedManualPlayables.remove(playback.tag)
169+ }
170+ }
171+ }
172+
173+ private fun detachFromPlayback (playback : Playback ) {
174+ bridge.removeErrorListener(playback)
175+ bridge.removeEventListener(playback)
176+ playback.removeCallback(this )
177+ debugOnly {
178+ check(playback.playable == = this ) {
179+ """
180+ Old playback of this playable ($this ) is
181+ bound to a different playable: ${playback.playable}
182+ """ .trimIndent()
183+ }
184+ }
185+ if (playback.playable == = this ) playback.playable = null
186+ if (playback.playerParametersChangeListener == = this ) {
187+ playback.playerParametersChangeListener = null
188+ }
189+ }
190+
177191 // Playback.Callback
178192
179193 override fun onActive (playback : Playback ) {
0 commit comments