Skip to content

Instantly share code, notes, and snippets.

@egzonpllana
Last active March 9, 2023 16:16
Show Gist options
  • Star 4 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save egzonpllana/adef18cb237b990d277eaeb8225f51d8 to your computer and use it in GitHub Desktop.
Save egzonpllana/adef18cb237b990d277eaeb8225f51d8 to your computer and use it in GitHub Desktop.
//
// AVPlayer+Singleton.swift
// DeveloperBelt
//
// Created by Egzon Pllana on 11/5/19.
// Copyright © 2019 Native Coders. All rights reserved.
//
import Foundation
import MediaPlayer
enum PlayType {
case meditation
case breathing
}
class AVPlayerSingleton {
// MARK: - Properties
// Singleton pattern
static let shared = AVPlayerSingleton()
private var playerTimeObserver: Any?
// Timer
var timePlayed: Double = 0
// Player
var player: AVPlayer?
var isPlaying: Bool = false
var playId: Int?
var playType: PlayType?
// Get the shared MPRemoteCommandCenter
private let commandCenter = MPRemoteCommandCenter.shared()
// MARK: - Functions
func initPlayer(withPlayId playId: Int? = nil, withURL url: URL, withPlayType playType: PlayType) -> AVPlayer {
// Stop and release current player if there is any
self.pause()
self.timePlayed = 0
// Register for RemoteCommandCenter observers
addCommandCenterManagerObservers()
// Init player with id
let playerItem = AVPlayerItem.init(url: url)
playerItem.preferredPeakBitRate = 2
let player = AVPlayer.init(playerItem: playerItem)
// Initialize self properties
self.player = player
self.playId = playId
self.playType = playType
// Add started playing observer
let interval = CMTime.init(value: 1, timescale: 2)
playerTimeObserver = player.addPeriodicTimeObserver(forInterval: interval, queue: DispatchQueue.main) { [weak self] time in
guard let self = self else { return }
self.isPlaying = true
self.timePlayed = time.seconds
}
return player
}
@objc private func play() {
guard let player = player, isPlaying != true else { return }
isPlaying = true
player.play()
}
@objc private func pause() {
guard let player = player, isPlaying != false else { return }
isPlaying = false
player.pause()
}
func stopPlayer() {
if let pto = playerTimeObserver{
player?.removeTimeObserver(pto)
playerTimeObserver = nil
}
self.isPlaying = false
self.player = nil
}
private func addCommandCenterManagerObservers() {
// Add handler for Play command
commandCenter.playCommand.addTarget { [weak self] event in
guard let self = self else { return .commandFailed }
self.play()
return .success
}
// Add handler for Pause command
commandCenter.pauseCommand.addTarget { [weak self] event in
guard let self = self else { return .commandFailed }
self.pause()
return .success
}
}
}
@KheangSenghort
Copy link

Dear sir,

I'm really thankful for provide the best code support replay audio.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment