1 /* 2 * Copyright (c) 2023-2024 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 #ifndef OHOS_AUDIO_ADAPTER_INTERFACE_IMPL_H 17 #define OHOS_AUDIO_ADAPTER_INTERFACE_IMPL_H 18 19 #include <condition_variable> 20 #include <map> 21 #include <mutex> 22 23 #include <v1_0/iaudio_adapter.h> 24 #include <v1_0/audio_types.h> 25 #include <v2_0/id_audio_manager.h> 26 27 #include "audio_capture_interface_impl.h" 28 #include "audio_capture_interface_impl_base.h" 29 #include "audio_render_interface_impl.h" 30 #include "audio_render_interface_impl_base.h" 31 #ifdef DAUDIO_SUPPORT_EXTENSION 32 #include "audio_capture_ext_impl.h" 33 #include "audio_render_ext_impl.h" 34 #endif 35 36 namespace OHOS { 37 namespace HDI { 38 namespace DistributedAudio { 39 namespace Audio { 40 namespace V1_0 { 41 using OHOS::HDI::DistributedAudio::Audioext::V2_0::DAudioEvent; 42 using OHOS::HDI::DistributedAudio::Audioext::V2_0::PortOperationMode; 43 using OHOS::HDI::DistributedAudio::Audioext::V2_0::AudioParameter; 44 using OHOS::HDI::DistributedAudio::Audioext::V2_0::IDAudioCallback; 45 using OHOS::HDI::DistributedAudio::Audio::V1_0::AudioPortPin; 46 47 typedef enum { 48 STATUS_ONLINE = 0, 49 STATUS_OFFLINE, 50 STATUS_LOAD, 51 STATUS_UNLOAD, 52 STATUS_CREATE_RENDER, 53 } AudioAdapterStatus; 54 55 typedef enum { 56 EVENT_DEV_CLOSED = 0, 57 EVENT_OPEN_SPK, 58 EVENT_CLOSE_SPK, 59 EVENT_OPEN_MIC, 60 EVENT_CLOSE_MIC, 61 } AudioDeviceEvent; 62 63 typedef enum { 64 EVENT_GET_VOLUME = 1, 65 EVENT_GET_MIN_VOLUME = 2, 66 EVENT_GET_MAX_VOLUME = 3, 67 EVENT_IS_STREAM_MUTE = 4, 68 } VolumeEventType; 69 70 class AudioAdapterInterfaceImpl : public IAudioAdapter { 71 public: 72 explicit AudioAdapterInterfaceImpl(const AudioAdapterDescriptor &desc); 73 ~AudioAdapterInterfaceImpl() override; 74 75 int32_t InitAllPorts() override; 76 int32_t CreateRender(const AudioDeviceDescriptor &desc, const AudioSampleAttributes &attrs, 77 sptr<IAudioRender> &render, uint32_t &renderId) override; 78 int32_t DestroyRender(uint32_t renderId) override; 79 int32_t CreateCapture(const AudioDeviceDescriptor &desc, const AudioSampleAttributes &attrs, 80 sptr<IAudioCapture> &capture, uint32_t &captureId) override; 81 int32_t DestroyCapture(uint32_t captureId) override; 82 int32_t GetPortCapability(const AudioPort &port, AudioPortCapability &capability) override; 83 int32_t SetPassthroughMode(const AudioPort &port, AudioPortPassthroughMode mode) override; 84 int32_t GetPassthroughMode(const AudioPort &port, AudioPortPassthroughMode &mode) override; 85 int32_t GetDeviceStatus(AudioDeviceStatus& status) override; 86 int32_t UpdateAudioRoute(const AudioRoute &route, int32_t &routeHandle) override; 87 int32_t ReleaseAudioRoute(int32_t routeHandle) override; 88 int32_t SetMicMute(bool mute) override; 89 int32_t GetMicMute(bool& mute) override; 90 int32_t SetVoiceVolume(float volume) override; 91 int32_t SetExtraParams(AudioExtParamKey key, const std::string &condition, const std::string &value) override; 92 int32_t GetExtraParams(AudioExtParamKey key, const std::string &condition, std::string &value) override; 93 int32_t RegExtraParamObserver(const sptr<IAudioCallback> &audioCallback, int8_t cookie) override; 94 95 public: 96 void SetSpeakerCallback(const int32_t dhId, const sptr<IDAudioCallback> &speakerCallback); 97 void SetMicCallback(const int32_t dhId, const sptr<IDAudioCallback> &micCallback); 98 AudioAdapterDescriptor GetAdapterDesc(); 99 std::string GetDeviceCapabilitys(const uint32_t devId); 100 int32_t AdapterLoad(); 101 int32_t AdapterUnload(); 102 int32_t Notify(const uint32_t devId, const uint32_t streamId, const DAudioEvent &event); 103 int32_t AddAudioDevice(const uint32_t devId, const std::string &caps); 104 int32_t RemoveAudioDevice(const uint32_t devId); 105 uint32_t GetVolumeGroup(const uint32_t devId); 106 uint32_t GetInterruptGroup(const uint32_t devId); 107 bool IsPortsNoReg(); 108 109 private: 110 int32_t OpenRenderDevice(const AudioDeviceDescriptor &desc, const AudioSampleAttributes &attrs, 111 const sptr<IDAudioCallback> extSpkCallback, const int32_t dhId, const int32_t renderId = 0); 112 int32_t CloseRenderDevice(const AudioDeviceDescriptor &desc, const sptr<IDAudioCallback> extSpkCallback, 113 const int32_t dhId, const int32_t renderId = 0); 114 int32_t OpenCaptureDevice(const AudioDeviceDescriptor &desc, const AudioSampleAttributes &attrs, 115 const sptr<IDAudioCallback> extMicCallback, const int32_t dhId, const int32_t captureId = 0); 116 int32_t CloseCaptureDevice(const AudioDeviceDescriptor &desc, const sptr<IDAudioCallback> extMicCallback, 117 const int32_t dhId, const int32_t captureId = 0); 118 int32_t SetAudioVolume(const std::string& condition, const std::string ¶m); 119 int32_t GetAudioVolume(const std::string& condition, std::string ¶m); 120 int32_t HandleFocusChangeEvent(const DAudioEvent &event); 121 int32_t HandleRenderStateChangeEvent(const DAudioEvent &event); 122 int32_t HandleVolumeChangeEvent(const DAudioEvent &event); 123 int32_t HandleSANotifyEvent(const uint32_t streamId, const DAudioEvent &event); 124 int32_t WaitForSANotify(const uint32_t streamId, const AudioDeviceEvent &event); 125 int32_t HandleDeviceClosed(const uint32_t streamId, const DAudioEvent &event); 126 int32_t getEventTypeFromCondition(const std::string& condition); 127 sptr<AudioRenderInterfaceImplBase> CreateRenderImpl(const AudioDeviceDescriptor &desc, 128 const AudioSampleAttributes &attrs, int32_t renderId); 129 int32_t InsertRenderImpl(const AudioDeviceDescriptor &desc, const AudioSampleAttributes &attrs, 130 sptr<AudioRenderInterfaceImplBase> &audioRender, const int32_t dhId, uint32_t &renderId); 131 void DeleteRenderImpl(uint32_t renderId); 132 int32_t InsertCapImpl(const sptr<AudioCaptureInterfaceImplBase> &audioCapture, const int32_t dhId, 133 uint32_t &captureId); 134 inline bool IsIdValid(const uint32_t id); 135 bool CheckRendersValid(); 136 bool CheckCapsValid(); 137 bool CheckDevCapability(const AudioDeviceDescriptor &desc); 138 void SetDumpFlag(bool isRender); 139 sptr<IDAudioCallback> MatchStreamCallback(const AudioSampleAttributes &attrs, 140 const AudioDeviceDescriptor &desc, int32_t &dhId); 141 int32_t GetVolFromEvent(const std::string &content, const std::string &key, int32_t &vol); 142 int32_t ConvertMsg2Code(const std::string &msg); 143 std::string GetVolumeChangeString(const std::string &args); 144 int32_t ParseDhIdFromJson(const std::string &args); 145 int32_t ConvertString2Int(std::string val); 146 sptr<AudioRenderInterfaceImplBase> GetRenderImpl(const std::string &content); 147 void SetSpkStatus(const uint32_t streamId, bool status); 148 bool GetSpkStatus(const uint32_t streamId); 149 150 private: 151 static constexpr uint32_t WAIT_MILLISECONDS = 8000; 152 static constexpr int32_t TYPE_CONDITION = 11; 153 static constexpr int32_t MAX_EVENT_DIGITS = 3; 154 AudioAdapterDescriptor adpDescriptor_; 155 AudioAdapterStatus status_ = STATUS_OFFLINE; 156 157 std::mutex extCallbackMtx_; 158 std::map<int32_t, sptr<IDAudioCallback>> extCallbackMap_; 159 sptr<IAudioCallback> paramCallback_ = nullptr; 160 std::mutex renderDevMtx_; 161 std::vector<std::pair<int32_t, sptr<AudioRenderInterfaceImplBase>>> renderDevs_; 162 AudioParameter renderParam_; 163 std::mutex capDevMtx_; 164 std::vector<std::pair<int32_t, sptr<AudioCaptureInterfaceImplBase>>> captureDevs_; 165 AudioParameter captureParam_; 166 167 std::mutex devMapMtx_; 168 std::mutex captureOptMtx_; 169 std::mutex renderOptMtx_; 170 std::map<uint32_t, std::string> mapAudioDevice_; 171 std::mutex spkWaitMutex_; 172 std::condition_variable spkWaitCond_; 173 std::mutex micWaitMutex_; 174 std::condition_variable micWaitCond_; 175 176 std::mutex spkStatusMutex_; 177 std::vector<bool> spkStatus_; 178 int32_t errCode_ = -1; 179 bool isMicOpened_ = false; 180 bool spkNotifyFlag_ = false; 181 bool micNotifyFlag_ = false; 182 183 uint32_t spkPinInUse_ = 0; 184 uint32_t micPinInUse_ = 0; 185 uint32_t streamMuteStatus_ = 0; 186 187 // mmap param 188 PortOperationMode renderFlags_ = Audioext::V2_0::NORMAL_MODE; 189 PortOperationMode capturerFlags_ = Audioext::V2_0::NORMAL_MODE; 190 191 const std::string NOT_MUTE_STATUS = "0"; 192 const std::string IS_MUTE_STATUS = "1"; 193 }; 194 } // V1_0 195 } // Audio 196 } // Distributedaudio 197 } // HDI 198 } // OHOS 199 #endif // OHOS_AUDIO_ADAPTER_INTERFACE_IMPL_H