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 &param);
119     int32_t GetAudioVolume(const std::string& condition, std::string &param);
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