diff options
author | der richter <der.richter@gmx.de> | 2024-03-18 22:22:11 +0100 |
---|---|---|
committer | der richter <der.richter@gmx.de> | 2024-03-21 18:33:15 +0100 |
commit | 283d0877c470bf10efff390ea8037a819db501a7 (patch) | |
tree | 7d14082fe37eff82124710aa56ad380485b0541c /osdep | |
parent | 1d8f28cea7fb8d142a16eb6c9e104c707f2e7d77 (diff) | |
download | mpv-283d0877c470bf10efff390ea8037a819db501a7.tar.bz2 mpv-283d0877c470bf10efff390ea8037a819db501a7.tar.xz |
mac/type: move c<>swift type bridging into a dedicated type helper
Diffstat (limited to 'osdep')
-rw-r--r-- | osdep/mac/libmpv_helper.swift | 25 | ||||
-rw-r--r-- | osdep/mac/mpv_helper.swift | 36 | ||||
-rw-r--r-- | osdep/mac/precise_timer.swift | 4 | ||||
-rw-r--r-- | osdep/mac/remote_command_center.swift | 16 | ||||
-rw-r--r-- | osdep/mac/touch_bar.swift | 8 | ||||
-rw-r--r-- | osdep/mac/type_helper.swift | 69 |
6 files changed, 88 insertions, 70 deletions
diff --git a/osdep/mac/libmpv_helper.swift b/osdep/mac/libmpv_helper.swift index 4bead84c69..f67a15d1d6 100644 --- a/osdep/mac/libmpv_helper.swift +++ b/osdep/mac/libmpv_helper.swift @@ -50,7 +50,7 @@ class LibmpvHelper { let pAddress = mpv_opengl_init_params(get_proc_address: getProcAddress, get_proc_address_ctx: nil) - MPVHelper.withUnsafeMutableRawPointers([pAddress, advanced]) { (pointers: [UnsafeMutableRawPointer?]) in + TypeHelper.withUnsafeMutableRawPointers([pAddress, advanced]) { (pointers: [UnsafeMutableRawPointer?]) in var params: [mpv_render_param] = [ mpv_render_param(type: MPV_RENDER_PARAM_API_TYPE, data: api), mpv_render_param(type: MPV_RENDER_PARAM_OPENGL_INIT_PARAMS, data: pointers[0]), @@ -87,7 +87,7 @@ class LibmpvHelper { if mpvRenderContext == nil { log.sendWarning("Init mpv render context first.") } else { - mpv_render_context_set_update_callback(mpvRenderContext, callback, MPVHelper.bridge(obj: object)) + mpv_render_context_set_update_callback(mpvRenderContext, callback, TypeHelper.bridge(obj: object)) } } @@ -95,7 +95,7 @@ class LibmpvHelper { if mpvRenderContext == nil { log.sendWarning("Init mpv render context first.") } else { - mp_render_context_set_control_callback(mpvRenderContext, callback, MPVHelper.bridge(obj: object)) + mp_render_context_set_control_callback(mpvRenderContext, callback, TypeHelper.bridge(obj: object)) } } @@ -132,7 +132,7 @@ class LibmpvHelper { h: Int32(surface.height), internal_format: 0) - MPVHelper.withUnsafeMutableRawPointers([data, flip, ditherDepth, skip]) { (pointers: [UnsafeMutableRawPointer?]) in + TypeHelper.withUnsafeMutableRawPointers([data, flip, ditherDepth, skip]) { (pointers: [UnsafeMutableRawPointer?]) in var params: [mpv_render_param] = [ mpv_render_param(type: MPV_RENDER_PARAM_OPENGL_FBO, data: pointers[0]), mpv_render_param(type: MPV_RENDER_PARAM_FLIP_Y, data: pointers[1]), @@ -234,21 +234,4 @@ class LibmpvHelper { macOptsPtr = nil mpvHandle = nil } - - // *(char **) MPV_FORMAT_STRING on mpv_event_property - class func mpvStringArrayToString(_ obj: UnsafeMutableRawPointer?) -> String? { - guard let str = obj else { return nil } - let cstr = UnsafeMutablePointer<UnsafeMutablePointer<Int8>>(OpaquePointer(str)) - return String(cString: cstr[0]) - } - - // MPV_FORMAT_FLAG - class func mpvFlagToBool(_ obj: UnsafeMutableRawPointer) -> Bool? { - return UnsafePointer<Bool>(OpaquePointer(obj))?.pointee - } - - // MPV_FORMAT_DOUBLE - class func mpvDoubleToDouble(_ obj: UnsafeMutableRawPointer) -> Double? { - return UnsafePointer<Double>(OpaquePointer(obj))?.pointee - } } diff --git a/osdep/mac/mpv_helper.swift b/osdep/mac/mpv_helper.swift index 084fed48da..b49e181749 100644 --- a/osdep/mac/mpv_helper.swift +++ b/osdep/mac/mpv_helper.swift @@ -78,44 +78,10 @@ class MPVHelper: NSObject { } func setMacOptionCallback(_ callback: swift_wakeup_cb_fn, context object: AnyObject) { - m_config_cache_set_wakeup_cb(macOptsCachePtr, callback, MPVHelper.bridge(obj: object)) + m_config_cache_set_wakeup_cb(macOptsCachePtr, callback, TypeHelper.bridge(obj: object)) } func nextChangedMacOption(property: inout UnsafeMutableRawPointer?) -> Bool { return m_config_cache_get_next_changed(macOptsCachePtr, &property) } - - // (__bridge void*) - class func bridge<T: AnyObject>(obj: T) -> UnsafeMutableRawPointer { - return UnsafeMutableRawPointer(Unmanaged.passUnretained(obj).toOpaque()) - } - - // (__bridge T*) - class func bridge<T: AnyObject>(ptr: UnsafeRawPointer) -> T { - return Unmanaged<T>.fromOpaque(ptr).takeUnretainedValue() - } - - class func withUnsafeMutableRawPointers(_ arguments: [Any], - pointers: [UnsafeMutableRawPointer?] = [], - closure: (_ pointers: [UnsafeMutableRawPointer?]) -> Void) { - if arguments.count > 0 { - let args = Array(arguments.dropFirst(1)) - var newPtrs = pointers - var firstArg = arguments.first - withUnsafeMutableBytes(of: &firstArg) { (ptr: UnsafeMutableRawBufferPointer) in - newPtrs.append(ptr.baseAddress) - withUnsafeMutableRawPointers(args, pointers: newPtrs, closure: closure) - } - - return - } - - closure(pointers) - } - - class func getPointer<T>(_ value: inout T) -> UnsafeMutableRawPointer? { - return withUnsafeMutableBytes(of: &value) { (ptr: UnsafeMutableRawBufferPointer) in - ptr.baseAddress - } - } } diff --git a/osdep/mac/precise_timer.swift b/osdep/mac/precise_timer.swift index f4ad3bb6b6..4dbfec2694 100644 --- a/osdep/mac/precise_timer.swift +++ b/osdep/mac/precise_timer.swift @@ -59,7 +59,7 @@ class PreciseTimer { init?(common com: Common) { common = com - pthread_create(&thread, &threadAttr, entryC, MPVHelper.bridge(obj: self)) + pthread_create(&thread, &threadAttr, entryC, TypeHelper.bridge(obj: self)) if thread == nil { common.log.sendWarning("Couldn't create pthread for high precision timer") return nil @@ -119,7 +119,7 @@ class PreciseTimer { let threadSignal: @convention(c) (Int32) -> () = { (sig: Int32) in } let entryC: @convention(c) (UnsafeMutableRawPointer) -> UnsafeMutableRawPointer? = { (ptr: UnsafeMutableRawPointer) in - let ptimer: PreciseTimer = MPVHelper.bridge(ptr: ptr) + let ptimer: PreciseTimer = TypeHelper.bridge(ptr: ptr) ptimer.entry() return nil } diff --git a/osdep/mac/remote_command_center.swift b/osdep/mac/remote_command_center.swift index 6dd02e0ada..bec63a1984 100644 --- a/osdep/mac/remote_command_center.swift +++ b/osdep/mac/remote_command_center.swift @@ -186,24 +186,24 @@ class RemoteCommandCenter: NSObject { switch String(cString: property.name) { case "pause" where property.format == MPV_FORMAT_FLAG: - isPaused = LibmpvHelper.mpvFlagToBool(property.data) ?? false + isPaused = TypeHelper.toBool(property.data) ?? false case "time-pos" where property.format == MPV_FORMAT_DOUBLE: - let newPosition = max(LibmpvHelper.mpvDoubleToDouble(property.data) ?? 0, 0) + let newPosition = max(TypeHelper.toDouble(property.data) ?? 0, 0) if Int((floor(newPosition) - floor(position)) / rate) != 0 { position = newPosition } case "duration" where property.format == MPV_FORMAT_DOUBLE: - duration = LibmpvHelper.mpvDoubleToDouble(property.data) ?? 0 + duration = TypeHelper.toDouble(property.data) ?? 0 case "speed" where property.format == MPV_FORMAT_DOUBLE: - rate = LibmpvHelper.mpvDoubleToDouble(property.data) ?? 1 + rate = TypeHelper.toDouble(property.data) ?? 1 case "media-title" where [MPV_FORMAT_STRING, MPV_FORMAT_NONE].contains(property.format): - title = LibmpvHelper.mpvStringArrayToString(property.data) ?? "" + title = TypeHelper.toString(property.data) ?? "" case "chapter-metadata/title" where [MPV_FORMAT_STRING, MPV_FORMAT_NONE].contains(property.format): - chapter = LibmpvHelper.mpvStringArrayToString(property.data) + chapter = TypeHelper.toString(property.data) case "metadata/by-key/album" where [MPV_FORMAT_STRING, MPV_FORMAT_NONE].contains(property.format): - album = LibmpvHelper.mpvStringArrayToString(property.data) + album = TypeHelper.toString(property.data) case "metadata/by-key/artist" where [MPV_FORMAT_STRING, MPV_FORMAT_NONE].contains(property.format): - artist = LibmpvHelper.mpvStringArrayToString(property.data) + artist = TypeHelper.toString(property.data) default: break } diff --git a/osdep/mac/touch_bar.swift b/osdep/mac/touch_bar.swift index 1fb28f438b..002c3dacb1 100644 --- a/osdep/mac/touch_bar.swift +++ b/osdep/mac/touch_bar.swift @@ -284,16 +284,16 @@ class TouchBar: NSTouchBar, NSTouchBarDelegate { switch String(cString: property.name) { case "time-pos" where property.format == MPV_FORMAT_DOUBLE: - let newPosition = max(LibmpvHelper.mpvDoubleToDouble(property.data) ?? 0, 0) + let newPosition = max(TypeHelper.toDouble(property.data) ?? 0, 0) if Int((floor(newPosition) - floor(position)) / rate) != 0 { position = newPosition } case "duration" where property.format == MPV_FORMAT_DOUBLE: - duration = LibmpvHelper.mpvDoubleToDouble(property.data) ?? 0 + duration = TypeHelper.toDouble(property.data) ?? 0 case "pause" where property.format == MPV_FORMAT_FLAG: - isPaused = LibmpvHelper.mpvFlagToBool(property.data) ?? false + isPaused = TypeHelper.toBool(property.data) ?? false case "speed" where property.format == MPV_FORMAT_DOUBLE: - rate = LibmpvHelper.mpvDoubleToDouble(property.data) ?? 1 + rate = TypeHelper.toDouble(property.data) ?? 1 default: break } diff --git a/osdep/mac/type_helper.swift b/osdep/mac/type_helper.swift new file mode 100644 index 0000000000..bd90d0ac59 --- /dev/null +++ b/osdep/mac/type_helper.swift @@ -0,0 +1,69 @@ +/* + * 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 TypeHelper { + // (__bridge void*) + class func bridge<T: AnyObject>(obj: T) -> UnsafeMutableRawPointer { + return UnsafeMutableRawPointer(Unmanaged.passUnretained(obj).toOpaque()) + } + + // (__bridge T*) + class func bridge<T: AnyObject>(ptr: UnsafeRawPointer) -> T { + return Unmanaged<T>.fromOpaque(ptr).takeUnretainedValue() + } + + class func withUnsafeMutableRawPointers(_ arguments: [Any], + pointers: [UnsafeMutableRawPointer?] = [], + closure: (_ pointers: [UnsafeMutableRawPointer?]) -> Void) { + if arguments.count > 0 { + let args = Array(arguments.dropFirst(1)) + var newPtrs = pointers + var firstArg = arguments.first + withUnsafeMutableBytes(of: &firstArg) { (ptr: UnsafeMutableRawBufferPointer) in + newPtrs.append(ptr.baseAddress) + withUnsafeMutableRawPointers(args, pointers: newPtrs, closure: closure) + } + + return + } + + closure(pointers) + } + + class func toPointer<T>(_ value: inout T) -> UnsafeMutableRawPointer? { + return withUnsafeMutableBytes(of: &value) { (ptr: UnsafeMutableRawBufferPointer) in + ptr.baseAddress + } + } + + // *(char **) MPV_FORMAT_STRING + class func toString(_ obj: UnsafeMutableRawPointer?) -> String? { + guard let str = obj else { return nil } + let cstr = UnsafeMutablePointer<UnsafeMutablePointer<Int8>>(OpaquePointer(str)) + return String(cString: cstr[0]) + } + + // MPV_FORMAT_FLAG + class func toBool(_ obj: UnsafeMutableRawPointer) -> Bool? { + return UnsafePointer<Bool>(OpaquePointer(obj))?.pointee + } + + // MPV_FORMAT_DOUBLE + class func toDouble(_ obj: UnsafeMutableRawPointer) -> Double? { + return UnsafePointer<Double>(OpaquePointer(obj))?.pointee + } +} |