MediaPlayerManager.kt 4.3 KB
Newer Older
范玉宾 committed
1 2 3
package com.yidianling.muse.helper

import android.content.Context
范玉宾 committed
4 5
import android.media.AudioAttributes
import android.media.AudioManager
范玉宾 committed
6
import android.media.MediaPlayer
7 8 9 10 11 12
import io.reactivex.Observable
import io.reactivex.Observer
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.Disposable
import io.reactivex.schedulers.Schedulers
import java.util.concurrent.TimeUnit
范玉宾 committed
13 14 15 16 17 18
import kotlin.properties.Delegates

class MediaPlayerManager private constructor() {

    private var listener:OnMediaPlayerManagerListener?=null

19 20 21
    private var mCurrentListIndex = 0
    private var mAudioPaths = mutableListOf<String>()

范玉宾 committed
22
    private var mMediaId:Long? = null
23
    private var mTime = 0L
范玉宾 committed
24
    private var mTimeOffStatus = false
25 26 27 28

    private var mDisposable:Disposable? = null
    private var mObservable: Observable<Long>? = null
    private var mObserver: Observer<Long>? = null
范玉宾 committed
29 30 31 32 33 34 35

    fun setMediaId(mediaId:Long?){
        mMediaId = mediaId
    }

    fun getMediaId():Long? = mMediaId

36 37
    fun getTimeOff():Long = mTime

范玉宾 committed
38 39 40 41 42 43 44 45 46 47
    fun getTimeOffStatus():Boolean = mTimeOffStatus

    fun setTimeOffStatus(timeOffStatus:Boolean){
        mTimeOffStatus = timeOffStatus
    }

    fun setTimeOff(time:Long){
        mTime = time
    }

48
    fun setAudioPath(path: String){
范玉宾 committed
49 50 51 52 53 54 55

        val attrs = AudioAttributes.Builder()
            .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
            .setUsage(AudioAttributes.USAGE_MEDIA)
            .setLegacyStreamType(AudioManager.STREAM_MUSIC)
            .build()

范玉宾 committed
56
        mPath = path
范玉宾 committed
57
        mMediaPlayer?.reset()
范玉宾 committed
58 59
        mMediaPlayer?.setAudioAttributes(attrs)
        mMediaPlayer?.setDataSource(path)
范玉宾 committed
60 61
        mMediaPlayer?.prepareAsync()
        mMediaPlayer?.setOnPreparedListener {
范玉宾 committed
62 63 64 65
            listener?.onPrepared(it)
        }
    }

范玉宾 committed
66
    fun getMediaPlayer():MediaPlayer?  = mMediaPlayer
范玉宾 committed
67 68 69

    fun getAudioPath():String? = mPath

范玉宾 committed
70
    fun isPlaying() = mMediaPlayer?.isPlaying
范玉宾 committed
71 72

    fun play() {
范玉宾 committed
73 74
        if (mMediaPlayer?.isPlaying == true) return
        mMediaPlayer?.start()
范玉宾 committed
75 76 77
    }

    fun pause() {
范玉宾 committed
78
        if (mMediaPlayer?.isPlaying == true) mMediaPlayer?.pause()
范玉宾 committed
79 80 81
    }

    fun seekTo(position: Int) {
范玉宾 committed
82
        mMediaPlayer?.seekTo(position)
范玉宾 committed
83 84 85
    }

    fun stop() {
范玉宾 committed
86
        mMediaPlayer?.stop()
范玉宾 committed
87 88 89
    }

    fun release() {
范玉宾 committed
90
        mMediaPlayer?.stop()
范玉宾 committed
91 92 93 94 95 96
    }

    fun setOnPreparedListener(listener: OnMediaPlayerManagerListener){
        this.listener = listener
    }

97
    fun initRxTimeOff(time: Long) {
98
        if (time ==null && time <=0){
范玉宾 committed
99
            mDisposable?.dispose()
100 101
        }

102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
        mObservable = Observable.interval(0, 1, TimeUnit.SECONDS)
            .take(time / 1000 + 1)
            .map { t -> time - t * 1000 }
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())

        mObserver = object : Observer<Long> {
            override fun onSubscribe(d: Disposable) {
                mDisposable = d
            }

            override fun onNext(t: Long) {
                mTime = t
            }

            override fun onError(e: Throwable) {

            }

            override fun onComplete() {

            }
        }

        if (mObserver != null && mObserver is Observer<Long>) {
            mObservable?.subscribe(mObserver as Observer<Long>)
        }

        if (mDisposable?.isDisposed == true && mObserver != null && mObserver is Observer<Long>) {
            mObservable?.subscribe(mObserver as Observer<Long>)
        }

    }

136
    fun dispose() {
范玉宾 committed
137
        mTime = 0
138 139 140
        mDisposable?.dispose()
    }

范玉宾 committed
141 142 143 144
    companion object {

        private var mContext: Context by Delegates.notNull()

范玉宾 committed
145
        private var mMediaPlayer:MediaPlayer? = null
范玉宾 committed
146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172

        private var mPath:String? = null

        @Volatile
        private var instance: MediaPlayerManager? = null

        fun getInstance(context: Context): MediaPlayerManager? {
            return when{
                instance != null -> instance
                else -> synchronized(this) {
                    if (instance == null){
                        mContext = context
                        mMediaPlayer = MediaPlayer()
                        instance = MediaPlayerManager()
                    }
                    instance
                }
            }
        }
    }


    interface OnMediaPlayerManagerListener{
        fun onPrepared(mediaPlayer: MediaPlayer)
    }

}