| // Copyright 2019 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.sessions2; |
| |
| using zx; |
| using fuchsia.media.audio; |
| using fuchsia.media; |
| |
| alias SessionId = uint64; |
| |
| /// SessionInfoDelta holds a description of a media session. |
| type SessionInfoDelta = table { |
| /// The domain on which the session takes place. A domain identifies a set of |
| /// mutually compatible media targets and sessions; sessions on a domain may |
| /// be played back on targets of the same domain. |
| /// |
| /// This field is always present. |
| 1: domain Domain; |
| /// Whether the source of the media playback is on this device. |
| /// |
| /// This field is present only if known. |
| 2: is_local bool; |
| /// If this is `true`, the playback is taking place local to the device. |
| /// Playing on the device speaker is local, playing on a remote speaker |
| /// is not. This is only set when the session is playing back; a paused |
| /// session is not active. |
| /// |
| /// This field is always present. |
| 3: is_locally_active bool; |
| /// The status of the player. |
| /// |
| /// This field is always present. |
| 4: player_status PlayerStatus; |
| /// Metadata describing the media session. |
| /// |
| /// This field is always present. |
| 5: metadata fuchsia.media.Metadata; |
| /// Images associated with the media or its source. |
| /// |
| /// This field is always present. |
| 6: media_images vector<MediaImage>; |
| /// The capabilities the player of the media implements. |
| /// |
| /// This field is always present. |
| 7: player_capabilities PlayerCapabilities; |
| }; |
| |
| /// Controls a media session and views its status. |
| /// |
| /// The channel will close if the media session is stopped. |
| protocol SessionControl { |
| /// Plays media. |
| Play(); |
| /// Pauses playback and retains position in media |
| Pause(); |
| /// Stops playback. The session should close. |
| Stop(); |
| /// Seeks to a specific position in media. Implementations are free to |
| /// enter an error state if the position is out of bounds. `position` |
| /// is an offset from the beginning of the media. |
| Seek(struct { |
| position zx.duration; |
| }); |
| /// Skips forward in media by the player's default skip amount. |
| SkipForward(); |
| /// Skips in reverse in media by the player's default skip amount. |
| SkipReverse(); |
| /// 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 will not change the |
| /// playback mode. |
| SetPlaybackRate(struct { |
| playback_rate float32; |
| }); |
| /// Sets repeat mode to any of the supported repeat modes. |
| SetRepeatMode(struct { |
| repeat_mode RepeatMode; |
| }); |
| /// Sets shuffle mode. |
| SetShuffleMode(struct { |
| shuffle_on bool; |
| }); |
| /// Binds to the session's volume control for control and notifications. |
| BindVolumeControl(resource struct { |
| volume_control_request server_end:fuchsia.media.audio.VolumeControl; |
| }); |
| /// Watches the session status. Leave a request hanging to receive a reply when |
| /// the session status changes. The first request will be answered immediately with |
| /// the current state. |
| WatchStatus() -> (struct { |
| session_info_delta SessionInfoDelta; |
| }); |
| }; |
| |
| /// Views a media session's status. |
| /// |
| /// The channel will close if the media session is stopped. |
| protocol SessionObserver { |
| /// Watches the session status. Leave a request hanging to receive a reply when |
| /// the session status changes. The first request will be answered immediately with |
| /// the current state. |
| WatchStatus() -> (struct { |
| session_info_delta SessionInfoDelta; |
| }); |
| }; |
| |
| /// Options that specify which sessions are watched when watching the collection. |
| /// |
| /// The watched set is the set of sessions which satisfies all options. |
| type WatchOptions = table { |
| /// Watch only the active session. Watches all if not set. |
| 1: only_active bool; |
| /// Watch only sessions with these allowlisted ids. Watches all if not set. |
| 2: allowed_sessions vector<SessionId>:1000; |
| }; |
| |
| /// `SessionsWatcher` watches the collection of published sessions. |
| protocol SessionsWatcher { |
| /// Called by the registry service when a session is updated. On first connection, |
| /// this will be called as many times as needed to communicate the state of the |
| /// world. |
| /// |
| /// `SessionsWatcher` must reply to acknowledge receipt of the session info delta. |
| /// Delinquent watchers who do not reply will eventually be disconnected. |
| SessionUpdated(struct { |
| session_id SessionId; |
| session_info_delta SessionInfoDelta; |
| }) -> (); |
| |
| /// Called by the registry service when a session is removed from the registered |
| /// collection. |
| /// |
| /// `SessionsWatcher` must reply to acknlowledge receipt of the session removal. |
| /// Delinquent watchers who do not reply will eventually be disconnected. |
| SessionRemoved(struct { |
| session_id SessionId; |
| }) -> (); |
| }; |
| |
| /// `Discovery` observes the collection of published media sessions |
| /// and connects clients to them. |
| @discoverable |
| protocol Discovery { |
| /// Connects a session watcher configured with the given options. |
| WatchSessions(resource struct { |
| watch_options WatchOptions; |
| session_watcher client_end:SessionsWatcher; |
| }); |
| |
| /// Connects to a `SessionControl` for `session_id` if present. Drops the |
| /// given channel otherwise. |
| ConnectToSession(resource struct { |
| session_id SessionId; |
| session_control_request server_end:SessionControl; |
| }); |
| }; |
| |
| /// `ObserverDiscovery` observes the collection of published media sessions |
| /// and connects clients to them for observation without playback controls. |
| @discoverable |
| protocol ObserverDiscovery { |
| /// Connects a session watcher configured with the given options. |
| WatchSessions(resource struct { |
| watch_options WatchOptions; |
| sessions_watcher client_end:SessionsWatcher; |
| }); |
| |
| /// Connects to a `SessionObserver` for `session_id` if present. Drops the |
| /// given channel otherwise. |
| ConnectToSession(resource struct { |
| session_id SessionId; |
| session_request server_end:SessionObserver; |
| }); |
| }; |
| |
| /// A protocol for watching the current active media session on the device. |
| /// |
| /// The currently active media session is the most recent existing media session |
| /// to announce a "Playing" state on the local device, even if it is now paused. |
| @discoverable |
| protocol ActiveSession { |
| /// Watches the active session. The first request will be answered immediately |
| /// with the current active session. Always leave a request hanging to receive |
| /// a reply when the active session changes. |
| WatchActiveSession() -> (resource struct { |
| session client_end:<SessionControl, optional>; |
| }); |
| }; |