From aa02b526c04b6d2d51854b6a205c886ef70ff56e Mon Sep 17 00:00:00 2001 From: zztkm Date: Tue, 8 Oct 2024 12:00:19 +0900 Subject: [PATCH] =?UTF-8?q?View=20=E3=81=AE=E7=8A=B6=E6=85=8B=E3=81=8C?= =?UTF-8?q?=E5=A4=89=E3=82=8F=E3=81=A3=E3=81=9F=E3=81=A8=E3=81=8D=E3=81=AB?= =?UTF-8?q?SDK=E3=83=A6=E3=83=BC=E3=82=B6=E3=83=BC=E5=81=B4=E3=81=A7?= =?UTF-8?q?=E6=A4=9C=E7=9F=A5=E3=81=99=E3=82=8B=E3=81=9F=E3=82=81=E3=81=AE?= =?UTF-8?q?=E3=83=8F=E3=83=B3=E3=83=89=E3=83=A9=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Sora/SwiftUIVideoView.swift | 26 +++++++++++++++++++++++++- Sora/VideoView.swift | 18 ++++++++++++------ 2 files changed, 37 insertions(+), 7 deletions(-) diff --git a/Sora/SwiftUIVideoView.swift b/Sora/SwiftUIVideoView.swift index 191bc362..aaa6c870 100644 --- a/Sora/SwiftUIVideoView.swift +++ b/Sora/SwiftUIVideoView.swift @@ -105,7 +105,6 @@ public struct SwiftUIVideoView: View where Background: View { /** 画面を背景ビューに切り替えます。 このメソッドは描画停止時のみ有効です。 - TODO(zztkm): State で更新できるか確認する */ public func videoClear(_ flag: Bool) -> SwiftUIVideoView { if flag { @@ -126,6 +125,24 @@ public struct SwiftUIVideoView: View where Background: View { controller.videoView.handlers.onRender = perform return self } + + /// 映像フレームの描画開始時に実行されるブロックを指定します。 + public func videoOnStart(perform: @escaping () -> Void) -> SwiftUIVideoView { + controller.videoView.handlers.onDisconnect = perform + return self + } + + /// 映像フレームの描画停止時に実行されるブロックを指定します。 + public func videoOnStop(perform: @escaping () -> Void) -> SwiftUIVideoView { + controller.videoView.handlers.onAdded = perform + return self + } + + /// 映像が backgroundView に切り替わったときに実行されるブロックを指定します。 + public func videoOnClear(perform: @escaping () -> Void) -> SwiftUIVideoView { + controller.videoView.handlers.onClear = perform + return self + } } /* @@ -159,6 +176,9 @@ private struct RepresentedVideoView: UIViewRepresentable { controller.stream?.videoRenderer = uiView } + /** + 映像の描画を停止します。TODO(zztkm): method 名の検討 (stop start の toggle なので、stop はおかしいかも? + */ private func stop(_ uiView: VideoView) -> VideoView { if isStop { uiView.stop() @@ -168,6 +188,10 @@ private struct RepresentedVideoView: UIViewRepresentable { return uiView } + /** + 画面を背景ビューに切り替えます。 + このメソッドは描画停止時のみ有効です。 + */ private func clear(_ uiView: VideoView) -> VideoView { if isClear { uiView.clear() diff --git a/Sora/VideoView.swift b/Sora/VideoView.swift index 9414c8f7..64869a89 100644 --- a/Sora/VideoView.swift +++ b/Sora/VideoView.swift @@ -15,12 +15,19 @@ public enum VideoViewConnectionMode { case manual } -// Video (SwiftUI 用) で使う +// SwiftUIVideoView (SwiftUI 用) で使う /// :nodoc: public struct VideoViewHandlers { + /// 映像のサイズ変更時に実行される public var onChange: ((CGSize) -> Void)? + /// 映像フレーム描画時に実行される public var onRender: ((VideoFrame?) -> Void)? -} + /// 映像フレームの描画開始時に実行される + public var onStart: (() -> Void)? + /// 映像フレームの描画停止時に実行される + public var onStop: (() -> Void)? + /// 映像が backgroundView に切り替わったときに実行される + public var onClear: (() -> Void)? /** VideoRenderer プロトコルのデフォルト実装となる UIView です。 @@ -173,6 +180,7 @@ public class VideoView: UIView { self.bringSubviewToFront(self.defaultBackgroundView) } } + handlers.onClear?() } } @@ -180,13 +188,12 @@ public class VideoView: UIView { 映像フレームの描画を開始します。 */ public func start() { - print("kensaku: call start") if !isRendering { - print("kensaku: 描画開始") DispatchQueue.main.async { self.bringSubviewToFront(self.contentView) self.isRendering = true } + handlers.onStart?() } } @@ -195,9 +202,8 @@ public class VideoView: UIView { 描画の停止中は ``render(videoFrame:)`` が実行されません。 */ public func stop() { - print("kensaku: call stop") isRendering = false - print("kensaku: isRendering is now \(isRendering)") + handlers.onStop?() } // MARK: - デバッグモード