RemoteMediaClient onProgressUpdated iOS
This commit is contained in:
parent
e3b46e81e1
commit
3cb3dbfaf7
2 changed files with 65 additions and 2 deletions
|
|
@ -64,7 +64,7 @@ func getFlutterMediaTracks(mediaTracks: [GCKMediaTrack]?) -> [MediaTrack]? {
|
||||||
result.append(resultTrack)
|
result.append(resultTrack)
|
||||||
})
|
})
|
||||||
return result
|
return result
|
||||||
}x
|
}
|
||||||
|
|
||||||
func getFlutterMediaTrack(mediaTrack: GCKMediaTrack) -> MediaTrack {
|
func getFlutterMediaTrack(mediaTrack: GCKMediaTrack) -> MediaTrack {
|
||||||
let result = MediaTrack()
|
let result = MediaTrack()
|
||||||
|
|
|
||||||
|
|
@ -19,6 +19,7 @@ public class SwiftFlutterCastFrameworkPlugin: NSObject, FlutterPlugin, GCKSessio
|
||||||
private let castContext: GCKCastContext
|
private let castContext: GCKCastContext
|
||||||
private var castStateObserver: NSKeyValueObservation?
|
private var castStateObserver: NSKeyValueObservation?
|
||||||
private let flutterApi : CastFlutterApi
|
private let flutterApi : CastFlutterApi
|
||||||
|
private var progressTimer: Timer?
|
||||||
|
|
||||||
private let sessionManager: GCKSessionManager
|
private let sessionManager: GCKSessionManager
|
||||||
|
|
||||||
|
|
@ -132,6 +133,44 @@ public class SwiftFlutterCastFrameworkPlugin: NSObject, FlutterPlugin, GCKSessio
|
||||||
deinit {
|
deinit {
|
||||||
castStateObserver?.invalidate()
|
castStateObserver?.invalidate()
|
||||||
castStateObserver = nil
|
castStateObserver = nil
|
||||||
|
stopProgressTImer()
|
||||||
|
}
|
||||||
|
|
||||||
|
func startProgressTimer() {
|
||||||
|
if progressTimer != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if #available(iOS 10.0, *) {
|
||||||
|
debugPrint("ProgressTimer: creating progress timer")
|
||||||
|
let timer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true, block: onProgressTimerFired)
|
||||||
|
RunLoop.current.add(timer, forMode: .common)
|
||||||
|
progressTimer = timer
|
||||||
|
} else {
|
||||||
|
debugPrint("ProgressTimer: can't create progress timer")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private func onProgressTimerFired(t: Timer) {
|
||||||
|
let durationSecs = remoteMediaClient?.mediaStatus?.mediaInformation?.streamDuration ?? 0
|
||||||
|
let progressInterval = remoteMediaClient?.approximateStreamPosition() ?? 0
|
||||||
|
|
||||||
|
let durationMs = Int(durationSecs * 1000)
|
||||||
|
let progressMs = Int(progressInterval * 1000)
|
||||||
|
|
||||||
|
let nsDuration = NSNumber(value: durationMs)
|
||||||
|
let nsProgress = NSNumber(value: progressMs)
|
||||||
|
|
||||||
|
DispatchQueue.main.async {
|
||||||
|
self.flutterApi.onProgressUpdatedProgressMs(nsProgress, durationMs: nsDuration) { (_:Error?) in
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func stopProgressTImer() {
|
||||||
|
debugPrint("ProgressTimer: stopping progress timer")
|
||||||
|
progressTimer?.invalidate()
|
||||||
|
progressTimer = nil
|
||||||
}
|
}
|
||||||
|
|
||||||
public func sendMessageMessage(_ message: CastMessage, error: AutoreleasingUnsafeMutablePointer<FlutterError?>) {
|
public func sendMessageMessage(_ message: CastMessage, error: AutoreleasingUnsafeMutablePointer<FlutterError?>) {
|
||||||
|
|
@ -194,6 +233,7 @@ public class SwiftFlutterCastFrameworkPlugin: NSObject, FlutterPlugin, GCKSessio
|
||||||
// onSessionEnding
|
// onSessionEnding
|
||||||
public func sessionManager(_ sessionManager: GCKSessionManager, willEnd session: GCKCastSession) {
|
public func sessionManager(_ sessionManager: GCKSessionManager, willEnd session: GCKCastSession) {
|
||||||
print("SessionListener: willEnd")
|
print("SessionListener: willEnd")
|
||||||
|
stopProgressTImer()
|
||||||
flutterApi.onSessionEnding { (_:Error?) in
|
flutterApi.onSessionEnding { (_:Error?) in
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -248,7 +288,30 @@ public class SwiftFlutterCastFrameworkPlugin: NSObject, FlutterPlugin, GCKSessio
|
||||||
|
|
||||||
// onStatusUpdated
|
// onStatusUpdated
|
||||||
public func remoteMediaClient(_ client: GCKRemoteMediaClient, didUpdate mediaStatus: GCKMediaStatus?) {
|
public func remoteMediaClient(_ client: GCKRemoteMediaClient, didUpdate mediaStatus: GCKMediaStatus?) {
|
||||||
print("RemoteMediaClientListener: didUpdate mediaStatus")
|
var playerState = ""
|
||||||
|
|
||||||
|
switch mediaStatus?.playerState {
|
||||||
|
case .unknown:
|
||||||
|
playerState = "PlayerStateUnknown"
|
||||||
|
case .idle:
|
||||||
|
playerState = "PlayerStateIdle"
|
||||||
|
case .playing:
|
||||||
|
playerState = "PlayerStatePlaying"
|
||||||
|
startProgressTimer()
|
||||||
|
case .paused:
|
||||||
|
playerState = "PlayerStatePaused"
|
||||||
|
startProgressTimer()
|
||||||
|
case .buffering:
|
||||||
|
playerState = "PlayerStateBuffering"
|
||||||
|
startProgressTimer()
|
||||||
|
case .loading:
|
||||||
|
playerState = "PlayerStateLoading"
|
||||||
|
startProgressTimer()
|
||||||
|
default: break
|
||||||
|
}
|
||||||
|
|
||||||
|
debugPrint("RemoteMediaClientListener: didUpdate mediaStatus - playerState: \(playerState)")
|
||||||
|
|
||||||
flutterApi.onStatusUpdated { (_:Error?) in
|
flutterApi.onStatusUpdated { (_:Error?) in
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue