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