blob: c41587726a2a93fd3cd6afc18c1bcb3f6ed54604 [file] [log] [blame]
// 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.bluetooth.avrcp;
using fuchsia.bluetooth as bt;
using zx;
@discoverable
closed protocol PeerManager {
/// Returns a browse controller client to a remote target (TG) service at
/// the peer specified by `peer_id`.
strict GetBrowseControllerForTarget(resource struct {
peer_id bt.PeerId;
client server_end:BrowseController;
}) -> () error zx.Status;
/// Returns a controller client to a remote target (TG) service at the peer specified by
/// `peer_id`.
strict GetControllerForTarget(resource struct {
peer_id bt.PeerId;
client server_end:Controller;
}) -> () error zx.Status;
/// Set the absolute volume handler. Only one handler may be set at at time.
/// If a second handler is registered it will be dropped and an error will
/// be returned.
strict SetAbsoluteVolumeHandler(resource struct {
handler client_end:AbsoluteVolumeHandler;
}) -> () error zx.Status;
/// Sets an implementation of target handler that will vend delegates for each incoming
/// remote TG -> local CT connections to handle the commands being sent by the remote TG.
strict RegisterTargetHandler(resource struct {
handler client_end:TargetHandler;
}) -> () error zx.Status;
};
/// Handler for absolute volume requests from a remote peer. See AVRCP v 1.6.2 section 6.13.2.
/// Absolute volume is represented as a percentage using one byte with the most significant bit
/// reserved. 0% is represented as 0x0 and 100% as 0x7f. Volume should scaled between the
/// two values.
closed protocol AbsoluteVolumeHandler {
/// Requests that the absolute volume of the player be changed.
/// `requested_volume` is the requested volume by the peer.
/// Returns the actual volume set locally by the handler.
strict SetVolume(struct {
requested_volume uint8;
}) -> (struct {
set_volume uint8;
});
/// Returns latest volume of the handler to the AVRCP service. This function should return
/// immediately on the first call and if the volume has changed since the last call to this
/// function, otherwise it should only return when the volume has been changed.
/// Multiple outstanding `OnVolumeChanged` requests can be made - all outstanding calls will
/// return when the volume has been changed.
// TODO(https://fxbug.dev/42131477): Update docs when addressed.
strict OnVolumeChanged() -> (struct {
new_volume uint8;
});
/// Returns the current volume immediately.
strict GetCurrentVolume() -> (struct {
volume uint8;
});
};
/// Client wrapper for local controller (CT) -> remote target (TG) AVCTP
/// connections between devices for browse related commands.
///
/// NOTE: a client is high level construct and does not represent a connection
/// with a device. Connections are internally managed and may be shared by
/// multiple clients. The actual connection may be opened on-demand after any
/// command here is called.
closed protocol BrowseController {
/// Used for GetFolderItems(MediaPlayerList).
/// Gets the list of media players. End index is inclusive.
strict GetMediaPlayerItems(struct {
start_index uint32;
end_index uint32;
}) -> (struct {
items vector<MediaPlayerItem>:MAX_MEDIA_PLAYER_ITEMS;
}) error BrowseControllerError;
/// Used for GetFolderItems(NowPlayingList).
/// Gets the list of items from the now playing list aka the queue of the
/// addressed media player.
/// + request `end_index` is inclusive.
strict GetNowPlayingItems(struct {
start_index uint32;
end_index uint32;
attribute_option AttributeRequestOption;
}) -> (struct {
items vector<MediaElementItem>:MAX_NOW_PLAYING_ITEMS;
}) error BrowseControllerError;
/// Used for GetFolderItems(MediaPlayerVirtualFilesystem).
/// Gets the list of folder item/media element item.
/// + request `end_index` is inclusive.
strict GetFileSystemItems(struct {
start_index uint32;
end_index uint32;
attribute_option AttributeRequestOption;
}) -> (struct {
items vector<FileSystemItem>:MAX_FILESYSTEM_ITEMS;
}) error BrowseControllerError;
/// Used for ChangePath browse command.
/// + request `path` dictates whether or not the direction will be Move Up
/// or Move down. If `path.parent` is set, direction will be Move Up. If
/// `path.child_folder_uid` is set, direction will be Move Down.
strict ChangePath(struct {
path Path;
}) -> (struct {
num_items uint32;
}) error BrowseControllerError;
/// Used for PlayItem(FileSystem).
strict PlayFileSystemItem(struct {
/// UID of folder or media element.
uid uint64;
}) -> () error BrowseControllerError;
/// Used for PlayItem(NowPlayingList). Plays the specified item from the now playing
/// list aka the queue of the addressed media player.
strict PlayNowPlayingItem(struct {
uid uint64;
}) -> () error BrowseControllerError;
/// Changes the addressed `player_id` on the target when multiple are supported.
strict SetBrowsedPlayer(struct {
player_id uint16;
}) -> () error BrowseControllerError;
};
/// Client wrapper for local controller (CT) -> remote target (TG) AVCTP
/// connections between devices for AV/C commands.
///
/// See `BrowseController` protocol note for more detailed explanation on
/// the purpose of this protocol.
closed protocol Controller {
/// Returns currently set player application setting values for the `attribute_ids`.
/// If no `attribute_ids` are provided, this method will query the TG for all valid
/// attribute ID's, and return the currently set player application setting values.
strict GetPlayerApplicationSettings(struct {
attribute_ids vector<PlayerApplicationSettingAttributeId>:MAX_ATTRIBUTES;
}) -> (struct {
current_settings PlayerApplicationSettings;
}) error ControllerError;
/// Sets the player application settings specified by `requested_settings`. Only
/// settings specified in the input `requested_settings` will be overwritten.
/// Returns the actual settings that were set.
/// Settings provided in the `requested_settings` that are unsupported or unknown
/// will not be set; the returned `set_settings` will include only the settings
/// that were successfully set on the remote target.
strict SetPlayerApplicationSettings(struct {
requested_settings PlayerApplicationSettings;
}) -> (struct {
set_settings PlayerApplicationSettings;
}) error ControllerError;
/// Returns the currently playing media attributes.
/// May send either the GetElementAttributes or GetItemAttributes command depending on what
/// is supported.
strict GetMediaAttributes() -> (struct {
attributes MediaAttributes;
}) error ControllerError;
/// Returns the status of the currently playing media.
strict GetPlayStatus() -> (struct {
play_status PlayStatus;
}) error ControllerError;
/// Request the absolute volume on the peer be changed. Returns the actual volume set by the
/// peer. Values can range from 0x00 to 0x7F (with 100% volume being 0x7F). You may not get a
/// volume changed notification event from the remote peer as result of changing this.
strict SetAbsoluteVolume(struct {
requested_volume uint8;
}) -> (struct {
set_volume uint8;
}) error ControllerError;
/// Inform target of the controller's battery level.
strict InformBatteryStatus(struct {
battery_status BatteryStatus;
}) -> () error ControllerError;
/// Filters notifications that will be received with [`OnNotification`]. Not all notifications
/// are supported by all peers. Resetting the notification filter may trigger all requested
/// notification types to post their current value to [`OnNotification`] immediately.
///
/// The `position_change_interval` argument is used to set the interval in seconds that the
/// controller client would like to be notified of `TRACK_POS_CHANGED` events.
/// `position_change_interval` is ignored if `TRACK_POS` is not set. The position change interval
/// is best effort and not a guarantee and events may arrive more frequently or less frequently
/// than requested.
strict SetNotificationFilter(struct {
notifications Notifications;
position_change_interval uint32;
});
/// Incoming notification events from the target peer. `timestamp` is monotonic wall time
/// of when the event was received by the peer.
/// You must call [`NotifyNotificationHandled`] after receving a notification event to
/// acknowledge delivery. Multiple non-discrete events may be combined into a single
/// notification if acknowledged after a new event arrives from a peer.
/// Call [`SetNotificationFilter`] to set the notifications that are requested of the peer.
/// All notifications are discrete state changes except volume change and position change
/// notifications.
strict -> OnNotification(struct {
timestamp zx.Time;
notification Notification;
});
/// Call to acknowledge handling of a notification from [`OnNotification`].
strict NotifyNotificationHandled();
/// Changes the addressed `player_id` on the target when multiple are supported.
strict SetAddressedPlayer(struct {
player_id uint16;
}) -> () error ControllerError;
/// Send an AV\C passthrough key command. Sends both a key down and key up event.
strict SendCommand(struct {
command AvcPanelCommand;
}) -> () error ControllerError;
};