//
// Copyright (C) 2017 Google, Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at:
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
#pragma once
#include
#include
#include
namespace bluetooth {
namespace hal {
class BluetoothAvrcpInterface {
public:
// The HAL interface doesn't allow registering "user data" that carries
// context beyond the callback parameters, forcing implementations to deal
// with global variables. The *Observer interface is to redirect these events
// to interested parties in an object-oriented manner.
class TargetObserver {
public:
virtual ~TargetObserver() = default;
virtual void RemoteFeaturesCallback(const RawAddress& bd_addr,
btrc_remote_features_t features);
virtual void GetPlayStatusCallback(const RawAddress& bd_addr);
virtual void ListPlayerAppAttrCallback(const RawAddress& bd_addr);
virtual void ListPlayerAppValuesCallback(btrc_player_attr_t attr_id,
const RawAddress& bd_addr);
virtual void GetPlayerAppValueCallback(uint8_t num_attr,
btrc_player_attr_t* p_attrs,
const RawAddress& bd_addr);
virtual void GetPlayerAppAttrsTextCallback(uint8_t num_attr,
btrc_player_attr_t* p_attrs,
const RawAddress& bd_addr);
virtual void GetPlayerAppValuesTextCallback(uint8_t attr_id,
uint8_t num_val,
uint8_t* p_vals,
const RawAddress& bd_addr);
virtual void SetPlayerAppValueCallback(btrc_player_settings_t* p_vals,
const RawAddress& bd_addr);
virtual void GetElementAttrCallback(uint8_t num_attr,
btrc_media_attr_t* p_attrs,
const RawAddress& bd_addr);
virtual void RegisterNotificationCallback(btrc_event_id_t event_id,
uint32_t param,
const RawAddress& bd_addr);
virtual void VolumeChangeCallback(uint8_t volume, uint8_t ctype,
const RawAddress& bd_addr);
virtual void PassthroughCmdCallback(int id, int key_state,
const RawAddress& bd_addr);
virtual void SetAddressedPlayerCallback(uint16_t player_id,
const RawAddress& bd_addr);
virtual void SetBrowsedPlayerCallback(uint16_t player_id,
const RawAddress& bd_addr);
virtual void GetFolderItemsCallback(uint8_t scope, uint32_t start_item,
uint32_t end_item, uint8_t num_attr,
uint32_t* p_attr_ids,
const RawAddress& bd_addr);
virtual void ChangePathCallback(uint8_t direction, uint8_t* folder_uid,
const RawAddress& bd_addr);
virtual void GetItemAttrCallback(uint8_t scope, uint8_t* uid,
uint16_t uid_counter, uint8_t num_attr,
btrc_media_attr_t* p_attrs,
const RawAddress& bd_addr);
virtual void PlayItemCallback(uint8_t scope, uint16_t uid_counter,
uint8_t* uid, const RawAddress& bd_addr);
virtual void GetTotalNumOfItemsCallback(uint8_t scope,
const RawAddress& bd_addr);
virtual void SearchCallback(uint16_t str_len, uint8_t* p_str,
const RawAddress& bd_addr);
virtual void AddToNowPlayingCallback(uint8_t scope, uint8_t* uid,
uint16_t uid_counter,
const RawAddress& bd_addr);
};
class ControlObserver {
public:
virtual ~ControlObserver() = default;
virtual void PassthroughRspCallback(const RawAddress& bd_addr, int id,
int key_state);
virtual void GroupnavigationRspCallback(int id, int key_state);
virtual void ConnectionStateCallback(bool rc_connect, bool bt_connect,
const RawAddress& bd_addr);
virtual void CtrlGetrcfeaturesCallback(const RawAddress& bd_addr,
int features);
virtual void CtrlSetplayerapplicationsettingRspCallback(
const RawAddress& bd_addr, uint8_t accepted);
virtual void CtrlPlayerapplicationsettingCallback(
const RawAddress& bd_addr, uint8_t num_attr,
btrc_player_app_attr_t* app_attrs, uint8_t num_ext_attr,
btrc_player_app_ext_attr_t* ext_attrs);
virtual void CtrlPlayerapplicationsettingChangedCallback(
const RawAddress& bd_addr, const btrc_player_settings_t& p_vals);
virtual void CtrlSetabsvolCmdCallback(const RawAddress& bd_addr,
uint8_t abs_vol, uint8_t label);
virtual void CtrlRegisternotificationAbsVolCallback(
const RawAddress& bd_addr, uint8_t label);
virtual void CtrlTrackChangedCallback(const RawAddress& bd_addr,
uint8_t num_attr,
btrc_element_attr_val_t* p_attrs);
virtual void CtrlPlayPositionChangedCallback(const RawAddress& bd_addr,
uint32_t song_len,
uint32_t song_pos);
virtual void CtrlPlayStatusChangedCallback(const RawAddress& bd_addr,
btrc_play_status_t play_status);
virtual void CtrlGetFolderItemsCallback(
const RawAddress& bd_addr, btrc_status_t status,
const btrc_folder_items_t* folder_items, uint8_t count);
virtual void CtrlChangePathCallback(const RawAddress& bd_addr,
uint32_t count);
virtual void CtrlSetBrowsedPlayerCallback(const RawAddress& bd_addr,
uint8_t num_items, uint8_t depth);
virtual void CtrlSetAddressedPlayerCallback(const RawAddress& bd_addr,
uint8_t status);
};
// Initialize and clean up the BluetoothInterface singleton. Returns false if
// the underlying HAL interface failed to initialize, and true on success.
static bool Initialize();
// Shuts down and cleans up the interface. CleanUp must be called on the same
// thread that called Initialize.
static void CleanUp();
// Returns true if the interface was initialized and a global singleton has
// been created.
static bool IsInitialized();
// Initialize for testing. Use this to inject a test version of
// BluetoothAvrcpInterface. To be used from unit tests only.
static void InitializeForTesting(BluetoothAvrcpInterface* test_instance);
// Returns the BluetoothAvrcpInterface singleton. If the interface has
// not been initialized, returns nullptr. This method is thread-safe, in that
// it will block if the internal lock is being held by another thread. Don't
// call this re-entrantly from an observer event as this may cause a deadlock.
static BluetoothAvrcpInterface* Get();
virtual bool AvrcpControlEnable() = 0;
virtual void AvrcpControlDisable() = 0;
virtual bool AvrcpTargetEnable() = 0;
virtual void AvrcpTargetDisable() = 0;
// Thread-safety is guaranteed by ObserverList.
virtual void AddTargetObserver(TargetObserver* observer) = 0;
virtual void RemoveTargetObserver(TargetObserver* observer) = 0;
// Thread-safety is guaranteed by ObserverList.
virtual void AddControlObserver(ControlObserver* observer) = 0;
virtual void RemoveControlObserver(ControlObserver* observer) = 0;
// The HAL module pointers provided by the shared Bluetooth library
virtual const btrc_interface_t* GetTargetHALInterface() const = 0;
virtual const btrc_ctrl_interface_t* GetControlHALInterface() const = 0;
protected:
BluetoothAvrcpInterface() = default;
virtual ~BluetoothAvrcpInterface() = default;
private:
DISALLOW_COPY_AND_ASSIGN(BluetoothAvrcpInterface);
};
} // namespace hal
} // namespace bluetooth