• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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_1/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_1::DAudioEvent;
42 using OHOS::HDI::DistributedAudio::Audioext::V2_1::PortOperationMode;
43 using OHOS::HDI::DistributedAudio::Audioext::V2_1::AudioParameter;
44 using OHOS::HDI::DistributedAudio::Audioext::V2_1::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 HandleRenderCallback(const uint32_t renderId, const DAudioEvent &event);
127     int32_t getEventTypeFromCondition(const std::string& condition);
128     sptr<AudioRenderInterfaceImplBase> CreateRenderImpl(const AudioDeviceDescriptor &desc,
129         const AudioSampleAttributes &attrs, int32_t renderId);
130     int32_t InsertRenderImpl(const AudioDeviceDescriptor &desc, const AudioSampleAttributes &attrs,
131         sptr<AudioRenderInterfaceImplBase> &audioRender, const int32_t dhId, uint32_t &renderId);
132     void DeleteRenderImpl(uint32_t renderId);
133     int32_t InsertCapImpl(const sptr<AudioCaptureInterfaceImplBase> &audioCapture, const int32_t dhId,
134         uint32_t &captureId);
135     inline bool IsIdValid(const uint32_t id);
136     bool CheckRendersValid();
137     bool CheckCapsValid();
138     bool CheckDevCapability(const AudioDeviceDescriptor &desc);
139     void SetDumpFlag(bool isRender);
140     sptr<IDAudioCallback> MatchStreamCallback(const AudioSampleAttributes &attrs,
141         const AudioDeviceDescriptor &desc, int32_t &dhId);
142     int32_t GetVolFromEvent(const std::string &content, const std::string &key, int32_t &vol);
143     int32_t ConvertMsg2Code(const std::string &msg);
144     std::string GetVolumeChangeString(const std::string &args);
145     int32_t ParseDhIdFromJson(const std::string &args);
146     int32_t ConvertString2Int(std::string val);
147     sptr<AudioRenderInterfaceImplBase> GetRenderImpl(const std::string &content);
148     void SetSpkStatus(const uint32_t streamId, bool status);
149     bool GetSpkStatus(const uint32_t streamId);
150     sptr<IAudioCallback> GetRenderCallback(const uint32_t renderId);
151     void DeleteRenderCallback(const uint32_t renderId);
152 
153 private:
154     static constexpr uint32_t WAIT_MILLISECONDS = 8000;
155     static constexpr int32_t TYPE_CONDITION = 11;
156     static constexpr int32_t MAX_EVENT_DIGITS = 3;
157     AudioAdapterDescriptor adpDescriptor_;
158     AudioAdapterStatus status_ = STATUS_OFFLINE;
159 
160     std::mutex extCallbackMtx_;
161     std::map<int32_t, sptr<IDAudioCallback>> extCallbackMap_;
162     sptr<IAudioCallback> paramCallback_ = nullptr;
163     std::mutex renderDevMtx_;
164     std::vector<std::pair<int32_t, sptr<AudioRenderInterfaceImplBase>>> renderDevs_;
165     AudioParameter renderParam_;
166     std::mutex capDevMtx_;
167     std::vector<std::pair<int32_t, sptr<AudioCaptureInterfaceImplBase>>> captureDevs_;
168     AudioParameter captureParam_;
169     std::map<int32_t, sptr<AudioRenderInterfaceImplBase>> renderCallbacks_;
170 
171     std::mutex devMapMtx_;
172     std::mutex captureOptMtx_;
173     std::mutex renderOptMtx_;
174     std::map<uint32_t, std::string> mapAudioDevice_;
175     std::mutex spkWaitMutex_;
176     std::condition_variable spkWaitCond_;
177     std::mutex micWaitMutex_;
178     std::condition_variable micWaitCond_;
179 
180     std::mutex spkStatusMutex_;
181     std::vector<bool> spkStatus_;
182     int32_t errCode_ = -1;
183     bool isMicOpened_ = false;
184     bool spkNotifyFlag_ = false;
185     bool micNotifyFlag_ = false;
186 
187     uint32_t spkPinInUse_ = 0;
188     uint32_t micPinInUse_ = 0;
189     uint32_t streamMuteStatus_ = 0;
190 
191     // mmap param
192     PortOperationMode renderFlags_ = Audioext::V2_1::NORMAL_MODE;
193     PortOperationMode capturerFlags_ = Audioext::V2_1::NORMAL_MODE;
194 
195     const std::string NOT_MUTE_STATUS = "0";
196     const std::string IS_MUTE_STATUS = "1";
197 };
198 } // V1_0
199 } // Audio
200 } // Distributedaudio
201 } // HDI
202 } // OHOS
203 #endif // OHOS_AUDIO_ADAPTER_INTERFACE_IMPL_H