123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179 |
- //
- // 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 <mutex>
- #include <string>
- #include <vector>
- #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<int32_t>& attrs) = 0;
- virtual void OnGetPlayerAppAttrsText(const std::string& addr,
- const std::vector<int32_t>& attrs) = 0;
- virtual void OnGetPlayerAppValuesText(
- const std::string& addr, int32_t attr_id,
- const std::vector<int32_t>& values) = 0;
- virtual void OnSetPlayerAppValue(
- const std::string& addr, const std::vector<AvrcpIntValue>& values) = 0;
- virtual void OnGetElementAttrs(const std::string& addr,
- const std::vector<int32_t>& 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<int32_t>& attrs);
- bool GetPlayerAppValueResponse(const std::string& addr,
- const std::vector<AvrcpIntValue>& values);
- bool GetPlayerAppAttrTextResponse(const std::string& addr,
- const std::vector<AvrcpStringValue>& attrs);
- bool GetPlayerAppValueTextResponse(
- const std::string& addr, const std::vector<AvrcpStringValue>& attrs);
- bool GetElementAttrResponse(const std::string& addr,
- const std::vector<AvrcpStringValue>& 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
|