• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022 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 #include "audio_errors.h"
17 #include "audio_policy_manager.h"
18 #include "audio_capturer_gateway.h"
19 #include "audio_container_stream_base.h"
20 #include "audio_log.h"
21 #include "audio_capturer.h"
22 
23 namespace OHOS {
24 namespace AudioStandard {
25 AudioCapturer::~AudioCapturer() = default;
26 
~AudioCapturerGateway()27 AudioCapturerGateway::~AudioCapturerGateway()
28 {
29     CapturerState state = GetStatus();
30     if (state != CAPTURER_RELEASED && state != CAPTURER_NEW) {
31         Release();
32     }
33 }
34 
AudioCapturerGateway(AudioStreamType audioStreamType,const AppInfo & appInfo)35 AudioCapturerGateway::AudioCapturerGateway(AudioStreamType audioStreamType, const AppInfo &appInfo)
36 {
37     appInfo_ = appInfo;
38     if (!(appInfo_.appPid)) {
39         appInfo_.appPid = getpid();
40     }
41 
42     if (appInfo_.appUid < 0) {
43         appInfo_.appUid = static_cast<int32_t>(getuid());
44     }
45 
46     audioStream_ = std::make_shared<AudioContainerCaptureStream>(audioStreamType, AUDIO_MODE_RECORD, appInfo.appUid);
47     if (audioStream_) {
48     AUDIO_DEBUG_LOG("AudioCapturerGateway::Audio stream created");
49     }
50 }
51 
GetFrameCount(uint32_t & frameCount) const52 int32_t AudioCapturerGateway::GetFrameCount(uint32_t &frameCount) const
53 {
54     return audioStream_->GetFrameCount(frameCount);
55 }
56 
SetParams(const AudioCapturerParams params)57 int32_t AudioCapturerGateway::SetParams(const AudioCapturerParams params)
58 {
59     audioStream_->SetCapturerInfo(capturerInfo_);
60 
61     AudioStreamParams audioStreamParams;
62     audioStreamParams.format = params.audioSampleFormat;
63     audioStreamParams.samplingRate = params.samplingRate;
64     audioStreamParams.channels = params.audioChannel;
65     audioStreamParams.encoding = params.audioEncoding;
66 
67     audioStream_->SetClientID(appInfo_.appPid, appInfo_.appUid);
68     AUDIO_INFO_LOG("AudioCapturerGateway::SetParams SetAudioStreamInfo");
69     return audioStream_->SetAudioStreamInfo(audioStreamParams);
70 }
71 
SetCapturerCallback(const std::shared_ptr<AudioCapturerCallback> & callback)72 int32_t AudioCapturerGateway::SetCapturerCallback(const std::shared_ptr<AudioCapturerCallback> &callback)
73 {
74     // If the client is using the deprecated SetParams API. SetCapturerCallback must be invoked, after SetParams.
75     // In general, callbacks can only be set after the capturer state is  PREPARED.
76     CapturerState state = GetStatus();
77     if (state == CAPTURER_NEW || state == CAPTURER_RELEASED) {
78         AUDIO_DEBUG_LOG("AudioCapturerGateway::SetCapturerCallback ncorrect state:%{public}d to register cb", state);
79         return ERR_ILLEGAL_STATE;
80     }
81     if (callback == nullptr) {
82         AUDIO_ERR_LOG("AudioCapturerGateway::SetCapturerCallback callback param is null");
83         return ERR_INVALID_PARAM;
84     }
85 
86     // Save and Set reference for stream callback. Order is important here.
87     if (audioStreamCallback_ == nullptr) {
88         audioStreamCallback_ = std::make_shared<AudioStreamCapturerCallback>();
89         if (audioStreamCallback_ == nullptr) {
90             AUDIO_ERR_LOG("AudioCapturerGateway::Failed to allocate memory for audioStreamCallback_");
91             return ERROR;
92         }
93     }
94     AUDIO_ERR_LOG("AudioCapturerGateway::SetCapturerCallback");
95     std::shared_ptr<AudioStreamCapturerCallback> cbStream =
96         std::static_pointer_cast<AudioStreamCapturerCallback>(audioStreamCallback_);
97     cbStream->SaveCallback(callback);
98     (void)audioStream_->SetStreamCallback(audioStreamCallback_);
99 
100     return SUCCESS;
101 }
102 
GetParams(AudioCapturerParams & params) const103 int32_t AudioCapturerGateway::GetParams(AudioCapturerParams &params) const
104 {
105     AudioStreamParams audioStreamParams;
106     int32_t result = audioStream_->GetAudioStreamInfo(audioStreamParams);
107     if (SUCCESS == result) {
108         params.audioSampleFormat = static_cast<AudioSampleFormat>(audioStreamParams.format);
109         params.samplingRate = static_cast<AudioSamplingRate>(audioStreamParams.samplingRate);
110         params.audioChannel = static_cast<AudioChannel>(audioStreamParams.channels);
111         params.audioEncoding = static_cast<AudioEncodingType>(audioStreamParams.encoding);
112     }
113 
114     return result;
115 }
116 
GetCapturerInfo(AudioCapturerInfo & capturerInfo) const117 int32_t AudioCapturerGateway::GetCapturerInfo(AudioCapturerInfo &capturerInfo) const
118 {
119     capturerInfo = capturerInfo_;
120 
121     return SUCCESS;
122 }
123 
GetStreamInfo(AudioStreamInfo & streamInfo) const124 int32_t AudioCapturerGateway::GetStreamInfo(AudioStreamInfo &streamInfo) const
125 {
126     AudioStreamParams audioStreamParams;
127     int32_t result = audioStream_->GetAudioStreamInfo(audioStreamParams);
128     if (SUCCESS == result) {
129         streamInfo.format = static_cast<AudioSampleFormat>(audioStreamParams.format);
130         streamInfo.samplingRate = static_cast<AudioSamplingRate>(audioStreamParams.samplingRate);
131         streamInfo.channels = static_cast<AudioChannel>(audioStreamParams.channels);
132         streamInfo.encoding = static_cast<AudioEncodingType>(audioStreamParams.encoding);
133     }
134 
135     return result;
136 }
137 
138 
SetCapturerPositionCallback(int64_t markPosition,const std::shared_ptr<CapturerPositionCallback> & callback)139 int32_t AudioCapturerGateway::SetCapturerPositionCallback(int64_t markPosition,
140     const std::shared_ptr<CapturerPositionCallback> &callback)
141 {
142     if ((callback == nullptr) || (markPosition <= 0)) {
143         AUDIO_ERR_LOG("AudioCapturerGateway::SetCapturerPositionCallback input param is invalid");
144         return ERR_INVALID_PARAM;
145     }
146 
147     audioStream_->SetCapturerPositionCallback(markPosition, callback);
148 
149     return SUCCESS;
150 }
151 
UnsetCapturerPositionCallback()152 void AudioCapturerGateway::UnsetCapturerPositionCallback()
153 {
154     audioStream_->UnsetCapturerPositionCallback();
155 }
156 
SetCapturerPeriodPositionCallback(int64_t frameNumber,const std::shared_ptr<CapturerPeriodPositionCallback> & callback)157 int32_t AudioCapturerGateway::SetCapturerPeriodPositionCallback(int64_t frameNumber,
158     const std::shared_ptr<CapturerPeriodPositionCallback> &callback)
159 {
160     if ((callback == nullptr) || (frameNumber <= 0)) {
161         AUDIO_ERR_LOG("AudioCapturerGateway::SetCapturerPeriodPositionCallback input param is invalid");
162         return ERR_INVALID_PARAM;
163     }
164 
165     audioStream_->SetCapturerPeriodPositionCallback(frameNumber, callback);
166 
167     return SUCCESS;
168 }
169 
UnsetCapturerPeriodPositionCallback()170 void AudioCapturerGateway::UnsetCapturerPeriodPositionCallback()
171 {
172     audioStream_->UnsetCapturerPeriodPositionCallback();
173 }
174 
Start() const175 bool AudioCapturerGateway::Start() const
176 {
177     return audioStream_->StartAudioStream();
178 }
179 
Read(uint8_t & buffer,size_t userSize,bool isBlockingRead) const180 int32_t AudioCapturerGateway::Read(uint8_t &buffer, size_t userSize, bool isBlockingRead) const
181 {
182     return audioStream_->Read(buffer, userSize, isBlockingRead);
183 }
184 
GetStatus() const185 CapturerState AudioCapturerGateway::GetStatus() const
186 {
187     return (CapturerState)audioStream_->GetState();
188 }
189 
GetAudioTime(Timestamp & timestamp,Timestamp::Timestampbase base) const190 bool AudioCapturerGateway::GetAudioTime(Timestamp &timestamp, Timestamp::Timestampbase base) const
191 {
192     return audioStream_->GetAudioTime(timestamp, base);
193 }
194 
Pause() const195 bool AudioCapturerGateway::Pause() const
196 {
197     return audioStream_->PauseAudioStream();
198 }
199 
Stop() const200 bool AudioCapturerGateway::Stop() const
201 {
202     return audioStream_->StopAudioStream();
203 }
204 
Flush() const205 bool AudioCapturerGateway::Flush() const
206 {
207     return audioStream_->FlushAudioStream();
208 }
209 
Release() const210 bool AudioCapturerGateway::Release() const
211 {
212     return audioStream_->ReleaseAudioStream();
213 }
214 
GetBufferSize(size_t & bufferSize) const215 int32_t AudioCapturerGateway::GetBufferSize(size_t &bufferSize) const
216 {
217     return audioStream_->GetBufferSize(bufferSize);
218 }
219 
GetAudioStreamId(uint32_t & sessionID) const220 int32_t AudioCapturerGateway::GetAudioStreamId(uint32_t &sessionID) const
221 {
222     return audioStream_->GetAudioSessionID(sessionID);
223 }
224 
SetBufferDuration(uint64_t bufferDuration) const225 int32_t AudioCapturerGateway::SetBufferDuration(uint64_t bufferDuration) const
226 {
227     if (bufferDuration < MINIMUM_BUFFER_SIZE_MSEC || bufferDuration > MAXIMUM_BUFFER_SIZE_MSEC) {
228         AUDIO_ERR_LOG("Error: Please set the buffer duration between 5ms ~ 20ms");
229         return ERR_INVALID_PARAM;
230     }
231     return audioStream_->SetBufferSizeInMsec(bufferDuration);
232 }
233 
SetApplicationCachePath(const std::string cachePath)234 void AudioCapturerGateway::SetApplicationCachePath(const std::string cachePath)
235 {
236     audioStream_->SetApplicationCachePath(cachePath);
237 }
238 
SaveCallback(const std::weak_ptr<AudioCapturerCallback> & callback)239 void AudioStreamCapturerCallback::SaveCallback(const std::weak_ptr<AudioCapturerCallback> &callback)
240 {
241     std::shared_ptr<AudioCapturerCallback> cb = callback.lock();
242     AUDIO_ERR_LOG("AudioCapturerGateway AudioStreamCapturerCallback::SaveCallback cb");
243     callback_ = callback;
244 }
245 
OnStateChange(const State state,StateChangeCmdType cmdType)246 void AudioStreamCapturerCallback::OnStateChange(const State state, StateChangeCmdType cmdType)
247 {
248     std::shared_ptr<AudioCapturerCallback> cb = callback_.lock();
249     if (cb == nullptr) {
250         AUDIO_ERR_LOG("AudioStreamCapturerCallback::OnStateChange cb == nullptr.");
251         return;
252     }
253 
254     AUDIO_ERR_LOG("AudioCapturerGateway AudioStreamCapturerCallback::OnStateChange cb");
255     cb->OnStateChange(static_cast<CapturerState>(state));
256 }
257 
SetCaptureMode(AudioCaptureMode captureMode) const258 int32_t AudioCapturerGateway::SetCaptureMode(AudioCaptureMode captureMode) const
259 {
260     return audioStream_->SetCaptureMode(captureMode);
261 }
262 
GetCaptureMode() const263 AudioCaptureMode AudioCapturerGateway::GetCaptureMode() const
264 {
265     return audioStream_->GetCaptureMode();
266 }
267 
SetCapturerReadCallback(const std::shared_ptr<AudioCapturerReadCallback> & callback)268 int32_t AudioCapturerGateway::SetCapturerReadCallback(const std::shared_ptr<AudioCapturerReadCallback> &callback)
269 {
270     return audioStream_->SetCapturerReadCallback(callback);
271 }
272 
GetBufferDesc(BufferDesc & bufDesc) const273 int32_t AudioCapturerGateway::GetBufferDesc(BufferDesc &bufDesc) const
274 {
275     return audioStream_->GetBufferDesc(bufDesc);
276 }
277 
Enqueue(const BufferDesc & bufDesc) const278 int32_t AudioCapturerGateway::Enqueue(const BufferDesc &bufDesc) const
279 {
280     return audioStream_->Enqueue(bufDesc);
281 }
282 
Clear() const283 int32_t AudioCapturerGateway::Clear() const
284 {
285     return audioStream_->Clear();
286 }
287 
GetBufQueueState(BufferQueueState & bufState) const288 int32_t AudioCapturerGateway::GetBufQueueState(BufferQueueState &bufState) const
289 {
290     return audioStream_->GetBufQueueState(bufState);
291 }
292 
293 }  // namespace AudioStandard
294 }  // namespace OHOS
295