• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2025 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 AUDIO_CAPTURE_SOURCE_H
17 #define AUDIO_CAPTURE_SOURCE_H
18 
19 #include "source/i_audio_capture_source.h"
20 #include <iostream>
21 #include <cstring>
22 #include <mutex>
23 #include <thread>
24 #include "v5_0/iaudio_manager.h"
25 #include "audio_utils.h"
26 #include "util/audio_running_lock.h"
27 #include "util/ring_buffer_handler.h"
28 #include "util/callback_wrapper.h"
29 #include "audio_primary_source_clock.h"
30 
31 namespace OHOS {
32 namespace AudioStandard {
33 
34 class AudioCaptureSource : public IAudioCaptureSource {
35 public:
36     explicit AudioCaptureSource(const uint32_t captureId, const std::string &halName = "primary");
37     ~AudioCaptureSource();
38 
39     int32_t Init(const IAudioSourceAttr &attr) override;
40     void DeInit(void) override;
41     bool IsInited(void) override;
42 
43     int32_t Start(void) override;
44     int32_t Stop(void) override;
45     int32_t Resume(void) override;
46     int32_t Pause(void) override;
47     int32_t Flush(void) override;
48     int32_t Reset(void) override;
49     int32_t CaptureFrame(char *frame, uint64_t requestBytes, uint64_t &replyBytes) override;
50     int32_t CaptureFrameWithEc(FrameDesc *fdesc, uint64_t &replyBytes, FrameDesc *fdescEc,
51         uint64_t &replyBytesEc) override;
52 
53     std::string GetAudioParameter(const AudioParamKey key, const std::string &condition) override;
54 
55     int32_t SetVolume(float left, float right) override;
56     int32_t GetVolume(float &left, float &right) override;
57     int32_t SetMute(bool isMute) override;
58     int32_t GetMute(bool &isMute) override;
59 
60     uint64_t GetTransactionId(void) override;
61     int32_t GetPresentationPosition(uint64_t &frames, int64_t &timeSec, int64_t &timeNanoSec) override;
62     float GetMaxAmplitude(void) override;
63 
64     int32_t SetAudioScene(AudioScene audioScene, bool scoExcludeFlag = false) override;
65 
66     int32_t UpdateActiveDevice(DeviceType inputDevice) override;
67     int32_t UpdateSourceType(SourceType sourceType) override;
68     void RegistCallback(uint32_t type, IAudioSourceCallback *callback) override;
69     void RegistCallback(uint32_t type, std::shared_ptr<IAudioSourceCallback> callback) override;
70 
71     int32_t UpdateAppsUid(const int32_t appsUid[PA_MAX_OUTPUTS_PER_SOURCE], const size_t size) final;
72     int32_t UpdateAppsUid(const std::vector<int32_t> &appsUid) final;
73 
74     void SetAddress(const std::string &address) override;
75     int32_t SetAccessoryDeviceState(bool state);
76     void DumpInfo(std::string &dumpString) override;
77 
78     void SetDmDeviceType(uint16_t dmDeviceType, DeviceType deviceType) override;
79 
80 private:
81     static AudioFormat ConvertToHdiFormat(AudioSampleFormat format);
82     static uint64_t GetChannelLayoutByChannelCount(uint32_t channelCount);
83     static enum AudioInputType ConvertToHDIAudioInputType(int32_t sourceType);
84     static AudioSampleFormat ParseAudioFormat(const std::string &format);
85     static AudioCategory GetAudioCategory(AudioScene audioScene);
86     static int32_t GetByteSizeByFormat(AudioSampleFormat format);
87     static bool IsFormalSourceType(int32_t sourceType);
88     uint32_t GetUniqueId(void) const;
89     uint32_t GetUniqueIdBySourceType(void) const;
90     void InitEcOrMicRefAttr(const IAudioSourceAttr &attr);
91     void InitAudioSampleAttr(struct AudioSampleAttributes &param);
92     void InitDeviceDesc(struct AudioDeviceDescriptor &deviceDesc);
93     void InitSceneDesc(struct AudioSceneDescriptor &sceneDesc, AudioScene audioScene);
94     void SetAudioRouteInfoForEnhanceChain(void);
95     int32_t CreateCapture(void);
96     int32_t DoSetInputRoute(DeviceType inputDevice);
97     int32_t InitCapture(void);
98     void InitLatencyMeasurement(void);
99     void DeInitLatencyMeasurement(void);
100     void CheckLatencySignal(uint8_t *frame, size_t replyBytes);
101     void CheckUpdateState(char *frame, size_t replyBytes);
102     bool IsNonblockingSource(const std::string &adapterName);
103     int32_t NonblockingStart(void);
104     int32_t NonblockingStop(void);
105     int32_t NonblockingCaptureFrameWithEc(FrameDesc *fdescEc, uint64_t &replyBytesEc);
106     void CaptureFrameOnlyEc(std::vector<uint8_t> &ecData);
107     void CaptureThreadLoop(void);
108     int32_t UpdateActiveDeviceWithoutLock(DeviceType inputDevice);
109     int32_t DoStop(void);
110     void DumpData(char *frame, uint64_t &replyBytes);
111     void InitRunningLock(void);
112     void CheckAcousticEchoCancelerSupported(int32_t sourcetype, int32_t &hdiAudioInputType);
113     bool IsCaptureInvalid(void) override;
114 
115 private:
116     static constexpr uint32_t AUDIO_CHANNELCOUNT = 2;
117     static constexpr uint32_t AUDIO_SAMPLE_RATE_48K = 48000;
118     static constexpr uint32_t DEEP_BUFFER_CAPTURE_PERIOD_SIZE = 4096;
119     static constexpr uint32_t STEREO_CHANNEL_COUNT = 2;
120     static constexpr float MAX_VOLUME_LEVEL = 15.0f;
121     static constexpr uint16_t GET_MAX_AMPLITUDE_FRAMES_THRESHOLD = 10;
122     static constexpr int32_t HALF_FACTOR = 2;
123     static constexpr uint32_t AUDIO_BUFFER_SIZE = 16 * 1024;
124     static constexpr uint32_t USB_DEFAULT_BUFFER_SIZE = 3840;
125     static constexpr uint32_t FRAME_TIME_LEN_MS = 20; // 20ms
126 #ifdef FEATURE_POWER_MANAGER
127     static constexpr const char *RUNNING_LOCK_NAME = "AudioPrimaryCapture";
128     static constexpr const char *RUNNING_LOCK_NAME_WAKEUP = "AudioWakeupCapture";
129     static constexpr int32_t RUNNING_LOCK_TIMEOUTMS_LASTING = -1;
130 #endif
131 
132     uint32_t captureId_ = HDI_INVALID_ID;
133     const std::string halName_ = "";
134     IAudioSourceAttr attr_ = {};
135     std::mutex callbackMutex_;
136     SourceCallbackWrapper callback_ = {};
137     bool sourceInited_ = false;
138     bool captureInited_ = false;
139     std::atomic<bool> started_ = false;
140     bool paused_ = false;
141     float leftVolume_ = MAX_VOLUME_LEVEL;
142     float rightVolume_ = MAX_VOLUME_LEVEL;
143     std::mutex statusMutex_;
144     uint32_t openMic_ = 0;
145     uint32_t hdiCaptureId_ = 0;
146     std::string adapterNameCase_ = "";
147     struct IAudioCapture *audioCapture_ = nullptr;
148     // for signal detect
149     std::shared_ptr<SignalDetectAgent> signalDetectAgent_ = nullptr;
150     bool signalDetected_ = false;
151     std::mutex signalDetectMutex_;
152     // for get amplitude
153     float maxAmplitude_ = 0;
154     int64_t lastGetMaxAmplitudeTime_ = 0;
155     int64_t last10FrameStartTime_ = 0;
156     bool startUpdate_ = false;
157     int captureFrameNum_ = 0;
158     // for dfx log
159     int32_t logMode_ = 0;
160     std::string logUtilsTag_ = "";
161     mutable int64_t volumeDataCount_ = 0;
162     // for ec and mic_ref
163     std::unique_ptr<std::thread> captureThread_ = nullptr;
164     bool isCaptureThreadRunning_ = false;
165     std::shared_ptr<RingBufferHandler> ringBufferHandler_ = nullptr;
166 #ifdef FEATURE_POWER_MANAGER
167     std::shared_ptr<AudioRunningLock> runningLock_;
168 #endif
169     FILE *dumpFile_ = nullptr;
170     std::string dumpFileName_ = "";
171     DeviceType currentActiveDevice_ = DEVICE_TYPE_INVALID;
172     AudioScene currentAudioScene_ = AUDIO_SCENE_INVALID;
173     std::atomic<bool> muteState_ = false;
174     std::string address_ = "";
175     std::unordered_map<DeviceType, uint16_t> dmDeviceTypeMap_;
176 
177     std::shared_ptr<AudioCapturerSourceClock> audioSrcClock_ = nullptr;
178 };
179 
180 } // namespace AudioStandard
181 } // namespace OHOS
182 
183 #endif // AUDIO_CAPTURE_SOURCE_H
184