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