1 /* 2 * Copyright (c) 2023 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/id_audio_manager.h> 25 #include <v1_0/audio_types.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::V1_0::DAudioEvent; 42 using OHOS::HDI::DistributedAudio::Audioext::V1_0::PortOperationMode; 43 using OHOS::HDI::DistributedAudio::Audioext::V1_0::AudioParameter; 44 using OHOS::HDI::DistributedAudio::Audioext::V1_0::IDAudioCallback; 45 46 typedef enum { 47 STATUS_ONLINE = 0, 48 STATUS_OFFLINE, 49 STATUS_LOAD, 50 STATUS_UNLOAD, 51 STATUS_CREATE_RENDER, 52 } AudioAdapterStatus; 53 54 typedef enum { 55 EVENT_DEV_CLOSED = 0, 56 EVENT_OPEN_SPK, 57 EVENT_CLOSE_SPK, 58 EVENT_OPEN_MIC, 59 EVENT_CLOSE_MIC, 60 } AudioDeviceEvent; 61 62 typedef enum { 63 EVENT_GET_VOLUME = 1, 64 EVENT_GET_MIN_VOLUME = 2, 65 EVENT_GET_MAX_VOLUME = 3, 66 EVENT_IS_STREAM_MUTE = 4, 67 } VolumeEventType; 68 69 class AudioAdapterInterfaceImpl : public IAudioAdapter { 70 public: 71 explicit AudioAdapterInterfaceImpl(const AudioAdapterDescriptor &desc); 72 ~AudioAdapterInterfaceImpl() override; 73 74 int32_t InitAllPorts() override; 75 int32_t CreateRender(const AudioDeviceDescriptor &desc, const AudioSampleAttributes &attrs, 76 sptr<IAudioRender> &render) override; 77 int32_t DestroyRender(const AudioDeviceDescriptor &desc) override; 78 int32_t CreateCapture(const AudioDeviceDescriptor &desc, const AudioSampleAttributes &attrs, 79 sptr<IAudioCapture> &capture) override; 80 int32_t DestroyCapture(const AudioDeviceDescriptor &desc) override; 81 int32_t GetPortCapability(const AudioPort &port, AudioPortCapability &capability) override; 82 int32_t SetPassthroughMode(const AudioPort &port, AudioPortPassthroughMode mode) override; 83 int32_t GetPassthroughMode(const AudioPort &port, AudioPortPassthroughMode &mode) override; 84 int32_t GetDeviceStatus(AudioDeviceStatus& status) override; 85 int32_t UpdateAudioRoute(const AudioRoute &route, int32_t &routeHandle) override; 86 int32_t ReleaseAudioRoute(int32_t routeHandle) override; 87 int32_t SetMicMute(bool mute) override; 88 int32_t GetMicMute(bool& mute) override; 89 int32_t SetVoiceVolume(float volume) override; 90 int32_t SetExtraParams(AudioExtParamKey key, const std::string &condition, const std::string &value) override; 91 int32_t GetExtraParams(AudioExtParamKey key, const std::string &condition, std::string &value) override; 92 int32_t RegExtraParamObserver(const sptr<IAudioCallback> &audioCallback, int8_t cookie) override; 93 94 public: 95 void SetSpeakerCallback(const sptr<IDAudioCallback> &speakerCallback); 96 void SetMicCallback(const sptr<IDAudioCallback> &micCallback); 97 AudioAdapterDescriptor GetAdapterDesc(); 98 std::string GetDeviceCapabilitys(const uint32_t devId); 99 int32_t AdapterLoad(); 100 int32_t AdapterUnload(); 101 int32_t Notify(const uint32_t devId, const DAudioEvent &event); 102 int32_t AddAudioDevice(const uint32_t devId, const std::string &caps); 103 int32_t RemoveAudioDevice(const uint32_t devId); 104 int32_t OpenRenderDevice(const AudioDeviceDescriptor &desc, const AudioSampleAttributes &attrs); 105 int32_t CloseRenderDevice(const AudioDeviceDescriptor &desc); 106 int32_t OpenCaptureDevice(const AudioDeviceDescriptor &desc, const AudioSampleAttributes &attrs); 107 int32_t CloseCaptureDevice(const AudioDeviceDescriptor &desc); 108 uint32_t GetVolumeGroup(const uint32_t devId); 109 uint32_t GetInterruptGroup(const uint32_t devId); 110 bool IsPortsNoReg(); 111 112 private: 113 int32_t SetAudioVolume(const std::string& condition, const std::string ¶m); 114 int32_t GetAudioVolume(const std::string& condition, std::string ¶m); 115 int32_t HandleFocusChangeEvent(const DAudioEvent &event); 116 int32_t HandleRenderStateChangeEvent(const DAudioEvent &event); 117 int32_t HandleVolumeChangeEvent(const DAudioEvent &event); 118 int32_t HandleSANotifyEvent(const DAudioEvent &event); 119 int32_t WaitForSANotify(const AudioDeviceEvent &event); 120 int32_t HandleDeviceClosed(const DAudioEvent &event); 121 int32_t getEventTypeFromCondition(const std::string& condition); 122 123 private: 124 static constexpr uint8_t WAIT_SECONDS = 10; 125 static constexpr int32_t TYPE_CONDITION = 11; 126 AudioAdapterDescriptor adpDescriptor_; 127 AudioAdapterStatus status_ = STATUS_OFFLINE; 128 129 sptr<IDAudioCallback> extSpkCallback_ = nullptr; 130 sptr<IDAudioCallback> extMicCallback_ = nullptr; 131 sptr<IAudioCallback> paramCallback_ = nullptr; 132 sptr<AudioRenderInterfaceImplBase> audioRender_ = nullptr; 133 AudioParameter renderParam_; 134 sptr<AudioCaptureInterfaceImplBase> audioCapture_ = nullptr; 135 AudioParameter captureParam_; 136 137 std::mutex devMapMtx_; 138 std::mutex captureOptMtx_; 139 std::mutex renderOptMtx_; 140 std::map<uint32_t, std::string> mapAudioDevice_; 141 std::mutex spkWaitMutex_; 142 std::condition_variable spkWaitCond_; 143 std::mutex micWaitMutex_; 144 std::condition_variable micWaitCond_; 145 146 bool isSpkOpened_ = false; 147 bool isMicOpened_ = false; 148 bool spkNotifyFlag_ = false; 149 bool micNotifyFlag_ = false; 150 151 uint32_t spkPinInUse_ = 0; 152 uint32_t micPinInUse_ = 0; 153 uint32_t streamMuteStatus_ = 0; 154 uint32_t timeInterval_ = 5; 155 156 // mmap param 157 PortOperationMode renderFlags_ = Audioext::V1_0::NORMAL_MODE; 158 PortOperationMode capturerFlags_ = Audioext::V1_0::NORMAL_MODE; 159 160 const std::string NOT_MUTE_STATUS = "0"; 161 const std::string IS_MUTE_STATUS = "1"; 162 }; 163 } // V1_0 164 } // Audio 165 } // Distributedaudio 166 } // HDI 167 } // OHOS 168 #endif // OHOS_AUDIO_ADAPTER_INTERFACE_IMPL_H