// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
library fuchsia.media.playback;

using fuchsia.math;
using fuchsia.media;
using fuchsia.media.audio;
using fuchsia.ui.views;
using zx;

/// Plays media.
@discoverable
closed protocol Player {
    compose SourceManager;

    /// Sets a file channel to read from.
    strict SetFileSource(resource struct {
        file_channel zx.Handle:CHANNEL;
    });

    /// Sets a file channel to read from.
    strict SetFileSourceWithOptions(resource struct {
        file_channel zx.Handle:CHANNEL;
        options PlayerOptions;
    });

    /// Starts playback.
    strict Play();

    /// Pauses playback.
    strict Pause();

    /// Provides current status immediately after binding and whenever status
    /// changes thereafter.
    strict -> OnStatusChanged(struct {
        player_status PlayerStatus;
    });

    /// Seeks to the specified position, specified in nanoseconds.
    strict Seek(struct {
        position int64;
    });

    /// Creates a video view.
    strict CreateView(resource struct {
        view_token fuchsia.ui.views.ViewToken;
    });

    /// Binds to the gain control for this player.
    strict BindGainControl(resource struct {
        gain_control_request server_end:fuchsia.media.audio.GainControl;
    });

    /// Adds a new binding to this player.
    strict AddBinding(resource struct {
        player_request server_end:Player;
    });

    /// Sets the rate to be used when the player is playing. `rate` must be positive. The
    /// `timeline_function` field of `PlayerStatus` indicates the actual rate when the player
    /// is playing.
    strict SetPlaybackRate(struct {
        playback_rate float32;
    });
};

/// Options used in `SetFileSourceWithOptions`.
type PlayerOptions = table {
    /// When set to true, suppresses audio rendering. Default value false.
    1: silent bool;
};

/// Player status information.
type PlayerStatus = struct {
    /// Duration of the content.
    duration zx.Duration;

    /// Whether the player can pause.
    can_pause bool;

    /// Whether the player can seek.
    can_seek bool;

    /// Whether the source has an audio stream.
    has_audio bool;

    /// Whether the source has a video stream.
    has_video bool;

    /// Indicates whether the player is ready to play. After
    /// `SetFileSource` or `SourceManager.SetSource` is called, this value is
    /// false until the player is fully prepared to play the content from the
    /// source.
    ready bool;

    // Describes the media.
    metadata box<fuchsia.media.Metadata>;

    /// Indicates a problem preventing intended operation.
    problem box<Problem>;

    /// Indicates whether an audio stream is currently connected for rendering.
    /// This value will be false if `has_audio` is false or if the audio stream
    /// type isn't supported.
    audio_connected bool;

    /// Indicates whether a video stream is currently connected for rendering.
    /// This value will be false if `has_video` is false or if the video stream
    /// type isn't supported.
    video_connected bool;

    /// Size of the video currently being produced. This value will be null if
    /// the video size is currently unknown.
    video_size box<fuchsia.math.Size>;

    /// Relative dimensions of a video pixel. This value will be null if the
    /// pixel aspect ratio is currently unknown.
    pixel_aspect_ratio box<fuchsia.math.Size>;

    /// Function translating local time to presentation time. This value will be
    /// null if the timeline function is currently undefined.
    timeline_function box<fuchsia.media.TimelineFunction>;

    /// Indicates whether presentation for all streams has reached end-of-stream.
    end_of_stream bool;
};
