Set AVAudioSession, disable screensaver during playback on macOS

This commit is contained in:
Arkadiusz Fal
2021-10-24 16:01:36 +02:00
parent ca8298a9e9
commit 68b5abd122
6 changed files with 80 additions and 3 deletions

View File

@@ -47,11 +47,19 @@ final class PlayerModel: ObservableObject {
private var shouldResumePlaying = true
private var statusObservation: NSKeyValueObservation?
#if os(macOS)
var playerTimeControlStatusObserver: Any?
#endif
init(accounts: AccountsModel? = nil, instances: InstancesModel? = nil) {
self.accounts = accounts ?? AccountsModel()
self.instances = instances ?? InstancesModel()
addItemDidPlayToEndTimeObserver()
addTimeObserver()
#if os(macOS)
addPlayerTimeControlStatusObserver()
#endif
}
func presentPlayer() {
@@ -123,6 +131,9 @@ final class PlayerModel: ObservableObject {
of video: Video,
preservingTime: Bool = false
) {
#if !os(macOS)
try? AVAudioSession.sharedInstance().setActive(false)
#endif
resetSegments()
sponsorBlock.loadSegments(videoID: video.videoID)
@@ -172,6 +183,10 @@ final class PlayerModel: ObservableObject {
}
let startPlaying = {
#if !os(macOS)
try? AVAudioSession.sharedInstance().setActive(true)
#endif
DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) {
self.play()
}
@@ -302,6 +317,10 @@ final class PlayerModel: ObservableObject {
}
@objc func itemDidPlayToEndTime() {
#if !os(macOS)
try? AVAudioSession.sharedInstance().setActive(false)
#endif
if queue.isEmpty {
addCurrentItemToHistory()
resetQueue()
@@ -360,4 +379,19 @@ final class PlayerModel: ObservableObject {
self.handleSegments(at: time)
}
}
#if os(macOS)
private func addPlayerTimeControlStatusObserver() {
playerTimeControlStatusObserver = player.observe(\.timeControlStatus) { player, _ in
guard self.player == player else {
return
}
if player.timeControlStatus == .playing {
ScreenSaverManager.shared.disable(reason: "Yattee is playing video")
} else {
ScreenSaverManager.shared.enable()
}
}
}
#endif
}

View File

@@ -0,0 +1,34 @@
import Foundation
import IOKit.pwr_mgt
struct ScreenSaverManager {
static var shared = ScreenSaverManager()
var noSleepAssertion: IOPMAssertionID = 0
var noSleepReturn: IOReturn?
var enabled: Bool {
noSleepReturn == nil
}
@discardableResult mutating func disable(reason: String = "Unknown reason") -> Bool {
guard enabled else {
return false
}
noSleepReturn = IOPMAssertionCreateWithName(kIOPMAssertionTypeNoDisplaySleep as CFString,
IOPMAssertionLevel(kIOPMAssertionLevelOn),
reason as CFString,
&noSleepAssertion)
return noSleepReturn == kIOReturnSuccess
}
@discardableResult mutating func enable() -> Bool {
if noSleepReturn != nil {
_ = IOPMAssertionRelease(noSleepAssertion) == kIOReturnSuccess
noSleepReturn = nil
return true
}
return false
}
}