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