summaryrefslogtreecommitdiffstats
path: root/osdep/mac/app_hub.swift
diff options
context:
space:
mode:
Diffstat (limited to 'osdep/mac/app_hub.swift')
-rw-r--r--osdep/mac/app_hub.swift109
1 files changed, 109 insertions, 0 deletions
diff --git a/osdep/mac/app_hub.swift b/osdep/mac/app_hub.swift
new file mode 100644
index 0000000000..cdfd03f153
--- /dev/null
+++ b/osdep/mac/app_hub.swift
@@ -0,0 +1,109 @@
+/*
+ * This file is part of mpv.
+ *
+ * mpv is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * mpv is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with mpv. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+class AppHub: NSObject {
+ @objc static let shared = AppHub()
+
+ var mpv: OpaquePointer?
+ @objc var input: InputHelper
+#if HAVE_MACOS_MEDIA_PLAYER
+ var remote: RemoteCommandCenter?
+#endif
+
+ var isApplication: Bool { get { NSApp is Application } }
+
+ private override init() {
+ input = InputHelper()
+ }
+
+ @objc func initMpv(_ mpv: OpaquePointer) {
+ if isApplication {
+ self.mpv = mpv
+ mpv_observe_property(mpv, 0, "duration", MPV_FORMAT_DOUBLE)
+ mpv_observe_property(mpv, 0, "time-pos", MPV_FORMAT_DOUBLE)
+ mpv_observe_property(mpv, 0, "speed", MPV_FORMAT_DOUBLE)
+ mpv_observe_property(mpv, 0, "pause", MPV_FORMAT_FLAG)
+ mpv_observe_property(mpv, 0, "media-title", MPV_FORMAT_STRING)
+ mpv_observe_property(mpv, 0, "chapter-metadata/title", MPV_FORMAT_STRING)
+ mpv_observe_property(mpv, 0, "metadata/by-key/album", MPV_FORMAT_STRING)
+ mpv_observe_property(mpv, 0, "metadata/by-key/artist", MPV_FORMAT_STRING)
+ mpv_set_wakeup_callback(mpv, wakeup, TypeHelper.bridge(obj: self))
+ return
+ }
+
+ mpv_destroy(mpv)
+ }
+
+ @objc func initInput(_ input: OpaquePointer?) {
+ self.input.signal(input: input)
+ }
+
+ @objc func initCocoaCb() {
+ guard let app = NSApp as? Application else { return }
+ DispatchQueue.main.sync { app.initCocoaCb(mpv) }
+ }
+
+ @objc func startRemote() {
+#if HAVE_MACOS_MEDIA_PLAYER
+ if remote == nil { remote = RemoteCommandCenter() }
+ remote?.start()
+#endif
+ }
+
+ @objc func stopRemote() {
+#if HAVE_MACOS_MEDIA_PLAYER
+ remote?.stop()
+#endif
+ }
+
+ let wakeup: EventHelper.wakeup_cb = { ( ctx ) in
+ let event = unsafeBitCast(ctx, to: AppHub.self)
+ DispatchQueue.main.async { event.eventLoop() }
+ }
+
+ func eventLoop() {
+ while let mpv = mpv, let event = mpv_wait_event(mpv, 0) {
+ if event.pointee.event_id == MPV_EVENT_NONE { break }
+ handle(event: event)
+ }
+ }
+
+ func handle(event: UnsafeMutablePointer<mpv_event>) {
+ if let app = NSApp as? Application {
+ app.processEvent(event)
+ }
+
+#if HAVE_MACOS_MEDIA_PLAYER
+ if let remote = remote {
+ remote.processEvent(event)
+ }
+#endif
+
+ switch event.pointee.event_id {
+ case MPV_EVENT_SHUTDOWN:
+#if HAVE_MACOS_COCOA_CB
+ if let app = NSApp as? Application, app.cocoaCB?.isShuttingDown ?? false {
+ mpv = nil;
+ return
+ }
+#endif
+ mpv_destroy(mpv)
+ mpv = nil
+ default: break
+ }
+ }
+}