// // 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 #include "base/macros.h" #include "service/common/bluetooth/avrcp_int_value.h" #include "service/common/bluetooth/avrcp_register_notification_response.h" #include "service/common/bluetooth/avrcp_string_value.h" #include "service/bluetooth_instance.h" #include "service/hal/bluetooth_avrcp_interface.h" namespace bluetooth { // Note: presently this only supports // (BTRC_FEAT_METADATA | BTRC_FEAT_ABSOLUTE_VOLUME) class AvrcpTarget : public BluetoothInstance, private hal::BluetoothAvrcpInterface::TargetObserver { public: // We only allow one instance of this object at a time. static const int kSingletonInstanceId; class Delegate { public: virtual void OnGetRemoteFeatures(const std::string& addr, int32_t features) = 0; virtual void OnGetPlayStatus(const std::string& addr) = 0; virtual void OnListPlayerAppAttr(const std::string& addr) = 0; virtual void OnListPlayerAppValues(const std::string& addr, int32_t attr_id) = 0; virtual void OnGetPlayerAppValue(const std::string& addr, const std::vector& attrs) = 0; virtual void OnGetPlayerAppAttrsText(const std::string& addr, const std::vector& attrs) = 0; virtual void OnGetPlayerAppValuesText( const std::string& addr, int32_t attr_id, const std::vector& values) = 0; virtual void OnSetPlayerAppValue( const std::string& addr, const std::vector& values) = 0; virtual void OnGetElementAttrs(const std::string& addr, const std::vector& attrs) = 0; virtual void OnRegisterNotification(const std::string& addr, int32_t event_id, uint32_t param) = 0; virtual void OnVolumeChange(const std::string& addr, int32_t volume, int32_t ctype) = 0; virtual void OnPassThroughCommand(const std::string& addr, int32_t id, int32_t key_state) = 0; protected: virtual ~Delegate() = default; }; // The destructor automatically unregisters this instance from the stack. ~AvrcpTarget() override; // Assigns a delegate to this instance. |delegate| must out-live this // AvrcpTarget instance. void SetDelegate(Delegate* delegate); // BluetoothClientInstace overrides: const Uuid& GetAppIdentifier() const override; int GetInstanceId() const override; bool Enable(); void Disable(); bool GetPlayStatusResponse(const std::string& addr, int32_t play_status, uint32_t song_len, uint32_t song_pos); bool ListPlayerAppAttrResponse(const std::string& addr, const std::vector& attrs); bool GetPlayerAppValueResponse(const std::string& addr, const std::vector& values); bool GetPlayerAppAttrTextResponse(const std::string& addr, const std::vector& attrs); bool GetPlayerAppValueTextResponse( const std::string& addr, const std::vector& attrs); bool GetElementAttrResponse(const std::string& addr, const std::vector& attrs); bool SetPlayerAppValueResponse(const std::string& addr, int32_t rsp_status); bool RegisterNotificationResponse( int32_t event_id, int32_t type, const AvrcpRegisterNotificationResponse& param); bool SetVolume(int volume); private: friend class AvrcpTargetFactory; // Constructor shouldn't be called directly as instances are meant to be // obtained from the factory. AvrcpTarget(const Uuid& uuid); // hal::BluetoothAvrcpInterface::TargetObserver implementation: void RemoteFeaturesCallback(const RawAddress& bd_addr, btrc_remote_features_t features) override; void GetPlayStatusCallback(const RawAddress& bd_addr) override; void ListPlayerAppAttrCallback(const RawAddress& bd_addr) override; void ListPlayerAppValuesCallback(btrc_player_attr_t attr_id, const RawAddress& bd_addr) override; void GetPlayerAppValueCallback(uint8_t num_attr, btrc_player_attr_t* p_attrs, const RawAddress& bd_addr) override; void GetPlayerAppAttrsTextCallback(uint8_t num_attr, btrc_player_attr_t* p_attrs, const RawAddress& bd_addr) override; void GetPlayerAppValuesTextCallback(uint8_t attr_id, uint8_t num_val, uint8_t* p_vals, const RawAddress& bd_addr) override; void SetPlayerAppValueCallback(btrc_player_settings_t* p_vals, const RawAddress& bd_addr) override; void GetElementAttrCallback(uint8_t num_attr, btrc_media_attr_t* p_attrs, const RawAddress& bd_addr) override; void RegisterNotificationCallback(btrc_event_id_t event_id, uint32_t param, const RawAddress& bd_addr) override; void VolumeChangeCallback(uint8_t volume, uint8_t ctype, const RawAddress& bd_addr) override; void PassthroughCmdCallback(int id, int key_state, const RawAddress& bd_addr) override; // See getters for documentation. const Uuid app_identifier_; // Mutex that synchronizes access to the entries below. std::mutex mutex_; // Raw handle to the Delegate, which must outlive this AvrcpTarget instance. std::mutex delegate_mutex_; Delegate* delegate_ = nullptr; DISALLOW_COPY_AND_ASSIGN(AvrcpTarget); }; // AvrcpTargetFactory is used to register and obtain a per-application // AvrcpTarget // instance. Users should call RegisterClient to obtain their own unique // AvrcpTarget instance that has been registered with the Bluetooth stack. class AvrcpTargetFactory : public BluetoothInstanceFactory, private hal::BluetoothAvrcpInterface::TargetObserver { public: // Don't construct/destruct directly except in tests. Instead, obtain a handle // from an Adapter instance. AvrcpTargetFactory(); ~AvrcpTargetFactory() override; // BluetoothInstanceFactory override: bool RegisterInstance(const Uuid& uuid, const RegisterCallback& callback) override; private: DISALLOW_COPY_AND_ASSIGN(AvrcpTargetFactory); }; } // namespace bluetooth