1/*
2 * Copyright (C) 2021 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 *     http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16/**
17 * @addtogroup Bluetooth
18 * @{
19 *
20 * @brief The framework interface and callback function of a2dp sink are defined.
21 *
22 * @since 6
23 */
24
25#ifndef BLUETOOTH_A2DP_SNK_H
26#define BLUETOOTH_A2DP_SNK_H
27
28#include <cstdio>
29#include "bluetooth_types.h"
30#include "bluetooth_remote_device.h"
31#include "bluetooth_no_destructor.h"
32
33namespace OHOS {
34namespace Bluetooth {
35/**
36 * @brief A2dp sink API callback function.
37 *
38 * @since 6.0
39 */
40class A2dpSinkObserver {
41public:
42    /**
43     * @brief A destructor used to delete the a2dp sink Observer instance.
44     *
45     * @since 6.0
46     */
47    virtual ~A2dpSinkObserver() = default;
48
49    /**
50     * @brief ConnectionState Changed observer
51     * @param device bluetooth device address
52     * @param state Connecton state
53     * @param cause Connecton cause
54     * @since 12
55     */
56    virtual void OnConnectionStateChanged(const BluetoothRemoteDevice &device, int state, int cause)
57    {};
58};
59
60/**
61 * @brief A2dp sink API.
62 *
63 * @since 6.0
64 */
65class BLUETOOTH_API A2dpSink {
66public:
67    /**
68     * @brief Get a2dp sink instance.
69     *
70     * @return Returns an instance of a2dp sink.
71     * @since 6.0
72     */
73    static A2dpSink *GetProfile();
74
75    /**
76     * @brief Get devices by connection states.
77     *
78     * @param states The connection states of the bluetooth device.
79     * @return Returns devices that match the connection states.
80     * @since 6.0
81     */
82    std::vector<BluetoothRemoteDevice> GetDevicesByStates(std::vector<int> states) const;
83
84    /**
85     * @brief Get device connection state by address.
86     *
87     * @param device The address of the peer bluetooth device.
88     * @return Returns <b>A2DP_DISCONNECTED</b> if device connect state is disconnected;
89     *         Returns <b>A2DP_DISCONNECTING</b> if device connect state is disconnecting;
90     *         Returns <b>A2DP_CONNECTED</b> if device connect state is connected;
91     *         Returns <b>A2DP_CONNECTING</b> if device connect state is connecting;
92     *         Returns <b>A2DP_INVALID_STATUS</b> if can not find peer device.
93     * @since 6.0
94     */
95    int GetDeviceState(const BluetoothRemoteDevice &device) const;
96
97    /**
98     * @brief Get device playing state by address when peer device is on connected.
99     *
100     * @param device The address of the peer bluetooth device.
101     * @return Returns <b>1</b> if device is on playing;
102     *         Returns <b>0</b> if device is not on playing.
103     * @since 6.0
104     */
105    int GetPlayingState(const BluetoothRemoteDevice &device) const;
106
107    /**
108     * @brief Get device playing state by address when peer device is on connected.
109     *
110     * @param device The address of the peer bluetooth device.
111     * @param state The playing state of the peer bluetooth device.
112     * @return Returns <b>1</b> if device is on playing;
113     *         Returns <b>0</b> if device is not on playing.
114     * @since 6.0
115     */
116    int GetPlayingState(const BluetoothRemoteDevice &device, int &state) const;
117
118    /**
119     * @brief Connect to the peer bluetooth device.
120     *
121     * @param device The address of the peer bluetooth device.
122     * @return Returns <b>true</b> Perform normal connection processing.
123     *         Returns <b>false</b> Target device is on connected,or connecting,
124                                    or device is not allowed to connect,or the connection fails.
125     * @since 6.0
126     */
127    bool Connect(const BluetoothRemoteDevice &device);
128
129    /**
130     * @brief Disconnect with the peer bluetooth service.
131     *
132     * @param device The address of the peer bluetooth device.
133     * @return Returns <b>true</b> if perform normal disconnection processing.
134     *         Returns <b>false</b> if target device is on disconnected,or disconnecting,or disconnection fails.
135     * @since 6.0
136     */
137    bool Disconnect(const BluetoothRemoteDevice &device);
138
139    /**
140     * @brief Set connection strategy for peer bluetooth device.
141     *        If peer device is connected and the policy is set not allowed,then perform disconnect operation.
142     *        If peer device is disconnected and the policy is set allowed,then perform connect operation.
143     *
144     * @param device The address of the peer bluetooth device.
145     * @param strategy The device connect strategy.
146     * @return Returns <b>true</b> if the operation is successful.
147     *         Returns <b>false</b> if the operation fails.
148     * @since 6.0
149     */
150    bool SetConnectStrategy(const BluetoothRemoteDevice &device, int strategy);
151
152    /**
153     * @brief Get connection strategy of peer bluetooth device.
154     *
155     * @param device The address of the peer bluetooth device.
156     * @return Returns <b>A2DP_CONNECT_POLICY_AGREE</b> if the peer device is allowed to connect.
157     *         Returns <b>A2DP_CONNECT_POLICY_DISAGREE</b> if the peer device is not allowed to connect.
158     * @since 6.0
159     */
160    int GetConnectStrategy(const BluetoothRemoteDevice &device) const;
161
162    /**
163     * @brief Send delay reporting.
164     *
165     * @param device The address of the peer bluetooth device.
166     * @param delayValue The delay value.
167     * @return Returns <b>true</b> Set delay reporting success.
168     *         Returns <b>false</b> Set delay reporting failed,
169     */
170    bool SendDelay(const BluetoothRemoteDevice &device, uint16_t delayValue);
171
172    /**
173     * @brief Register callback function of framework.
174     *
175     * @param observer Reference to the a2dp sink observer.
176     * @since 6.0
177     */
178    void RegisterObserver(std::shared_ptr<A2dpSinkObserver> observer);
179
180    /**
181     * @brief Deregister callback function of framework.
182     *
183     * @param observer Reference to the a2dp sink observer.
184     * @since 6.0
185     */
186    void DeregisterObserver(std::shared_ptr<A2dpSinkObserver> observer);
187
188    /**
189     * @brief The external process calls the A2dpSink profile interface before the Bluetooth process starts. At this
190     * time, it needs to monitor the start of the Bluetooth process, and then call this interface to initialize the
191     * A2dpSink proflie.
192     */
193    void Init();
194
195private:
196    /**
197     * @brief A constructor used to create a a2dp sink instance.
198     *
199     * @since 6.0
200     */
201    A2dpSink(void);
202
203    /**
204     * @brief A destructor used to delete the a2dp sink instance.
205     *
206     * @since 6.0
207     */
208    ~A2dpSink(void);
209    BLUETOOTH_DISALLOW_COPY_AND_ASSIGN(A2dpSink);
210    BLUETOOTH_DECLARE_IMPL();
211
212#ifdef DTFUZZ_TEST
213    friend class BluetoothNoDestructor<A2dpSink>;
214#endif
215};
216}  // namespace Bluetooth
217}  // namespace OHOS
218#endif  // BLUETOOTH_A2DP_SNK_H