// 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.mediasession;

using zx;

/// |PlaybackCapabilities| enumerates the capabilities of the player backing
/// the media session, and correspond to the control commands they can execute.
struct PlaybackCapabilities {
    /// If set, the player can |Play()|.
    bool can_play;
    /// If set, the player can |Stop()|.
    bool can_stop;
    /// If set, the player can |Pause()|.
    bool can_pause;
    /// If set, the player can |SeekToPosition()|.
    bool can_seek_to_position;
    /// If set, the player can |SkipForward()| on |supported_skip_intervals|.
    bool can_skip_forward;
    /// If set, the player can |SkipReverse()| on |supported_skip_intervals|.
    bool can_skip_reverse;
    /// The intervals on which skipping can be performed in the media.
    vector<zx.duration> supported_skip_intervals;
    /// The playback rates supported by the media.
    vector<float32> supported_playback_rates;

    /// If set, the player can |SetShuffleMode()|.
    bool can_shuffle;
    /// Supported repeat modes that can be set with |SetRepeatMode()|.
    vector<RepeatMode> supported_repeat_mode;

    // If set, the player can |NextItem()| if there is a next item.
    bool can_change_to_next_item;
    // If set, the player can |PrevItem()| if there is a previous item.
    bool can_change_to_prev_item;

    /// A set of names of custom extensions the player advertises.
    vector<string> custom_extensions;
};
