summaryrefslogtreecommitdiffstats
path: root/video/out/mac_common.swift
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-05-04 01:13:14 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-05-04 01:13:14 +0000
commit60e8a3d404f0640fa5a3f834eae54b4f1fb9127d (patch)
tree1da89a218d0ecf010c67a87cb2f625c4cb18e7d7 /video/out/mac_common.swift
parentAdding upstream version 0.37.0. (diff)
downloadmpv-upstream/0.38.0.tar.xz
mpv-upstream/0.38.0.zip
Adding upstream version 0.38.0.upstream/0.38.0upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to '')
-rw-r--r--video/out/mac_common.swift75
1 files changed, 37 insertions, 38 deletions
diff --git a/video/out/mac_common.swift b/video/out/mac_common.swift
index 349712b..f29815d 100644
--- a/video/out/mac_common.swift
+++ b/video/out/mac_common.swift
@@ -20,16 +20,18 @@ import Cocoa
class MacCommon: Common {
@objc var layer: MetalLayer?
+ var presentation: Presentation?
var timer: PreciseTimer?
var swapTime: UInt64 = 0
let swapLock: NSCondition = NSCondition()
- var needsICCUpdate: Bool = false
-
@objc init(_ vo: UnsafeMutablePointer<vo>) {
- let newlog = mp_log_new(vo, vo.pointee.log, "mac")
- super.init(newlog)
- mpv = MPVHelper(vo, log)
+ let log = LogHelper(mp_log_new(vo, vo.pointee.log, "mac"))
+ let option = OptionHelper(vo, vo.pointee.global)
+ super.init(option, log)
+ self.vo = vo
+ input = InputHelper(vo.pointee.input_ctx, option)
+ presentation = Presentation(common: self)
timer = PreciseTimer(common: self)
DispatchQueue.main.sync {
@@ -39,16 +41,16 @@ class MacCommon: Common {
}
@objc func config(_ vo: UnsafeMutablePointer<vo>) -> Bool {
- mpv?.vo = vo
+ self.vo = vo
DispatchQueue.main.sync {
let previousActiveApp = getActiveApp()
initApp()
- let (_, _, wr) = getInitProperties(vo)
+ let (_, wr) = getInitProperties(vo)
guard let layer = self.layer else {
- log.sendError("Something went wrong, no MetalLayer was initialized")
+ log.error("Something went wrong, no MetalLayer was initialized")
exit(1)
}
@@ -58,12 +60,18 @@ class MacCommon: Common {
initWindowState()
}
- if !NSEqualSizes(window?.unfsContentFramePixel.size ?? NSZeroSize, wr.size) {
+ if !NSEqualSizes(window?.unfsContentFramePixel.size ?? NSZeroSize, wr.size) &&
+ option.vo.auto_window_resize
+ {
window?.updateSize(wr.size)
}
+ if option.vo.focus_on == 2 {
+ NSApp.activate(ignoringOtherApps: true)
+ }
+
windowDidResize()
- needsICCUpdate = true
+ updateICCProfile()
}
return true
@@ -83,7 +91,7 @@ class MacCommon: Common {
}
@objc func swapBuffer() {
- if mpv?.macOpts.macos_render_timer ?? Int32(RENDER_TIMER_CALLBACK) != RENDER_TIMER_SYSTEM {
+ if option.mac.macos_render_timer > RENDER_TIMER_SYSTEM {
swapLock.lock()
while(swapTime < 1) {
swapLock.wait()
@@ -91,18 +99,16 @@ class MacCommon: Common {
swapTime = 0
swapLock.unlock()
}
-
- if needsICCUpdate {
- needsICCUpdate = false
- updateICCProfile()
- }
}
- func updateRenderSize(_ size: NSSize) {
- mpv?.vo.pointee.dwidth = Int32(size.width)
- mpv?.vo.pointee.dheight = Int32(size.height)
- flagEvents(VO_EVENT_RESIZE | VO_EVENT_EXPOSE)
- }
+ @objc func fillVsync(info: UnsafeMutablePointer<vo_vsync_info>) {
+ if option.mac.macos_render_timer != RENDER_TIMER_PRESENTATION_FEEDBACK { return }
+
+ let next = presentation?.next()
+ info.pointee.vsync_duration = next?.duration ?? -1
+ info.pointee.skipped_vsyncs = next?.skipped ?? -1
+ info.pointee.last_queue_display_time = next?.time ?? -1
+ }
override func displayLinkCallback(_ displayLink: CVDisplayLink,
_ inNow: UnsafePointer<CVTimeStamp>,
@@ -110,7 +116,6 @@ class MacCommon: Common {
_ flagsIn: CVOptionFlags,
_ flagsOut: UnsafeMutablePointer<CVOptionFlags>) -> CVReturn
{
- let frameTimer = mpv?.macOpts.macos_render_timer ?? Int32(RENDER_TIMER_CALLBACK)
let signalSwap = {
self.swapLock.lock()
self.swapTime += 1
@@ -118,13 +123,18 @@ class MacCommon: Common {
self.swapLock.unlock()
}
- if frameTimer != RENDER_TIMER_SYSTEM {
- if let timer = self.timer, frameTimer == RENDER_TIMER_PRECISE {
+ if option.mac.macos_render_timer > RENDER_TIMER_SYSTEM {
+ if let timer = self.timer, option.mac.macos_render_timer == RENDER_TIMER_PRECISE {
timer.scheduleAt(time: inOutputTime.pointee.hostTime, closure: signalSwap)
return kCVReturnSuccess
}
signalSwap()
+ return kCVReturnSuccess
+ }
+
+ if option.mac.macos_render_timer == RENDER_TIMER_PRESENTATION_FEEDBACK {
+ presentation?.add(time: inOutputTime.pointee)
}
return kCVReturnSuccess
@@ -144,27 +154,16 @@ class MacCommon: Common {
flagEvents(VO_EVENT_AMBIENT_LIGHTING_CHANGED)
}
- @objc override func updateICCProfile() {
- guard let colorSpace = window?.screen?.colorSpace else {
- log.sendWarning("Couldn't update ICC Profile, no color space available")
- return
- }
-
- layer?.colorspace = colorSpace.cgColorSpace
+ override func updateICCProfile() {
flagEvents(VO_EVENT_ICC_PROFILE_CHANGED)
}
override func windowDidResize() {
- guard let window = window else {
- log.sendWarning("No window available on window resize event")
- return
- }
-
- updateRenderSize(window.framePixel.size)
+ flagEvents(VO_EVENT_RESIZE | VO_EVENT_EXPOSE)
}
override func windowDidChangeScreenProfile() {
- needsICCUpdate = true
+ updateICCProfile()
}
override func windowDidChangeBackingProperties() {