• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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, uint32_t &renderId) override;
77     int32_t DestroyRender(uint32_t renderId) override;
78     int32_t CreateCapture(const AudioDeviceDescriptor &desc, const AudioSampleAttributes &attrs,
79         sptr<IAudioCapture> &capture, uint32_t &captureId) override;
80     int32_t DestroyCapture(uint32_t captureId) 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 int32_t dhId, const sptr<IDAudioCallback> &speakerCallback);
96     void SetMicCallback(const int32_t dhId, 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     uint32_t GetVolumeGroup(const uint32_t devId);
105     uint32_t GetInterruptGroup(const uint32_t devId);
106     bool IsPortsNoReg();
107 
108 private:
109     int32_t OpenRenderDevice(const AudioDeviceDescriptor &desc, const AudioSampleAttributes &attrs,
110         const sptr<IDAudioCallback> extSpkCallback, const int32_t dhId);
111     int32_t CloseRenderDevice(const AudioDeviceDescriptor &desc, const sptr<IDAudioCallback> extSpkCallback,
112         const int32_t dhId);
113     int32_t OpenCaptureDevice(const AudioDeviceDescriptor &desc, const AudioSampleAttributes &attrs,
114         const sptr<IDAudioCallback> extMicCallback, const int32_t dhId);
115     int32_t CloseCaptureDevice(const AudioDeviceDescriptor &desc, const sptr<IDAudioCallback> extMicCallback,
116         const int32_t dhId);
117     int32_t SetAudioVolume(const std::string& condition, const std::string &param);
118     int32_t GetAudioVolume(const std::string& condition, std::string &param);
119     int32_t HandleFocusChangeEvent(const DAudioEvent &event);
120     int32_t HandleRenderStateChangeEvent(const DAudioEvent &event);
121     int32_t HandleVolumeChangeEvent(const DAudioEvent &event);
122     int32_t HandleSANotifyEvent(const DAudioEvent &event);
123     int32_t WaitForSANotify(const AudioDeviceEvent &event);
124     int32_t HandleDeviceClosed(const DAudioEvent &event);
125     int32_t getEventTypeFromCondition(const std::string& condition);
126     int32_t InsertRenderImpl(const sptr<AudioRenderInterfaceImplBase> &audioRender, const int32_t dhId,
127         uint32_t &renderId);
128     int32_t InsertCapImpl(const sptr<AudioCaptureInterfaceImplBase> &audioCapture, const int32_t dhId,
129         uint32_t &captureId);
130     inline bool IsIdValid(const uint32_t id);
131     bool CheckRendersValid();
132     bool CheckCapsValid();
133     bool CheckDevCapability(const AudioDeviceDescriptor &desc);
134     void SetDumpFlag(bool isRender);
135     sptr<IDAudioCallback> MatchStreamCallback(const AudioSampleAttributes &attrs,
136         const AudioDeviceDescriptor &desc, int32_t &dhId);
137     int32_t GetVolFromEvent(const std::string &content, const std::string &key, int32_t &vol);
138     int32_t ConvertMsg2Code(const std::string &msg);
139     std::string GetVolumeChangeString(const std::string &args);
140     int32_t ParseDhIdFromJson(const std::string &args);
141     int32_t ConvertString2Int(std::string val);
142     sptr<AudioRenderInterfaceImplBase> GetRenderImpl(const std::string &content);
143 
144 private:
145     static constexpr uint8_t WAIT_SECONDS = 20;
146     static constexpr int32_t TYPE_CONDITION = 11;
147     static constexpr int32_t MAX_EVENT_DIGITS = 3;
148     AudioAdapterDescriptor adpDescriptor_;
149     AudioAdapterStatus status_ = STATUS_OFFLINE;
150 
151     std::mutex extCallbackMtx_;
152     std::map<int32_t, sptr<IDAudioCallback>> extCallbackMap_;
153     sptr<IAudioCallback> paramCallback_ = nullptr;
154     std::mutex renderDevMtx_;
155     std::vector<std::pair<int32_t, sptr<AudioRenderInterfaceImplBase>>> renderDevs_;
156     AudioParameter renderParam_;
157     std::mutex capDevMtx_;
158     std::vector<std::pair<int32_t, sptr<AudioCaptureInterfaceImplBase>>> captureDevs_;
159     AudioParameter captureParam_;
160 
161     std::mutex devMapMtx_;
162     std::mutex captureOptMtx_;
163     std::mutex renderOptMtx_;
164     std::map<uint32_t, std::string> mapAudioDevice_;
165     std::mutex spkWaitMutex_;
166     std::condition_variable spkWaitCond_;
167     std::mutex micWaitMutex_;
168     std::condition_variable micWaitCond_;
169 
170     bool isSpkOpened_ = false;
171     int32_t errCode_ = -1;
172     bool isMicOpened_ = false;
173     bool spkNotifyFlag_ = false;
174     bool micNotifyFlag_ = false;
175 
176     uint32_t spkPinInUse_ = 0;
177     uint32_t micPinInUse_ = 0;
178     uint32_t streamMuteStatus_ = 0;
179     uint32_t timeInterval_ = 5;
180 
181     // mmap param
182     PortOperationMode renderFlags_ = Audioext::V1_0::NORMAL_MODE;
183     PortOperationMode capturerFlags_ = Audioext::V1_0::NORMAL_MODE;
184 
185     const std::string NOT_MUTE_STATUS = "0";
186     const std::string IS_MUTE_STATUS = "1";
187 };
188 } // V1_0
189 } // Audio
190 } // Distributedaudio
191 } // HDI
192 } // OHOS
193 #endif // OHOS_AUDIO_ADAPTER_INTERFACE_IMPL_H