# Event Listeners Reference

ByteArk Player delivers events through two channels: Delegate (ByteArkPlayerPlaybackDelegate) for type-safe reception, and Notification (ByteArkPlayerPlaybackEngineNotification) for use inside plugins.

# Option 1 — Delegate

There are two ways to receive delegate callbacks:

Subclass ByteArkPlayerViewController and override callback methods:

class PlayerViewController: ByteArkPlayerViewController {
  override func playbackPlay(player: ByteArkPlayer) {
    super.playbackPlay(player: player)
    // Playback started
  }
}
1
2
3
4
5
6

Or assign delegate on the player instance:

class CustomViewController: UIViewController, ByteArkPlayerPlaybackDelegate {
  override func viewDidLoad() {
    super.viewDidLoad()
    playerViewController.player.delegate = self
  }
  func playbackPlay(player: ByteArkPlayer) {
    // Playback started
  }
}
1
2
3
4
5
6
7
8
9
10

# Player lifecycle callbacks

Callback Description
playerReady(player:) Player created and ready
playerLoadingMetadata(player:) Started loading metadata
playerLoadedMetadata(player:) Finished loading metadata
playbackReady(player:, item:) The video is ready to play
playbackFirstPlay(player:) The video plays for the first time
playbackPlay(player:) Playback starts/resumes
playbackPause(player:) Playback paused
playbackEnded(player:) Playback finished
playbackStalled(player:) Player entered stalled state

# Buffer & seek callbacks

Callback Description
playbackSeeking(player:) Seek started
playbackSeeked(player:) Seek finished
playbackBuffering(player:) Buffering started
playbackBuffered(player:) Buffering finished

# Progress & status callbacks

Callback Description
playbackTimeupdate(player:, time:) Playback position updated
playbackError(player:, error:) An error occurred

# UI callbacks

Callback Description
playerEnterFullscreen(player:) Entered fullscreen
playerExitFullscreen(player:) Exited fullscreen
playerEnterPictureInPictureMode(player:) Entered Picture-in-Picture
playerExitPictureInPictureMode(player:) Exited Picture-in-Picture

# Tracks & playback callbacks

Callback Description
playbackMuted(player:) Muted
playbackUnmuted(player:) Unmuted
playbackSpeedChanged(player:, speed:) Playback speed changed
playbackVolumeChanged(player:, volume:) Volume changed
playbackAudioTrackChanged(player:, audioTrack:) Audio track changed
playbackSubtitleTrackChanged(player:, subtitleTrack:) Subtitle track changed
playbackResolutionChanged(player:, resolution:) Resolution changed
playbackPlaylistItemChanged(player:, item:) Playlist item changed

# Option 2 — Notification

For use inside plugins or when you prefer a notification-center observer:

let token = player.addPlaybackEngineObserve(
  for: ByteArkPlayerPlaybackEngineNotification.play
) { notification in
  // Handle event
}
1
2
3
4
5

Available cases of ByteArkPlayerPlaybackEngineNotification:

Notification Description
.ready Player ready
.loadingMetadata / .loadedMetadata Metadata loading state
.firstPlay / .play / .pause / .ended Playback lifecycle
.seeking / .seeked Seek state
.stalled / .buffering / .buffered Buffer state
.timeupdate Playback position updated
.error Error occurred
.playbackItemReady Playlist item ready to play
.enterPictureInPictureMode / .exitPictureInPictureMode PiP state
.enablePictureInPictureMode / .disablePictureInPictureMode PiP enabled/disabled
.enterFullscreenMode / .exitFullscreenMode Fullscreen state
.muted / .unmuted Mute state
.playbackSpeedChanged Speed changed
.playbackVolumeChanged Volume changed
.audioTrackChanged / .subtitleTrackChanged / .resolutionChanged Tracks/quality changed
.playlistItemChanged Playlist item changed