@@ -689,6 +689,8 @@ class MusicService : BaseService(), Playback, MusicEventCallback,
689
689
override fun onPrepared (mp : MediaPlayer ? ) {
690
690
Timber .v(" 准备完成:%s" , firstPrepared)
691
691
692
+ prepared = true
693
+
692
694
if (firstPrepared) {
693
695
firstPrepared = false
694
696
if (lastProgress > 0 ) {
@@ -867,6 +869,10 @@ class MusicService : BaseService(), Playback, MusicEventCallback,
867
869
*/
868
870
override fun play (fadeIn : Boolean ) {
869
871
Timber .v(" play: $fadeIn " )
872
+ if (! prepared) {
873
+ ToastUtil .show(this , getString(R .string.buffering_wait))
874
+ return
875
+ }
870
876
audioFocus = AudioManagerCompat .requestAudioFocus(
871
877
audioManager,
872
878
focusRequest
@@ -1459,7 +1465,7 @@ class MusicService : BaseService(), Playback, MusicEventCallback,
1459
1465
private fun prepare (song : Song , requestFocus : Boolean = true) {
1460
1466
tryLaunch(
1461
1467
block = {
1462
- Timber .v(" 准备播放 : %s" , song)
1468
+ Timber .v(" prepare start : %s" , song)
1463
1469
if (TextUtils .isEmpty(song.data)) {
1464
1470
ToastUtil .show(service, getString(R .string.path_empty))
1465
1471
return @tryLaunch
@@ -1486,8 +1492,7 @@ class MusicService : BaseService(), Playback, MusicEventCallback,
1486
1492
mediaPlayer.playbackParams = PlaybackParams ().setSpeed(speed)
1487
1493
}
1488
1494
mediaPlayer.prepareAsync()
1489
- prepared = true
1490
- isLove = withContext(Dispatchers .IO ) {
1495
+ isLove = song.isLocal() && withContext(Dispatchers .IO ) {
1491
1496
repository.isMyLove(playQueue.song.id)
1492
1497
.onErrorReturn {
1493
1498
false
@@ -1503,11 +1508,18 @@ class MusicService : BaseService(), Playback, MusicEventCallback,
1503
1508
}
1504
1509
1505
1510
private suspend fun setDataSource (song : Song ) = withContext(Dispatchers .IO ) {
1511
+ Timber .v(" setDataSource: ${song.data} " )
1506
1512
if (song.isLocal()) {
1507
1513
mediaPlayer.setDataSource(this @MusicService, song.contentUri)
1508
1514
} else if (song is Song .Remote ) {
1515
+ val start = System .currentTimeMillis()
1509
1516
mediaPlayer.setDataSource(this @MusicService, song.contentUri, song.headers)
1510
- retrieveRemoteSong(song, playQueue.song as Song .Remote )
1517
+ Timber .v(" setDataSource spend: ${System .currentTimeMillis() - start} " )
1518
+
1519
+ // 可能会特别耗时
1520
+ launch(Dispatchers .IO ) {
1521
+ retrieveRemoteSong(song, playQueue.song as Song .Remote )
1522
+ }
1511
1523
}
1512
1524
}
1513
1525
@@ -1537,7 +1549,11 @@ class MusicService : BaseService(), Playback, MusicEventCallback,
1537
1549
ToastUtil .show(service, R .string.song_lose_effect)
1538
1550
return
1539
1551
}
1540
- isPlaying = true
1552
+ // 不能在这里设置playing,因为远程的歌曲可能需要缓冲,并且这里需要提前刷新下界面
1553
+ if (playQueue.song.isRemote()) {
1554
+ uiHandler.sendEmptyMessage(UPDATE_META_DATA )
1555
+ }
1556
+
1541
1557
prepare(playQueue.song)
1542
1558
}
1543
1559
@@ -2057,10 +2073,7 @@ class MusicService : BaseService(), Playback, MusicEventCallback,
2057
2073
if (bitmap == null || bitmap.isRecycled) {
2058
2074
return null
2059
2075
}
2060
- var config: Bitmap .Config ? = bitmap.config
2061
- if (config == null ) {
2062
- config = Bitmap .Config .RGB_565
2063
- }
2076
+ val config: Bitmap .Config = bitmap.config
2064
2077
return try {
2065
2078
bitmap.copy(config, false )
2066
2079
} catch (e: OutOfMemoryError ) {
@@ -2071,6 +2084,8 @@ class MusicService : BaseService(), Playback, MusicEventCallback,
2071
2084
}
2072
2085
2073
2086
fun retrieveRemoteSong (song : Song .Remote , targetSong : Song .Remote ) {
2087
+ Timber .v(" retrieveRemoteSong: ${song.data} " )
2088
+ val start = System .currentTimeMillis()
2074
2089
val metadataRetriever = MediaMetadataRetriever ()
2075
2090
try {
2076
2091
metadataRetriever.setDataSource(song.data, song.headers)
@@ -2115,8 +2130,9 @@ class MusicService : BaseService(), Playback, MusicEventCallback,
2115
2130
dateModified
2116
2131
)
2117
2132
} catch (e: Exception ) {
2118
- Timber .v(" fail to retrieve : $e " )
2133
+ Timber .v(" fail to retrieveRemoteSong data: ${song.data} detail : $e " )
2119
2134
} finally {
2135
+ Timber .v(" retrieveRemoteSong spend:${System .currentTimeMillis() - start} ${song.data} " )
2120
2136
metadataRetriever.release()
2121
2137
}
2122
2138
}
0 commit comments