import type { CancellationSignal } from "../utils/task_canceller"; import BROWSER_GLOBALS, { type IMediaElement } from "./browser_compatibility_types"; /** * Temporarily disables remote playback on a media element by setting the * `disableRemotePlayback` attribute to `true` when using a `ManagedMediaSource`. * The original value of the `disableRemotePlayback` attribute is restored when * the cancellation signal is triggered. * * This is useful when the `ManagedMediaSource` is being used and * the media element needs to ensure that remote playback (e.g., Airplay) is disabled * during the playback session. * @param {HTMLElement} mediaElement - The media element whose `disableRemotePlayback` * attribute will be modified. * @param {CancellationSignal} cancellationSignal - The signal that, when triggered, * restores the `disableRemotePlayback` attribute to its original value. */ export default function disableRemotePlaybackOnManagedMediaSource( mediaElement: IMediaElement, cancellationSignal: CancellationSignal, ) { if (BROWSER_GLOBALS.isManagedMediaSource && "disableRemotePlayback" in mediaElement) { const disableRemotePlaybackPreviousValue = mediaElement.disableRemotePlayback; cancellationSignal.register(() => { /** * Restore the `disableRemotePlayback` attribute to its previous value. * This ensures that the media element's state is the same as it was before * calling `RxPlayer.loadVideo` in the application. */ mediaElement.disableRemotePlayback = disableRemotePlaybackPreviousValue; }); /** * Using ManagedMediaSource needs to disableRemotePlayback or to provide * an Airplay source alternative, such as HLS. * https://github.com/w3c/media-source/issues/320 */ mediaElement.disableRemotePlayback = true; } }