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

using id = uint64;

/// |Publisher| publishes media sessions. This allows priviledged processes to
/// send media controls to the media session and observe changes in its
/// playback state.
[Discoverable]
interface Publisher {
    /// Publishes a session. Returns |session_id| which can be used to
    /// to identify the session.
    Publish(Controller controller) -> (id session_id);
};

/// Describes the session which is currently implementing the active session
/// interface.
struct ActiveSession {
    id session_id;
};

/// |ControllerRegistry| observes the collection of published media sessions
/// and vends control handles to them.
[Discoverable]
interface ControllerRegistry {
    /// |OnActiveSession| is sent on connection and when the
    /// underlying active session is changed.
    -> OnActiveSession(ActiveSession? active_session);

    /// Connects to a |Controller| for |session_id| if present.
    ConnectToControllerById(id session_id, request<Controller> controller_request);
};

/// |ObserverRegistry| vends handles to observe published media sessions.
[Discoverable]
interface ObserverRegistry {
    /// |OnActiveSession| is sent on connection and when the
    /// underlying active session is changed.
    -> OnActiveSession(ActiveSession? active_session);

    /// Connects to an |Observer| for |session_id| if present.
    GetObserverById(id session_id, request<Observer> observer_request);
};
