1 /*
2  * Copyright 2021 HIMSA II K/S - www.himsa.com.
3  * Represented by EHIMA - www.ehima.com
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  *      http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  */
17 
18 #pragma once
19 
20 #include <hardware/bluetooth.h>
21 
22 #include <variant>
23 
24 namespace bluetooth {
25 namespace vc {
26 
27 enum class ConnectionState {
28   DISCONNECTED = 0,
29   CONNECTING,
30   CONNECTED,
31   DISCONNECTING
32 };
33 
34 class VolumeControlCallbacks {
35  public:
36   virtual ~VolumeControlCallbacks() = default;
37 
38   /** Callback for profile connection state change */
39   virtual void OnConnectionState(ConnectionState state,
40                                  const RawAddress& address) = 0;
41 
42   /* Callback for the volume change changed on the device */
43   virtual void OnVolumeStateChanged(const RawAddress& address, uint8_t volume,
44                                     bool mute) = 0;
45 
46   /* Callback for the volume change changed on the group*/
47   virtual void OnGroupVolumeStateChanged(int group_id, uint8_t volume,
48                                          bool mute) = 0;
49 };
50 
51 class VolumeControlInterface {
52  public:
53   virtual ~VolumeControlInterface() = default;
54 
55   /** Register the Volume Control callbacks */
56   virtual void Init(VolumeControlCallbacks* callbacks) = 0;
57 
58   /** Closes the interface */
59   virtual void Cleanup(void) = 0;
60 
61   /** Connect to Volume Control */
62   virtual void Connect(const RawAddress& address) = 0;
63 
64   /** Disconnect from Volume Control */
65   virtual void Disconnect(const RawAddress& address) = 0;
66 
67   /** Called when Volume control devices is unbonded */
68   virtual void RemoveDevice(const RawAddress& address) = 0;
69 
70   /** Set the volume */
71   virtual void SetVolume(std::variant<RawAddress, int> addr_or_group_id,
72                          uint8_t volume) = 0;
73 };
74 
75 } /* namespace vc */
76 } /* namespace bluetooth */
77