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

/// |Controller| is a handle for media playback, allowing clients to observe
/// and control a media playback session. Unsupported commands are no-ops.
/// Consult |PlaybackCapabilities|, sent by |OnPlaybackCapabilities|, to learn
/// which commands are supported.
[FragileBase]
interface Controller : Observer {
    /// Sent on first connection and when supported
    /// playback capabilities change.
    -> OnPlaybackCapabilitiesChanged(PlaybackCapabilities playback_capabilities);

    // Plays media.
    Play();
    // Pauses playback and retains position in media
    Pause();
    // Stops playback. There is no position or associated media in the stopped
    // state.
    Stop();
    // Seeks to a specific position in media. Implementations are free to
    // to treat this as a no-op or enter an error state if the position
    // is out of bounds. |position| is an offset from the beginning of the media.
    SeekToPosition(zx.duration position);
    // Skips forward in media. Uses the default skip interval if |skip_amount|
    // is 0.
    SkipForward(zx.duration skip_amount);
    // Skips in reverse in media. Uses the default skip interval if |skip_amount|
    // is 0.
    SkipReverse(zx.duration skip_amount);
    // Changes media to the next item (e.g. next song in playlist).
    NextItem();
    // Changes media to the previous item.
    PrevItem();
    // Sets the playback rate of the media. This may imply a change of
    // playback mode.
    SetPlaybackRate(float32 playback_rate);
    // Sets through supported repeat modes.
    SetRepeatMode(RepeatMode repeat_mode);
    // Sets through supported shuffle modes.
    SetShuffleMode(bool shuffle_on);

    // Connects a channel to a custom extension. This is for clients
    // privy to the underlying implementation.
    ConnectToExtension(string extension, handle<channel> channel);
};
