1 /*
2 * Copyright (c) 2021-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 #ifndef LOG_TAG
16 #define LOG_TAG "AudioRenderer"
17 #endif
18
19 #include <sstream>
20 #include <atomic>
21 #include <cinttypes>
22
23 #include "audio_renderer_private.h"
24 #include "shared_audio_renderer_wrapper.h"
25
26 #include "audio_renderer_log.h"
27 #include "audio_errors.h"
28 #include "audio_policy_manager.h"
29 #include "audio_speed.h"
30
31 #include "media_monitor_manager.h"
32 #include "audio_stream_descriptor.h"
33 #include "audio_scope_exit.h"
34 #include "volume_tools.h"
35
36 namespace OHOS {
37 namespace AudioStandard {
38
39 static const std::vector<StreamUsage> NEED_VERIFY_PERMISSION_STREAMS = {
40 STREAM_USAGE_SYSTEM,
41 STREAM_USAGE_DTMF,
42 STREAM_USAGE_ENFORCED_TONE,
43 STREAM_USAGE_ULTRASONIC,
44 STREAM_USAGE_VOICE_MODEM_COMMUNICATION
45 };
46
47 const std::vector<StreamUsage> BACKGROUND_NOSTART_STREAM_USAGE {
48 STREAM_USAGE_MUSIC,
49 STREAM_USAGE_MOVIE,
50 STREAM_USAGE_AUDIOBOOK
51 };
52 static constexpr uid_t UID_MSDP_SA = 6699;
53 static constexpr int32_t WRITE_UNDERRUN_NUM = 100;
54 static constexpr int32_t MINIMUM_BUFFER_SIZE_MSEC = 5;
55 static constexpr int32_t MAXIMUM_BUFFER_SIZE_MSEC = 60;
56 constexpr int32_t TIME_OUT_SECONDS = 10;
57 constexpr int32_t START_TIME_OUT_SECONDS = 15;
58 static constexpr uint32_t BLOCK_INTERRUPT_CALLBACK_IN_MS = 1000; // 1000ms
59 static constexpr float MIN_LOUDNESS_GAIN = -90.0;
60 static constexpr float MAX_LOUDNESS_GAIN = 24.0;
61 static constexpr int32_t UID_MEDIA = 1013;
62
63 static const std::map<AudioStreamType, StreamUsage> STREAM_TYPE_USAGE_MAP = {
64 {STREAM_MUSIC, STREAM_USAGE_MUSIC},
65 {STREAM_VOICE_CALL, STREAM_USAGE_VOICE_COMMUNICATION},
66 {STREAM_VOICE_CALL_ASSISTANT, STREAM_USAGE_VOICE_CALL_ASSISTANT},
67 {STREAM_VOICE_ASSISTANT, STREAM_USAGE_VOICE_ASSISTANT},
68 {STREAM_ALARM, STREAM_USAGE_ALARM},
69 {STREAM_VOICE_MESSAGE, STREAM_USAGE_VOICE_MESSAGE},
70 {STREAM_RING, STREAM_USAGE_RINGTONE},
71 {STREAM_NOTIFICATION, STREAM_USAGE_NOTIFICATION},
72 {STREAM_ACCESSIBILITY, STREAM_USAGE_ACCESSIBILITY},
73 {STREAM_SYSTEM, STREAM_USAGE_SYSTEM},
74 {STREAM_MOVIE, STREAM_USAGE_MOVIE},
75 {STREAM_GAME, STREAM_USAGE_GAME},
76 {STREAM_SPEECH, STREAM_USAGE_AUDIOBOOK},
77 {STREAM_NAVIGATION, STREAM_USAGE_NAVIGATION},
78 {STREAM_DTMF, STREAM_USAGE_DTMF},
79 {STREAM_SYSTEM_ENFORCED, STREAM_USAGE_ENFORCED_TONE},
80 {STREAM_ULTRASONIC, STREAM_USAGE_ULTRASONIC},
81 {STREAM_VOICE_RING, STREAM_USAGE_VOICE_RINGTONE},
82 };
83
84 static const std::map<AudioFlag, int32_t> OUTPUT_ROUTE_TO_STREAM_MAP = {
85 {AUDIO_OUTPUT_FLAG_NORMAL, AUDIO_FLAG_NORMAL},
86 {AUDIO_OUTPUT_FLAG_DIRECT, AUDIO_FLAG_DIRECT},
87 {AUDIO_OUTPUT_FLAG_FAST, AUDIO_FLAG_MMAP},
88 };
89
90 static const std::map<uint32_t, IAudioStream::StreamClass> AUDIO_OUTPUT_FLAG_GROUP_MAP = {
91 {AUDIO_OUTPUT_FLAG_NORMAL, IAudioStream::StreamClass::PA_STREAM},
92 {AUDIO_OUTPUT_FLAG_DIRECT, IAudioStream::StreamClass::PA_STREAM},
93 {AUDIO_OUTPUT_FLAG_MULTICHANNEL, IAudioStream::StreamClass::PA_STREAM},
94 {AUDIO_OUTPUT_FLAG_LOWPOWER, IAudioStream::StreamClass::PA_STREAM},
95 {AUDIO_OUTPUT_FLAG_FAST, IAudioStream::StreamClass::FAST_STREAM},
96 {AUDIO_OUTPUT_FLAG_HWDECODING, IAudioStream::StreamClass::PA_STREAM},
97 };
98
99 static const std::vector<StreamUsage> AUDIO_DEFAULT_OUTPUT_DEVICE_SUPPORTED_STREAM_USAGES {
100 STREAM_USAGE_VOICE_COMMUNICATION,
101 STREAM_USAGE_VOICE_MESSAGE,
102 STREAM_USAGE_VIDEO_COMMUNICATION,
103 STREAM_USAGE_VOICE_MODEM_COMMUNICATION,
104 };
105
SetStreamInfoToParams(const AudioStreamInfo & streamInfo)106 static AudioRendererParams SetStreamInfoToParams(const AudioStreamInfo &streamInfo)
107 {
108 AudioRendererParams params;
109 params.sampleFormat = streamInfo.format;
110 params.sampleRate = streamInfo.samplingRate;
111 params.channelCount = streamInfo.channels;
112 params.encodingType = streamInfo.encoding;
113 params.channelLayout = streamInfo.channelLayout;
114 return params;
115 }
116
117 std::mutex AudioRenderer::createRendererMutex_;
118
119 AudioRenderer::~AudioRenderer() = default;
~AudioRendererPrivate()120 AudioRendererPrivate::~AudioRendererPrivate()
121 {
122 AUDIO_INFO_LOG("Destruct in");
123
124 std::shared_ptr<OutputDeviceChangeWithInfoCallbackImpl> outputDeviceChangeCallback = outputDeviceChangeCallback_;
125 if (outputDeviceChangeCallback != nullptr) {
126 outputDeviceChangeCallback->RemoveCallback();
127 outputDeviceChangeCallback->UnsetAudioRendererObj();
128 }
129 for (auto id : usedSessionId_) {
130 AudioPolicyManager::GetInstance().UnregisterDeviceChangeWithInfoCallback(id);
131 }
132
133 RendererState state = GetStatus();
134 if (state != RENDERER_RELEASED && state != RENDERER_NEW) {
135 Release();
136 }
137
138 if (rendererProxyObj_ != nullptr) {
139 rendererProxyObj_->UnsetRendererObj();
140 AudioPolicyManager::GetInstance().RemoveClientTrackerStub(sessionID_);
141 }
142
143 RemoveRendererPolicyServiceDiedCallback();
144 DumpFileUtil::CloseDumpFile(&dumpFile_);
145 }
146
CheckMaxRendererInstances()147 int32_t AudioRenderer::CheckMaxRendererInstances()
148 {
149 std::vector<std::shared_ptr<AudioRendererChangeInfo>> audioRendererChangeInfos;
150 AudioPolicyManager::GetInstance().GetCurrentRendererChangeInfos(audioRendererChangeInfos);
151 AUDIO_INFO_LOG("Audio current renderer change infos size: %{public}zu", audioRendererChangeInfos.size());
152 int32_t maxRendererInstances = AudioPolicyManager::GetInstance().GetMaxRendererInstances();
153 if (audioRendererChangeInfos.size() >= static_cast<size_t>(maxRendererInstances)) {
154 std::map<int32_t, int32_t> appUseNumMap;
155 int32_t INITIAL_VALUE = 1;
156 int32_t mostAppUid = -1;
157 int32_t mostAppNum = -1;
158 for (auto it = audioRendererChangeInfos.begin(); it != audioRendererChangeInfos.end(); it++) {
159 auto appUseNum = appUseNumMap.find((*it)->clientUID);
160 if (appUseNum != appUseNumMap.end()) {
161 appUseNumMap[(*it)->clientUID] = ++appUseNum->second;
162 } else {
163 appUseNumMap.emplace((*it)->clientUID, INITIAL_VALUE);
164 }
165 }
166 for (auto iter = appUseNumMap.begin(); iter != appUseNumMap.end(); iter++) {
167 if (iter->second > mostAppNum) {
168 mostAppNum = iter->second;
169 mostAppUid = iter->first;
170 }
171 }
172 std::shared_ptr<Media::MediaMonitor::EventBean> bean = std::make_shared<Media::MediaMonitor::EventBean>(
173 Media::MediaMonitor::ModuleId::AUDIO, Media::MediaMonitor::EventId::AUDIO_STREAM_EXHAUSTED_STATS,
174 Media::MediaMonitor::EventType::FREQUENCY_AGGREGATION_EVENT);
175 bean->Add("CLIENT_UID", mostAppUid);
176 bean->Add("TIMES", mostAppNum);
177 Media::MediaMonitor::MediaMonitorManager::GetInstance().WriteLogMsg(bean);
178 }
179
180 CHECK_AND_RETURN_RET_LOG(audioRendererChangeInfos.size() < static_cast<size_t>(maxRendererInstances), ERR_OVERFLOW,
181 "The current number of audio renderer streams is greater than the maximum number of configured instances");
182
183 return SUCCESS;
184 }
185
GetAudioFormatSize(AudioSampleFormat format)186 size_t GetAudioFormatSize(AudioSampleFormat format)
187 {
188 size_t bitWidthSize = 2;
189 switch (format) {
190 case SAMPLE_U8:
191 bitWidthSize = 1; // size is 1
192 break;
193 case SAMPLE_S16LE:
194 bitWidthSize = 2; // size is 2
195 break;
196 case SAMPLE_S24LE:
197 bitWidthSize = 3; // size is 3
198 break;
199 case SAMPLE_S32LE:
200 case SAMPLE_F32LE:
201 bitWidthSize = 4; // size is 4
202 break;
203 default:
204 bitWidthSize = 2; // size is 2
205 break;
206 }
207 return bitWidthSize;
208 }
209
GetFormatSize(const AudioStreamParams & info)210 size_t GetFormatSize(const AudioStreamParams& info)
211 {
212 return GetAudioFormatSize(static_cast<AudioSampleFormat>(info.format));
213 }
214
FadeInAudioBuffer(const BufferDesc & buffer,AudioSampleFormat format,AudioChannel channel)215 int32_t AudioRenderer::FadeInAudioBuffer(const BufferDesc &buffer, AudioSampleFormat format, AudioChannel channel)
216 {
217 CHECK_AND_RETURN_RET_LOG(buffer.buffer != nullptr && buffer.bufLength != 0 && buffer.dataLength != 0,
218 ERR_INVALID_PARAM, "Invalid buffer or length");
219 BufferDesc tempBuffer = buffer;
220 if (tempBuffer.bufLength > tempBuffer.dataLength) {
221 AUDIO_INFO_LOG("less buffer case: bufLength: %{public}zu, dataLength : %{public}zu", tempBuffer.bufLength,
222 tempBuffer.dataLength);
223 tempBuffer.bufLength = tempBuffer.dataLength;
224 }
225 ChannelVolumes mapVols = VolumeTools::GetChannelVolumes(channel, 0.0f, 1.0f);
226 int32_t volRet = VolumeTools::Process(tempBuffer, format, mapVols);
227 CHECK_AND_RETURN_RET_LOG(volRet == SUCCESS, volRet, "Process Volume failed: %{public}d", volRet);
228 return volRet;
229 }
230
FadeOutAudioBuffer(const BufferDesc & buffer,AudioSampleFormat format,AudioChannel channel)231 int32_t AudioRenderer::FadeOutAudioBuffer(const BufferDesc &buffer, AudioSampleFormat format, AudioChannel channel)
232 {
233 CHECK_AND_RETURN_RET_LOG(buffer.buffer != nullptr && buffer.bufLength != 0 && buffer.dataLength != 0,
234 ERR_INVALID_PARAM, "Invalid buffer or length");
235 BufferDesc tempBuffer = buffer;
236 if (tempBuffer.bufLength > tempBuffer.dataLength) {
237 AUDIO_INFO_LOG("less buffer case: bufLength: %{public}zu, dataLength : %{public}zu", tempBuffer.bufLength,
238 tempBuffer.dataLength);
239 tempBuffer.bufLength = tempBuffer.dataLength;
240 }
241 ChannelVolumes mapVols = VolumeTools::GetChannelVolumes(channel, 1.0f, 0.0f);
242 int32_t volRet = VolumeTools::Process(tempBuffer, format, mapVols);
243 CHECK_AND_RETURN_RET_LOG(volRet == SUCCESS, volRet, "Process Volume failed: %{public}d", volRet);
244 return volRet;
245 }
246
MuteAudioBuffer(uint8_t * addr,size_t offset,size_t length,AudioSampleFormat format)247 int32_t AudioRenderer::MuteAudioBuffer(uint8_t *addr, size_t offset, size_t length, AudioSampleFormat format)
248 {
249 CHECK_AND_RETURN_RET_LOG(addr != nullptr && length != 0, ERR_INVALID_PARAM, "Invalid addr or length");
250
251 bool formatValid = std::find(AUDIO_SUPPORTED_FORMATS.begin(), AUDIO_SUPPORTED_FORMATS.end(), format)
252 != AUDIO_SUPPORTED_FORMATS.end();
253 CHECK_AND_RETURN_RET_LOG(formatValid, ERR_INVALID_PARAM, "Invalid AudioSampleFormat");
254
255 size_t bitWidthSize = GetAudioFormatSize(format);
256 if (bitWidthSize != 0 && length % bitWidthSize != 0) {
257 AUDIO_ERR_LOG("length is %{public}zu, can not be divided by %{public}zu", length, bitWidthSize);
258 return ERR_INVALID_PARAM;
259 }
260
261 int32_t ret = 0;
262 if (format == SAMPLE_U8) {
263 ret = memset_s(addr + offset, length, 0X7F, length);
264 } else {
265 ret = memset_s(addr + offset, length, 0, length);
266 }
267 CHECK_AND_RETURN_RET_LOG(ret == EOK, ERR_OPERATION_FAILED, "Mute failed!");
268 return SUCCESS;
269 }
270
Create(AudioStreamType audioStreamType)271 std::unique_ptr<AudioRenderer> AudioRenderer::Create(AudioStreamType audioStreamType)
272 {
273 AppInfo appInfo = {};
274 return Create(audioStreamType, appInfo);
275 }
276
Create(AudioStreamType audioStreamType,const AppInfo & appInfo)277 std::unique_ptr<AudioRenderer> AudioRenderer::Create(AudioStreamType audioStreamType, const AppInfo &appInfo)
278 {
279 if (audioStreamType == STREAM_MEDIA) {
280 audioStreamType = STREAM_MUSIC;
281 }
282
283 auto sharedRenderer = std::make_shared<AudioRendererPrivate>(audioStreamType, appInfo, true);
284 CHECK_AND_RETURN_RET_LOG(sharedRenderer != nullptr, nullptr, "renderer is null");
285
286 return std::make_unique<SharedAudioRendererWrapper>(sharedRenderer);
287 }
288
Create(const AudioRendererOptions & rendererOptions)289 std::unique_ptr<AudioRenderer> AudioRenderer::Create(const AudioRendererOptions &rendererOptions)
290 {
291 AppInfo appInfo = {};
292 return Create("", rendererOptions, appInfo);
293 }
294
Create(const AudioRendererOptions & rendererOptions,const AppInfo & appInfo)295 std::unique_ptr<AudioRenderer> AudioRenderer::Create(const AudioRendererOptions &rendererOptions,
296 const AppInfo &appInfo)
297 {
298 return Create("", rendererOptions, appInfo);
299 }
300
Create(const std::string cachePath,const AudioRendererOptions & rendererOptions)301 std::unique_ptr<AudioRenderer> AudioRenderer::Create(const std::string cachePath,
302 const AudioRendererOptions &rendererOptions)
303 {
304 AppInfo appInfo = {};
305 return Create(cachePath, rendererOptions, appInfo);
306 }
307
Create(const std::string cachePath,const AudioRendererOptions & rendererOptions,const AppInfo & appInfo)308 std::unique_ptr<AudioRenderer> AudioRenderer::Create(const std::string cachePath,
309 const AudioRendererOptions &rendererOptions, const AppInfo &appInfo)
310 {
311 auto sharedRenderer = CreateRenderer(rendererOptions, appInfo);
312 CHECK_AND_RETURN_RET_LOG(sharedRenderer != nullptr, nullptr, "renderer is null");
313
314 return std::make_unique<SharedAudioRendererWrapper>(sharedRenderer);
315 }
316
HandleSetRendererInfoByOptions(const AudioRendererOptions & rendererOptions,const AppInfo & appInfo)317 void AudioRendererPrivate::HandleSetRendererInfoByOptions(const AudioRendererOptions &rendererOptions,
318 const AppInfo &appInfo)
319 {
320 rendererInfo_.contentType = rendererOptions.rendererInfo.contentType;
321 rendererInfo_.streamUsage = rendererOptions.rendererInfo.streamUsage;
322 rendererInfo_.isSatellite = rendererOptions.rendererInfo.isSatellite;
323 /* Set isOffloadAllowed during renderer creation when setOffloadAllowed is disabled. */
324 rendererInfo_.isOffloadAllowed = GetFinalOffloadAllowed(rendererOptions.rendererInfo.isOffloadAllowed);
325 rendererInfo_.playerType = rendererOptions.rendererInfo.playerType;
326 rendererInfo_.expectedPlaybackDurationBytes
327 = rendererOptions.rendererInfo.expectedPlaybackDurationBytes;
328 rendererInfo_.samplingRate = rendererOptions.streamInfo.samplingRate;
329 rendererInfo_.volumeMode = rendererOptions.rendererInfo.volumeMode;
330 rendererInfo_.isLoopback = rendererOptions.rendererInfo.isLoopback;
331 rendererInfo_.loopbackMode = rendererOptions.rendererInfo.loopbackMode;
332
333 privacyType_ = rendererOptions.privacyType;
334 strategy_ = rendererOptions.strategy;
335 originalStrategy_ = rendererOptions.strategy;
336 }
337
GetFinalOffloadAllowed(bool originalAllowed)338 bool AudioRendererPrivate::GetFinalOffloadAllowed(bool originalAllowed)
339 {
340 if (getuid() == UID_MEDIA) {
341 // Boot animation use avplayer, do not get bundle name to avoid increasing boot duration.
342 std::string bundleName = AudioSystemManager::GetInstance()->GetSelfBundleName(appInfo_.appUid);
343 if (bundleName == "mockNotOffloadHap") {
344 AUDIO_INFO_LOG("Force set offload allowed to false for this stream");
345 return false;
346 }
347 }
348 return originalAllowed;
349 }
350
CreateRenderer(const AudioRendererOptions & rendererOptions,const AppInfo & appInfo)351 std::shared_ptr<AudioRenderer> AudioRenderer::CreateRenderer(const AudioRendererOptions &rendererOptions,
352 const AppInfo &appInfo)
353 {
354 Trace trace("KeyAction AudioRenderer::Create");
355 std::lock_guard<std::mutex> lock(createRendererMutex_);
356 CHECK_AND_RETURN_RET_LOG(AudioPolicyManager::GetInstance().GetAudioPolicyManagerProxy() != nullptr,
357 nullptr, "sa not start");
358 AudioStreamType audioStreamType = IAudioStream::GetStreamType(rendererOptions.rendererInfo.contentType,
359 rendererOptions.rendererInfo.streamUsage);
360 if (audioStreamType == STREAM_ULTRASONIC && getuid() != UID_MSDP_SA) {
361 AudioRenderer::SendRendererCreateError(rendererOptions.rendererInfo.streamUsage, ERR_INVALID_PARAM);
362 AUDIO_ERR_LOG("ULTRASONIC can only create by MSDP");
363 return nullptr;
364 }
365
366 auto audioRenderer = std::make_shared<AudioRendererPrivate>(audioStreamType, appInfo, false);
367 if (audioRenderer == nullptr) {
368 AudioRenderer::SendRendererCreateError(rendererOptions.rendererInfo.streamUsage,
369 ERR_OPERATION_FAILED);
370 }
371 CHECK_AND_RETURN_RET_LOG(audioRenderer != nullptr, nullptr, "Failed to create renderer object");
372
373 int32_t rendererFlags = rendererOptions.rendererInfo.rendererFlags;
374 bool isVirtualKeyboard = audioRenderer->IsVirtualKeyboard(rendererFlags);
375 rendererFlags = rendererFlags == AUDIO_FLAG_VKB_NORMAL ? AUDIO_FLAG_NORMAL : rendererFlags;
376 rendererFlags = rendererFlags == AUDIO_FLAG_VKB_FAST ? AUDIO_FLAG_MMAP : rendererFlags;
377
378 AUDIO_INFO_LOG("StreamClientState for Renderer::Create. content: %{public}d, usage: %{public}d, "\
379 "isOffloadAllowed: %{public}s, isVKB: %{public}s, flags: %{public}d, uid: %{public}d",
380 rendererOptions.rendererInfo.contentType, rendererOptions.rendererInfo.streamUsage,
381 rendererOptions.rendererInfo.isOffloadAllowed ? "T" : "F",
382 isVirtualKeyboard ? "T" : "F", rendererFlags, appInfo.appUid);
383
384 audioRenderer->rendererInfo_.isVirtualKeyboard = isVirtualKeyboard;
385 audioRenderer->rendererInfo_.rendererFlags = rendererFlags;
386 audioRenderer->rendererInfo_.originalFlag = rendererFlags;
387 audioRenderer->HandleSetRendererInfoByOptions(rendererOptions, appInfo);
388 AudioRendererParams params = SetStreamInfoToParams(rendererOptions.streamInfo);
389 if (audioRenderer->SetParams(params) != SUCCESS) {
390 AUDIO_ERR_LOG("SetParams failed in renderer");
391 audioRenderer = nullptr;
392 AudioRenderer::SendRendererCreateError(rendererOptions.rendererInfo.streamUsage,
393 ERR_OPERATION_FAILED);
394 }
395
396 return audioRenderer;
397 }
398
SendRendererCreateError(const StreamUsage & sreamUsage,const int32_t & errorCode)399 void AudioRenderer::SendRendererCreateError(const StreamUsage &sreamUsage,
400 const int32_t &errorCode)
401 {
402 std::shared_ptr<Media::MediaMonitor::EventBean> bean = std::make_shared<Media::MediaMonitor::EventBean>(
403 Media::MediaMonitor::AUDIO, Media::MediaMonitor::AUDIO_STREAM_CREATE_ERROR_STATS,
404 Media::MediaMonitor::FREQUENCY_AGGREGATION_EVENT);
405 bean->Add("IS_PLAYBACK", 1);
406 bean->Add("CLIENT_UID", static_cast<int32_t>(getuid()));
407 bean->Add("STREAM_TYPE", sreamUsage);
408 bean->Add("ERROR_CODE", errorCode);
409 Media::MediaMonitor::MediaMonitorManager::GetInstance().WriteLogMsg(bean);
410 }
411
AudioRendererPrivate(AudioStreamType audioStreamType,const AppInfo & appInfo,bool createStream)412 AudioRendererPrivate::AudioRendererPrivate(AudioStreamType audioStreamType, const AppInfo &appInfo, bool createStream)
413 {
414 appInfo_ = appInfo;
415 if (!(appInfo_.appPid)) {
416 appInfo_.appPid = getpid();
417 }
418
419 if (appInfo_.appUid < 0) {
420 appInfo_.appUid = static_cast<int32_t>(getuid());
421 }
422
423 if (createStream) {
424 AudioStreamParams tempParams = {};
425 audioStream_ = IAudioStream::GetPlaybackStream(IAudioStream::PA_STREAM, tempParams, audioStreamType,
426 appInfo_.appUid);
427 if (audioStream_ && STREAM_TYPE_USAGE_MAP.count(audioStreamType) != 0) {
428 // Initialize the streamUsage based on the streamType
429 rendererInfo_.streamUsage = STREAM_TYPE_USAGE_MAP.at(audioStreamType);
430 }
431 AUDIO_INFO_LOG("AudioRendererPrivate create normal stream for old mode.");
432 }
433
434 rendererProxyObj_ = std::make_shared<AudioRendererProxyObj>();
435 if (!rendererProxyObj_) {
436 AUDIO_WARNING_LOG("AudioRendererProxyObj Memory Allocation Failed !!");
437 }
438
439 audioInterrupt_.audioFocusType.streamType = audioStreamType;
440 audioInterrupt_.pid = appInfo_.appPid;
441 audioInterrupt_.uid = appInfo_.appUid;
442 audioInterrupt_.mode = SHARE_MODE;
443
444 state_ = RENDERER_PREPARED;
445 }
446
447 // Inner function. Must be called with AudioRendererPrivate::rendererMutex_
448 // or AudioRendererPrivate::streamMutex_ held.
InitAudioInterruptCallback(bool isRestoreAudio)449 int32_t AudioRendererPrivate::InitAudioInterruptCallback(bool isRestoreAudio)
450 {
451 AUDIO_DEBUG_LOG("in");
452
453 if (audioInterrupt_.streamId != 0 && !isRestoreAudio) {
454 AUDIO_INFO_LOG("old session already has interrupt, need to reset");
455 (void)AudioPolicyManager::GetInstance().DeactivateAudioInterrupt(audioInterrupt_);
456 (void)AudioPolicyManager::GetInstance().UnsetAudioInterruptCallback(audioInterrupt_.streamId);
457 }
458
459 CHECK_AND_RETURN_RET_LOG(audioInterrupt_.mode == SHARE_MODE || audioInterrupt_.mode == INDEPENDENT_MODE,
460 ERR_INVALID_PARAM, "Invalid interrupt mode!");
461 CHECK_AND_RETURN_RET_LOG(audioStream_->GetAudioSessionID(audioInterrupt_.streamId) == 0, ERR_INVALID_INDEX,
462 "GetAudioSessionID failed");
463 sessionID_ = audioInterrupt_.streamId;
464 audioInterrupt_.streamUsage = rendererInfo_.streamUsage;
465 audioInterrupt_.contentType = rendererInfo_.contentType;
466 audioInterrupt_.sessionStrategy = strategy_;
467 audioInterrupt_.api = rendererInfo_.playerType;
468
469 AUDIO_INFO_LOG("interruptMode %{public}d, streamType %{public}d, sessionID %{public}d",
470 audioInterrupt_.mode, audioInterrupt_.audioFocusType.streamType, audioInterrupt_.streamId);
471
472 if (audioInterruptCallback_ == nullptr) {
473 audioInterruptCallback_ = std::make_shared<AudioRendererInterruptCallbackImpl>(audioStream_, audioInterrupt_);
474 CHECK_AND_RETURN_RET_LOG(audioInterruptCallback_ != nullptr, ERROR,
475 "Failed to allocate memory for audioInterruptCallback_");
476 }
477 return AudioPolicyManager::GetInstance().SetAudioInterruptCallback(sessionID_, audioInterruptCallback_,
478 appInfo_.appUid);
479 }
480
InitOutputDeviceChangeCallback()481 int32_t AudioRendererPrivate::InitOutputDeviceChangeCallback()
482 {
483 if (!outputDeviceChangeCallback_) {
484 outputDeviceChangeCallback_ = std::make_shared<OutputDeviceChangeWithInfoCallbackImpl>();
485 CHECK_AND_RETURN_RET_LOG(outputDeviceChangeCallback_ != nullptr, ERROR, "Memory allocation failed");
486 }
487
488 outputDeviceChangeCallback_->SetAudioRendererObj(weak_from_this());
489
490 uint32_t sessionId;
491 int32_t ret = GetAudioStreamIdInner(sessionId);
492 CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ret, "Get sessionId failed");
493
494 usedSessionId_.push_back(sessionId);
495 ret = AudioPolicyManager::GetInstance().RegisterDeviceChangeWithInfoCallback(sessionId,
496 outputDeviceChangeCallback_);
497 CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ret, "Register failed");
498
499 return SUCCESS;
500 }
501
InitAudioRouteCallback()502 void AudioRendererPrivate::InitAudioRouteCallback()
503 {
504 audioRouteCallback_ = audioRouteCallback_ == nullptr ? std::make_shared<AudioRouteCallbackImpl>(weak_from_this()) :
505 audioRouteCallback_;
506 AUDIO_INFO_LOG("set audio route callback, sessionId: %{public}u", sessionID_);
507 AudioPolicyManager::GetInstance().SetAudioRouteCallback(sessionID_, audioRouteCallback_, appInfo_.appUid);
508 }
509
510 // Inner function. Must be called with AudioRendererPrivate::rendererMutex_
511 // or AudioRendererPrivate::streamMutex_ held.
InitAudioStream(AudioStreamParams audioStreamParams)512 int32_t AudioRendererPrivate::InitAudioStream(AudioStreamParams audioStreamParams)
513 {
514 Trace trace("AudioRenderer::InitAudioStream");
515 rendererProxyObj_->SaveRendererObj(weak_from_this());
516 audioStream_->SetRendererInfo(rendererInfo_);
517 audioStream_->SetClientID(appInfo_.appPid, appInfo_.appUid, appInfo_.appTokenId, appInfo_.appFullTokenId);
518
519 SetAudioPrivacyTypeInner(privacyType_);
520 audioStream_->SetStreamTrackerState(false);
521
522 int32_t ret = audioStream_->SetAudioStreamInfo(audioStreamParams, rendererProxyObj_);
523 CHECK_AND_RETURN_RET_LOG(!ret, ret, "SetParams SetAudioStreamInfo Failed");
524
525 ret = GetAudioStreamIdInner(sessionID_);
526 CHECK_AND_RETURN_RET_LOG(!ret, ret, "GetAudioStreamId err");
527 InitLatencyMeasurement(audioStreamParams);
528
529 return SUCCESS;
530 }
531
GetFrameCount(uint32_t & frameCount) const532 int32_t AudioRendererPrivate::GetFrameCount(uint32_t &frameCount) const
533 {
534 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
535 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, ERROR_ILLEGAL_STATE, "audioStream_ is nullptr");
536 return currentStream->GetFrameCount(frameCount);
537 }
538
GetLatency(uint64_t & latency) const539 int32_t AudioRendererPrivate::GetLatency(uint64_t &latency) const
540 {
541 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
542 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, ERROR_ILLEGAL_STATE, "audioStream_ is nullptr");
543 return currentStream->GetLatency(latency);
544 }
545
SetAudioPrivacyType(AudioPrivacyType privacyType)546 void AudioRendererPrivate::SetAudioPrivacyType(AudioPrivacyType privacyType)
547 {
548 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
549 CHECK_AND_RETURN_LOG(currentStream != nullptr, "audioStream_ is nullptr");
550 privacyType_ = privacyType;
551 currentStream->SetPrivacyType(privacyType);
552 }
553
GetAudioPrivacyType()554 AudioPrivacyType AudioRendererPrivate::GetAudioPrivacyType()
555 {
556 return privacyType_;
557 }
558
GetPreferredStreamClass(AudioStreamParams audioStreamParams)559 IAudioStream::StreamClass AudioRendererPrivate::GetPreferredStreamClass(AudioStreamParams audioStreamParams)
560 {
561 if (rendererInfo_.originalFlag == AUDIO_FLAG_FORCED_NORMAL) {
562 return IAudioStream::PA_STREAM;
563 }
564 if (rendererInfo_.originalFlag == AUDIO_FLAG_MMAP &&
565 !IAudioStream::IsStreamSupported(rendererInfo_.originalFlag, audioStreamParams)) {
566 AUDIO_WARNING_LOG("Unsupported stream params, will create normal stream");
567 rendererInfo_.originalFlag = AUDIO_FLAG_NORMAL;
568 rendererInfo_.rendererFlags = AUDIO_FLAG_NORMAL;
569 }
570
571 int32_t flag = AudioPolicyManager::GetInstance().GetPreferredOutputStreamType(rendererInfo_);
572 AUDIO_INFO_LOG("Preferred renderer flag: %{public}d", flag);
573 if (flag == AUDIO_FLAG_MMAP) {
574 rendererInfo_.rendererFlags = AUDIO_FLAG_MMAP;
575 isFastRenderer_ = true;
576 return IAudioStream::FAST_STREAM;
577 }
578 if (flag == AUDIO_FLAG_VOIP_FAST) {
579 // It is not possible to directly create a fast VoIP stream
580 isFastVoipSupported_ = true;
581 } else if (flag == AUDIO_FLAG_VOIP_DIRECT) {
582 isDirectVoipSupported_ = IsDirectVoipParams(audioStreamParams);
583 rendererInfo_.originalFlag = isDirectVoipSupported_ ? AUDIO_FLAG_VOIP_DIRECT : AUDIO_FLAG_NORMAL;
584 // The VoIP direct mode can only be used for RENDER_MODE_CALLBACK
585 rendererInfo_.rendererFlags = (isDirectVoipSupported_ && audioRenderMode_ == RENDER_MODE_CALLBACK) ?
586 AUDIO_FLAG_VOIP_DIRECT : AUDIO_FLAG_NORMAL;
587 AUDIO_INFO_LOG("Preferred renderer flag is VOIP_DIRECT. Actual flag: %{public}d", rendererInfo_.rendererFlags);
588 return IAudioStream::PA_STREAM;
589 }
590
591 AUDIO_INFO_LOG("Preferred renderer flag: AUDIO_FLAG_NORMAL");
592 rendererInfo_.rendererFlags = AUDIO_FLAG_NORMAL;
593 return IAudioStream::PA_STREAM;
594 }
595
IsDirectVoipParams(const AudioStreamParams & audioStreamParams)596 bool AudioRendererPrivate::IsDirectVoipParams(const AudioStreamParams &audioStreamParams)
597 {
598 // VoIP derect only supports 16K and 48K sampling rate.
599 if (!(audioStreamParams.samplingRate == SAMPLE_RATE_16000 ||
600 audioStreamParams.samplingRate == SAMPLE_RATE_48000)) {
601 AUDIO_ERR_LOG("The sampling rate %{public}d is not supported for direct VoIP mode",
602 audioStreamParams.samplingRate);
603 return false;
604 }
605
606 // VoIP derect only supports MONO and STEREO.
607 if (!(audioStreamParams.channels == MONO || audioStreamParams.channels == STEREO)) {
608 AUDIO_ERR_LOG("The channels %{public}d is not supported for direct VoIP mode",
609 audioStreamParams.channels);
610 return false;
611 }
612
613 // VoIP derect only supports 16bit, 32bit, 32float.
614 if (!(audioStreamParams.format == SAMPLE_S16LE || audioStreamParams.format == SAMPLE_S32LE ||
615 audioStreamParams.format == SAMPLE_F32LE)) {
616 AUDIO_ERR_LOG("The format %{public}d is not supported for direct VoIP mode",
617 audioStreamParams.format);
618 return false;
619 }
620
621 AUDIO_INFO_LOG("Valid params for direct VoIP: sampling rate %{public}d, format %{public}d, channels %{public}d",
622 audioStreamParams.samplingRate, audioStreamParams.format, audioStreamParams.channels);
623 return true;
624 }
625
SetParams(const AudioRendererParams params)626 int32_t AudioRendererPrivate::SetParams(const AudioRendererParams params)
627 {
628 Trace trace("AudioRenderer::SetParams");
629 AUDIO_INFO_LOG("StreamClientState for Renderer::SetParams.");
630 std::shared_lock<std::shared_mutex> lockShared;
631 if (callbackLoopTid_ != gettid()) { // No need to add lock in callback thread to prevent deadlocks
632 lockShared = std::shared_lock<std::shared_mutex>(rendererMutex_);
633 }
634 std::lock_guard<std::mutex> lock(setParamsMutex_);
635 AudioStreamParams audioStreamParams = ConvertToAudioStreamParams(params);
636
637 AudioStreamType audioStreamType = IAudioStream::GetStreamType(rendererInfo_.contentType, rendererInfo_.streamUsage);
638 #ifdef SUPPORT_LOW_LATENCY
639 IAudioStream::StreamClass streamClass = GetPreferredStreamClass(audioStreamParams);
640 #else
641 if (rendererInfo_.originalFlag != AUDIO_FLAG_PCM_OFFLOAD) {
642 rendererInfo_.originalFlag = AUDIO_FLAG_NORMAL;
643 }
644 rendererInfo_.rendererFlags = AUDIO_FLAG_NORMAL;
645 IAudioStream::StreamClass streamClass = IAudioStream::PA_STREAM;
646 #endif
647 rendererInfo_.audioFlag = AUDIO_OUTPUT_FLAG_NORMAL;
648 int32_t ret = PrepareAudioStream(audioStreamParams, audioStreamType, streamClass, rendererInfo_.audioFlag);
649 CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ERR_INVALID_PARAM, "PrepareAudioStream failed");
650
651 ret = InitAudioStream(audioStreamParams);
652 if (ret != SUCCESS) {
653 // if the normal stream creation fails, return fail, other try create normal stream
654 CHECK_AND_RETURN_RET_LOG(streamClass != IAudioStream::PA_STREAM, ret, "Normal Stream Init Failed");
655 ret = HandleCreateFastStreamError(audioStreamParams, audioStreamType);
656 }
657
658 CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ret, "SetAudioStreamInfo Failed");
659 AUDIO_INFO_LOG("SetAudioStreamInfo Succeeded");
660
661 RegisterRendererPolicyServiceDiedCallback();
662 // eg: 100005_44100_2_1_client_in.pcm
663 std::string dumpFileName = std::to_string(sessionID_) + "_" + std::to_string(params.sampleRate) + "_" +
664 std::to_string(params.channelCount) + "_" + std::to_string(params.sampleFormat) + "_client_in.pcm";
665 DumpFileUtil::OpenDumpFile(DumpFileUtil::DUMP_CLIENT_PARA, dumpFileName, &dumpFile_);
666
667 ret = InitOutputDeviceChangeCallback();
668 CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ret, "InitOutputDeviceChangeCallback Failed");
669
670 ret = InitFormatUnsupportedErrorCallback();
671 CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ret, "InitFormatUnsupportedErrorCallback Failed");
672
673 InitAudioRouteCallback();
674
675 return InitAudioInterruptCallback();
676 }
677
PrepareAudioStream(AudioStreamParams & audioStreamParams,const AudioStreamType & audioStreamType,IAudioStream::StreamClass & streamClass,uint32_t & flag)678 int32_t AudioRendererPrivate::PrepareAudioStream(AudioStreamParams &audioStreamParams,
679 const AudioStreamType &audioStreamType, IAudioStream::StreamClass &streamClass, uint32_t &flag)
680 {
681 AUDIO_INFO_LOG("Create stream with flag: %{public}d, original flag: %{public}d, streamClass: %{public}d",
682 rendererInfo_.rendererFlags, rendererInfo_.originalFlag, streamClass);
683
684 // Create Client
685 std::shared_ptr<AudioStreamDescriptor> streamDesc = ConvertToStreamDescriptor(audioStreamParams);
686 flag = AUDIO_OUTPUT_FLAG_NORMAL;
687
688 std::string networkId = LOCAL_NETWORK_ID;
689 int32_t ret = AudioPolicyManager::GetInstance().CreateRendererClient(
690 streamDesc, flag, audioStreamParams.originalSessionId, networkId);
691 CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ERR_OPERATION_FAILED, "CreateRendererClient failed");
692 AUDIO_INFO_LOG("StreamClientState for Renderer::CreateClient. id %{public}u, flag: %{public}u",
693 audioStreamParams.originalSessionId, flag);
694
695 SetClientInfo(flag, streamClass);
696
697 if (audioStream_ == nullptr) {
698 audioStream_ = IAudioStream::GetPlaybackStream(streamClass, audioStreamParams, audioStreamType,
699 appInfo_.appUid);
700 CHECK_AND_RETURN_RET_LOG(audioStream_ != nullptr, ERR_INVALID_PARAM, "SetParams GetPlayBackStream failed.");
701 AUDIO_INFO_LOG("IAudioStream::GetStream success");
702 isFastRenderer_ = IAudioStream::IsFastStreamClass(streamClass);
703 audioStream_->NotifyRouteUpdate(flag, networkId);
704 }
705 return SUCCESS;
706 }
707
ConvertToStreamDescriptor(const AudioStreamParams & audioStreamParams)708 std::shared_ptr<AudioStreamDescriptor> AudioRendererPrivate::ConvertToStreamDescriptor(
709 const AudioStreamParams &audioStreamParams)
710 {
711 std::shared_ptr<AudioStreamDescriptor> streamDesc = std::make_shared<AudioStreamDescriptor>();
712 streamDesc->streamInfo_.format = static_cast<AudioSampleFormat>(audioStreamParams.format);
713 streamDesc->streamInfo_.samplingRate = static_cast<AudioSamplingRate>(audioStreamParams.samplingRate);
714 streamDesc->streamInfo_.channels = static_cast<AudioChannel>(audioStreamParams.channels);
715 streamDesc->streamInfo_.encoding = static_cast<AudioEncodingType>(audioStreamParams.encoding);
716 streamDesc->streamInfo_.channelLayout = static_cast<AudioChannelLayout>(audioStreamParams.channelLayout);
717 streamDesc->audioMode_ = AUDIO_MODE_PLAYBACK;
718 streamDesc->createTimeStamp_ = ClockTime::GetCurNano();
719 streamDesc->rendererInfo_ = rendererInfo_;
720 streamDesc->appInfo_ = appInfo_;
721 streamDesc->callerUid_ = static_cast<int32_t>(getuid());
722 streamDesc->callerPid_ = static_cast<int32_t>(getpid());
723 streamDesc->sessionId_ = audioStreamParams.originalSessionId;
724 return streamDesc;
725 }
726
SetClientInfo(uint32_t flag,IAudioStream::StreamClass & streamClass)727 void AudioRendererPrivate::SetClientInfo(uint32_t flag, IAudioStream::StreamClass &streamClass)
728 {
729 if (flag & AUDIO_OUTPUT_FLAG_FAST) {
730 if (flag & AUDIO_OUTPUT_FLAG_VOIP) {
731 streamClass = IAudioStream::StreamClass::VOIP_STREAM;
732 rendererInfo_.originalFlag = AUDIO_FLAG_VOIP_FAST;
733 rendererInfo_.rendererFlags = AUDIO_FLAG_VOIP_FAST;
734 rendererInfo_.pipeType = PIPE_TYPE_LOWLATENCY_OUT;
735 } else {
736 streamClass = IAudioStream::StreamClass::FAST_STREAM;
737 rendererInfo_.rendererFlags = AUDIO_FLAG_VOIP_FAST;
738 rendererInfo_.pipeType = PIPE_TYPE_LOWLATENCY_OUT;
739 }
740 } else if (flag & AUDIO_OUTPUT_FLAG_DIRECT) {
741 if (flag & AUDIO_OUTPUT_FLAG_VOIP) {
742 streamClass = IAudioStream::StreamClass::PA_STREAM;
743 rendererInfo_.originalFlag = AUDIO_FLAG_VOIP_DIRECT;
744 rendererInfo_.rendererFlags = AUDIO_FLAG_VOIP_DIRECT;
745 rendererInfo_.pipeType = PIPE_TYPE_CALL_OUT;
746 } else {
747 streamClass = IAudioStream::StreamClass::PA_STREAM;
748 rendererInfo_.rendererFlags = AUDIO_FLAG_DIRECT;
749 rendererInfo_.pipeType = PIPE_TYPE_DIRECT_OUT;
750 }
751 } else if (flag & AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD) {
752 streamClass = IAudioStream::StreamClass::PA_STREAM;
753 rendererInfo_.rendererFlags = AUDIO_FLAG_NORMAL;
754 rendererInfo_.pipeType = PIPE_TYPE_OFFLOAD;
755 } else if (flag & AUDIO_OUTPUT_FLAG_MULTICHANNEL) {
756 streamClass = IAudioStream::StreamClass::PA_STREAM;
757 rendererInfo_.rendererFlags = AUDIO_FLAG_NORMAL;
758 rendererInfo_.pipeType = PIPE_TYPE_MULTICHANNEL;
759 } else {
760 streamClass = IAudioStream::StreamClass::PA_STREAM;
761 rendererInfo_.rendererFlags = AUDIO_FLAG_NORMAL;
762 rendererInfo_.pipeType = PIPE_TYPE_NORMAL_OUT;
763 }
764 AUDIO_INFO_LOG("Route flag: %{public}u, streamClass: %{public}d, rendererFlag: %{public}d, pipeType: %{public}d",
765 flag, streamClass, rendererInfo_.rendererFlags, rendererInfo_.pipeType);
766 }
767
GetParams(AudioRendererParams & params) const768 int32_t AudioRendererPrivate::GetParams(AudioRendererParams ¶ms) const
769 {
770 AudioStreamParams audioStreamParams;
771 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
772 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, ERROR_ILLEGAL_STATE, "audioStream_ is nullptr");
773 int32_t result = currentStream->GetAudioStreamInfo(audioStreamParams);
774 if (!result) {
775 params.sampleFormat = static_cast<AudioSampleFormat>(audioStreamParams.format);
776 params.sampleRate = static_cast<AudioSamplingRate>(audioStreamParams.samplingRate);
777 params.channelCount = static_cast<AudioChannel>(audioStreamParams.channels);
778 params.encodingType = static_cast<AudioEncodingType>(audioStreamParams.encoding);
779 params.channelLayout = static_cast<AudioChannelLayout>(audioStreamParams.channelLayout);
780 }
781
782 return result;
783 }
784
GetRendererInfo(AudioRendererInfo & rendererInfo) const785 int32_t AudioRendererPrivate::GetRendererInfo(AudioRendererInfo &rendererInfo) const
786 {
787 rendererInfo = rendererInfo_;
788
789 return SUCCESS;
790 }
791
GetStreamInfo(AudioStreamInfo & streamInfo) const792 int32_t AudioRendererPrivate::GetStreamInfo(AudioStreamInfo &streamInfo) const
793 {
794 AudioStreamParams audioStreamParams;
795 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
796 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, ERROR_ILLEGAL_STATE, "audioStream_ is nullptr");
797 int32_t result = currentStream->GetAudioStreamInfo(audioStreamParams);
798 if (!result) {
799 streamInfo.format = static_cast<AudioSampleFormat>(audioStreamParams.format);
800 streamInfo.samplingRate = static_cast<AudioSamplingRate>(audioStreamParams.samplingRate);
801 streamInfo.channels = static_cast<AudioChannel>(audioStreamParams.channels);
802 streamInfo.encoding = static_cast<AudioEncodingType>(audioStreamParams.encoding);
803 streamInfo.channelLayout = static_cast<AudioChannelLayout>(audioStreamParams.channelLayout);
804 }
805
806 return result;
807 }
808
SetRendererCallback(const std::shared_ptr<AudioRendererCallback> & callback)809 int32_t AudioRendererPrivate::SetRendererCallback(const std::shared_ptr<AudioRendererCallback> &callback)
810 {
811 std::shared_lock<std::shared_mutex> lockShared;
812 if (callbackLoopTid_ != gettid()) { // No need to add lock in callback thread to prevent deadlocks
813 lockShared = std::shared_lock<std::shared_mutex>(rendererMutex_);
814 }
815 std::lock_guard<std::mutex> lock(setStreamCallbackMutex_);
816 // If the client is using the deprecated SetParams API. SetRendererCallback must be invoked, after SetParams.
817 // In general, callbacks can only be set after the renderer state is PREPARED.
818 RendererState state = GetStatusInner();
819 CHECK_AND_RETURN_RET_LOG(state != RENDERER_NEW && state != RENDERER_RELEASED, ERR_ILLEGAL_STATE,
820 "incorrect state:%{public}d to register cb", state);
821
822 CHECK_AND_RETURN_RET_LOG(callback != nullptr, ERR_INVALID_PARAM,
823 "callback param is null");
824
825 // Save reference for interrupt callback
826 CHECK_AND_RETURN_RET_LOG(audioInterruptCallback_ != nullptr, ERROR,
827 "audioInterruptCallback_ == nullptr");
828 std::shared_ptr<AudioRendererInterruptCallbackImpl> cbInterrupt =
829 std::static_pointer_cast<AudioRendererInterruptCallbackImpl>(audioInterruptCallback_);
830 cbInterrupt->SaveCallback(callback);
831
832 // Save and Set reference for stream callback. Order is important here.
833 if (audioStreamCallback_ == nullptr) {
834 audioStreamCallback_ = std::make_shared<AudioStreamCallbackRenderer>(weak_from_this());
835 CHECK_AND_RETURN_RET_LOG(audioStreamCallback_ != nullptr, ERROR,
836 "Failed to allocate memory for audioStreamCallback_");
837 }
838 std::shared_ptr<AudioStreamCallbackRenderer> cbStream =
839 std::static_pointer_cast<AudioStreamCallbackRenderer>(audioStreamCallback_);
840 cbStream->SaveCallback(callback);
841 (void)audioStream_->SetStreamCallback(audioStreamCallback_);
842
843 return SUCCESS;
844 }
845
SetRendererPositionCallback(int64_t markPosition,const std::shared_ptr<RendererPositionCallback> & callback)846 int32_t AudioRendererPrivate::SetRendererPositionCallback(int64_t markPosition,
847 const std::shared_ptr<RendererPositionCallback> &callback)
848 {
849 CHECK_AND_RETURN_RET_LOG((callback != nullptr) && (markPosition > 0), ERR_INVALID_PARAM,
850 "input param is invalid");
851 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
852 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, ERROR_ILLEGAL_STATE, "audioStream_ is nullptr");
853 currentStream->SetRendererPositionCallback(markPosition, callback);
854
855 return SUCCESS;
856 }
857
UnsetRendererPositionCallback()858 void AudioRendererPrivate::UnsetRendererPositionCallback()
859 {
860 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
861 CHECK_AND_RETURN_LOG(currentStream != nullptr, "audioStream_ is nullptr");
862 currentStream->UnsetRendererPositionCallback();
863 }
864
SetRendererPeriodPositionCallback(int64_t frameNumber,const std::shared_ptr<RendererPeriodPositionCallback> & callback)865 int32_t AudioRendererPrivate::SetRendererPeriodPositionCallback(int64_t frameNumber,
866 const std::shared_ptr<RendererPeriodPositionCallback> &callback)
867 {
868 CHECK_AND_RETURN_RET_LOG((callback != nullptr) && (frameNumber > 0), ERR_INVALID_PARAM,
869 "input param is invalid");
870 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
871 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, ERROR_ILLEGAL_STATE, "audioStream_ is nullptr");
872 currentStream->SetRendererPeriodPositionCallback(frameNumber, callback);
873
874 return SUCCESS;
875 }
876
UnsetRendererPeriodPositionCallback()877 void AudioRendererPrivate::UnsetRendererPeriodPositionCallback()
878 {
879 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
880 CHECK_AND_RETURN_LOG(currentStream != nullptr, "audioStream_ is nullptr");
881 currentStream->UnsetRendererPeriodPositionCallback();
882 }
883
IsAllowedStartBackgroud()884 bool AudioRendererPrivate::IsAllowedStartBackgroud()
885 {
886 bool ret = AudioPolicyManager::GetInstance().IsAllowedPlayback(appInfo_.appUid, appInfo_.appPid);
887 if (ret) {
888 AUDIO_INFO_LOG("AVSession IsAudioPlaybackAllowed is: %{public}d", ret);
889 return ret;
890 } else {
891 if (std::count(BACKGROUND_NOSTART_STREAM_USAGE.begin(), BACKGROUND_NOSTART_STREAM_USAGE.end(),
892 rendererInfo_.streamUsage) == 0) {
893 AUDIO_INFO_LOG("%{public}d is BACKGROUND_NOSTART_STREAM_USAGE", rendererInfo_.streamUsage);
894 return true;
895 }
896 }
897 return ret;
898 }
899
900 // Must be called with rendererMutex_ or streamMutex_ held.
GetStartStreamResult(StateChangeCmdType cmdType)901 bool AudioRendererPrivate::GetStartStreamResult(StateChangeCmdType cmdType)
902 {
903 bool result = audioStream_->StartAudioStream(cmdType);
904 if (!result) {
905 AUDIO_ERR_LOG("Start audio stream failed");
906 std::lock_guard<std::mutex> lock(silentModeAndMixWithOthersMutex_);
907 if (!audioStream_->GetSilentModeAndMixWithOthers()) {
908 int32_t ret = AudioPolicyManager::GetInstance().DeactivateAudioInterrupt(audioInterrupt_);
909 if (ret != 0) {
910 AUDIO_WARNING_LOG("DeactivateAudioInterrupt Failed");
911 }
912 }
913 }
914
915 state_ = RENDERER_RUNNING;
916 return result;
917 }
918
GetInnerStream() const919 std::shared_ptr<IAudioStream> AudioRendererPrivate::GetInnerStream() const
920 {
921 std::shared_lock<std::shared_mutex> lockShared;
922 if (callbackLoopTid_ != gettid()) { // No need to add lock in callback thread to prevent deadlocks
923 lockShared = std::shared_lock<std::shared_mutex>(rendererMutex_);
924 }
925 return audioStream_;
926 }
927
StartSwitchProcess(RestoreInfo & restoreInfo,IAudioStream::StreamClass & targetClass,std::string callingFunc)928 int32_t AudioRendererPrivate::StartSwitchProcess(RestoreInfo &restoreInfo, IAudioStream::StreamClass &targetClass,
929 std::string callingFunc)
930 {
931 // hold rendererMutex_ to avoid render control and switch process called in concurrency
932 std::unique_lock<std::shared_mutex> lock;
933 if (callbackLoopTid_ != gettid()) { // No need to add lock in callback thread to prevent deadlocks
934 lock = std::unique_lock<std::shared_mutex>(rendererMutex_);
935 CHECK_AND_RETURN_RET_LOG(releaseFlag_ == false, SUCCESS, "In renderer release, return");
936 }
937
938 // Block interrupt calback, avoid pausing wrong stream.
939 std::shared_ptr<AudioRendererInterruptCallbackImpl> interruptCbImpl = nullptr;
940 if (audioInterruptCallback_ != nullptr) {
941 interruptCbImpl = std::static_pointer_cast<AudioRendererInterruptCallbackImpl>(audioInterruptCallback_);
942 interruptCbImpl->StartSwitch();
943 }
944
945 FastStatus fastStatus = GetFastStatusInner();
946 // Switch to target audio stream. Deactivate audio interrupt if switch failed.
947 AUDIO_INFO_LOG("Before %{public}s, restore audiorenderer %{public}u", callingFunc.c_str(), sessionID_);
948 if (!SwitchToTargetStream(targetClass, restoreInfo)) {
949 if (audioRendererErrorCallback_) {
950 audioRendererErrorCallback_->OnError(ERROR_SYSTEM); // Notify app if switch failed.
951 }
952 AUDIO_INFO_LOG("Deactivate audio interrupt after switch to target stream");
953 AudioInterrupt audioInterrupt = audioInterrupt_;
954 int32_t ret = AudioPolicyManager::GetInstance().DeactivateAudioInterrupt(audioInterrupt);
955 if (ret != SUCCESS) {
956 if (interruptCbImpl) {
957 interruptCbImpl->FinishSwitch();
958 }
959 AUDIO_ERR_LOG("DeactivateAudioInterrupt Failed");
960 return ERR_OPERATION_FAILED;
961 }
962 } else {
963 FastStatusChangeCallback(fastStatus);
964 }
965
966 // Unblock interrupt callback.
967 if (interruptCbImpl) {
968 interruptCbImpl->FinishSwitch();
969 }
970 return SUCCESS;
971 }
972
CheckAndRestoreAudioRenderer(std::string callingFunc)973 int32_t AudioRendererPrivate::CheckAndRestoreAudioRenderer(std::string callingFunc)
974 {
975 RestoreInfo restoreInfo;
976 std::shared_ptr<IAudioStream> oldStream = nullptr;
977 IAudioStream::StreamClass targetClass = IAudioStream::PA_STREAM;
978 {
979 std::unique_lock<std::shared_mutex> lock;
980 if (callbackLoopTid_ != gettid()) { // No need to add lock in callback thread to prevent deadlocks
981 lock = std::unique_lock<std::shared_mutex>(rendererMutex_);
982 CHECK_AND_RETURN_RET_LOG(releaseFlag_ == false, SUCCESS, "In renderer release, return");
983 }
984
985 // Return in advance if there's no need for restore.
986 CHECK_AND_RETURN_RET_LOG(audioStream_, ERR_ILLEGAL_STATE, "audioStream_ is nullptr");
987 RestoreStatus restoreStatus = audioStream_->CheckRestoreStatus();
988 if (abortRestore_ || restoreStatus == NO_NEED_FOR_RESTORE) {
989 return SUCCESS;
990 }
991 if (restoreStatus == RESTORING) {
992 AUDIO_WARNING_LOG("%{public}s when restoring, return", callingFunc.c_str());
993 return ERR_ILLEGAL_STATE;
994 }
995
996 // Get restore info and target stream class for switching.
997 audioStream_->GetRestoreInfo(restoreInfo);
998 SetClientInfo(restoreInfo.routeFlag, targetClass);
999 if (restoreStatus == NEED_RESTORE_TO_NORMAL) {
1000 restoreInfo.targetStreamFlag = AUDIO_FLAG_FORCED_NORMAL;
1001 }
1002 // Check if split stream. If true, fetch output device and return.
1003 CHECK_AND_RETURN_RET(ContinueAfterSplit(restoreInfo), true, "Stream split");
1004 // Check if continue to switch after some concede operation.
1005 CHECK_AND_RETURN_RET_LOG(ContinueAfterConcede(targetClass, restoreInfo),
1006 true, "No need for switch");
1007 oldStream = audioStream_;
1008 }
1009 // ahead join callbackLoop and do not hold rendererMutex_ when waiting for callback
1010 oldStream->JoinCallbackLoop();
1011
1012 return StartSwitchProcess(restoreInfo, targetClass, callingFunc);
1013 }
1014
AsyncCheckAudioRenderer(std::string callingFunc)1015 int32_t AudioRendererPrivate::AsyncCheckAudioRenderer(std::string callingFunc)
1016 {
1017 if (switchStreamInNewThreadTaskCount_.fetch_add(1) > 0) {
1018 return SUCCESS;
1019 }
1020 auto weakRenderer = weak_from_this();
1021 taskLoop_.PostTask([weakRenderer, callingFunc] () {
1022 auto sharedRenderer = weakRenderer.lock();
1023 CHECK_AND_RETURN_LOG(sharedRenderer, "render is null");
1024 uint32_t taskCount;
1025 do {
1026 taskCount = sharedRenderer->switchStreamInNewThreadTaskCount_.load();
1027 sharedRenderer->CheckAudioRenderer(callingFunc + "withNewThread");
1028 } while (sharedRenderer->switchStreamInNewThreadTaskCount_.fetch_sub(taskCount) > taskCount);
1029 });
1030 return SUCCESS;
1031 }
1032
Start(StateChangeCmdType cmdType)1033 bool AudioRendererPrivate::Start(StateChangeCmdType cmdType)
1034 {
1035 Trace trace("KeyAction AudioRenderer::Start " + std::to_string(sessionID_));
1036 AsyncCheckAudioRenderer("Start");
1037 AudioXCollie audioXCollie("AudioRendererPrivate::Start", START_TIME_OUT_SECONDS,
1038 [](void *) { AUDIO_ERR_LOG("Start timeout"); }, nullptr, AUDIO_XCOLLIE_FLAG_LOG);
1039
1040 std::unique_lock<std::shared_mutex> lock;
1041 if (callbackLoopTid_ != gettid()) { // No need to add lock in callback thread to prevent deadlocks
1042 lock = std::unique_lock<std::shared_mutex>(rendererMutex_);
1043 }
1044 AUDIO_WARNING_LOG("StreamClientState for Renderer::Start. id: %{public}u, streamType: %{public}d, "\
1045 "volume: %{public}f, interruptMode: %{public}d, isVKB: %{public}s",
1046 sessionID_, audioInterrupt_.audioFocusType.streamType,
1047 GetVolumeInner(), audioInterrupt_.mode, rendererInfo_.isVirtualKeyboard ? "T" : "F");
1048 CHECK_AND_RETURN_RET_LOG(IsAllowedStartBackgroud(), false, "Start failed. IsAllowedStartBackgroud is false");
1049 RendererState state = GetStatusInner();
1050 CHECK_AND_RETURN_RET_LOG((state == RENDERER_PREPARED) || (state == RENDERER_STOPPED) || (state == RENDERER_PAUSED),
1051 false, "Start failed. Illegal state:%{public}u", state);
1052
1053 CHECK_AND_RETURN_RET_LOG(!isSwitching_, false, "Start failed. Switching state: %{public}d", isSwitching_);
1054
1055 if (audioInterrupt_.audioFocusType.streamType == STREAM_DEFAULT || audioInterrupt_.streamId == INVALID_SESSION_ID) {
1056 return false;
1057 }
1058
1059 CHECK_AND_RETURN_RET_LOG(audioStream_ != nullptr, false, "audio stream is null");
1060
1061 float duckVolume = audioStream_->GetDuckVolume();
1062 bool isMute = audioStream_->GetMute();
1063 AUDIO_WARNING_LOG("VolumeInfo for Renderer::Start. duckVolume: %{public}f, isMute: %{public}d, MinStreamVolume:"\
1064 "MinStreamVolume: %{public}f, MaxStreamVolume: %{public}f",
1065 duckVolume, isMute, GetMinStreamVolume(), GetMaxStreamVolume());
1066
1067 if ((GetVolumeInner() == 0 && isStillZeroStreamVolume_) || isMute) {
1068 AUDIO_INFO_LOG("StreamClientState for Renderer::Start. volume=%{public}f, isStillZeroStreamVolume_=%{public}d"
1069 " isMute=%{public}d", GetVolumeInner(), isStillZeroStreamVolume_, isMute);
1070 audioInterrupt_.sessionStrategy.concurrencyMode = AudioConcurrencyMode::SILENT;
1071 } else {
1072 isStillZeroStreamVolume_ = false;
1073 }
1074
1075 {
1076 std::lock_guard<std::mutex> lockSilentMode(silentModeAndMixWithOthersMutex_);
1077 if (audioStream_->GetSilentModeAndMixWithOthers()) {
1078 audioInterrupt_.sessionStrategy.concurrencyMode = AudioConcurrencyMode::SILENT;
1079 }
1080 int32_t ret = AudioPolicyManager::GetInstance().ActivateAudioInterrupt(audioInterrupt_);
1081 CHECK_AND_RETURN_RET_LOG(ret == 0, false, "ActivateAudioInterrupt Failed");
1082 }
1083
1084 if (IsNoStreamRenderer()) {
1085 // no stream renderer only need to activate audio interrupt
1086 state_ = RENDERER_RUNNING;
1087 return true;
1088 }
1089
1090 return GetStartStreamResult(cmdType);
1091 }
1092
Write(uint8_t * buffer,size_t bufferSize)1093 int32_t AudioRendererPrivate::Write(uint8_t *buffer, size_t bufferSize)
1094 {
1095 Trace trace("AudioRenderer::Write");
1096 AsyncCheckAudioRenderer("Write");
1097 MockPcmData(buffer, bufferSize);
1098 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
1099 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, ERROR_ILLEGAL_STATE, "audioStream_ is nullptr");
1100 int32_t size = currentStream->Write(buffer, bufferSize);
1101 if (size > 0) {
1102 DumpFileUtil::WriteDumpFile(dumpFile_, static_cast<void *>(buffer), size);
1103 }
1104 return size;
1105 }
1106
Write(uint8_t * pcmBuffer,size_t pcmSize,uint8_t * metaBuffer,size_t metaSize)1107 int32_t AudioRendererPrivate::Write(uint8_t *pcmBuffer, size_t pcmSize, uint8_t *metaBuffer, size_t metaSize)
1108 {
1109 Trace trace("Write");
1110 AsyncCheckAudioRenderer("Write");
1111 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
1112 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, ERROR_ILLEGAL_STATE, "audioStream_ is nullptr");
1113 int32_t size = currentStream->Write(pcmBuffer, pcmSize, metaBuffer, metaSize);
1114 if (size > 0) {
1115 DumpFileUtil::WriteDumpFile(dumpFile_, static_cast<void *>(pcmBuffer), size);
1116 }
1117 return size;
1118 }
1119
GetStatus() const1120 RendererState AudioRendererPrivate::GetStatus() const
1121 {
1122 if (IsNoStreamRenderer()) {
1123 return state_;
1124 }
1125 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
1126 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, RENDERER_INVALID, "audioStream_ is nullptr");
1127 return static_cast<RendererState>(currentStream->GetState());
1128 }
1129
GetAudioTime(Timestamp & timestamp,Timestamp::Timestampbase base) const1130 bool AudioRendererPrivate::GetAudioTime(Timestamp ×tamp, Timestamp::Timestampbase base) const
1131 {
1132 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
1133 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, ERROR_ILLEGAL_STATE, "audioStream_ is nullptr");
1134 return currentStream->GetAudioTime(timestamp, base);
1135 }
1136
GetAudioPosition(Timestamp & timestamp,Timestamp::Timestampbase base)1137 bool AudioRendererPrivate::GetAudioPosition(Timestamp ×tamp, Timestamp::Timestampbase base)
1138 {
1139 AsyncCheckAudioRenderer("GetAudioPosition");
1140 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
1141 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, ERROR_ILLEGAL_STATE, "audioStream_ is nullptr");
1142 return currentStream->GetAudioPosition(timestamp, base);
1143 }
1144
Drain() const1145 bool AudioRendererPrivate::Drain() const
1146 {
1147 Trace trace("KeyAction AudioRenderer::Drain");
1148 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
1149 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, ERROR_ILLEGAL_STATE, "audioStream_ is nullptr");
1150 return currentStream->DrainAudioStream();
1151 }
1152
Flush() const1153 bool AudioRendererPrivate::Flush() const
1154 {
1155 Trace trace("KeyAction AudioRenderer::Flush " + std::to_string(sessionID_));
1156 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
1157 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, ERROR_ILLEGAL_STATE, "audioStream_ is nullptr");
1158 return currentStream->FlushAudioStream();
1159 }
1160
PauseTransitent(StateChangeCmdType cmdType)1161 bool AudioRendererPrivate::PauseTransitent(StateChangeCmdType cmdType)
1162 {
1163 Trace trace("KeyAction AudioRenderer::PauseTransitent " + std::to_string(sessionID_));
1164 std::unique_lock<std::shared_mutex> lock;
1165 if (callbackLoopTid_ != gettid()) { // No need to add lock in callback thread to prevent deadlocks
1166 lock = std::unique_lock<std::shared_mutex>(rendererMutex_);
1167 }
1168 AUDIO_INFO_LOG("StreamClientState for Renderer::PauseTransitent. id: %{public}u", sessionID_);
1169 if (isSwitching_) {
1170 AUDIO_ERR_LOG("failed. Switching state: %{public}d", isSwitching_);
1171 return false;
1172 }
1173
1174 if (IsNoStreamRenderer()) {
1175 // no stream renderer don't need to change audio stream state
1176 state_ = RENDERER_PAUSED;
1177 return true;
1178 }
1179
1180 RendererState state = GetStatusInner();
1181 if (state != RENDERER_RUNNING) {
1182 // If the stream is not running, there is no need to pause and deactive audio interrupt
1183 AUDIO_ERR_LOG("State of stream is not running. Illegal state:%{public}u", state);
1184 return false;
1185 }
1186 bool result = audioStream_->PauseAudioStream(cmdType);
1187 if (result) {
1188 state_ = RENDERER_PAUSED;
1189 }
1190
1191 return result;
1192 }
1193
Mute(StateChangeCmdType cmdType) const1194 bool AudioRendererPrivate::Mute(StateChangeCmdType cmdType) const
1195 {
1196 Trace trace("AudioRenderer::Mute");
1197 std::shared_lock<std::shared_mutex> lock;
1198 if (callbackLoopTid_ != gettid()) { // No need to add lock in callback thread to prevent deadlocks
1199 lock = std::shared_lock<std::shared_mutex>(rendererMutex_);
1200 }
1201 AUDIO_INFO_LOG("StreamClientState for Renderer::Mute. id: %{public}u", sessionID_);
1202 (void)audioStream_->SetMute(true, cmdType);
1203 return true;
1204 }
1205
Unmute(StateChangeCmdType cmdType) const1206 bool AudioRendererPrivate::Unmute(StateChangeCmdType cmdType) const
1207 {
1208 Trace trace("AudioRenderer::Unmute");
1209 std::shared_lock<std::shared_mutex> lock;
1210 if (callbackLoopTid_ != gettid()) { // No need to add lock in callback thread to prevent deadlocks
1211 lock = std::shared_lock<std::shared_mutex>(rendererMutex_);
1212 }
1213 AUDIO_INFO_LOG("StreamClientState for Renderer::Unmute. id: %{public}u", sessionID_);
1214 (void)audioStream_->SetMute(false, cmdType);
1215 UpdateAudioInterruptStrategy(GetVolumeInner(), false);
1216 return true;
1217 }
1218
Pause(StateChangeCmdType cmdType)1219 bool AudioRendererPrivate::Pause(StateChangeCmdType cmdType)
1220 {
1221 Trace trace("KeyAction AudioRenderer::Pause " + std::to_string(sessionID_));
1222 AudioXCollie audioXCollie("AudioRenderer::Pause", TIME_OUT_SECONDS,
1223 [](void *) {
1224 AUDIO_ERR_LOG("Pause timeout");
1225 }, nullptr, AUDIO_XCOLLIE_FLAG_LOG);
1226 std::unique_lock<std::shared_mutex> lock;
1227 if (callbackLoopTid_ != gettid()) { // No need to add lock in callback thread to prevent deadlocks
1228 lock = std::unique_lock<std::shared_mutex>(rendererMutex_);
1229 }
1230 AUDIO_WARNING_LOG("StreamClientState for Renderer::Pause. id: %{public}u", sessionID_);
1231
1232 CHECK_AND_RETURN_RET_LOG(!isSwitching_, false, "Pause failed. Switching state: %{public}d", isSwitching_);
1233
1234 if (IsNoStreamRenderer()) {
1235 // When the cellular call stream is pausing, only need to deactivate audio interrupt.
1236 if (AudioPolicyManager::GetInstance().DeactivateAudioInterrupt(audioInterrupt_) != 0) {
1237 AUDIO_ERR_LOG("DeactivateAudioInterrupt Failed");
1238 }
1239 state_ = RENDERER_PAUSED;
1240 return true;
1241 }
1242
1243 RendererState state = GetStatusInner();
1244 CHECK_AND_RETURN_RET_LOG(state == RENDERER_RUNNING, false,
1245 "State of stream is not running. Illegal state:%{public}u", state);
1246 bool result = audioStream_->PauseAudioStream(cmdType);
1247 if (result) {
1248 state_ = RENDERER_PAUSED;
1249 }
1250
1251 // When user is intentionally pausing, deactivate to remove from audioFocusInfoList_
1252 int32_t ret = AudioPolicyManager::GetInstance().DeactivateAudioInterrupt(audioInterrupt_);
1253 if (ret != 0) {
1254 AUDIO_ERR_LOG("DeactivateAudioInterrupt Failed");
1255 }
1256 (void)audioStream_->SetDuckVolume(1.0f);
1257
1258 return result;
1259 }
1260
Stop()1261 bool AudioRendererPrivate::Stop()
1262 {
1263 Trace trace("KeyAction AudioRenderer::Stop " + std::to_string(sessionID_));
1264 AUDIO_WARNING_LOG("StreamClientState for Renderer::Stop. id: %{public}u", sessionID_);
1265 std::unique_lock<std::shared_mutex> lock;
1266 if (callbackLoopTid_ != gettid()) { // No need to add lock in callback thread to prevent deadlocks
1267 lock = std::unique_lock<std::shared_mutex>(rendererMutex_);
1268 }
1269 CHECK_AND_RETURN_RET_LOG(!isSwitching_, false,
1270 "AudioRenderer::Stop failed. Switching state: %{public}d", isSwitching_);
1271 if (IsNoStreamRenderer()) {
1272 // When the cellular call stream is stopping, only need to deactivate audio interrupt.
1273 if (AudioPolicyManager::GetInstance().DeactivateAudioInterrupt(audioInterrupt_) != 0) {
1274 AUDIO_WARNING_LOG("DeactivateAudioInterrupt Failed");
1275 }
1276 state_ = RENDERER_STOPPED;
1277 return true;
1278 }
1279
1280 WriteUnderrunEvent();
1281 bool result = audioStream_->StopAudioStream();
1282 if (result) {
1283 state_ = RENDERER_STOPPED;
1284 }
1285 int32_t ret = AudioPolicyManager::GetInstance().DeactivateAudioInterrupt(audioInterrupt_);
1286 if (ret != 0) {
1287 AUDIO_WARNING_LOG("DeactivateAudioInterrupt Failed");
1288 }
1289 (void)audioStream_->SetDuckVolume(1.0f);
1290
1291 return result;
1292 }
1293
SetReleaseFlagWithLock(bool releaseFlag)1294 void AudioRendererPrivate::SetReleaseFlagWithLock(bool releaseFlag)
1295 {
1296 std::unique_lock<std::shared_mutex> lock(rendererMutex_);
1297 releaseFlag_ = releaseFlag;
1298 }
1299
SetReleaseFlagNoLock(bool releaseFlag)1300 void AudioRendererPrivate::SetReleaseFlagNoLock(bool releaseFlag)
1301 {
1302 releaseFlag_ = releaseFlag;
1303 }
1304
Release()1305 bool AudioRendererPrivate::Release()
1306 {
1307 Trace trace("KeyAction AudioRenderer::Release " + std::to_string(sessionID_));
1308
1309 std::unique_lock<std::shared_mutex> lock;
1310 if (callbackLoopTid_ != gettid()) { // No need to add lock in callback thread to prevent deadlocks
1311 SetReleaseFlagWithLock(true);
1312 auto audioStreamInner = GetInnerStream();
1313 if (audioStreamInner != nullptr) {
1314 audioStreamInner->JoinCallbackLoop();
1315 }
1316 lock = std::unique_lock<std::shared_mutex>(rendererMutex_);
1317 }
1318 AUDIO_WARNING_LOG("StreamClientState for Renderer::Release. id: %{public}u", sessionID_);
1319
1320 abortRestore_ = true;
1321 if (audioStream_ == nullptr) {
1322 AUDIO_ERR_LOG("audioStream is null");
1323 SetReleaseFlagNoLock(false);
1324 return true;
1325 }
1326 bool result = audioStream_->ReleaseAudioStream();
1327
1328 // If Stop call was skipped, Release to take care of Deactivation
1329 (void)AudioPolicyManager::GetInstance().DeactivateAudioInterrupt(audioInterrupt_);
1330
1331 // Unregister the callaback in policy server
1332 (void)AudioPolicyManager::GetInstance().UnsetAudioInterruptCallback(sessionID_);
1333
1334 (void)AudioPolicyManager::GetInstance().UnsetAudioFormatUnsupportedErrorCallback();
1335
1336 (void)AudioPolicyManager::GetInstance().UnsetAudioRouteCallback(sessionID_);
1337
1338 for (auto id : usedSessionId_) {
1339 AudioPolicyManager::GetInstance().UnregisterDeviceChangeWithInfoCallback(id);
1340 }
1341 SetReleaseFlagNoLock(false);
1342 lock.unlock();
1343 RemoveRendererPolicyServiceDiedCallback();
1344
1345 return result;
1346 }
1347
GetBufferSize(size_t & bufferSize) const1348 int32_t AudioRendererPrivate::GetBufferSize(size_t &bufferSize) const
1349 {
1350 Trace trace("AudioRenderer::GetBufferSize");
1351 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
1352 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, ERROR_ILLEGAL_STATE, "audioStream_ is nullptr");
1353 return currentStream->GetBufferSize(bufferSize);
1354 }
1355
GetAudioStreamId(uint32_t & sessionID) const1356 int32_t AudioRendererPrivate::GetAudioStreamId(uint32_t &sessionID) const
1357 {
1358 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
1359 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, ERROR_ILLEGAL_STATE, "audioStream_ is nullptr");
1360 return currentStream->GetAudioSessionID(sessionID);
1361 }
1362
SetAudioRendererDesc(AudioRendererDesc audioRendererDesc)1363 int32_t AudioRendererPrivate::SetAudioRendererDesc(AudioRendererDesc audioRendererDesc)
1364 {
1365 ContentType contentType = audioRendererDesc.contentType;
1366 StreamUsage streamUsage = audioRendererDesc.streamUsage;
1367 AudioStreamType audioStreamType = IAudioStream::GetStreamType(contentType, streamUsage);
1368 audioInterrupt_.audioFocusType.streamType = audioStreamType;
1369 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
1370 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, ERROR_ILLEGAL_STATE, "audioStream_ is nullptr");
1371 return currentStream->SetAudioStreamType(audioStreamType);
1372 }
1373
SetStreamType(AudioStreamType audioStreamType)1374 int32_t AudioRendererPrivate::SetStreamType(AudioStreamType audioStreamType)
1375 {
1376 audioInterrupt_.audioFocusType.streamType = audioStreamType;
1377 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
1378 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, ERROR_ILLEGAL_STATE, "audioStream_ is nullptr");
1379 return currentStream->SetAudioStreamType(audioStreamType);
1380 }
1381
SetVolumeMode(int32_t mode)1382 int32_t AudioRendererPrivate::SetVolumeMode(int32_t mode)
1383 {
1384 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
1385 AUDIO_INFO_LOG("SetVolumeMode mode = %{public}d", mode);
1386 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, ERROR_ILLEGAL_STATE, "audioStream_ is nullptr");
1387 rendererInfo_.volumeMode = static_cast<AudioVolumeMode>(mode);
1388 return SUCCESS;
1389 }
1390
SetVolume(float volume) const1391 int32_t AudioRendererPrivate::SetVolume(float volume) const
1392 {
1393 UpdateAudioInterruptStrategy(volume, true);
1394 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
1395 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, ERROR_ILLEGAL_STATE, "audioStream_ is nullptr");
1396 return currentStream->SetVolume(volume);
1397 }
1398
UpdateAudioInterruptStrategy(float volume,bool setVolume) const1399 void AudioRendererPrivate::UpdateAudioInterruptStrategy(float volume, bool setVolume) const
1400 {
1401 CHECK_AND_RETURN_LOG(audioStream_ != nullptr, "audioStream_ is nullptr");
1402 State currentState = audioStream_->GetState();
1403 bool isMute = audioStream_->GetMute();
1404 bool noNeedActive = setVolume && (audioStream_->GetVolume() > 0) && (volume > 0);
1405 if (currentState == NEW || currentState == PREPARED) {
1406 AUDIO_INFO_LOG("UpdateAudioInterruptStrategy for set volume before RUNNING, volume=%{public}f", volume);
1407 isStillZeroStreamVolume_ = (volume == 0);
1408 } else if ((isStillZeroStreamVolume_ || !isMute) && volume > 0) {
1409 isStillZeroStreamVolume_ = false;
1410 audioInterrupt_.sessionStrategy.concurrencyMode =
1411 (originalStrategy_.concurrencyMode == AudioConcurrencyMode::INVALID ?
1412 AudioConcurrencyMode::DEFAULT : originalStrategy_.concurrencyMode);
1413 if (currentState == RUNNING && !noNeedActive) {
1414 AudioInterrupt audioInterrupt = audioInterrupt_;
1415 AUDIO_INFO_LOG("UpdateAudioInterruptStrategy for set volume, volume=%{public}f", volume);
1416 int ret = AudioPolicyManager::GetInstance().ActivateAudioInterrupt(audioInterrupt, 0, true);
1417 CHECK_AND_RETURN_LOG(ret == 0, "ActivateAudioInterrupt Failed at SetVolume");
1418 }
1419 }
1420 }
1421
GetVolume() const1422 float AudioRendererPrivate::GetVolume() const
1423 {
1424 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
1425 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, ERROR_ILLEGAL_STATE, "audioStream_ is nullptr");
1426 return currentStream->GetVolume();
1427 }
1428
SetLoudnessGain(float loudnessGain) const1429 int32_t AudioRendererPrivate::SetLoudnessGain(float loudnessGain) const
1430 {
1431 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
1432 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, ERROR_ILLEGAL_STATE, "audioStream_ is nullptr");
1433 CHECK_AND_RETURN_RET_LOG(rendererInfo_.streamUsage == STREAM_USAGE_MUSIC ||
1434 rendererInfo_.streamUsage == STREAM_USAGE_MOVIE ||
1435 rendererInfo_.streamUsage == STREAM_USAGE_AUDIOBOOK, ERROR_UNSUPPORTED, "audio stream type not supported");
1436 CHECK_AND_RETURN_RET_LOG(((loudnessGain >= MIN_LOUDNESS_GAIN) && (loudnessGain <= MAX_LOUDNESS_GAIN)),
1437 ERROR_INVALID_PARAM, "loudnessGain set invalid");
1438 CHECK_AND_RETURN_RET_LOG(rendererInfo_.rendererFlags != AUDIO_FLAG_MMAP &&
1439 rendererInfo_.rendererFlags != AUDIO_FLAG_VOIP_FAST &&
1440 rendererInfo_.rendererFlags != AUDIO_FLAG_DIRECT &&
1441 rendererInfo_.rendererFlags != AUDIO_FLAG_VOIP_DIRECT,
1442 ERROR_UNSUPPORTED, "low latency mode not supported");
1443 return currentStream->SetLoudnessGain(loudnessGain);
1444 }
1445
GetLoudnessGain() const1446 float AudioRendererPrivate::GetLoudnessGain() const
1447 {
1448 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
1449 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, 0.0f, "audioStream_ is nullptr");
1450
1451 CHECK_AND_RETURN_RET_LOG(rendererInfo_.streamUsage == STREAM_USAGE_MUSIC ||
1452 rendererInfo_.streamUsage == STREAM_USAGE_MOVIE ||
1453 rendererInfo_.streamUsage == STREAM_USAGE_AUDIOBOOK, 0.0f, "audio stream type not supported");
1454
1455 CHECK_AND_RETURN_RET_LOG(rendererInfo_.rendererFlags != AUDIO_FLAG_MMAP &&
1456 rendererInfo_.rendererFlags != AUDIO_FLAG_VOIP_FAST &&
1457 rendererInfo_.rendererFlags != AUDIO_FLAG_DIRECT &&
1458 rendererInfo_.rendererFlags != AUDIO_FLAG_VOIP_DIRECT,
1459 0.0f, "low latency mode not supported");
1460
1461 return currentStream->GetLoudnessGain();
1462 }
1463
SetRenderRate(AudioRendererRate renderRate) const1464 int32_t AudioRendererPrivate::SetRenderRate(AudioRendererRate renderRate) const
1465 {
1466 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
1467 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, ERROR_ILLEGAL_STATE, "audioStream_ is nullptr");
1468 int32_t ret = currentStream->SetRenderRate(renderRate);
1469 CHECK_AND_RETURN_RET(ret == SUCCESS, ret);
1470 float speed = 1.0f;
1471 switch (renderRate) {
1472 case RENDER_RATE_NORMAL:
1473 speed = 1.0f;
1474 break;
1475 case RENDER_RATE_DOUBLE:
1476 speed = 2.0f;
1477 break;
1478 case RENDER_RATE_HALF:
1479 speed = 0.5f;
1480 break;
1481 default:
1482 speed = 1.0f;
1483 }
1484 ret = currentStream->SetSpeed(speed);
1485 if (ret != SUCCESS) {
1486 AUDIO_WARNING_LOG("SetSpeed Failed, error: %{public}d", ret);
1487 }
1488 ret = currentStream->SetPitch(speed);
1489 if (ret != SUCCESS) {
1490 AUDIO_WARNING_LOG("SetPitch Failed, error: %{public}d", ret);
1491 }
1492 return SUCCESS;
1493 }
1494
GetRenderRate() const1495 AudioRendererRate AudioRendererPrivate::GetRenderRate() const
1496 {
1497 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
1498 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, RENDER_RATE_NORMAL, "audioStream_ is nullptr");
1499 return currentStream->GetRenderRate();
1500 }
1501
SetRendererSamplingRate(uint32_t sampleRate) const1502 int32_t AudioRendererPrivate::SetRendererSamplingRate(uint32_t sampleRate) const
1503 {
1504 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
1505 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, ERROR_ILLEGAL_STATE, "audioStream_ is nullptr");
1506 return currentStream->SetRendererSamplingRate(sampleRate);
1507 }
1508
GetRendererSamplingRate() const1509 uint32_t AudioRendererPrivate::GetRendererSamplingRate() const
1510 {
1511 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
1512 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, ERROR_ILLEGAL_STATE, "audioStream_ is nullptr");
1513 return currentStream->GetRendererSamplingRate();
1514 }
1515
SetBufferDuration(uint64_t bufferDuration) const1516 int32_t AudioRendererPrivate::SetBufferDuration(uint64_t bufferDuration) const
1517 {
1518 CHECK_AND_RETURN_RET_LOG(bufferDuration >= MINIMUM_BUFFER_SIZE_MSEC && bufferDuration <= MAXIMUM_BUFFER_SIZE_MSEC,
1519 ERR_INVALID_PARAM, "Error: Please set the buffer duration between 5ms ~ 60ms");
1520 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
1521 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, ERROR_ILLEGAL_STATE, "audioStream_ is nullptr");
1522 return currentStream->SetBufferSizeInMsec(bufferDuration);
1523 }
1524
SetChannelBlendMode(ChannelBlendMode blendMode)1525 int32_t AudioRendererPrivate::SetChannelBlendMode(ChannelBlendMode blendMode)
1526 {
1527 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
1528 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, ERROR_ILLEGAL_STATE, "audioStream_ is nullptr");
1529 return currentStream->SetChannelBlendMode(blendMode);
1530 }
1531
AudioRendererInterruptCallbackImpl(const std::shared_ptr<IAudioStream> & audioStream,const AudioInterrupt & audioInterrupt)1532 AudioRendererInterruptCallbackImpl::AudioRendererInterruptCallbackImpl(const std::shared_ptr<IAudioStream> &audioStream,
1533 const AudioInterrupt &audioInterrupt)
1534 : audioStream_(audioStream), audioInterrupt_(audioInterrupt)
1535 {
1536 AUDIO_DEBUG_LOG("AudioRendererInterruptCallbackImpl constructor");
1537 }
1538
~AudioRendererInterruptCallbackImpl()1539 AudioRendererInterruptCallbackImpl::~AudioRendererInterruptCallbackImpl()
1540 {
1541 AUDIO_DEBUG_LOG("AudioRendererInterruptCallbackImpl: instance destroy");
1542 }
1543
SaveCallback(const std::weak_ptr<AudioRendererCallback> & callback)1544 void AudioRendererInterruptCallbackImpl::SaveCallback(const std::weak_ptr<AudioRendererCallback> &callback)
1545 {
1546 callback_ = callback;
1547 }
1548
UpdateAudioStream(const std::shared_ptr<IAudioStream> & audioStream)1549 void AudioRendererInterruptCallbackImpl::UpdateAudioStream(const std::shared_ptr<IAudioStream> &audioStream)
1550 {
1551 std::lock_guard<std::mutex> lock(mutex_);
1552 audioStream_ = audioStream;
1553 }
1554
StartSwitch()1555 void AudioRendererInterruptCallbackImpl::StartSwitch()
1556 {
1557 std::lock_guard<std::mutex> lock(mutex_);
1558 switching_ = true;
1559 AUDIO_INFO_LOG("SwitchStream start, block interrupt callback");
1560 }
1561
FinishSwitch()1562 void AudioRendererInterruptCallbackImpl::FinishSwitch()
1563 {
1564 std::lock_guard<std::mutex> lock(mutex_);
1565 switching_ = false;
1566 switchStreamCv_.notify_all();
1567 AUDIO_INFO_LOG("SwitchStream finish, notify interrupt callback");
1568 }
1569
NotifyEvent(const InterruptEvent & interruptEvent)1570 void AudioRendererInterruptCallbackImpl::NotifyEvent(const InterruptEvent &interruptEvent)
1571 {
1572 if (cb_ != nullptr && interruptEvent.callbackToApp) {
1573 cb_->OnInterrupt(interruptEvent);
1574 AUDIO_DEBUG_LOG("Send interruptEvent to app successfully");
1575 } else if (cb_ == nullptr) {
1576 AUDIO_WARNING_LOG("cb_==nullptr, failed to send interruptEvent");
1577 } else {
1578 AUDIO_INFO_LOG("callbackToApp is %{public}d", interruptEvent.callbackToApp);
1579 }
1580 }
1581
HandleForceDucking(const InterruptEventInternal & interruptEvent)1582 bool AudioRendererInterruptCallbackImpl::HandleForceDucking(const InterruptEventInternal &interruptEvent)
1583 {
1584 float duckVolumeFactor = interruptEvent.duckVolume;
1585 int32_t ret = audioStream_->SetDuckVolume(duckVolumeFactor);
1586 CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, false, "Failed to set duckVolumeFactor(instance) %{public}f",
1587 duckVolumeFactor);
1588
1589 AUDIO_INFO_LOG("Set duckVolumeFactor %{public}f successfully.", duckVolumeFactor);
1590 return true;
1591 }
1592
NotifyForcePausedToResume(const InterruptEventInternal & interruptEvent)1593 void AudioRendererInterruptCallbackImpl::NotifyForcePausedToResume(const InterruptEventInternal &interruptEvent)
1594 {
1595 // Change InterruptForceType to Share, Since app will take care of resuming
1596 InterruptEvent interruptEventResume {interruptEvent.eventType, INTERRUPT_SHARE,
1597 interruptEvent.hintType};
1598 NotifyEvent(interruptEventResume);
1599 }
1600
HandleAndNotifyForcedEvent(const InterruptEventInternal & interruptEvent)1601 InterruptCallbackEvent AudioRendererInterruptCallbackImpl::HandleAndNotifyForcedEvent(
1602 const InterruptEventInternal &interruptEvent)
1603 {
1604 State currentState = audioStream_->GetState();
1605 audioStream_->GetAudioSessionID(sessionID_);
1606 switch (interruptEvent.hintType) {
1607 case INTERRUPT_HINT_PAUSE:
1608 if (currentState == RUNNING || currentState == PREPARED) {
1609 (void)audioStream_->PauseAudioStream(); // Just Pause, do not deactivate here
1610 (void)audioStream_->SetDuckVolume(1.0f);
1611 isForcePaused_ = true;
1612 } else {
1613 AUDIO_WARNING_LOG("sessionId: %{public}u, state: %{public}d. No need to pause",
1614 sessionID_, static_cast<int32_t>(currentState));
1615 return NO_EVENT;
1616 }
1617 break;
1618 case INTERRUPT_HINT_RESUME:
1619 if ((currentState != PAUSED && currentState != PREPARED) || !isForcePaused_) {
1620 AUDIO_WARNING_LOG("sessionId: %{public}u, State: %{public}d or not force pause before",
1621 sessionID_, static_cast<int32_t>(currentState));
1622 return NO_EVENT;
1623 }
1624 isForcePaused_ = false;
1625 return FORCE_PAUSED_TO_RESUME_EVENT;
1626 case INTERRUPT_HINT_STOP:
1627 (void)audioStream_->StopAudioStream();
1628 (void)audioStream_->SetDuckVolume(1.0f);
1629 break;
1630 case INTERRUPT_HINT_DUCK:
1631 if (!HandleForceDucking(interruptEvent)) {
1632 AUDIO_WARNING_LOG("Failed to duck forcely, don't notify app");
1633 return NO_EVENT;
1634 }
1635 isForceDucked_ = true;
1636 break;
1637 case INTERRUPT_HINT_UNDUCK:
1638 CHECK_AND_RETURN_RET_LOG(isForceDucked_, NO_EVENT, "It is not forced ducked, don't unduck or notify app");
1639 (void)audioStream_->SetDuckVolume(1.0f);
1640 AUDIO_INFO_LOG("Unduck Volume successfully");
1641 isForceDucked_ = NO_EVENT;
1642 break;
1643 default: // If the hintType is NONE, don't need to send callbacks
1644 return NO_EVENT;
1645 }
1646 return FORCE_EVENT;
1647 }
1648
NotifyForcedEvent(const InterruptEventInternal & interruptEvent)1649 void AudioRendererInterruptCallbackImpl::NotifyForcedEvent(const InterruptEventInternal &interruptEvent)
1650 {
1651 InterruptEvent interruptEventForced {interruptEvent.eventType, interruptEvent.forceType, interruptEvent.hintType,
1652 interruptEvent.callbackToApp};
1653 if (interruptEventForced.hintType == INTERRUPT_HINT_RESUME) {
1654 // Reusme event should be INTERRUPT_SHARE type. Change the force type before sending the interrupt event.
1655 interruptEventForced.forceType = INTERRUPT_SHARE;
1656 }
1657 NotifyEvent(interruptEventForced);
1658 }
1659
OnInterrupt(const InterruptEventInternal & interruptEvent)1660 void AudioRendererInterruptCallbackImpl::OnInterrupt(const InterruptEventInternal &interruptEvent)
1661 {
1662 std::unique_lock<std::mutex> lock(mutex_);
1663
1664 if (interruptEvent.hintType == InterruptHint::INTERRUPT_HINT_EXIT_STANDALONE) {
1665 int32_t ret = AudioPolicyManager::GetInstance().ActivateAudioInterrupt(audioInterrupt_);
1666 CHECK_AND_RETURN_LOG(ret == 0, "resume ActivateAudioInterrupt Failed");
1667 return;
1668 }
1669 if (switching_) {
1670 AUDIO_INFO_LOG("Wait for SwitchStream");
1671 bool res = switchStreamCv_.wait_for(lock, std::chrono::milliseconds(BLOCK_INTERRUPT_CALLBACK_IN_MS),
1672 [this] {return !switching_;});
1673 if (!res) {
1674 switching_ = false;
1675 AUDIO_WARNING_LOG("Wait for SwitchStream time out, could handle interrupt event with old stream");
1676 }
1677 }
1678 cb_ = callback_.lock();
1679 InterruptForceType forceType = interruptEvent.forceType;
1680
1681 if (audioStream_ != nullptr) {
1682 audioStream_->GetAudioSessionID(sessionID_);
1683 }
1684 AUDIO_INFO_LOG("sessionId: %{public}u, forceType: %{public}d, hintType: %{public}d",
1685 sessionID_, forceType, interruptEvent.hintType);
1686
1687 if (forceType != INTERRUPT_FORCE) { // INTERRUPT_SHARE
1688 AUDIO_DEBUG_LOG("INTERRUPT_SHARE. Let app handle the event");
1689 InterruptEvent interruptEventShared {interruptEvent.eventType, interruptEvent.forceType,
1690 interruptEvent.hintType, interruptEvent.callbackToApp};
1691 NotifyEvent(interruptEventShared);
1692 return;
1693 }
1694
1695 CHECK_AND_RETURN_LOG(audioStream_ != nullptr,
1696 "Stream is not alive. No need to take forced action");
1697
1698 auto ret = HandleAndNotifyForcedEvent(interruptEvent);
1699 lock.unlock();
1700 if (ret == FORCE_EVENT) {
1701 // Notify valid forced event callbacks to app
1702 NotifyForcedEvent(interruptEvent);
1703 } else if (ret == FORCE_PAUSED_TO_RESUME_EVENT) {
1704 // sending callback is taken care in NotifyForcePausedToResume
1705 NotifyForcePausedToResume(interruptEvent);
1706 }
1707 }
1708
AudioStreamCallbackRenderer(std::weak_ptr<AudioRendererPrivate> renderer)1709 AudioStreamCallbackRenderer::AudioStreamCallbackRenderer(std::weak_ptr<AudioRendererPrivate> renderer)
1710 : renderer_(renderer)
1711 {
1712 }
1713
SaveCallback(const std::weak_ptr<AudioRendererCallback> & callback)1714 void AudioStreamCallbackRenderer::SaveCallback(const std::weak_ptr<AudioRendererCallback> &callback)
1715 {
1716 callback_ = callback;
1717 }
1718
OnStateChange(const State state,const StateChangeCmdType cmdType)1719 void AudioStreamCallbackRenderer::OnStateChange(const State state, const StateChangeCmdType cmdType)
1720 {
1721 std::shared_ptr<AudioRendererPrivate> rendererObj = renderer_.lock();
1722 CHECK_AND_RETURN_LOG(rendererObj != nullptr, "rendererObj is nullptr");
1723 std::shared_ptr<AudioRendererCallback> cb = callback_.lock();
1724 CHECK_AND_RETURN_LOG(cb != nullptr, "cb == nullptr.");
1725
1726 auto renderState = static_cast<RendererState>(state);
1727 cb->OnStateChange(renderState, cmdType);
1728
1729 AudioInterrupt audioInterrupt;
1730 rendererObj->GetAudioInterrupt(audioInterrupt);
1731 audioInterrupt.state = state;
1732 rendererObj->SetAudioInterrupt(audioInterrupt);
1733 }
1734
GetSupportedFormats()1735 std::vector<AudioSampleFormat> AudioRenderer::GetSupportedFormats()
1736 {
1737 return AUDIO_SUPPORTED_FORMATS;
1738 }
1739
GetSupportedSamplingRates()1740 std::vector<AudioSamplingRate> AudioRenderer::GetSupportedSamplingRates()
1741 {
1742 return AUDIO_SUPPORTED_SAMPLING_RATES;
1743 }
1744
GetSupportedChannels()1745 std::vector<AudioChannel> AudioRenderer::GetSupportedChannels()
1746 {
1747 return RENDERER_SUPPORTED_CHANNELS;
1748 }
1749
GetSupportedEncodingTypes()1750 std::vector<AudioEncodingType> AudioRenderer::GetSupportedEncodingTypes()
1751 {
1752 return AUDIO_SUPPORTED_ENCODING_TYPES;
1753 }
1754
SetRenderMode(AudioRenderMode renderMode)1755 int32_t AudioRendererPrivate::SetRenderMode(AudioRenderMode renderMode)
1756 {
1757 AUDIO_INFO_LOG("Render mode: %{public}d", renderMode);
1758 audioRenderMode_ = renderMode;
1759 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
1760 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, ERROR_ILLEGAL_STATE, "audioStream_ is nullptr");
1761 int32_t ret = currentStream->SetRenderMode(renderMode);
1762 callbackLoopTid_ = audioStream_->GetCallbackLoopTid();
1763 return ret;
1764 }
1765
GetRenderMode() const1766 AudioRenderMode AudioRendererPrivate::GetRenderMode() const
1767 {
1768 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
1769 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, RENDER_MODE_NORMAL, "audioStream_ is nullptr");
1770 return currentStream->GetRenderMode();
1771 }
1772
GetBufferDesc(BufferDesc & bufDesc)1773 int32_t AudioRendererPrivate::GetBufferDesc(BufferDesc &bufDesc)
1774 {
1775 AsyncCheckAudioRenderer("GetBufferDesc");
1776 std::shared_ptr<IAudioStream> currentStream = audioStream_;
1777 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, ERROR_ILLEGAL_STATE, "audioStream_ is nullptr");
1778 int32_t ret = currentStream->GetBufferDesc(bufDesc);
1779 return ret;
1780 }
1781
Enqueue(const BufferDesc & bufDesc)1782 int32_t AudioRendererPrivate::Enqueue(const BufferDesc &bufDesc)
1783 {
1784 Trace trace("AudioRenderer::Enqueue");
1785 AsyncCheckAudioRenderer("Enqueue");
1786 MockPcmData(bufDesc.buffer, bufDesc.bufLength);
1787 DumpFileUtil::WriteDumpFile(dumpFile_, static_cast<void *>(bufDesc.buffer), bufDesc.bufLength);
1788 std::shared_ptr<IAudioStream> currentStream = audioStream_;
1789 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, ERROR_ILLEGAL_STATE, "audioStream_ is nullptr");
1790 int32_t ret = currentStream->Enqueue(bufDesc);
1791 return ret;
1792 }
1793
Clear() const1794 int32_t AudioRendererPrivate::Clear() const
1795 {
1796 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
1797 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, ERROR_ILLEGAL_STATE, "audioStream_ is nullptr");
1798 return currentStream->Clear();
1799 }
1800
GetBufQueueState(BufferQueueState & bufState) const1801 int32_t AudioRendererPrivate::GetBufQueueState(BufferQueueState &bufState) const
1802 {
1803 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
1804 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, ERROR_ILLEGAL_STATE, "audioStream_ is nullptr");
1805 return currentStream->GetBufQueueState(bufState);
1806 }
1807
SetRendererWriteCallback(const std::shared_ptr<AudioRendererWriteCallback> & callback)1808 int32_t AudioRendererPrivate::SetRendererWriteCallback(const std::shared_ptr<AudioRendererWriteCallback> &callback)
1809 {
1810 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
1811 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, ERROR_ILLEGAL_STATE, "audioStream_ is nullptr");
1812 return currentStream->SetRendererWriteCallback(callback);
1813 }
1814
SetRendererFirstFrameWritingCallback(const std::shared_ptr<AudioRendererFirstFrameWritingCallback> & callback)1815 int32_t AudioRendererPrivate::SetRendererFirstFrameWritingCallback(
1816 const std::shared_ptr<AudioRendererFirstFrameWritingCallback> &callback)
1817 {
1818 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
1819 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, ERROR_ILLEGAL_STATE, "audioStream_ is nullptr");
1820 return currentStream->SetRendererFirstFrameWritingCallback(callback);
1821 }
1822
SetInterruptMode(InterruptMode mode)1823 void AudioRendererPrivate::SetInterruptMode(InterruptMode mode)
1824 {
1825 AUDIO_INFO_LOG("InterruptMode %{public}d", mode);
1826 if (audioInterrupt_.mode == mode) {
1827 return;
1828 } else if (mode != SHARE_MODE && mode != INDEPENDENT_MODE) {
1829 AUDIO_ERR_LOG("Invalid interrupt mode!");
1830 return;
1831 }
1832 audioInterrupt_.mode = mode;
1833 }
1834
SetSilentModeAndMixWithOthers(bool on)1835 void AudioRendererPrivate::SetSilentModeAndMixWithOthers(bool on)
1836 {
1837 Trace trace(std::string("AudioRenderer::SetSilentModeAndMixWithOthers:") + (on ? "on" : "off"));
1838 std::shared_lock<std::shared_mutex> sharedLockSwitch;
1839 if (callbackLoopTid_ != gettid()) { // No need to add lock in callback thread to prevent deadlocks
1840 sharedLockSwitch = std::shared_lock<std::shared_mutex>(rendererMutex_);
1841 }
1842 std::lock_guard<std::mutex> lock(silentModeAndMixWithOthersMutex_);
1843 if (audioStream_->GetSilentModeAndMixWithOthers() && !on) {
1844 audioInterrupt_.sessionStrategy.concurrencyMode = originalStrategy_.concurrencyMode;
1845 if (static_cast<RendererState>(audioStream_->GetState()) == RENDERER_RUNNING) {
1846 int32_t ret = AudioPolicyManager::GetInstance().ActivateAudioInterrupt(audioInterrupt_, 0, true);
1847 CHECK_AND_RETURN_LOG(ret == SUCCESS, "ActivateAudioInterrupt Failed");
1848 }
1849 audioStream_->SetSilentModeAndMixWithOthers(on);
1850 return;
1851 } else if (!audioStream_->GetSilentModeAndMixWithOthers() && on) {
1852 audioStream_->SetSilentModeAndMixWithOthers(on);
1853 audioInterrupt_.sessionStrategy.concurrencyMode = AudioConcurrencyMode::SILENT;
1854 if (static_cast<RendererState>(audioStream_->GetState()) == RENDERER_RUNNING) {
1855 int32_t ret = AudioPolicyManager::GetInstance().ActivateAudioInterrupt(audioInterrupt_, 0, true);
1856 CHECK_AND_RETURN_LOG(ret == SUCCESS, "ActivateAudioInterrupt Failed");
1857 }
1858 return;
1859 }
1860 audioStream_->SetSilentModeAndMixWithOthers(on);
1861 }
1862
GetSilentModeAndMixWithOthers()1863 bool AudioRendererPrivate::GetSilentModeAndMixWithOthers()
1864 {
1865 std::lock_guard<std::mutex> lock(silentModeAndMixWithOthersMutex_);
1866 return audioStream_->GetSilentModeAndMixWithOthers();
1867 }
1868
SetParallelPlayFlag(bool parallelPlayFlag)1869 int32_t AudioRendererPrivate::SetParallelPlayFlag(bool parallelPlayFlag)
1870 {
1871 AUDIO_PRERELEASE_LOGI("parallelPlayFlag %{public}d", parallelPlayFlag);
1872 if (parallelPlayFlag) {
1873 audioInterrupt_.sessionStrategy.concurrencyMode = AudioConcurrencyMode::MIX_WITH_OTHERS;
1874 } else {
1875 audioInterrupt_.sessionStrategy.concurrencyMode = originalStrategy_.concurrencyMode;
1876 }
1877 return SUCCESS;
1878 }
1879
SetLowPowerVolume(float volume) const1880 int32_t AudioRendererPrivate::SetLowPowerVolume(float volume) const
1881 {
1882 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
1883 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, ERROR_ILLEGAL_STATE, "audioStream_ is nullptr");
1884 return currentStream->SetLowPowerVolume(volume);
1885 }
1886
GetLowPowerVolume() const1887 float AudioRendererPrivate::GetLowPowerVolume() const
1888 {
1889 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
1890 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, ERROR_ILLEGAL_STATE, "audioStream_ is nullptr");
1891 return currentStream->GetLowPowerVolume();
1892 }
1893
1894 // in plan: need remove
SetOffloadAllowed(bool isAllowed)1895 int32_t AudioRendererPrivate::SetOffloadAllowed(bool isAllowed)
1896 {
1897 AUDIO_PRERELEASE_LOGI("offload allowed: %{public}d", isAllowed);
1898 rendererInfo_.isOffloadAllowed = isAllowed;
1899 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
1900 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, ERROR_ILLEGAL_STATE, "audioStream_ is nullptr");
1901 currentStream->SetRendererInfo(rendererInfo_);
1902 return SUCCESS;
1903 }
1904
SetOffloadMode(int32_t state,bool isAppBack) const1905 int32_t AudioRendererPrivate::SetOffloadMode(int32_t state, bool isAppBack) const
1906 {
1907 AUDIO_INFO_LOG("set offload mode for session %{public}u", sessionID_);
1908 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
1909 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, ERROR_ILLEGAL_STATE, "audioStream_ is nullptr");
1910 return currentStream->SetOffloadMode(state, isAppBack);
1911 }
1912
UnsetOffloadMode() const1913 int32_t AudioRendererPrivate::UnsetOffloadMode() const
1914 {
1915 AUDIO_INFO_LOG("session %{public}u session unset offload", sessionID_);
1916 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
1917 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, ERROR_ILLEGAL_STATE, "audioStream_ is nullptr");
1918 int32_t ret = currentStream->UnsetOffloadMode();
1919 CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ret, "unset offload failed");
1920 return SUCCESS;
1921 }
1922
GetSingleStreamVolume() const1923 float AudioRendererPrivate::GetSingleStreamVolume() const
1924 {
1925 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
1926 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, ERROR_ILLEGAL_STATE, "audioStream_ is nullptr");
1927 return currentStream->GetSingleStreamVolume();
1928 }
1929
GetMinStreamVolume() const1930 float AudioRendererPrivate::GetMinStreamVolume() const
1931 {
1932 return AudioPolicyManager::GetInstance().GetMinStreamVolume();
1933 }
1934
GetMaxStreamVolume() const1935 float AudioRendererPrivate::GetMaxStreamVolume() const
1936 {
1937 return AudioPolicyManager::GetInstance().GetMaxStreamVolume();
1938 }
1939
GetCurrentOutputDevices(AudioDeviceDescriptor & deviceInfo) const1940 int32_t AudioRendererPrivate::GetCurrentOutputDevices(AudioDeviceDescriptor &deviceInfo) const
1941 {
1942 std::vector<std::shared_ptr<AudioRendererChangeInfo>> audioRendererChangeInfos;
1943 uint32_t sessionId = static_cast<uint32_t>(-1);
1944 int32_t ret = GetAudioStreamId(sessionId);
1945 CHECK_AND_RETURN_RET_LOG(!ret, ret, " Get sessionId failed");
1946
1947 ret = AudioPolicyManager::GetInstance().GetCurrentRendererChangeInfos(audioRendererChangeInfos);
1948 CHECK_AND_RETURN_RET_LOG(!ret, ret, "Get Current Renderer devices failed");
1949
1950 for (auto it = audioRendererChangeInfos.begin(); it != audioRendererChangeInfos.end(); it++) {
1951 if ((*it)->sessionId == static_cast<int32_t>(sessionId)) {
1952 deviceInfo = (*it)->outputDeviceInfo;
1953 }
1954 }
1955 return SUCCESS;
1956 }
1957
GetUnderflowCount() const1958 uint32_t AudioRendererPrivate::GetUnderflowCount() const
1959 {
1960 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
1961 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, ERROR_ILLEGAL_STATE, "audioStream_ is nullptr");
1962 return currentStream->GetUnderflowCount();
1963 }
1964
1965
SetAudioRendererErrorCallback(std::shared_ptr<AudioRendererErrorCallback> errorCallback)1966 void AudioRendererPrivate::SetAudioRendererErrorCallback(std::shared_ptr<AudioRendererErrorCallback> errorCallback)
1967 {
1968 std::shared_lock<std::shared_mutex> sharedLock;
1969 if (callbackLoopTid_ != gettid()) { // No need to add lock in callback thread to prevent deadlocks
1970 sharedLock = std::shared_lock<std::shared_mutex>(rendererMutex_);
1971 }
1972 std::lock_guard lock(audioRendererErrCallbackMutex_);
1973 audioRendererErrorCallback_ = errorCallback;
1974 }
1975
RegisterAudioPolicyServerDiedCb(const int32_t clientPid,const std::shared_ptr<AudioRendererPolicyServiceDiedCallback> & callback)1976 int32_t AudioRendererPrivate::RegisterAudioPolicyServerDiedCb(const int32_t clientPid,
1977 const std::shared_ptr<AudioRendererPolicyServiceDiedCallback> &callback)
1978 {
1979 AUDIO_INFO_LOG("RegisterAudioPolicyServerDiedCb client id: %{public}d", clientPid);
1980 CHECK_AND_RETURN_RET_LOG(callback != nullptr, ERR_INVALID_PARAM, "callback is null");
1981
1982 std::lock_guard<std::mutex> lock(policyServiceDiedCallbackMutex_);
1983
1984 policyServiceDiedCallback_ = callback;
1985 return AudioPolicyManager::GetInstance().RegisterAudioPolicyServerDiedCb(clientPid, callback);
1986 }
1987
UnregisterAudioPolicyServerDiedCb(const int32_t clientPid)1988 int32_t AudioRendererPrivate::UnregisterAudioPolicyServerDiedCb(const int32_t clientPid)
1989 {
1990 AUDIO_INFO_LOG("UnregisterAudioPolicyServerDiedCb client id: %{public}d", clientPid);
1991 return AudioPolicyManager::GetInstance().UnregisterAudioPolicyServerDiedCb(clientPid);
1992 }
1993
RegisterOutputDeviceChangeWithInfoCallback(const std::shared_ptr<AudioRendererOutputDeviceChangeCallback> & callback)1994 int32_t AudioRendererPrivate::RegisterOutputDeviceChangeWithInfoCallback(
1995 const std::shared_ptr<AudioRendererOutputDeviceChangeCallback> &callback)
1996 {
1997 AUDIO_INFO_LOG("in");
1998 if (callback == nullptr) {
1999 AUDIO_ERR_LOG("callback is null");
2000 return ERR_INVALID_PARAM;
2001 }
2002
2003 outputDeviceChangeCallback_->SaveCallback(callback);
2004 AUDIO_DEBUG_LOG("successful!");
2005 return SUCCESS;
2006 }
2007
UnregisterOutputDeviceChangeWithInfoCallback()2008 int32_t AudioRendererPrivate::UnregisterOutputDeviceChangeWithInfoCallback()
2009 {
2010 AUDIO_INFO_LOG("Unregister all");
2011
2012 outputDeviceChangeCallback_->RemoveCallback();
2013 return SUCCESS;
2014 }
2015
UnregisterOutputDeviceChangeWithInfoCallback(const std::shared_ptr<AudioRendererOutputDeviceChangeCallback> & callback)2016 int32_t AudioRendererPrivate::UnregisterOutputDeviceChangeWithInfoCallback(
2017 const std::shared_ptr<AudioRendererOutputDeviceChangeCallback> &callback)
2018 {
2019 AUDIO_INFO_LOG("in");
2020
2021 outputDeviceChangeCallback_->RemoveCallback(callback);
2022 return SUCCESS;
2023 }
2024
SetFastStatusChangeCallback(const std::shared_ptr<AudioRendererFastStatusChangeCallback> & callback)2025 void AudioRendererPrivate::SetFastStatusChangeCallback(
2026 const std::shared_ptr<AudioRendererFastStatusChangeCallback> &callback)
2027 {
2028 std::lock_guard lock(fastStatusChangeCallbackMutex_);
2029 fastStatusChangeCallback_ = callback;
2030 }
2031
SetSwitchInfo(IAudioStream::SwitchInfo info,std::shared_ptr<IAudioStream> audioStream)2032 bool AudioRendererPrivate::SetSwitchInfo(IAudioStream::SwitchInfo info, std::shared_ptr<IAudioStream> audioStream)
2033 {
2034 CHECK_AND_RETURN_RET_LOG(audioStream, false, "stream is nullptr");
2035
2036 audioStream->SetStreamTrackerState(false);
2037 audioStream->SetClientID(info.clientPid, info.clientUid, appInfo_.appTokenId, appInfo_.appFullTokenId);
2038 audioStream->SetPrivacyType(info.privacyType);
2039 audioStream->SetRendererInfo(info.rendererInfo);
2040 audioStream->SetCapturerInfo(info.capturerInfo);
2041 int32_t res = audioStream->SetAudioStreamInfo(info.params, rendererProxyObj_);
2042 CHECK_AND_RETURN_RET_LOG(res == SUCCESS, false, "SetAudioStreamInfo failed");
2043 audioStream->SetDefaultOutputDevice(info.defaultOutputDevice, true);
2044 audioStream->SetRenderMode(info.renderMode);
2045 callbackLoopTid_ = audioStream->GetCallbackLoopTid();
2046 audioStream->SetAudioEffectMode(info.effectMode);
2047 audioStream->SetVolume(info.volume);
2048 res = audioStream->SetDuckVolume(info.duckVolume);
2049 CHECK_AND_RETURN_RET_LOG(res == SUCCESS, false, "SetDuckVolume failed");
2050 audioStream->SetUnderflowCount(info.underFlowCount);
2051
2052 if (info.userSettedPreferredFrameSize.has_value()) {
2053 audioStream->SetPreferredFrameSize(info.userSettedPreferredFrameSize.value());
2054 }
2055
2056 audioStream->SetSilentModeAndMixWithOthers(info.silentModeAndMixWithOthers);
2057
2058 if (speed_.has_value()) {
2059 audioStream->SetSpeed(speed_.value());
2060 }
2061
2062 if (pitch_.has_value()) {
2063 audioStream->SetPitch(pitch_.value());
2064 }
2065
2066 if (info.lastCallStartByUserTid.has_value()) {
2067 audioStream->SetCallStartByUserTid(info.lastCallStartByUserTid.value());
2068 }
2069
2070 // set callback
2071 if ((info.renderPositionCb != nullptr) && (info.frameMarkPosition > 0)) {
2072 audioStream->SetRendererPositionCallback(info.frameMarkPosition, info.renderPositionCb);
2073 }
2074
2075 if ((info.capturePositionCb != nullptr) && (info.frameMarkPosition > 0)) {
2076 audioStream->SetCapturerPositionCallback(info.frameMarkPosition, info.capturePositionCb);
2077 }
2078
2079 if ((info.renderPeriodPositionCb != nullptr) && (info.framePeriodNumber > 0)) {
2080 audioStream->SetRendererPeriodPositionCallback(info.framePeriodNumber, info.renderPeriodPositionCb);
2081 }
2082
2083 if ((info.capturePeriodPositionCb != nullptr) && (info.framePeriodNumber > 0)) {
2084 audioStream->SetCapturerPeriodPositionCallback(info.framePeriodNumber, info.capturePeriodPositionCb);
2085 }
2086
2087 audioStream->SetStreamCallback(info.audioStreamCallback);
2088 audioStream->SetRendererWriteCallback(info.rendererWriteCallback);
2089
2090 audioStream->SetRendererFirstFrameWritingCallback(info.rendererFirstFrameWritingCallback);
2091 audioStream->SetSwitchInfoTimestamp(info.lastFramePosAndTimePair, info.lastFramePosAndTimePairWithSpeed);
2092 return true;
2093 }
2094
2095 // The only function that updates AudioRendererPrivate::audioStream_ in its life cycle.
UpdateRendererAudioStream(const std::shared_ptr<IAudioStream> & newAudioStream)2096 void AudioRendererPrivate::UpdateRendererAudioStream(const std::shared_ptr<IAudioStream> &newAudioStream)
2097 {
2098 audioStream_ = newAudioStream;
2099 audioStream_->GetRendererInfo(rendererInfo_);
2100 if (audioInterruptCallback_ != nullptr) {
2101 std::shared_ptr<AudioRendererInterruptCallbackImpl> interruptCbImpl =
2102 std::static_pointer_cast<AudioRendererInterruptCallbackImpl>(audioInterruptCallback_);
2103 interruptCbImpl->UpdateAudioStream(audioStream_);
2104 }
2105 }
2106
2107 // Inner function. Must be called with AudioRendererPrivate::rendererMutex_ held;
UnsetOffloadModeInner() const2108 int32_t AudioRendererPrivate::UnsetOffloadModeInner() const
2109 {
2110 AUDIO_INFO_LOG("session %{public}u session unset offload", sessionID_);
2111 int32_t ret = audioStream_->UnsetOffloadMode();
2112 CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ret, "unset offload failed");
2113 return SUCCESS;
2114 }
2115
2116 // Inner function. Must be called with AudioRendererPrivate::rendererMutex_
2117 // or AudioRendererPrivate::streamMutex_ held.
GetStatusInner()2118 RendererState AudioRendererPrivate::GetStatusInner()
2119 {
2120 if (IsNoStreamRenderer()) {
2121 return state_;
2122 }
2123 return static_cast<RendererState>(audioStream_->GetState());
2124 }
2125
2126 // Inner function. Must be called with AudioRendererPrivate::rendererMutex_
2127 // or AudioRendererPrivate::streamMutex_ held.
SetAudioPrivacyTypeInner(AudioPrivacyType privacyType)2128 void AudioRendererPrivate::SetAudioPrivacyTypeInner(AudioPrivacyType privacyType)
2129 {
2130 CHECK_AND_RETURN_LOG(audioStream_ != nullptr, "audioStream_ is nullptr");
2131 privacyType_ = privacyType;
2132 audioStream_->SetPrivacyType(privacyType);
2133 }
2134
2135 // Inner function. Must be called with AudioRendererPrivate::rendererMutex_
2136 // or AudioRendererPrivate::streamMutex_ held.
GetAudioStreamIdInner(uint32_t & sessionID) const2137 int32_t AudioRendererPrivate::GetAudioStreamIdInner(uint32_t &sessionID) const
2138 {
2139 return audioStream_->GetAudioSessionID(sessionID);
2140 }
2141
2142 // Inner function. Must be called with AudioRendererPrivate::rendererMutex_
2143 // or AudioRendererPrivate::streamMutex_ held.
GetVolumeInner() const2144 float AudioRendererPrivate::GetVolumeInner() const
2145 {
2146 return audioStream_->GetVolume();
2147 }
2148
2149 // Inner function. Must be called with AudioRendererPrivate::rendererMutex_
2150 // or AudioRendererPrivate::streamMutex_ held.
GetUnderflowCountInner() const2151 uint32_t AudioRendererPrivate::GetUnderflowCountInner() const
2152 {
2153 return audioStream_->GetUnderflowCount();
2154 }
2155
2156 // Only called in SwitchToTargetStream, with AudioRendererPrivate::rendererMutex_ held.
InitSwitchInfo(IAudioStream::StreamClass targetClass,IAudioStream::SwitchInfo & info)2157 void AudioRendererPrivate::InitSwitchInfo(IAudioStream::StreamClass targetClass, IAudioStream::SwitchInfo &info)
2158 {
2159 audioStream_->GetSwitchInfo(info);
2160 if (targetClass == IAudioStream::VOIP_STREAM) {
2161 info.rendererInfo.originalFlag = AUDIO_FLAG_VOIP_FAST;
2162 }
2163
2164 if (rendererInfo_.rendererFlags == AUDIO_FLAG_VOIP_DIRECT) {
2165 info.rendererInfo.originalFlag = AUDIO_FLAG_VOIP_DIRECT;
2166 info.rendererInfo.rendererFlags = AUDIO_FLAG_VOIP_DIRECT;
2167 info.rendererFlags = AUDIO_FLAG_VOIP_DIRECT;
2168 } else if (rendererInfo_.rendererFlags == AUDIO_FLAG_DIRECT) {
2169 info.rendererInfo.pipeType = PIPE_TYPE_DIRECT_MUSIC;
2170 info.rendererFlags = AUDIO_FLAG_DIRECT;
2171 } else if (rendererInfo_.rendererFlags == AUDIO_FLAG_NORMAL) {
2172 info.rendererInfo.rendererFlags = AUDIO_FLAG_NORMAL;
2173 } else if (rendererInfo_.rendererFlags == AUDIO_FLAG_MMAP) {
2174 info.rendererInfo.rendererFlags = AUDIO_FLAG_MMAP;
2175 }
2176 info.params.originalSessionId = sessionID_;
2177 return;
2178 }
2179
2180 // Only called in SwitchToTargetStream, with AudioRendererPrivate::rendererMutex_ held.
UpdateFramesWritten()2181 void AudioRendererPrivate::UpdateFramesWritten()
2182 {
2183 int64_t framesWritten = audioStream_->GetFramesWritten();
2184 if (framesWritten > 0) {
2185 framesAlreadyWritten_ += framesWritten;
2186 AUDIO_INFO_LOG("Frames already written: %{public}" PRId64 ", current stream value: %{public}" PRId64 ".",
2187 framesAlreadyWritten_, framesWritten);
2188 }
2189 }
2190
2191 // Set new stream info before switching to new stream.
InitTargetStream(IAudioStream::SwitchInfo & info,std::shared_ptr<IAudioStream> & newAudioStream)2192 bool AudioRendererPrivate::InitTargetStream(IAudioStream::SwitchInfo &info,
2193 std::shared_ptr<IAudioStream> &newAudioStream)
2194 {
2195 bool initResult = SetSwitchInfo(info, newAudioStream);
2196 if (initResult != SUCCESS && info.rendererInfo.originalFlag != AUDIO_FLAG_NORMAL) {
2197 AUDIO_ERR_LOG("Re-create stream failed, crate normal ipc stream");
2198 isFastRenderer_ = false;
2199 newAudioStream = IAudioStream::GetPlaybackStream(IAudioStream::PA_STREAM, info.params,
2200 info.eStreamType, appInfo_.appUid);
2201 CHECK_AND_RETURN_RET_LOG(newAudioStream != nullptr, false, "Get ipc stream failed");
2202 initResult = SetSwitchInfo(info, newAudioStream);
2203 CHECK_AND_RETURN_RET_LOG(initResult, false, "Init ipc strean failed");
2204 }
2205 return initResult;
2206 }
2207
FinishOldStream(IAudioStream::StreamClass targetClass,RestoreInfo restoreInfo,RendererState previousState,IAudioStream::SwitchInfo & switchInfo)2208 bool AudioRendererPrivate::FinishOldStream(IAudioStream::StreamClass targetClass, RestoreInfo restoreInfo,
2209 RendererState previousState, IAudioStream::SwitchInfo &switchInfo)
2210 {
2211 audioStream_->SetMute(true, CMD_FROM_SYSTEM); // Do not record this status in recover(InitSwitchInfo)
2212 bool switchResult = false;
2213 if (previousState == RENDERER_RUNNING) {
2214 switchResult = audioStream_->StopAudioStream();
2215 if (restoreInfo.restoreReason != SERVER_DIED) {
2216 CHECK_AND_RETURN_RET_LOG(switchResult, false, "StopAudioStream failed.");
2217 } else {
2218 switchResult = true;
2219 }
2220 }
2221 InitSwitchInfo(targetClass, switchInfo);
2222 if (restoreInfo.restoreReason == SERVER_DIED) {
2223 AUDIO_INFO_LOG("Server died, reset session id: %{public}d", switchInfo.params.originalSessionId);
2224 switchInfo.params.originalSessionId = 0;
2225 switchInfo.sessionId = 0;
2226 }
2227 UpdateFramesWritten();
2228 switchResult = audioStream_->ReleaseAudioStream(true, true);
2229 if (restoreInfo.restoreReason != SERVER_DIED) {
2230 CHECK_AND_RETURN_RET_LOG(switchResult, false, "release old stream failed.");
2231 } else {
2232 switchResult = true;
2233 }
2234 return switchResult;
2235 }
2236
GenerateNewStream(IAudioStream::StreamClass targetClass,RestoreInfo restoreInfo,RendererState previousState,IAudioStream::SwitchInfo & switchInfo)2237 bool AudioRendererPrivate::GenerateNewStream(IAudioStream::StreamClass targetClass, RestoreInfo restoreInfo,
2238 RendererState previousState, IAudioStream::SwitchInfo &switchInfo)
2239 {
2240 std::shared_ptr<AudioStreamDescriptor> streamDesc = GetStreamDescBySwitchInfo(switchInfo, restoreInfo);
2241 uint32_t flag = AUDIO_OUTPUT_FLAG_NORMAL;
2242 std::string networkId = LOCAL_NETWORK_ID;
2243 int32_t ret = AudioPolicyManager::GetInstance().CreateRendererClient(
2244 streamDesc, flag, switchInfo.params.originalSessionId, networkId);
2245 CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, false, "CreateRendererClient failed");
2246
2247 bool switchResult = false;
2248 std::shared_ptr<IAudioStream> oldAudioStream = nullptr;
2249 // create new IAudioStream
2250 std::shared_ptr<IAudioStream> newAudioStream = IAudioStream::GetPlaybackStream(targetClass, switchInfo.params,
2251 switchInfo.eStreamType, appInfo_.appUid);
2252 CHECK_AND_RETURN_RET_LOG(newAudioStream != nullptr, false, "SetParams GetPlayBackStream failed.");
2253 AUDIO_INFO_LOG("Get new stream success!");
2254
2255 // set new stream info. When switch to fast stream failed, call SetSwitchInfo again
2256 // and switch to normal ipc stream to avoid silence.
2257 switchResult = SetSwitchInfo(switchInfo, newAudioStream);
2258 if (!switchResult && switchInfo.rendererInfo.originalFlag != AUDIO_FLAG_NORMAL) {
2259 AUDIO_ERR_LOG("Re-create stream failed, create normal ipc stream");
2260 if (restoreInfo.restoreReason == SERVER_DIED) {
2261 switchInfo.sessionId = switchInfo.params.originalSessionId;
2262 streamDesc->sessionId_ = switchInfo.params.originalSessionId;
2263 }
2264 streamDesc->rendererInfo_.rendererFlags = AUDIO_FLAG_FORCED_NORMAL;
2265 streamDesc->routeFlag_ = AUDIO_FLAG_NONE;
2266 int32_t ret = AudioPolicyManager::GetInstance().CreateRendererClient(streamDesc, flag,
2267 switchInfo.params.originalSessionId, networkId);
2268 CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, false, "CreateRendererClient failed");
2269
2270 newAudioStream = IAudioStream::GetPlaybackStream(IAudioStream::PA_STREAM, switchInfo.params,
2271 switchInfo.eStreamType, appInfo_.appUid);
2272 targetClass = IAudioStream::PA_STREAM;
2273 CHECK_AND_RETURN_RET_LOG(newAudioStream != nullptr, false, "Get ipc stream failed");
2274 switchResult = SetSwitchInfo(switchInfo, newAudioStream);
2275 CHECK_AND_RETURN_RET_LOG(switchResult, false, "Init ipc stream failed");
2276 }
2277 oldAudioStream = audioStream_;
2278 // Update audioStream_ to newAudioStream in both AudioRendererPrivate and AudioInterruptCallbackImpl.
2279 // Operation of replace audioStream_ must be performed before StartAudioStream.
2280 // Otherwise GetBufferDesc will return the buffer pointer of oldStream (causing Use-After-Free).
2281 UpdateRendererAudioStream(newAudioStream);
2282 newAudioStream->NotifyRouteUpdate(flag, networkId);
2283
2284 // Start new stream if old stream was in running state.
2285 // When restoring for audio server died, no need for restart.
2286 if (restoreInfo.restoreReason == SERVER_DIED && IsNoStreamRenderer()) {
2287 AUDIO_INFO_LOG("Telephony scene , no need for start");
2288 } else if (previousState == RENDERER_RUNNING) {
2289 // restart audio stream
2290 switchResult = newAudioStream->StartAudioStream(CMD_FROM_CLIENT,
2291 static_cast<AudioStreamDeviceChangeReasonExt::ExtEnum>(restoreInfo.deviceChangeReason));
2292 CHECK_AND_RETURN_RET_LOG(switchResult, false, "start new stream failed.");
2293 }
2294
2295 isFastRenderer_ = IAudioStream::IsFastStreamClass(targetClass);
2296 return switchResult;
2297 }
2298
ContinueAfterConcede(IAudioStream::StreamClass & targetClass,RestoreInfo restoreInfo)2299 bool AudioRendererPrivate::ContinueAfterConcede(IAudioStream::StreamClass &targetClass, RestoreInfo restoreInfo)
2300 {
2301 CHECK_AND_RETURN_RET(restoreInfo.restoreReason == STREAM_CONCEDED, true);
2302 targetClass = IAudioStream::PA_STREAM;
2303 uint32_t sessionId = sessionID_;
2304 GetAudioStreamIdInner(sessionId);
2305 AudioPipeType pipeType = PIPE_TYPE_NORMAL_OUT;
2306 audioStream_->GetAudioPipeType(pipeType);
2307 AUDIO_INFO_LOG("session %{public}u concede from pipeType %{public}d", sessionID_, rendererInfo_.pipeType);
2308 rendererInfo_.pipeType = PIPE_TYPE_NORMAL_OUT;
2309 rendererInfo_.isOffloadAllowed = false;
2310 audioStream_->SetRendererInfo(rendererInfo_);
2311 if (pipeType == PIPE_TYPE_OFFLOAD) {
2312 UnsetOffloadModeInner();
2313 AudioPolicyManager::GetInstance().MoveToNewPipe(sessionId, PIPE_TYPE_NORMAL_OUT);
2314 audioStream_->SetRestoreStatus(NO_NEED_FOR_RESTORE);
2315 return false;
2316 }
2317 if ((pipeType == PIPE_TYPE_LOWLATENCY_OUT && audioStream_->GetStreamClass() != IAudioStream::PA_STREAM) ||
2318 pipeType == PIPE_TYPE_DIRECT_MUSIC) {
2319 return true;
2320 }
2321 audioStream_->SetRestoreStatus(NO_NEED_FOR_RESTORE);
2322 return false;
2323 }
2324
ContinueAfterSplit(RestoreInfo restoreInfo)2325 bool AudioRendererPrivate::ContinueAfterSplit(RestoreInfo restoreInfo)
2326 {
2327 CHECK_AND_RETURN_RET(restoreInfo.restoreReason == STREAM_SPLIT, true);
2328 audioStream_->FetchDeviceForSplitStream();
2329 return false;
2330 }
2331
SwitchToTargetStream(IAudioStream::StreamClass targetClass,RestoreInfo restoreInfo)2332 bool AudioRendererPrivate::SwitchToTargetStream(IAudioStream::StreamClass targetClass, RestoreInfo restoreInfo)
2333 {
2334 bool switchResult = false;
2335 Trace trace("KeyAction AudioRenderer::SwitchToTargetStream " + std::to_string(sessionID_)
2336 + ", target class " + std::to_string(targetClass) + ", reason " + std::to_string(restoreInfo.restoreReason)
2337 + ", device change reason " + std::to_string(restoreInfo.deviceChangeReason)
2338 + ", target flag " + std::to_string(restoreInfo.targetStreamFlag));
2339 AUDIO_INFO_LOG("Restore AudioRenderer %{public}u, target class %{public}d, reason: %{public}d, "
2340 "device change reason %{public}d, target flag %{public}d", sessionID_, targetClass,
2341 restoreInfo.restoreReason, restoreInfo.deviceChangeReason, restoreInfo.targetStreamFlag);
2342
2343 isSwitching_ = true;
2344 audioStream_->SetSwitchingStatus(true);
2345 AudioScopeExit scopeExit([this] () {
2346 audioStream_->SetSwitchingStatus(false);
2347 });
2348 RendererState previousState = GetStatusInner();
2349 IAudioStream::SwitchInfo switchInfo;
2350
2351 // Stop old stream, get stream info and frames written for new stream, and release old stream.
2352 switchResult = FinishOldStream(targetClass, restoreInfo, previousState, switchInfo);
2353 CHECK_AND_RETURN_RET_LOG(switchResult, false, "Finish old stream failed");
2354
2355 // Create and start new stream.
2356 switchResult = GenerateNewStream(targetClass, restoreInfo, previousState, switchInfo);
2357 CHECK_AND_RETURN_RET_LOG(switchResult, false, "Generate new stream failed");
2358
2359 // Activate audio interrupt again when restoring for audio server died.
2360 if (restoreInfo.restoreReason == SERVER_DIED) {
2361 HandleAudioInterruptWhenServerDied();
2362 }
2363 InitAudioRouteCallback();
2364 isSwitching_ = false;
2365 switchResult = true;
2366 scopeExit.Relase();
2367 WriteSwitchStreamLogMsg();
2368 return switchResult;
2369 }
2370
GetStreamDescBySwitchInfo(const IAudioStream::SwitchInfo & switchInfo,const RestoreInfo & restoreInfo)2371 std::shared_ptr<AudioStreamDescriptor> AudioRendererPrivate::GetStreamDescBySwitchInfo(
2372 const IAudioStream::SwitchInfo &switchInfo, const RestoreInfo &restoreInfo)
2373 {
2374 std::shared_ptr<AudioStreamDescriptor> streamDesc = std::make_shared<AudioStreamDescriptor>();
2375 streamDesc->streamInfo_.format = static_cast<AudioSampleFormat>(switchInfo.params.format);
2376 streamDesc->streamInfo_.samplingRate = static_cast<AudioSamplingRate>(switchInfo.params.samplingRate);
2377 streamDesc->streamInfo_.channels = static_cast<AudioChannel>(switchInfo.params.channels);
2378 streamDesc->streamInfo_.encoding = static_cast<AudioEncodingType>(switchInfo.params.encoding);
2379 streamDesc->streamInfo_.channelLayout = static_cast<AudioChannelLayout>(switchInfo.params.channelLayout);
2380
2381 streamDesc->audioMode_ = AUDIO_MODE_PLAYBACK;
2382 streamDesc->createTimeStamp_ = ClockTime::GetCurNano();
2383 streamDesc->rendererInfo_ = switchInfo.rendererInfo;
2384 streamDesc->appInfo_ = AppInfo{switchInfo.appUid, 0, switchInfo.clientPid, 0};
2385 streamDesc->callerUid_ = static_cast<int32_t>(getuid());
2386 streamDesc->callerPid_ = static_cast<int32_t>(getpid());
2387 streamDesc->sessionId_ = switchInfo.sessionId;
2388 streamDesc->routeFlag_ = restoreInfo.routeFlag;
2389 if (restoreInfo.targetStreamFlag == AUDIO_FLAG_FORCED_NORMAL) {
2390 streamDesc->rendererInfo_.originalFlag = AUDIO_FLAG_FORCED_NORMAL;
2391 }
2392 return streamDesc;
2393 }
2394
HandleAudioInterruptWhenServerDied()2395 void AudioRendererPrivate::HandleAudioInterruptWhenServerDied()
2396 {
2397 InitAudioInterruptCallback(true); // Register audio interrupt callback again.
2398 if (GetStatusInner() == RENDERER_RUNNING) {
2399 int32_t ret = AudioPolicyManager::GetInstance().ActivateAudioInterrupt(audioInterrupt_);
2400 if (ret != SUCCESS) {
2401 AUDIO_ERR_LOG("active audio interrupt failed");
2402 }
2403 }
2404 }
2405
WriteSwitchStreamLogMsg()2406 void AudioRendererPrivate::WriteSwitchStreamLogMsg()
2407 {
2408 std::shared_ptr<Media::MediaMonitor::EventBean> bean = std::make_shared<Media::MediaMonitor::EventBean>(
2409 Media::MediaMonitor::ModuleId::AUDIO, Media::MediaMonitor::EventId::AUDIO_PIPE_CHANGE,
2410 Media::MediaMonitor::EventType::BEHAVIOR_EVENT);
2411 bean->Add("CLIENT_UID", appInfo_.appUid);
2412 bean->Add("IS_PLAYBACK", 1);
2413 bean->Add("STREAM_TYPE", rendererInfo_.streamUsage);
2414 bean->Add("PIPE_TYPE_BEFORE_CHANGE", PIPE_TYPE_LOWLATENCY_OUT);
2415 bean->Add("PIPE_TYPE_AFTER_CHANGE", PIPE_TYPE_NORMAL_OUT);
2416 bean->Add("REASON", Media::MediaMonitor::DEVICE_CHANGE_FROM_FAST);
2417 Media::MediaMonitor::MediaMonitorManager::GetInstance().WriteLogMsg(bean);
2418 }
2419
OnDeviceChangeWithInfo(const uint32_t sessionId,const AudioDeviceDescriptor & deviceInfo,const AudioStreamDeviceChangeReasonExt reason)2420 void OutputDeviceChangeWithInfoCallbackImpl::OnDeviceChangeWithInfo(
2421 const uint32_t sessionId, const AudioDeviceDescriptor &deviceInfo, const AudioStreamDeviceChangeReasonExt reason)
2422 {
2423 AUDIO_INFO_LOG("OnRendererStateChange");
2424 std::vector<std::shared_ptr<AudioRendererOutputDeviceChangeCallback>> callbacks;
2425
2426 {
2427 std::lock_guard<std::mutex> lock(callbackMutex_);
2428 callbacks = callbacks_;
2429 }
2430
2431 for (auto &cb : callbacks) {
2432 if (cb != nullptr) {
2433 cb->OnOutputDeviceChange(deviceInfo, reason);
2434 }
2435 }
2436
2437 AUDIO_INFO_LOG("sessionId: %{public}u, deviceType: %{public}d reason: %{public}d size: %{public}zu",
2438 sessionId, static_cast<int>(deviceInfo.deviceType_), static_cast<int>(reason), callbacks.size());
2439 }
2440
2441 // NOTIFY: Possible audioRendererPrivate destruction here.
OnRecreateStreamEvent(const uint32_t sessionId,const int32_t streamFlag,const AudioStreamDeviceChangeReasonExt reason)2442 void OutputDeviceChangeWithInfoCallbackImpl::OnRecreateStreamEvent(const uint32_t sessionId, const int32_t streamFlag,
2443 const AudioStreamDeviceChangeReasonExt reason)
2444 {
2445 std::unique_lock<std::mutex> lock(audioRendererObjMutex_);
2446 AUDIO_INFO_LOG("Enter, session id: %{public}d, stream flag: %{public}d", sessionId, streamFlag);
2447 auto sharedptrRenderer = renderer_.lock();
2448 CHECK_AND_RETURN_LOG(sharedptrRenderer != nullptr, "renderer_ is nullptr");
2449 lock.unlock();
2450 }
2451
GetAudioEffectMode() const2452 AudioEffectMode AudioRendererPrivate::GetAudioEffectMode() const
2453 {
2454 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
2455 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, EFFECT_NONE, "audioStream_ is nullptr");
2456 return currentStream->GetAudioEffectMode();
2457 }
2458
GetFramesWritten() const2459 int64_t AudioRendererPrivate::GetFramesWritten() const
2460 {
2461 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
2462 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, ERROR_ILLEGAL_STATE, "audioStream_ is nullptr");
2463 return framesAlreadyWritten_ + currentStream->GetFramesWritten();
2464 }
2465
SetAudioEffectMode(AudioEffectMode effectMode) const2466 int32_t AudioRendererPrivate::SetAudioEffectMode(AudioEffectMode effectMode) const
2467 {
2468 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
2469 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, ERROR_ILLEGAL_STATE, "audioStream_ is nullptr");
2470 return currentStream->SetAudioEffectMode(effectMode);
2471 }
2472
SetVolumeWithRamp(float volume,int32_t duration)2473 int32_t AudioRendererPrivate::SetVolumeWithRamp(float volume, int32_t duration)
2474 {
2475 AUDIO_INFO_LOG("volume:%{public}f duration:%{public}d", volume, duration);
2476 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
2477 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, ERROR_ILLEGAL_STATE, "audioStream_ is nullptr");
2478 return currentStream->SetVolumeWithRamp(volume, duration);
2479 }
2480
SetPreferredFrameSize(int32_t frameSize)2481 void AudioRendererPrivate::SetPreferredFrameSize(int32_t frameSize)
2482 {
2483 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
2484 CHECK_AND_RETURN_LOG(currentStream != nullptr, "audioStream_ is nullptr");
2485 currentStream->SetPreferredFrameSize(frameSize);
2486 }
2487
GetAudioInterrupt(AudioInterrupt & audioInterrupt)2488 void AudioRendererPrivate::GetAudioInterrupt(AudioInterrupt &audioInterrupt)
2489 {
2490 audioInterrupt = audioInterrupt_;
2491 }
2492
SetAudioInterrupt(const AudioInterrupt & audioInterrupt)2493 void AudioRendererPrivate::SetAudioInterrupt(const AudioInterrupt &audioInterrupt)
2494 {
2495 audioInterrupt_ = audioInterrupt;
2496 }
2497
2498 // Only called AudioRendererPrivate::Stop(), with AudioRendererPrivate::rendererMutex_ held.
WriteUnderrunEvent() const2499 void AudioRendererPrivate::WriteUnderrunEvent() const
2500 {
2501 AUDIO_INFO_LOG("AudioRendererPrivate WriteUnderrunEvent!");
2502 if (GetUnderflowCountInner() < WRITE_UNDERRUN_NUM) {
2503 return;
2504 }
2505 AudioPipeType pipeType = PIPE_TYPE_NORMAL_OUT;
2506 IAudioStream::StreamClass streamClass = audioStream_->GetStreamClass();
2507 if (streamClass == IAudioStream::FAST_STREAM) {
2508 pipeType = PIPE_TYPE_LOWLATENCY_OUT;
2509 } else if (streamClass == IAudioStream::PA_STREAM) {
2510 if (audioStream_->GetOffloadEnable()) {
2511 pipeType = PIPE_TYPE_OFFLOAD;
2512 } else if (audioStream_->GetSpatializationEnabled()) {
2513 pipeType = PIPE_TYPE_SPATIALIZATION;
2514 } else if (audioStream_->GetHighResolutionEnabled()) {
2515 pipeType = PIPE_TYPE_HIGHRESOLUTION;
2516 }
2517 }
2518 std::shared_ptr<Media::MediaMonitor::EventBean> bean = std::make_shared<Media::MediaMonitor::EventBean>(
2519 Media::MediaMonitor::ModuleId::AUDIO, Media::MediaMonitor::EventId::PERFORMANCE_UNDER_OVERRUN_STATS,
2520 Media::MediaMonitor::EventType::FREQUENCY_AGGREGATION_EVENT);
2521 bean->Add("IS_PLAYBACK", 1);
2522 bean->Add("CLIENT_UID", appInfo_.appUid);
2523 bean->Add("PIPE_TYPE", pipeType);
2524 bean->Add("STREAM_TYPE", rendererInfo_.streamUsage);
2525 Media::MediaMonitor::MediaMonitorManager::GetInstance().WriteLogMsg(bean);
2526 }
2527
RegisterRendererPolicyServiceDiedCallback()2528 int32_t AudioRendererPrivate::RegisterRendererPolicyServiceDiedCallback()
2529 {
2530 std::lock_guard<std::mutex> lock(rendererPolicyServiceDiedCbMutex_);
2531 AUDIO_DEBUG_LOG("RegisterRendererPolicyServiceDiedCallback");
2532 if (!audioPolicyServiceDiedCallback_) {
2533 audioPolicyServiceDiedCallback_ = std::make_shared<RendererPolicyServiceDiedCallback>();
2534 if (!audioPolicyServiceDiedCallback_) {
2535 AUDIO_ERR_LOG("Memory allocation failed!!");
2536 return ERROR;
2537 }
2538 AudioPolicyManager::GetInstance().RegisterAudioStreamPolicyServerDiedCb(audioPolicyServiceDiedCallback_);
2539 audioPolicyServiceDiedCallback_->SetAudioRendererObj(weak_from_this());
2540 audioPolicyServiceDiedCallback_->SetAudioInterrupt(audioInterrupt_);
2541 }
2542 return SUCCESS;
2543 }
2544
RemoveRendererPolicyServiceDiedCallback()2545 int32_t AudioRendererPrivate::RemoveRendererPolicyServiceDiedCallback()
2546 {
2547 std::lock_guard<std::mutex> lock(rendererPolicyServiceDiedCbMutex_);
2548 AUDIO_DEBUG_LOG("RemoveRendererPolicyServiceDiedCallback");
2549 if (audioPolicyServiceDiedCallback_) {
2550 int32_t ret = AudioPolicyManager::GetInstance().UnregisterAudioStreamPolicyServerDiedCb(
2551 audioPolicyServiceDiedCallback_);
2552 if (ret != 0) {
2553 AUDIO_ERR_LOG("RemoveRendererPolicyServiceDiedCallback failed");
2554 audioPolicyServiceDiedCallback_ = nullptr;
2555 return ERROR;
2556 }
2557 }
2558 audioPolicyServiceDiedCallback_ = nullptr;
2559 return SUCCESS;
2560 }
2561
RendererPolicyServiceDiedCallback()2562 RendererPolicyServiceDiedCallback::RendererPolicyServiceDiedCallback()
2563 {
2564 AUDIO_DEBUG_LOG("RendererPolicyServiceDiedCallback create");
2565 }
2566
~RendererPolicyServiceDiedCallback()2567 RendererPolicyServiceDiedCallback::~RendererPolicyServiceDiedCallback()
2568 {
2569 AUDIO_DEBUG_LOG("RendererPolicyServiceDiedCallback destroy");
2570 }
2571
SetAudioRendererObj(std::weak_ptr<AudioRendererPrivate> rendererObj)2572 void RendererPolicyServiceDiedCallback::SetAudioRendererObj(std::weak_ptr<AudioRendererPrivate> rendererObj)
2573 {
2574 renderer_ = rendererObj;
2575 }
2576
SetAudioInterrupt(AudioInterrupt & audioInterrupt)2577 void RendererPolicyServiceDiedCallback::SetAudioInterrupt(AudioInterrupt &audioInterrupt)
2578 {
2579 audioInterrupt_ = audioInterrupt;
2580 }
2581
OnAudioPolicyServiceDied()2582 void RendererPolicyServiceDiedCallback::OnAudioPolicyServiceDied()
2583 {
2584 AUDIO_INFO_LOG("RendererPolicyServiceDiedCallback::OnAudioPolicyServiceDied");
2585
2586 if (taskCount_.fetch_add(1) > 0) {
2587 AUDIO_INFO_LOG("direct ret");
2588 return;
2589 }
2590
2591 std::weak_ptr<RendererPolicyServiceDiedCallback> weakRefCb = weak_from_this();
2592
2593 std::thread restoreThread ([weakRefCb] {
2594 std::shared_ptr<RendererPolicyServiceDiedCallback> strongRefCb = weakRefCb.lock();
2595 CHECK_AND_RETURN_LOG(strongRefCb != nullptr, "strongRef is nullptr");
2596 int32_t count;
2597 do {
2598 count = strongRefCb->taskCount_.load();
2599 strongRefCb->RestoreTheadLoop();
2600 } while (strongRefCb->taskCount_.fetch_sub(count) > count);
2601 });
2602 pthread_setname_np(restoreThread.native_handle(), "OS_ARPSRestore");
2603 restoreThread.detach();
2604 }
2605
RestoreTheadLoop()2606 void RendererPolicyServiceDiedCallback::RestoreTheadLoop()
2607 {
2608 int32_t tryCounter = 10;
2609 uint32_t sleepTime = 300000;
2610 bool restoreResult = false;
2611 while (!restoreResult && tryCounter > 0) {
2612 tryCounter--;
2613 usleep(sleepTime);
2614 std::shared_ptr<AudioRendererPrivate> sharedRenderer = renderer_.lock();
2615 CHECK_AND_RETURN_LOG(sharedRenderer != nullptr, "sharedRenderer is nullptr");
2616 if (sharedRenderer->audioStream_ == nullptr || sharedRenderer->abortRestore_) {
2617 AUDIO_INFO_LOG("abort restore");
2618 break;
2619 }
2620 sharedRenderer->RestoreAudioInLoop(restoreResult, tryCounter);
2621 }
2622 }
2623
RestoreAudioInLoop(bool & restoreResult,int32_t & tryCounter)2624 void AudioRendererPrivate::RestoreAudioInLoop(bool &restoreResult, int32_t &tryCounter)
2625 {
2626 std::unique_lock<std::shared_mutex> lock;
2627 if (callbackLoopTid_ != gettid()) { // No need to add lock in callback thread to prevent deadlocks
2628 lock = std::unique_lock<std::shared_mutex>(rendererMutex_);
2629 }
2630 CHECK_AND_RETURN_LOG(audioStream_, "audioStream_ is nullptr, no need for restore");
2631 AUDIO_INFO_LOG("Restore audio renderer when server died, session %{public}u", sessionID_);
2632 RestoreInfo restoreInfo;
2633 restoreInfo.restoreReason = SERVER_DIED;
2634 // When server died, restore client stream by SwitchToTargetStream. Target stream class is
2635 // the stream class of the old stream.
2636 restoreResult = SwitchToTargetStream(audioStream_->GetStreamClass(), restoreInfo);
2637 AUDIO_INFO_LOG("Set restore status when server died, restore result %{public}d", restoreResult);
2638 return;
2639 }
2640
SetSpeed(float speed)2641 int32_t AudioRendererPrivate::SetSpeed(float speed)
2642 {
2643 AUDIO_INFO_LOG("set speed %{public}f", speed);
2644 CHECK_AND_RETURN_RET_LOG((speed >= MIN_STREAM_SPEED_LEVEL) && (speed <= MAX_STREAM_SPEED_LEVEL),
2645 ERR_INVALID_PARAM, "invaild speed index");
2646 std::unique_lock<std::shared_mutex> lock;
2647 if (callbackLoopTid_ != gettid()) { // No need to add lock in callback thread to prevent deadlocks
2648 lock = std::unique_lock<std::shared_mutex>(rendererMutex_);
2649 }
2650 #ifdef SONIC_ENABLE
2651 CHECK_AND_RETURN_RET_LOG(audioStream_ != nullptr, ERROR_ILLEGAL_STATE, "audioStream_ is nullptr");
2652 audioStream_->SetSpeed(speed);
2653 #endif
2654 speed_ = speed;
2655
2656 if (lock.owns_lock()) {
2657 lock.unlock();
2658 }
2659
2660 SetPitch(AudioSpeed::GetPitchForSpeed(speed));
2661 return SUCCESS;
2662 }
2663
SetPitch(float pitch)2664 int32_t AudioRendererPrivate::SetPitch(float pitch)
2665 {
2666 AUDIO_INFO_LOG("set pitch %{public}f", pitch);
2667 CHECK_AND_RETURN_RET_LOG((pitch >= MIN_STREAM_SPEED_LEVEL) && (pitch <= MAX_STREAM_SPEED_LEVEL),
2668 ERR_INVALID_PARAM, "invaild pitch index");
2669 std::unique_lock<std::shared_mutex> lock;
2670 if (callbackLoopTid_ != gettid()) { // No need to add lock in callback thread to prevent deadlocks
2671 lock = std::unique_lock<std::shared_mutex>(rendererMutex_);
2672 }
2673 #ifdef SONIC_ENABLE
2674 CHECK_AND_RETURN_RET_LOG(audioStream_ != nullptr, ERROR_ILLEGAL_STATE, "audioStream_ is nullptr");
2675 audioStream_->SetPitch(pitch);
2676 #endif
2677 pitch_ = pitch;
2678 return SUCCESS;
2679 }
2680
GetSpeed()2681 float AudioRendererPrivate::GetSpeed()
2682 {
2683 std::shared_lock<std::shared_mutex> lock;
2684 if (callbackLoopTid_ != gettid()) { // No need to add lock in callback thread to prevent deadlocks
2685 lock = std::shared_lock<std::shared_mutex>(rendererMutex_);
2686 }
2687 #ifdef SONIC_ENABLE
2688 CHECK_AND_RETURN_RET_LOG(audioStream_ != nullptr, ERROR_ILLEGAL_STATE, "audioStream_ is nullptr");
2689 return audioStream_->GetSpeed();
2690 #endif
2691 return speed_.value_or(1.0f);
2692 }
2693
IsOffloadEnable()2694 bool AudioRendererPrivate::IsOffloadEnable()
2695 {
2696 std::shared_ptr currentStream = GetInnerStream();
2697 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, false, "audioStream_ is nullptr");
2698 bool enable = currentStream->GetOffloadEnable();
2699 AUDIO_INFO_LOG("GetOffloadEnable is [%{public}s]", (enable ? "true" : "false"));
2700 return enable;
2701 }
2702
IsFastRenderer()2703 bool AudioRendererPrivate::IsFastRenderer()
2704 {
2705 return isFastRenderer_;
2706 }
2707
2708 // Inner function. Must be called with AudioRendererPrivate::rendererMutex_
2709 // or AudioRendererPrivate::streamMutex_ held.
InitLatencyMeasurement(const AudioStreamParams & audioStreamParams)2710 void AudioRendererPrivate::InitLatencyMeasurement(const AudioStreamParams &audioStreamParams)
2711 {
2712 latencyMeasEnabled_ = AudioLatencyMeasurement::CheckIfEnabled();
2713 AUDIO_INFO_LOG("LatencyMeas enabled in renderer:%{public}d", latencyMeasEnabled_);
2714 if (!latencyMeasEnabled_) {
2715 return;
2716 }
2717 std::string bundleName = AudioSystemManager::GetInstance()->GetSelfBundleName(appInfo_.appUid);
2718 uint32_t sessionId = 0;
2719 audioStream_->GetAudioSessionID(sessionId);
2720 latencyMeasurement_ = std::make_shared<AudioLatencyMeasurement>(audioStreamParams.samplingRate,
2721 audioStreamParams.channels, audioStreamParams.format, bundleName, sessionId);
2722 }
2723
2724 // Inner function. Must be called with AudioRendererPrivate::rendererMutex_
2725 // or AudioRendererPrivate::streamMutex_ held.
MockPcmData(uint8_t * buffer,size_t bufferSize) const2726 void AudioRendererPrivate::MockPcmData(uint8_t *buffer, size_t bufferSize) const
2727 {
2728 if (!latencyMeasEnabled_) {
2729 return;
2730 }
2731 if (latencyMeasurement_->MockPcmData(buffer, bufferSize)) {
2732 std::string timestamp = GetTime();
2733 audioStream_->UpdateLatencyTimestamp(timestamp, true);
2734 }
2735 }
2736
EnableVoiceModemCommunicationStartStream(bool enable)2737 void AudioRendererPrivate::EnableVoiceModemCommunicationStartStream(bool enable)
2738 {
2739 isEnableVoiceModemCommunicationStartStream_ = enable;
2740 }
2741
IsNoStreamRenderer() const2742 bool AudioRendererPrivate::IsNoStreamRenderer() const
2743 {
2744 return rendererInfo_.streamUsage == STREAM_USAGE_VOICE_MODEM_COMMUNICATION &&
2745 !isEnableVoiceModemCommunicationStartStream_;
2746 }
2747
GetSourceDuration() const2748 int64_t AudioRendererPrivate::GetSourceDuration() const
2749 {
2750 return sourceDuration_;
2751 }
2752
SetSourceDuration(int64_t duration)2753 void AudioRendererPrivate::SetSourceDuration(int64_t duration)
2754 {
2755 sourceDuration_ = duration;
2756 audioStream_->SetSourceDuration(sourceDuration_);
2757 }
2758
SetDefaultOutputDevice(DeviceType deviceType)2759 int32_t AudioRendererPrivate::SetDefaultOutputDevice(DeviceType deviceType)
2760 {
2761 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
2762 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, ERROR_ILLEGAL_STATE, "audioStream_ is nullptr");
2763 if (deviceType != DEVICE_TYPE_EARPIECE && deviceType != DEVICE_TYPE_SPEAKER &&
2764 deviceType != DEVICE_TYPE_DEFAULT) {
2765 return ERR_NOT_SUPPORTED;
2766 }
2767 bool isSupportedStreamUsage = (find(AUDIO_DEFAULT_OUTPUT_DEVICE_SUPPORTED_STREAM_USAGES.begin(),
2768 AUDIO_DEFAULT_OUTPUT_DEVICE_SUPPORTED_STREAM_USAGES.end(), rendererInfo_.streamUsage) !=
2769 AUDIO_DEFAULT_OUTPUT_DEVICE_SUPPORTED_STREAM_USAGES.end());
2770 CHECK_AND_RETURN_RET_LOG(isSupportedStreamUsage, ERR_NOT_SUPPORTED, "stream usage not supported");
2771 AUDIO_INFO_LOG("set to %{public}d", deviceType);
2772 return currentStream->SetDefaultOutputDevice(deviceType);
2773 }
2774
GetFastStatus()2775 FastStatus AudioRendererPrivate::GetFastStatus()
2776 {
2777 std::unique_lock<std::shared_mutex> lock(rendererMutex_, std::defer_lock);
2778 if (callbackLoopTid_ != gettid()) {
2779 lock.lock();
2780 }
2781
2782 return GetFastStatusInner();
2783 }
2784
GetFastStatusInner()2785 FastStatus AudioRendererPrivate::GetFastStatusInner()
2786 {
2787 // inner function. Must be called with AudioRendererPrivate::rendererMutex_ held.
2788 CHECK_AND_RETURN_RET_LOG(audioStream_ != nullptr, FASTSTATUS_INVALID, "audioStream_ is nullptr");
2789 return audioStream_->GetFastStatus();
2790 }
2791
2792 // diffrence from GetAudioPosition only when set speed
GetAudioTimestampInfo(Timestamp & timestamp,Timestamp::Timestampbase base) const2793 int32_t AudioRendererPrivate::GetAudioTimestampInfo(Timestamp ×tamp, Timestamp::Timestampbase base) const
2794 {
2795 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
2796 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, ERROR_ILLEGAL_STATE, "audioStream_ is nullptr");
2797 return currentStream->GetAudioTimestampInfo(timestamp, base);
2798 }
2799
InitFormatUnsupportedErrorCallback()2800 int32_t AudioRendererPrivate::InitFormatUnsupportedErrorCallback()
2801 {
2802 if (!formatUnsupportedErrorCallback_) {
2803 formatUnsupportedErrorCallback_ = std::make_shared<FormatUnsupportedErrorCallbackImpl>();
2804 CHECK_AND_RETURN_RET_LOG(formatUnsupportedErrorCallback_ != nullptr, ERROR, "Memory allocation failed");
2805 }
2806 int32_t ret = AudioPolicyManager::GetInstance().SetAudioFormatUnsupportedErrorCallback(
2807 formatUnsupportedErrorCallback_);
2808 CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ret, "Register failed");
2809 return SUCCESS;
2810 }
2811
FastStatusChangeCallback(FastStatus status)2812 void AudioRendererPrivate::FastStatusChangeCallback(FastStatus status)
2813 {
2814 FastStatus newStatus = GetFastStatusInner();
2815 if (newStatus != status) {
2816 if (fastStatusChangeCallback_ != nullptr) {
2817 fastStatusChangeCallback_->OnFastStatusChange(newStatus);
2818 }
2819 }
2820 }
2821
OnFormatUnsupportedError(const AudioErrors & errorCode)2822 void FormatUnsupportedErrorCallbackImpl::OnFormatUnsupportedError(const AudioErrors &errorCode)
2823 {
2824 std::shared_ptr<AudioRendererErrorCallback> cb = callback_.lock();
2825 CHECK_AND_RETURN_LOG(cb != nullptr, "cb is nullptr");
2826 cb->OnError(errorCode);
2827 }
2828
StartDataCallback()2829 int32_t AudioRendererPrivate::StartDataCallback()
2830 {
2831 std::lock_guard<std::shared_mutex> lock(rendererMutex_);
2832 RendererState state = GetStatusInner();
2833 CHECK_AND_RETURN_RET_LOG(state == RENDERER_RUNNING, ERROR_ILLEGAL_STATE,
2834 "StartDataCallback failed. Illegal state:%{public}u", state);
2835 return audioStream_->SetOffloadDataCallbackState(0); // 0 hdi state need data
2836 }
2837
OnRouteUpdate(uint32_t routeFlag,const std::string & networkId)2838 void AudioRouteCallbackImpl::OnRouteUpdate(uint32_t routeFlag, const std::string &networkId)
2839 {
2840 std::shared_ptr<AudioRendererPrivate> sharedRenderer = renderer_.lock();
2841 CHECK_AND_RETURN_LOG(sharedRenderer != nullptr, "renderer is nullptr");
2842 std::shared_ptr<IAudioStream> currentStream = sharedRenderer->GetInnerStream();
2843 CHECK_AND_RETURN_LOG(currentStream != nullptr, "audioStream is nullptr");
2844 currentStream->NotifyRouteUpdate(routeFlag, networkId);
2845 }
2846
SetAudioHapticsSyncId(int32_t audioHapticsSyncId)2847 void AudioRendererPrivate::SetAudioHapticsSyncId(int32_t audioHapticsSyncId)
2848 {
2849 AUDIO_PRERELEASE_LOGI("AudioRendererPrivate::SetAudioHapticsSyncId %{public}d", audioHapticsSyncId);
2850 std::unique_lock<std::shared_mutex> lock;
2851 if (callbackLoopTid_ != gettid()) { // No need to add lock in callback thread to prevent deadlocks
2852 lock = std::unique_lock<std::shared_mutex>(rendererMutex_);
2853 }
2854
2855 CHECK_AND_RETURN_LOG(audioStream_ != nullptr, "audio stream is null");
2856
2857 if (audioHapticsSyncId > 0) {
2858 audioHapticsSyncId_ = audioHapticsSyncId;
2859 audioStream_->SetAudioHapticsSyncId(audioHapticsSyncId);
2860 }
2861 }
2862
ResetFirstFrameState()2863 void AudioRendererPrivate::ResetFirstFrameState()
2864 {
2865 AUDIO_PRERELEASE_LOGI("AudioRendererPrivate::ResetFirstFrameState");
2866 std::unique_lock<std::shared_mutex> lock;
2867 if (callbackLoopTid_ != gettid()) { // No need to add lock in callback thread to prevent deadlocks
2868 lock = std::unique_lock<std::shared_mutex>(rendererMutex_);
2869 }
2870
2871 CHECK_AND_RETURN_LOG(audioStream_ != nullptr, "audio stream is null");
2872
2873 audioStream_->ResetFirstFrameState();
2874 }
2875
StopDataCallback()2876 int32_t AudioRendererPrivate::StopDataCallback()
2877 {
2878 std::lock_guard<std::shared_mutex> lock(rendererMutex_);
2879 RendererState state = GetStatusInner();
2880 CHECK_AND_RETURN_RET_LOG(state == RENDERER_RUNNING, ERROR_ILLEGAL_STATE,
2881 "StopDataCallback failed. Illegal state:%{public}u", state);
2882 return audioStream_->SetOffloadDataCallbackState(3); // 3 hdi state full
2883 }
2884
SetInterruptEventCallbackType(InterruptEventCallbackType callbackType)2885 void AudioRendererPrivate::SetInterruptEventCallbackType(InterruptEventCallbackType callbackType)
2886 {
2887 audioInterrupt_.callbackType = callbackType;
2888 }
2889
IsVirtualKeyboard(const int32_t flags)2890 bool AudioRendererPrivate::IsVirtualKeyboard(const int32_t flags)
2891 {
2892 bool isBundleNameValid = false;
2893 std::string bundleName = AudioSystemManager::GetInstance()->GetSelfBundleName(getuid());
2894 int32_t ret = AudioSystemManager::GetInstance()->CheckVKBInfo(bundleName, isBundleNameValid);
2895 bool isVirtualKeyboard = (flags == AUDIO_FLAG_VKB_NORMAL || flags == AUDIO_FLAG_VKB_FAST)
2896 && isBundleNameValid;
2897 AUDIO_INFO_LOG("Check VKB ret:%{public}d, flags:%{public}d, isVKB:%{public}s", ret, flags,
2898 isVirtualKeyboard ? "T" : "F");
2899 return isVirtualKeyboard;
2900 }
2901
CheckAudioRenderer(std::string callingFunc)2902 int32_t AudioRendererPrivate::CheckAudioRenderer(std::string callingFunc)
2903 {
2904 CheckAndStopAudioRenderer(callingFunc);
2905 return CheckAndRestoreAudioRenderer(callingFunc);
2906 }
2907
CheckAndStopAudioRenderer(std::string callingFunc)2908 int32_t AudioRendererPrivate::CheckAndStopAudioRenderer(std::string callingFunc)
2909 {
2910 std::unique_lock<std::shared_mutex> lock(rendererMutex_, std::defer_lock);
2911 if (callbackLoopTid_ != gettid()) {
2912 lock.lock();
2913 }
2914 CHECK_AND_RETURN_RET_LOG(audioStream_, ERR_INVALID_PARAM, "audioStream_ is nullptr");
2915
2916 bool isNeedStop = audioStream_->GetStopFlag();
2917 if (!isNeedStop) {
2918 return SUCCESS;
2919 }
2920
2921 AUDIO_INFO_LOG("Before %{public}s, stop audio renderer %{public}u", callingFunc.c_str(), sessionID_);
2922 if (lock.owns_lock()) {
2923 lock.unlock();
2924 }
2925 Stop();
2926 return SUCCESS;
2927 }
2928
HandleCreateFastStreamError(AudioStreamParams & audioStreamParams,AudioStreamType audioStreamType)2929 int32_t AudioRendererPrivate::HandleCreateFastStreamError(AudioStreamParams &audioStreamParams,
2930 AudioStreamType audioStreamType)
2931 {
2932 AUDIO_INFO_LOG("Create fast Stream fail, play by normal stream.");
2933 IAudioStream::StreamClass streamClass = IAudioStream::PA_STREAM;
2934 isFastRenderer_ = false;
2935 rendererInfo_.rendererFlags = AUDIO_FLAG_FORCED_NORMAL;
2936
2937 // Create stream desc and pipe
2938 std::shared_ptr<AudioStreamDescriptor> streamDesc = ConvertToStreamDescriptor(audioStreamParams);
2939 uint32_t flag = AUDIO_OUTPUT_FLAG_NORMAL;
2940 std::string networkId = LOCAL_NETWORK_ID;
2941 int32_t ret = AudioPolicyManager::GetInstance().CreateRendererClient(streamDesc, flag,
2942 audioStreamParams.originalSessionId, networkId);
2943 CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ERR_OPERATION_FAILED, "CreateRendererClient failed");
2944 AUDIO_INFO_LOG("Create normal renderer, id: %{public}u", audioStreamParams.originalSessionId);
2945
2946 audioStream_ = IAudioStream::GetPlaybackStream(streamClass, audioStreamParams, audioStreamType, appInfo_.appUid);
2947 CHECK_AND_RETURN_RET_LOG(audioStream_ != nullptr, ERR_INVALID_PARAM, "Re-create normal stream failed.");
2948 ret = InitAudioStream(audioStreamParams);
2949 CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ret, "InitAudioStream failed");
2950 audioStream_->SetRenderMode(RENDER_MODE_CALLBACK);
2951 callbackLoopTid_ = audioStream_->GetCallbackLoopTid();
2952 audioStream_->NotifyRouteUpdate(flag, networkId);
2953 return ret;
2954 }
2955 } // namespace AudioStandard
2956 } // namespace OHOS
2957