MediaStreamHandlers

public final class MediaStreamHandlers

ストリームのイベントハンドラです。

イベントハンドラのプロパティの get / set は、プロパティごとの HandlerStorage が持つ NSLock で 排他します。 利用する任意の executor からの設定と、videoEnabled / audioEnabled の確定を配送する executor からの読み取りが並行してもデータ競合しません。配送側は lock を解放してから取得済みの closure を呼びます (HandlerStorage の doc 参照)。

呼び出し元のスレッドは保証されない。UI 更新や共有状態の変更は main queue / main actor へ 束ねること。

配送のたびにプロパティを読むため、接続の途中で設定を変更しても次の配送から反映される (プロパティごとの storage が排他するのは読み書きだけであり、配送側は lock を解放してから 取得済みの closure を呼ぶ)。

Swift 6 言語モードで @MainActor の文脈からハンドラーを設定する場合は、クロージャに @Sendable を付けるか nonisolated な関数へ処理を分離して隔離を外す。payload は Bool の ため、main actor へそのまま渡せる。

イベントを actor / Task から購読する場合は MediaChannel.subscribeEvents(bufferingPolicy:) を使う。新しい購読 API は、この handler と 同じ配送点から対応するイベントを配送する。

  • 映像トラックが有効または無効にセットされたときに呼ばれるクロージャー

    値が実際に変化したときに 1 回だけ呼ばれます。複数の公開 API から同じストリームの videoEnabled が並行に変更された場合は operation の世代で確定が調停され、後から開始した operation が先に確定していると古い世代の書き込み (失敗時の復元を含む) は破棄されるため、 破棄された書き込みでは呼ばれません。

    通知は確定の後に lock を解放して行うため、最後に配送された値が getter の最終値と一致する 保証はありません。

    MediaChannel.setVideoHardMute(true) の経路では VideoHardMuteActor の executor で、 MediaChannel.setVideoSoftMute、MediaChannel.setVideoHardMute(false) の成功時、 MediaStream.videoEnabled への直接代入では呼び出し側の executor で呼ばれます。

    VideoRenderer.onSwitch(video:) の配送 executor は main queue のため、このクロージャーと renderer の相対順序は保証されません。並行する operation が確定した場合、このクロージャーの 呼び出し順序は確定順と一致しないことがあります (通知順序の入れ替わりは発火回数を変えません)。

    Declaration

    Swift

    public var onSwitchVideo: ((_ isEnabled: Bool) -> Void)? { get set }
  • 音声トラックが有効または無効にセットされたときに呼ばれるクロージャー

    値が実際に変化したときに 1 回だけ呼ばれます。複数の公開 API から同じストリームの audioEnabled が並行に変更された場合は operation の世代で確定が調停され、後から開始した operation が先に確定していると古い世代の書き込みは破棄されるため、破棄された書き込みでは 呼ばれません。

    通知は確定の後に lock を解放して行うため、最後に配送された値が getter の最終値と一致する 保証はありません。

    VideoRenderer.onSwitch(audio:) の配送 executor は main queue のため、このクロージャーと renderer の相対順序は保証されません。並行する operation が確定した場合、このクロージャーの 呼び出し順序は確定順と一致しないことがあります (通知順序の入れ替わりは発火回数を変えません)。

    Declaration

    Swift

    public var onSwitchAudio: ((_ isEnabled: Bool) -> Void)? { get set }
  • 初期化します。

    Declaration

    Swift

    public init()