1 /*
2  * Copyright 2021 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #pragma once
18 
19 #include "../le_audio_software.h"
20 #include "bta/le_audio/le_audio_types.h"
21 #include "client_interface_hidl.h"
22 
23 namespace bluetooth {
24 namespace audio {
25 namespace hidl {
26 namespace le_audio {
27 
28 using ::android::hardware::bluetooth::audio::V2_1::PcmParameters;
29 using ::bluetooth::audio::hidl::BluetoothAudioCtrlAck;
30 using ::bluetooth::le_audio::set_configurations::AudioSetConfiguration;
31 using ::bluetooth::le_audio::set_configurations::CodecConfigSetting;
32 
33 using ::bluetooth::audio::le_audio::StartRequestState;
34 
35 constexpr uint8_t kChannelNumberMono = 1;
36 constexpr uint8_t kChannelNumberStereo = 2;
37 
38 constexpr uint32_t kSampleRate48000 = 48000;
39 constexpr uint32_t kSampleRate44100 = 44100;
40 constexpr uint32_t kSampleRate32000 = 32000;
41 constexpr uint32_t kSampleRate24000 = 24000;
42 constexpr uint32_t kSampleRate16000 = 16000;
43 constexpr uint32_t kSampleRate8000 = 8000;
44 
45 constexpr uint8_t kBitsPerSample16 = 16;
46 constexpr uint8_t kBitsPerSample24 = 24;
47 constexpr uint8_t kBitsPerSample32 = 32;
48 
49 using ::bluetooth::audio::le_audio::StreamCallbacks;
50 
51 void flush_sink();
52 void flush_source();
53 
54 bool is_source_hal_enabled();
55 bool is_sink_hal_enabled();
56 
57 class LeAudioTransport {
58 public:
59   LeAudioTransport(void (*flush)(void), StreamCallbacks stream_cb, PcmParameters pcm_config);
60 
61   BluetoothAudioCtrlAck StartRequest();
62 
63   BluetoothAudioCtrlAck SuspendRequest();
64 
65   void StopRequest();
66 
67   bool GetPresentationPosition(uint64_t* remote_delay_report_ns, uint64_t* total_bytes_processed,
68                                timespec* data_position);
69 
70   void MetadataChanged(const source_metadata_t& source_metadata);
71 
72   void ResetPresentationPosition();
73 
74   void LogBytesProcessed(size_t bytes_processed);
75 
76   void SetRemoteDelay(uint16_t delay_report_ms);
77 
78   const PcmParameters& LeAudioGetSelectedHalPcmConfig();
79 
80   void LeAudioSetSelectedHalPcmConfig(uint32_t sample_rate_hz, uint8_t bit_rate,
81                                       uint8_t channels_count, uint32_t data_interval);
82 
83   bool IsRequestCompletedAfterUpdate(
84           const std::function<std::pair<StartRequestState, bool>(StartRequestState)>& lambda);
85 
86   StartRequestState GetStartRequestState(void);
87   void ClearStartRequestState(void);
88   void SetStartRequestState(StartRequestState state);
89 
90 private:
91   void (*flush_)(void);
92   StreamCallbacks stream_cb_;
93   uint16_t remote_delay_report_ms_;
94   uint64_t total_bytes_processed_;
95   timespec data_position_;
96   PcmParameters pcm_config_;
97   mutable std::mutex start_request_state_mutex_;
98   std::atomic<StartRequestState> start_request_state_;
99 };
100 
101 // Sink transport implementation for Le Audio
102 class LeAudioSinkTransport : public ::bluetooth::audio::hidl::IBluetoothSinkTransportInstance {
103 public:
104   LeAudioSinkTransport(SessionType_2_1 session_type, StreamCallbacks stream_cb);
105 
106   ~LeAudioSinkTransport();
107 
108   BluetoothAudioCtrlAck StartRequest() override;
109 
110   BluetoothAudioCtrlAck SuspendRequest() override;
111 
112   void StopRequest() override;
113 
114   bool GetPresentationPosition(uint64_t* remote_delay_report_ns, uint64_t* total_bytes_read,
115                                timespec* data_position) override;
116 
117   void MetadataChanged(const source_metadata_t& source_metadata) override;
118 
119   void ResetPresentationPosition() override;
120 
121   void LogBytesRead(size_t bytes_read) override;
122 
123   void SetRemoteDelay(uint16_t delay_report_ms);
124 
125   const PcmParameters& LeAudioGetSelectedHalPcmConfig();
126 
127   void LeAudioSetSelectedHalPcmConfig(uint32_t sample_rate_hz, uint8_t bit_rate,
128                                       uint8_t channels_count, uint32_t data_interval);
129 
130   bool IsRequestCompletedAfterUpdate(
131           const std::function<std::pair<StartRequestState, bool>(StartRequestState)>& lambda);
132 
133   StartRequestState GetStartRequestState(void);
134   void ClearStartRequestState(void);
135   void SetStartRequestState(StartRequestState state);
136 
137   static inline LeAudioSinkTransport* instance = nullptr;
138   static inline BluetoothAudioSinkClientInterface* interface = nullptr;
139 
140 private:
141   LeAudioTransport* transport_;
142 };
143 
144 class LeAudioSourceTransport : public ::bluetooth::audio::hidl::IBluetoothSourceTransportInstance {
145 public:
146   LeAudioSourceTransport(SessionType_2_1 session_type, StreamCallbacks stream_cb);
147 
148   ~LeAudioSourceTransport();
149 
150   BluetoothAudioCtrlAck StartRequest() override;
151 
152   BluetoothAudioCtrlAck SuspendRequest() override;
153 
154   void StopRequest() override;
155 
156   bool GetPresentationPosition(uint64_t* remote_delay_report_ns, uint64_t* total_bytes_written,
157                                timespec* data_position) override;
158 
159   void MetadataChanged(const source_metadata_t& source_metadata) override;
160 
161   void ResetPresentationPosition() override;
162 
163   void LogBytesWritten(size_t bytes_written) override;
164 
165   void SetRemoteDelay(uint16_t delay_report_ms);
166 
167   const PcmParameters& LeAudioGetSelectedHalPcmConfig();
168 
169   void LeAudioSetSelectedHalPcmConfig(uint32_t sample_rate_hz, uint8_t bit_rate,
170                                       uint8_t channels_count, uint32_t data_interval);
171 
172   bool IsRequestCompletedAfterUpdate(
173           const std::function<std::pair<StartRequestState, bool>(StartRequestState)>& lambda);
174   StartRequestState GetStartRequestState(void);
175   void ClearStartRequestState(void);
176   void SetStartRequestState(StartRequestState state);
177 
178   static inline LeAudioSourceTransport* instance = nullptr;
179   static inline BluetoothAudioSourceClientInterface* interface = nullptr;
180 
181 private:
182   LeAudioTransport* transport_;
183 };
184 
185 }  // namespace le_audio
186 }  // namespace hidl
187 }  // namespace audio
188 }  // namespace bluetooth
189