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
30 #include "media_monitor_manager.h"
31 #include "audio_scope_exit.h"
32
33 namespace OHOS {
34 namespace AudioStandard {
35
36 static const std::vector<StreamUsage> NEED_VERIFY_PERMISSION_STREAMS = {
37 STREAM_USAGE_SYSTEM,
38 STREAM_USAGE_DTMF,
39 STREAM_USAGE_ENFORCED_TONE,
40 STREAM_USAGE_ULTRASONIC,
41 STREAM_USAGE_VOICE_MODEM_COMMUNICATION
42 };
43
44 const std::vector<StreamUsage> BACKGROUND_NOSTART_STREAM_USAGE {
45 STREAM_USAGE_MUSIC,
46 STREAM_USAGE_MOVIE,
47 STREAM_USAGE_AUDIOBOOK
48 };
49 static constexpr uid_t UID_MSDP_SA = 6699;
50 static constexpr int32_t WRITE_UNDERRUN_NUM = 100;
51 static constexpr int32_t MINIMUM_BUFFER_SIZE_MSEC = 5;
52 static constexpr int32_t MAXIMUM_BUFFER_SIZE_MSEC = 20;
53 constexpr int32_t TIME_OUT_SECONDS = 10;
54 constexpr int32_t START_TIME_OUT_SECONDS = 15;
55 static constexpr uint32_t BLOCK_INTERRUPT_CALLBACK_IN_MS = 300; // 300ms
56 static const std::map<AudioStreamType, StreamUsage> STREAM_TYPE_USAGE_MAP = {
57 {STREAM_MUSIC, STREAM_USAGE_MUSIC},
58 {STREAM_VOICE_CALL, STREAM_USAGE_VOICE_COMMUNICATION},
59 {STREAM_VOICE_CALL_ASSISTANT, STREAM_USAGE_VOICE_CALL_ASSISTANT},
60 {STREAM_VOICE_ASSISTANT, STREAM_USAGE_VOICE_ASSISTANT},
61 {STREAM_ALARM, STREAM_USAGE_ALARM},
62 {STREAM_VOICE_MESSAGE, STREAM_USAGE_VOICE_MESSAGE},
63 {STREAM_RING, STREAM_USAGE_RINGTONE},
64 {STREAM_NOTIFICATION, STREAM_USAGE_NOTIFICATION},
65 {STREAM_ACCESSIBILITY, STREAM_USAGE_ACCESSIBILITY},
66 {STREAM_SYSTEM, STREAM_USAGE_SYSTEM},
67 {STREAM_MOVIE, STREAM_USAGE_MOVIE},
68 {STREAM_GAME, STREAM_USAGE_GAME},
69 {STREAM_SPEECH, STREAM_USAGE_AUDIOBOOK},
70 {STREAM_NAVIGATION, STREAM_USAGE_NAVIGATION},
71 {STREAM_DTMF, STREAM_USAGE_DTMF},
72 {STREAM_SYSTEM_ENFORCED, STREAM_USAGE_ENFORCED_TONE},
73 {STREAM_ULTRASONIC, STREAM_USAGE_ULTRASONIC},
74 {STREAM_VOICE_RING, STREAM_USAGE_VOICE_RINGTONE},
75 };
76
77 static const std::vector<StreamUsage> AUDIO_DEFAULT_OUTPUT_DEVICE_SUPPORTED_STREAM_USAGES {
78 STREAM_USAGE_VOICE_COMMUNICATION,
79 STREAM_USAGE_VOICE_MESSAGE,
80 STREAM_USAGE_VIDEO_COMMUNICATION,
81 STREAM_USAGE_VOICE_MODEM_COMMUNICATION,
82 };
83
SetStreamInfoToParams(const AudioStreamInfo & streamInfo)84 static AudioRendererParams SetStreamInfoToParams(const AudioStreamInfo &streamInfo)
85 {
86 AudioRendererParams params;
87 params.sampleFormat = streamInfo.format;
88 params.sampleRate = streamInfo.samplingRate;
89 params.channelCount = streamInfo.channels;
90 params.encodingType = streamInfo.encoding;
91 params.channelLayout = streamInfo.channelLayout;
92 return params;
93 }
94
95 std::mutex AudioRenderer::createRendererMutex_;
96
97 AudioRenderer::~AudioRenderer() = default;
~AudioRendererPrivate()98 AudioRendererPrivate::~AudioRendererPrivate()
99 {
100 AUDIO_INFO_LOG("Destruct in");
101 abortRestore_ = true;
102
103 std::shared_ptr<OutputDeviceChangeWithInfoCallbackImpl> outputDeviceChangeCallback = outputDeviceChangeCallback_;
104 if (outputDeviceChangeCallback != nullptr) {
105 outputDeviceChangeCallback->RemoveCallback();
106 outputDeviceChangeCallback->UnsetAudioRendererObj();
107 }
108 for (auto id : usedSessionId_) {
109 AudioPolicyManager::GetInstance().UnregisterDeviceChangeWithInfoCallback(id);
110 }
111
112 RendererState state = GetStatus();
113 if (state != RENDERER_RELEASED && state != RENDERER_NEW) {
114 Release();
115 }
116
117 if (rendererProxyObj_ != nullptr) {
118 rendererProxyObj_->UnsetRendererObj();
119 AudioPolicyManager::GetInstance().RemoveClientTrackerStub(sessionID_);
120 }
121
122 RemoveRendererPolicyServiceDiedCallback();
123 DumpFileUtil::CloseDumpFile(&dumpFile_);
124 }
125
CheckMaxRendererInstances()126 int32_t AudioRenderer::CheckMaxRendererInstances()
127 {
128 std::vector<std::shared_ptr<AudioRendererChangeInfo>> audioRendererChangeInfos;
129 AudioPolicyManager::GetInstance().GetCurrentRendererChangeInfos(audioRendererChangeInfos);
130 AUDIO_INFO_LOG("Audio current renderer change infos size: %{public}zu", audioRendererChangeInfos.size());
131 int32_t maxRendererInstances = AudioPolicyManager::GetInstance().GetMaxRendererInstances();
132 if (audioRendererChangeInfos.size() >= static_cast<size_t>(maxRendererInstances)) {
133 std::map<int32_t, int32_t> appUseNumMap;
134 int32_t INITIAL_VALUE = 1;
135 int32_t mostAppUid = -1;
136 int32_t mostAppNum = -1;
137 for (auto it = audioRendererChangeInfos.begin(); it != audioRendererChangeInfos.end(); it++) {
138 auto appUseNum = appUseNumMap.find((*it)->clientUID);
139 if (appUseNum != appUseNumMap.end()) {
140 appUseNumMap[(*it)->clientUID] = ++appUseNum->second;
141 } else {
142 appUseNumMap.emplace((*it)->clientUID, INITIAL_VALUE);
143 }
144 }
145 for (auto iter = appUseNumMap.begin(); iter != appUseNumMap.end(); iter++) {
146 if (iter->second > mostAppNum) {
147 mostAppNum = iter->second;
148 mostAppUid = iter->first;
149 }
150 }
151 std::shared_ptr<Media::MediaMonitor::EventBean> bean = std::make_shared<Media::MediaMonitor::EventBean>(
152 Media::MediaMonitor::ModuleId::AUDIO, Media::MediaMonitor::EventId::AUDIO_STREAM_EXHAUSTED_STATS,
153 Media::MediaMonitor::EventType::FREQUENCY_AGGREGATION_EVENT);
154 bean->Add("CLIENT_UID", mostAppUid);
155 bean->Add("TIMES", mostAppNum);
156 Media::MediaMonitor::MediaMonitorManager::GetInstance().WriteLogMsg(bean);
157 }
158
159 CHECK_AND_RETURN_RET_LOG(audioRendererChangeInfos.size() < static_cast<size_t>(maxRendererInstances), ERR_OVERFLOW,
160 "The current number of audio renderer streams is greater than the maximum number of configured instances");
161
162 return SUCCESS;
163 }
164
GetAudioFormatSize(AudioSampleFormat format)165 size_t GetAudioFormatSize(AudioSampleFormat format)
166 {
167 size_t bitWidthSize = 2;
168 switch (format) {
169 case SAMPLE_U8:
170 bitWidthSize = 1; // size is 1
171 break;
172 case SAMPLE_S16LE:
173 bitWidthSize = 2; // size is 2
174 break;
175 case SAMPLE_S24LE:
176 bitWidthSize = 3; // size is 3
177 break;
178 case SAMPLE_S32LE:
179 case SAMPLE_F32LE:
180 bitWidthSize = 4; // size is 4
181 break;
182 default:
183 bitWidthSize = 2; // size is 2
184 break;
185 }
186 return bitWidthSize;
187 }
188
GetFormatSize(const AudioStreamParams & info)189 size_t GetFormatSize(const AudioStreamParams& info)
190 {
191 return GetAudioFormatSize(static_cast<AudioSampleFormat>(info.format));
192 }
193
MuteAudioBuffer(uint8_t * addr,size_t offset,size_t length,AudioSampleFormat format)194 int32_t AudioRenderer::MuteAudioBuffer(uint8_t *addr, size_t offset, size_t length, AudioSampleFormat format)
195 {
196 CHECK_AND_RETURN_RET_LOG(addr != nullptr && length != 0, ERR_INVALID_PARAM, "Invalid addr or length");
197
198 bool formatValid = std::find(AUDIO_SUPPORTED_FORMATS.begin(), AUDIO_SUPPORTED_FORMATS.end(), format)
199 != AUDIO_SUPPORTED_FORMATS.end();
200 CHECK_AND_RETURN_RET_LOG(formatValid, ERR_INVALID_PARAM, "Invalid AudioSampleFormat");
201
202 size_t bitWidthSize = GetAudioFormatSize(format);
203 if (bitWidthSize != 0 && length % bitWidthSize != 0) {
204 AUDIO_ERR_LOG("length is %{public}zu, can not be divided by %{public}zu", length, bitWidthSize);
205 return ERR_INVALID_PARAM;
206 }
207
208 int32_t ret = 0;
209 if (format == SAMPLE_U8) {
210 ret = memset_s(addr + offset, length, 0X7F, length);
211 } else {
212 ret = memset_s(addr + offset, length, 0, length);
213 }
214 CHECK_AND_RETURN_RET_LOG(ret == EOK, ERR_OPERATION_FAILED, "Mute failed!");
215 return SUCCESS;
216 }
217
Create(AudioStreamType audioStreamType)218 std::unique_ptr<AudioRenderer> AudioRenderer::Create(AudioStreamType audioStreamType)
219 {
220 AppInfo appInfo = {};
221 return Create(audioStreamType, appInfo);
222 }
223
Create(AudioStreamType audioStreamType,const AppInfo & appInfo)224 std::unique_ptr<AudioRenderer> AudioRenderer::Create(AudioStreamType audioStreamType, const AppInfo &appInfo)
225 {
226 if (audioStreamType == STREAM_MEDIA) {
227 audioStreamType = STREAM_MUSIC;
228 }
229
230 auto sharedRenderer = std::make_shared<AudioRendererPrivate>(audioStreamType, appInfo, true);
231 CHECK_AND_RETURN_RET_LOG(sharedRenderer != nullptr, nullptr, "renderer is null");
232
233 return std::make_unique<SharedAudioRendererWrapper>(sharedRenderer);
234 }
235
Create(const AudioRendererOptions & rendererOptions)236 std::unique_ptr<AudioRenderer> AudioRenderer::Create(const AudioRendererOptions &rendererOptions)
237 {
238 AppInfo appInfo = {};
239 return Create("", rendererOptions, appInfo);
240 }
241
Create(const AudioRendererOptions & rendererOptions,const AppInfo & appInfo)242 std::unique_ptr<AudioRenderer> AudioRenderer::Create(const AudioRendererOptions &rendererOptions,
243 const AppInfo &appInfo)
244 {
245 return Create("", rendererOptions, appInfo);
246 }
247
Create(const std::string cachePath,const AudioRendererOptions & rendererOptions)248 std::unique_ptr<AudioRenderer> AudioRenderer::Create(const std::string cachePath,
249 const AudioRendererOptions &rendererOptions)
250 {
251 AppInfo appInfo = {};
252 return Create(cachePath, rendererOptions, appInfo);
253 }
254
Create(const std::string cachePath,const AudioRendererOptions & rendererOptions,const AppInfo & appInfo)255 std::unique_ptr<AudioRenderer> AudioRenderer::Create(const std::string cachePath,
256 const AudioRendererOptions &rendererOptions, const AppInfo &appInfo)
257 {
258 auto sharedRenderer = CreateRenderer(rendererOptions, appInfo);
259 CHECK_AND_RETURN_RET_LOG(sharedRenderer != nullptr, nullptr, "renderer is null");
260
261 return std::make_unique<SharedAudioRendererWrapper>(sharedRenderer);
262 }
263
CreateRenderer(const AudioRendererOptions & rendererOptions,const AppInfo & appInfo)264 std::shared_ptr<AudioRenderer> AudioRenderer::CreateRenderer(const AudioRendererOptions &rendererOptions,
265 const AppInfo &appInfo)
266 {
267 Trace trace("AudioRenderer::Create");
268 std::lock_guard<std::mutex> lock(createRendererMutex_);
269 CHECK_AND_RETURN_RET_LOG(AudioPolicyManager::GetInstance().GetAudioPolicyManagerProxy() != nullptr,
270 nullptr, "sa not start");
271 AudioStreamType audioStreamType = IAudioStream::GetStreamType(rendererOptions.rendererInfo.contentType,
272 rendererOptions.rendererInfo.streamUsage);
273 if (audioStreamType == STREAM_ULTRASONIC && getuid() != UID_MSDP_SA) {
274 AudioRenderer::SendRendererCreateError(rendererOptions.rendererInfo.streamUsage,
275 ERR_INVALID_PARAM);
276 AUDIO_ERR_LOG("ULTRASONIC can only create by MSDP");
277 return nullptr;
278 }
279
280 auto audioRenderer = std::make_shared<AudioRendererPrivate>(audioStreamType, appInfo, false);
281 if (audioRenderer == nullptr) {
282 AudioRenderer::SendRendererCreateError(rendererOptions.rendererInfo.streamUsage,
283 ERR_OPERATION_FAILED);
284 }
285 CHECK_AND_RETURN_RET_LOG(audioRenderer != nullptr, nullptr, "Failed to create renderer object");
286
287 int32_t rendererFlags = rendererOptions.rendererInfo.rendererFlags;
288 AUDIO_INFO_LOG("StreamClientState for Renderer::Create. content: %{public}d, usage: %{public}d, "\
289 "flags: %{public}d, uid: %{public}d", rendererOptions.rendererInfo.contentType,
290 rendererOptions.rendererInfo.streamUsage, rendererFlags, appInfo.appUid);
291
292 audioRenderer->rendererInfo_.contentType = rendererOptions.rendererInfo.contentType;
293 audioRenderer->rendererInfo_.streamUsage = rendererOptions.rendererInfo.streamUsage;
294 audioRenderer->rendererInfo_.isSatellite = rendererOptions.rendererInfo.isSatellite;
295 audioRenderer->rendererInfo_.playerType = rendererOptions.rendererInfo.playerType;
296 audioRenderer->rendererInfo_.expectedPlaybackDurationBytes
297 = rendererOptions.rendererInfo.expectedPlaybackDurationBytes;
298 audioRenderer->rendererInfo_.samplingRate = rendererOptions.streamInfo.samplingRate;
299 audioRenderer->rendererInfo_.volumeMode = rendererOptions.rendererInfo.volumeMode;
300 audioRenderer->rendererInfo_.rendererFlags = rendererFlags;
301 audioRenderer->rendererInfo_.originalFlag = rendererFlags;
302 audioRenderer->privacyType_ = rendererOptions.privacyType;
303 audioRenderer->strategy_ = rendererOptions.strategy;
304 audioRenderer->originalStrategy_ = rendererOptions.strategy;
305 AudioRendererParams params = SetStreamInfoToParams(rendererOptions.streamInfo);
306 if (audioRenderer->SetParams(params) != SUCCESS) {
307 AUDIO_ERR_LOG("SetParams failed in renderer");
308 audioRenderer = nullptr;
309 AudioRenderer::SendRendererCreateError(rendererOptions.rendererInfo.streamUsage,
310 ERR_OPERATION_FAILED);
311 }
312
313 return audioRenderer;
314 }
315
SendRendererCreateError(const StreamUsage & sreamUsage,const int32_t & errorCode)316 void AudioRenderer::SendRendererCreateError(const StreamUsage &sreamUsage,
317 const int32_t &errorCode)
318 {
319 std::shared_ptr<Media::MediaMonitor::EventBean> bean = std::make_shared<Media::MediaMonitor::EventBean>(
320 Media::MediaMonitor::AUDIO, Media::MediaMonitor::AUDIO_STREAM_CREATE_ERROR_STATS,
321 Media::MediaMonitor::FREQUENCY_AGGREGATION_EVENT);
322 bean->Add("IS_PLAYBACK", 1);
323 bean->Add("CLIENT_UID", static_cast<int32_t>(getuid()));
324 bean->Add("STREAM_TYPE", sreamUsage);
325 bean->Add("ERROR_CODE", errorCode);
326 Media::MediaMonitor::MediaMonitorManager::GetInstance().WriteLogMsg(bean);
327 }
328
AudioRendererPrivate(AudioStreamType audioStreamType,const AppInfo & appInfo,bool createStream)329 AudioRendererPrivate::AudioRendererPrivate(AudioStreamType audioStreamType, const AppInfo &appInfo, bool createStream)
330 {
331 appInfo_ = appInfo;
332 if (!(appInfo_.appPid)) {
333 appInfo_.appPid = getpid();
334 }
335
336 if (appInfo_.appUid < 0) {
337 appInfo_.appUid = static_cast<int32_t>(getuid());
338 }
339
340 if (createStream) {
341 AudioStreamParams tempParams = {};
342 audioStream_ = IAudioStream::GetPlaybackStream(IAudioStream::PA_STREAM, tempParams, audioStreamType,
343 appInfo_.appUid);
344 if (audioStream_ && STREAM_TYPE_USAGE_MAP.count(audioStreamType) != 0) {
345 // Initialize the streamUsage based on the streamType
346 rendererInfo_.streamUsage = STREAM_TYPE_USAGE_MAP.at(audioStreamType);
347 }
348 AUDIO_INFO_LOG("AudioRendererPrivate create normal stream for old mode.");
349 }
350
351 rendererProxyObj_ = std::make_shared<AudioRendererProxyObj>();
352 if (!rendererProxyObj_) {
353 AUDIO_WARNING_LOG("AudioRendererProxyObj Memory Allocation Failed !!");
354 }
355
356 audioInterrupt_.audioFocusType.streamType = audioStreamType;
357 audioInterrupt_.pid = appInfo_.appPid;
358 audioInterrupt_.uid = appInfo_.appUid;
359 audioInterrupt_.mode = SHARE_MODE;
360 audioInterrupt_.parallelPlayFlag = false;
361
362 state_ = RENDERER_PREPARED;
363 }
364
365 // Inner function. Must be called with AudioRendererPrivate::rendererMutex_
366 // or AudioRendererPrivate::streamMutex_ held.
InitAudioInterruptCallback(bool isRestoreAudio)367 int32_t AudioRendererPrivate::InitAudioInterruptCallback(bool isRestoreAudio)
368 {
369 AUDIO_DEBUG_LOG("in");
370
371 if (audioInterrupt_.streamId != 0 && !isRestoreAudio) {
372 AUDIO_INFO_LOG("old session already has interrupt, need to reset");
373 (void)AudioPolicyManager::GetInstance().DeactivateAudioInterrupt(audioInterrupt_);
374 (void)AudioPolicyManager::GetInstance().UnsetAudioInterruptCallback(audioInterrupt_.streamId);
375 }
376
377 CHECK_AND_RETURN_RET_LOG(audioInterrupt_.mode == SHARE_MODE || audioInterrupt_.mode == INDEPENDENT_MODE,
378 ERR_INVALID_PARAM, "Invalid interrupt mode!");
379 CHECK_AND_RETURN_RET_LOG(audioStream_->GetAudioSessionID(audioInterrupt_.streamId) == 0, ERR_INVALID_INDEX,
380 "GetAudioSessionID failed");
381 sessionID_ = audioInterrupt_.streamId;
382 audioInterrupt_.streamUsage = rendererInfo_.streamUsage;
383 audioInterrupt_.contentType = rendererInfo_.contentType;
384 audioInterrupt_.sessionStrategy = strategy_;
385 audioInterrupt_.api = rendererInfo_.playerType;
386
387 AUDIO_INFO_LOG("interruptMode %{public}d, streamType %{public}d, sessionID %{public}d",
388 audioInterrupt_.mode, audioInterrupt_.audioFocusType.streamType, audioInterrupt_.streamId);
389
390 if (audioInterruptCallback_ == nullptr) {
391 audioInterruptCallback_ = std::make_shared<AudioRendererInterruptCallbackImpl>(audioStream_, audioInterrupt_);
392 CHECK_AND_RETURN_RET_LOG(audioInterruptCallback_ != nullptr, ERROR,
393 "Failed to allocate memory for audioInterruptCallback_");
394 }
395 return AudioPolicyManager::GetInstance().SetAudioInterruptCallback(sessionID_, audioInterruptCallback_,
396 appInfo_.appUid);
397 }
398
InitOutputDeviceChangeCallback()399 int32_t AudioRendererPrivate::InitOutputDeviceChangeCallback()
400 {
401 if (!outputDeviceChangeCallback_) {
402 outputDeviceChangeCallback_ = std::make_shared<OutputDeviceChangeWithInfoCallbackImpl>();
403 CHECK_AND_RETURN_RET_LOG(outputDeviceChangeCallback_ != nullptr, ERROR, "Memory allocation failed");
404 }
405
406 outputDeviceChangeCallback_->SetAudioRendererObj(weak_from_this());
407
408 uint32_t sessionId;
409 int32_t ret = GetAudioStreamIdInner(sessionId);
410 CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ret, "Get sessionId failed");
411
412 usedSessionId_.push_back(sessionId);
413 ret = AudioPolicyManager::GetInstance().RegisterDeviceChangeWithInfoCallback(sessionId,
414 outputDeviceChangeCallback_);
415 CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ret, "Register failed");
416
417 return SUCCESS;
418 }
419
420 // Inner function. Must be called with AudioRendererPrivate::rendererMutex_
421 // or AudioRendererPrivate::streamMutex_ held.
InitAudioStream(AudioStreamParams audioStreamParams)422 int32_t AudioRendererPrivate::InitAudioStream(AudioStreamParams audioStreamParams)
423 {
424 Trace trace("AudioRenderer::InitAudioStream");
425 rendererProxyObj_->SaveRendererObj(weak_from_this());
426 audioStream_->SetRendererInfo(rendererInfo_);
427 audioStream_->SetClientID(appInfo_.appPid, appInfo_.appUid, appInfo_.appTokenId, appInfo_.appFullTokenId);
428
429 SetAudioPrivacyTypeInner(privacyType_);
430 audioStream_->SetStreamTrackerState(false);
431
432 int32_t ret = audioStream_->SetAudioStreamInfo(audioStreamParams, rendererProxyObj_);
433 CHECK_AND_RETURN_RET_LOG(!ret, ret, "SetParams SetAudioStreamInfo Failed");
434
435 ret = GetAudioStreamIdInner(sessionID_);
436 CHECK_AND_RETURN_RET_LOG(!ret, ret, "GetAudioStreamId err");
437 InitLatencyMeasurement(audioStreamParams);
438
439 return SUCCESS;
440 }
441
GetFrameCount(uint32_t & frameCount) const442 int32_t AudioRendererPrivate::GetFrameCount(uint32_t &frameCount) const
443 {
444 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
445 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, ERROR_ILLEGAL_STATE, "audioStream_ is nullptr");
446 return currentStream->GetFrameCount(frameCount);
447 }
448
GetLatency(uint64_t & latency) const449 int32_t AudioRendererPrivate::GetLatency(uint64_t &latency) const
450 {
451 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
452 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, ERROR_ILLEGAL_STATE, "audioStream_ is nullptr");
453 return currentStream->GetLatency(latency);
454 }
455
SetAudioPrivacyType(AudioPrivacyType privacyType)456 void AudioRendererPrivate::SetAudioPrivacyType(AudioPrivacyType privacyType)
457 {
458 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
459 CHECK_AND_RETURN_LOG(currentStream != nullptr, "audioStream_ is nullptr");
460 privacyType_ = privacyType;
461 currentStream->SetPrivacyType(privacyType);
462 }
463
GetAudioPrivacyType()464 AudioPrivacyType AudioRendererPrivate::GetAudioPrivacyType()
465 {
466 return privacyType_;
467 }
468
GetPreferredStreamClass(AudioStreamParams audioStreamParams)469 IAudioStream::StreamClass AudioRendererPrivate::GetPreferredStreamClass(AudioStreamParams audioStreamParams)
470 {
471 if (rendererInfo_.originalFlag == AUDIO_FLAG_FORCED_NORMAL) {
472 return IAudioStream::PA_STREAM;
473 }
474 if (rendererInfo_.originalFlag == AUDIO_FLAG_MMAP &&
475 !IAudioStream::IsStreamSupported(rendererInfo_.originalFlag, audioStreamParams)) {
476 AUDIO_WARNING_LOG("Unsupported stream params, will create normal stream");
477 rendererInfo_.originalFlag = AUDIO_FLAG_NORMAL;
478 rendererInfo_.rendererFlags = AUDIO_FLAG_NORMAL;
479 }
480
481 int32_t flag = AudioPolicyManager::GetInstance().GetPreferredOutputStreamType(rendererInfo_);
482 AUDIO_INFO_LOG("Preferred renderer flag: %{public}d", flag);
483 if (flag == AUDIO_FLAG_MMAP) {
484 rendererInfo_.rendererFlags = AUDIO_FLAG_MMAP;
485 isFastRenderer_ = true;
486 return IAudioStream::FAST_STREAM;
487 }
488 if (flag == AUDIO_FLAG_VOIP_FAST) {
489 // It is not possible to directly create a fast VoIP stream
490 isFastVoipSupported_ = true;
491 } else if (flag == AUDIO_FLAG_VOIP_DIRECT) {
492 isDirectVoipSupported_ = IsDirectVoipParams(audioStreamParams);
493 rendererInfo_.originalFlag = isDirectVoipSupported_ ? AUDIO_FLAG_VOIP_DIRECT : AUDIO_FLAG_NORMAL;
494 // The VoIP direct mode can only be used for RENDER_MODE_CALLBACK
495 rendererInfo_.rendererFlags = (isDirectVoipSupported_ && audioRenderMode_ == RENDER_MODE_CALLBACK) ?
496 AUDIO_FLAG_VOIP_DIRECT : AUDIO_FLAG_NORMAL;
497 AUDIO_INFO_LOG("Preferred renderer flag is VOIP_DIRECT. Actual flag: %{public}d", rendererInfo_.rendererFlags);
498 return IAudioStream::PA_STREAM;
499 }
500
501 AUDIO_INFO_LOG("Preferred renderer flag: AUDIO_FLAG_NORMAL");
502 rendererInfo_.rendererFlags = AUDIO_FLAG_NORMAL;
503 return IAudioStream::PA_STREAM;
504 }
505
IsDirectVoipParams(const AudioStreamParams & audioStreamParams)506 bool AudioRendererPrivate::IsDirectVoipParams(const AudioStreamParams &audioStreamParams)
507 {
508 // VoIP derect only supports 16K and 48K sampling rate.
509 if (!(audioStreamParams.samplingRate == SAMPLE_RATE_16000 ||
510 audioStreamParams.samplingRate == SAMPLE_RATE_48000)) {
511 AUDIO_ERR_LOG("The sampling rate %{public}d is not supported for direct VoIP mode",
512 audioStreamParams.samplingRate);
513 return false;
514 }
515
516 // VoIP derect only supports MONO and STEREO.
517 if (!(audioStreamParams.channels == MONO || audioStreamParams.channels == STEREO)) {
518 AUDIO_ERR_LOG("The channels %{public}d is not supported for direct VoIP mode",
519 audioStreamParams.channels);
520 return false;
521 }
522
523 // VoIP derect only supports 16bit, 32bit, 32float.
524 if (!(audioStreamParams.format == SAMPLE_S16LE || audioStreamParams.format == SAMPLE_S32LE ||
525 audioStreamParams.format == SAMPLE_F32LE)) {
526 AUDIO_ERR_LOG("The format %{public}d is not supported for direct VoIP mode",
527 audioStreamParams.format);
528 return false;
529 }
530
531 AUDIO_INFO_LOG("Valid params for direct VoIP: sampling rate %{public}d, format %{public}d, channels %{public}d",
532 audioStreamParams.samplingRate, audioStreamParams.format, audioStreamParams.channels);
533 return true;
534 }
535
SetParams(const AudioRendererParams params)536 int32_t AudioRendererPrivate::SetParams(const AudioRendererParams params)
537 {
538 Trace trace("AudioRenderer::SetParams");
539 AUDIO_INFO_LOG("StreamClientState for Renderer::SetParams.");
540
541 std::shared_lock<std::shared_mutex> lockShared(rendererMutex_);
542 std::lock_guard<std::mutex> lock(setParamsMutex_);
543 AudioStreamParams audioStreamParams = ConvertToAudioStreamParams(params);
544
545 AudioStreamType audioStreamType = IAudioStream::GetStreamType(rendererInfo_.contentType, rendererInfo_.streamUsage);
546 #ifdef SUPPORT_LOW_LATENCY
547 IAudioStream::StreamClass streamClass = GetPreferredStreamClass(audioStreamParams);
548 #else
549 rendererInfo_.originalFlag = AUDIO_FLAG_FORCED_NORMAL;
550 rendererInfo_.rendererFlags = AUDIO_FLAG_NORMAL;
551 IAudioStream::StreamClass streamClass = IAudioStream::PA_STREAM;
552 #endif
553 int32_t ret = PrepareAudioStream(audioStreamParams, audioStreamType, streamClass);
554 CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ERR_INVALID_PARAM, "PrepareAudioStream failed");
555
556 ret = InitAudioStream(audioStreamParams);
557 // When the fast stream creation fails, a normal stream is created
558 if (ret != SUCCESS && streamClass == IAudioStream::FAST_STREAM) {
559 AUDIO_INFO_LOG("Create fast Stream fail, play by normal stream.");
560 streamClass = IAudioStream::PA_STREAM;
561 isFastRenderer_ = false;
562 audioStream_ = IAudioStream::GetPlaybackStream(streamClass, audioStreamParams, audioStreamType,
563 appInfo_.appUid);
564 CHECK_AND_RETURN_RET_LOG(audioStream_ != nullptr,
565 ERR_INVALID_PARAM, "SetParams GetPlayBackStream failed when create normal stream.");
566 ret = InitAudioStream(audioStreamParams);
567 CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ret, "InitAudioStream failed");
568 audioStream_->SetRenderMode(RENDER_MODE_CALLBACK);
569 }
570
571 CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ret, "SetAudioStreamInfo Failed");
572 AUDIO_INFO_LOG("SetAudioStreamInfo Succeeded");
573
574 RegisterRendererPolicyServiceDiedCallback();
575 // eg: 100005_44100_2_1_client_in.pcm
576 std::string dumpFileName = std::to_string(sessionID_) + "_" + std::to_string(params.sampleRate) + "_" +
577 std::to_string(params.channelCount) + "_" + std::to_string(params.sampleFormat) + "_client_in.pcm";
578 DumpFileUtil::OpenDumpFile(DumpFileUtil::DUMP_CLIENT_PARA, dumpFileName, &dumpFile_);
579
580 ret = InitOutputDeviceChangeCallback();
581 CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ret, "InitOutputDeviceChangeCallback Failed");
582
583 return InitAudioInterruptCallback();
584 }
585
PrepareAudioStream(const AudioStreamParams & audioStreamParams,const AudioStreamType & audioStreamType,IAudioStream::StreamClass & streamClass)586 int32_t AudioRendererPrivate::PrepareAudioStream(const AudioStreamParams &audioStreamParams,
587 const AudioStreamType &audioStreamType, IAudioStream::StreamClass &streamClass)
588 {
589 AUDIO_INFO_LOG("Create stream with flag: %{public}d, original flag: %{public}d, streamClass: %{public}d",
590 rendererInfo_.rendererFlags, rendererInfo_.originalFlag, streamClass);
591
592 // check AudioStreamParams for fast stream
593 // As fast stream only support specified audio format, we should call GetPlaybackStream with audioStreamParams.
594 ActivateAudioConcurrency(audioStreamParams, audioStreamType, streamClass);
595 if (audioStream_ == nullptr) {
596 audioStream_ = IAudioStream::GetPlaybackStream(streamClass, audioStreamParams, audioStreamType,
597 appInfo_.appUid);
598 CHECK_AND_RETURN_RET_LOG(audioStream_ != nullptr, ERR_INVALID_PARAM, "SetParams GetPlayBackStream failed.");
599 AUDIO_INFO_LOG("IAudioStream::GetStream success");
600 isFastRenderer_ = IAudioStream::IsFastStreamClass(streamClass);
601 }
602 return SUCCESS;
603 }
604
GetParams(AudioRendererParams & params) const605 int32_t AudioRendererPrivate::GetParams(AudioRendererParams ¶ms) const
606 {
607 AudioStreamParams audioStreamParams;
608 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
609 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, ERROR_ILLEGAL_STATE, "audioStream_ is nullptr");
610 int32_t result = currentStream->GetAudioStreamInfo(audioStreamParams);
611 if (!result) {
612 params.sampleFormat = static_cast<AudioSampleFormat>(audioStreamParams.format);
613 params.sampleRate = static_cast<AudioSamplingRate>(audioStreamParams.samplingRate);
614 params.channelCount = static_cast<AudioChannel>(audioStreamParams.channels);
615 params.encodingType = static_cast<AudioEncodingType>(audioStreamParams.encoding);
616 params.channelLayout = static_cast<AudioChannelLayout>(audioStreamParams.channelLayout);
617 }
618
619 return result;
620 }
621
GetRendererInfo(AudioRendererInfo & rendererInfo) const622 int32_t AudioRendererPrivate::GetRendererInfo(AudioRendererInfo &rendererInfo) const
623 {
624 rendererInfo = rendererInfo_;
625
626 return SUCCESS;
627 }
628
GetStreamInfo(AudioStreamInfo & streamInfo) const629 int32_t AudioRendererPrivate::GetStreamInfo(AudioStreamInfo &streamInfo) const
630 {
631 AudioStreamParams audioStreamParams;
632 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
633 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, ERROR_ILLEGAL_STATE, "audioStream_ is nullptr");
634 int32_t result = currentStream->GetAudioStreamInfo(audioStreamParams);
635 if (!result) {
636 streamInfo.format = static_cast<AudioSampleFormat>(audioStreamParams.format);
637 streamInfo.samplingRate = static_cast<AudioSamplingRate>(audioStreamParams.samplingRate);
638 streamInfo.channels = static_cast<AudioChannel>(audioStreamParams.channels);
639 streamInfo.encoding = static_cast<AudioEncodingType>(audioStreamParams.encoding);
640 streamInfo.channelLayout = static_cast<AudioChannelLayout>(audioStreamParams.channelLayout);
641 }
642
643 return result;
644 }
645
SetRendererCallback(const std::shared_ptr<AudioRendererCallback> & callback)646 int32_t AudioRendererPrivate::SetRendererCallback(const std::shared_ptr<AudioRendererCallback> &callback)
647 {
648 std::shared_lock<std::shared_mutex> lockShared(rendererMutex_);
649 std::lock_guard<std::mutex> lock(setStreamCallbackMutex_);
650 // If the client is using the deprecated SetParams API. SetRendererCallback must be invoked, after SetParams.
651 // In general, callbacks can only be set after the renderer state is PREPARED.
652 RendererState state = GetStatusInner();
653 CHECK_AND_RETURN_RET_LOG(state != RENDERER_NEW && state != RENDERER_RELEASED, ERR_ILLEGAL_STATE,
654 "incorrect state:%{public}d to register cb", state);
655
656 CHECK_AND_RETURN_RET_LOG(callback != nullptr, ERR_INVALID_PARAM,
657 "callback param is null");
658
659 // Save reference for interrupt callback
660 CHECK_AND_RETURN_RET_LOG(audioInterruptCallback_ != nullptr, ERROR,
661 "audioInterruptCallback_ == nullptr");
662 std::shared_ptr<AudioRendererInterruptCallbackImpl> cbInterrupt =
663 std::static_pointer_cast<AudioRendererInterruptCallbackImpl>(audioInterruptCallback_);
664 cbInterrupt->SaveCallback(callback);
665
666 // Save and Set reference for stream callback. Order is important here.
667 if (audioStreamCallback_ == nullptr) {
668 audioStreamCallback_ = std::make_shared<AudioStreamCallbackRenderer>(weak_from_this());
669 CHECK_AND_RETURN_RET_LOG(audioStreamCallback_ != nullptr, ERROR,
670 "Failed to allocate memory for audioStreamCallback_");
671 }
672 std::shared_ptr<AudioStreamCallbackRenderer> cbStream =
673 std::static_pointer_cast<AudioStreamCallbackRenderer>(audioStreamCallback_);
674 cbStream->SaveCallback(callback);
675 (void)audioStream_->SetStreamCallback(audioStreamCallback_);
676
677 return SUCCESS;
678 }
679
SetRendererPositionCallback(int64_t markPosition,const std::shared_ptr<RendererPositionCallback> & callback)680 int32_t AudioRendererPrivate::SetRendererPositionCallback(int64_t markPosition,
681 const std::shared_ptr<RendererPositionCallback> &callback)
682 {
683 CHECK_AND_RETURN_RET_LOG((callback != nullptr) && (markPosition > 0), ERR_INVALID_PARAM,
684 "input param is invalid");
685 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
686 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, ERROR_ILLEGAL_STATE, "audioStream_ is nullptr");
687 currentStream->SetRendererPositionCallback(markPosition, callback);
688
689 return SUCCESS;
690 }
691
UnsetRendererPositionCallback()692 void AudioRendererPrivate::UnsetRendererPositionCallback()
693 {
694 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
695 CHECK_AND_RETURN_LOG(currentStream != nullptr, "audioStream_ is nullptr");
696 currentStream->UnsetRendererPositionCallback();
697 }
698
SetRendererPeriodPositionCallback(int64_t frameNumber,const std::shared_ptr<RendererPeriodPositionCallback> & callback)699 int32_t AudioRendererPrivate::SetRendererPeriodPositionCallback(int64_t frameNumber,
700 const std::shared_ptr<RendererPeriodPositionCallback> &callback)
701 {
702 CHECK_AND_RETURN_RET_LOG((callback != nullptr) && (frameNumber > 0), ERR_INVALID_PARAM,
703 "input param is invalid");
704 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
705 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, ERROR_ILLEGAL_STATE, "audioStream_ is nullptr");
706 currentStream->SetRendererPeriodPositionCallback(frameNumber, callback);
707
708 return SUCCESS;
709 }
710
UnsetRendererPeriodPositionCallback()711 void AudioRendererPrivate::UnsetRendererPeriodPositionCallback()
712 {
713 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
714 CHECK_AND_RETURN_LOG(currentStream != nullptr, "audioStream_ is nullptr");
715 currentStream->UnsetRendererPeriodPositionCallback();
716 }
717
IsAllowedStartBackgroud()718 bool AudioRendererPrivate::IsAllowedStartBackgroud()
719 {
720 bool ret = AudioPolicyManager::GetInstance().IsAllowedPlayback(appInfo_.appUid, appInfo_.appPid);
721 if (ret) {
722 AUDIO_INFO_LOG("AVSession IsAudioPlaybackAllowed is: %{public}d", ret);
723 return ret;
724 } else {
725 if (std::count(BACKGROUND_NOSTART_STREAM_USAGE.begin(), BACKGROUND_NOSTART_STREAM_USAGE.end(),
726 rendererInfo_.streamUsage) == 0) {
727 AUDIO_INFO_LOG("%{public}d is BACKGROUND_NOSTART_STREAM_USAGE", rendererInfo_.streamUsage);
728 return true;
729 }
730 }
731 return ret;
732 }
733
734 // Must be called with rendererMutex_ or streamMutex_ held.
GetStartStreamResult(StateChangeCmdType cmdType)735 bool AudioRendererPrivate::GetStartStreamResult(StateChangeCmdType cmdType)
736 {
737 bool result = audioStream_->StartAudioStream(cmdType);
738 if (!result) {
739 AUDIO_ERR_LOG("Start audio stream failed");
740 std::lock_guard<std::mutex> lock(silentModeAndMixWithOthersMutex_);
741 if (!audioStream_->GetSilentModeAndMixWithOthers()) {
742 int32_t ret = AudioPolicyManager::GetInstance().DeactivateAudioInterrupt(audioInterrupt_);
743 if (ret != 0) {
744 AUDIO_WARNING_LOG("DeactivateAudioInterrupt Failed");
745 }
746 }
747 }
748
749 state_ = RENDERER_RUNNING;
750 return result;
751 }
752
GetInnerStream() const753 std::shared_ptr<IAudioStream> AudioRendererPrivate::GetInnerStream() const
754 {
755 std::shared_lock<std::shared_mutex> lock(rendererMutex_);
756 return audioStream_;
757 }
758
CheckAndRestoreAudioRenderer(std::string callingFunc)759 int32_t AudioRendererPrivate::CheckAndRestoreAudioRenderer(std::string callingFunc)
760 {
761 std::lock_guard<std::shared_mutex> lock(rendererMutex_);
762
763 // Return in advance if there's no need for restore.
764 CHECK_AND_RETURN_RET_LOG(audioStream_, ERR_ILLEGAL_STATE, "audioStream_ is nullptr");
765 RestoreStatus restoreStatus = audioStream_->CheckRestoreStatus();
766 if (restoreStatus == NO_NEED_FOR_RESTORE) {
767 return SUCCESS;
768 }
769 if (restoreStatus == RESTORING) {
770 AUDIO_WARNING_LOG("%{public}s when restoring, return", callingFunc.c_str());
771 return ERR_ILLEGAL_STATE;
772 }
773
774 // Get restore info and target stream class for switching.
775 RestoreInfo restoreInfo;
776 audioStream_->GetRestoreInfo(restoreInfo);
777 IAudioStream::StreamClass targetClass = GetTargetStreamClass(restoreInfo.targetStreamFlag);
778
779 // Block interrupt calback, avoid pausing wrong stream.
780 std::shared_ptr<AudioRendererInterruptCallbackImpl> interruptCbImpl = nullptr;
781 if (audioInterruptCallback_ != nullptr) {
782 interruptCbImpl = std::static_pointer_cast<AudioRendererInterruptCallbackImpl>(audioInterruptCallback_);
783 interruptCbImpl->StartSwitch();
784 }
785
786 // Switch to target audio stream. Deactivate audio interrupt if switch failed.
787 AUDIO_INFO_LOG("Before %{public}s, restore audiorenderer %{public}u", callingFunc.c_str(), sessionID_);
788 if (!SwitchToTargetStream(targetClass, restoreInfo)) {
789 if (audioRendererErrorCallback_) {
790 audioRendererErrorCallback_->OnError(ERROR_SYSTEM); // Notify app if switch failed.
791 }
792 AudioInterrupt audioInterrupt = audioInterrupt_;
793 int32_t ret = AudioPolicyManager::GetInstance().DeactivateAudioInterrupt(audioInterrupt);
794 if (ret != SUCCESS) {
795 if (interruptCbImpl) {
796 interruptCbImpl->FinishSwitch();
797 }
798 AUDIO_ERR_LOG("DeactivateAudioInterrupt Failed");
799 return ERR_OPERATION_FAILED;
800 }
801 }
802 // Unblock interrupt callback.
803 if (interruptCbImpl) {
804 interruptCbImpl->FinishSwitch();
805 }
806 return SUCCESS;
807 }
808
Start(StateChangeCmdType cmdType)809 bool AudioRendererPrivate::Start(StateChangeCmdType cmdType)
810 {
811 Trace trace("AudioRenderer::Start");
812 CheckAndRestoreAudioRenderer("Start");
813 AudioXCollie audioXCollie("AudioRendererPrivate::Start", START_TIME_OUT_SECONDS,
814 [](void *) {
815 AUDIO_ERR_LOG("Start timeout");
816 }, nullptr, AUDIO_XCOLLIE_FLAG_LOG | AUDIO_XCOLLIE_FLAG_RECOVERY);
817 std::lock_guard<std::shared_mutex> lock(rendererMutex_);
818 AUDIO_INFO_LOG("StreamClientState for Renderer::Start. id: %{public}u, streamType: %{public}d, "\
819 "volume: %{public}f, interruptMode: %{public}d", sessionID_, audioInterrupt_.audioFocusType.streamType,
820 GetVolumeInner(), audioInterrupt_.mode);
821 CHECK_AND_RETURN_RET_LOG(IsAllowedStartBackgroud(), false, "Start failed. IsAllowedStartBackgroud is false");
822 RendererState state = GetStatusInner();
823 CHECK_AND_RETURN_RET_LOG((state == RENDERER_PREPARED) || (state == RENDERER_STOPPED) || (state == RENDERER_PAUSED),
824 false, "Start failed. Illegal state:%{public}u", state);
825
826 CHECK_AND_RETURN_RET_LOG(!isSwitching_, false,
827 "Start failed. Switching state: %{public}d", isSwitching_);
828
829 if (audioInterrupt_.audioFocusType.streamType == STREAM_DEFAULT ||
830 audioInterrupt_.streamId == INVALID_SESSION_ID) {
831 return false;
832 }
833
834 CHECK_AND_RETURN_RET_LOG(audioStream_ != nullptr, false, "audio stream is null");
835
836 if (GetVolumeInner() == 0 && isStillMuted_) {
837 AUDIO_INFO_LOG("StreamClientState for Renderer::Start. volume=%{public}f, isStillMuted_=%{public}d",
838 GetVolumeInner(), isStillMuted_);
839 audioInterrupt_.sessionStrategy.concurrencyMode = AudioConcurrencyMode::SILENT;
840 } else {
841 isStillMuted_ = false;
842 }
843
844 {
845 std::lock_guard<std::mutex> lockSilentMode(silentModeAndMixWithOthersMutex_);
846 if (audioStream_->GetSilentModeAndMixWithOthers()) {
847 audioInterrupt_.sessionStrategy.concurrencyMode = AudioConcurrencyMode::SILENT;
848 }
849 int32_t ret = AudioPolicyManager::GetInstance().ActivateAudioInterrupt(audioInterrupt_);
850 CHECK_AND_RETURN_RET_LOG(ret == 0, false, "ActivateAudioInterrupt Failed");
851 }
852
853 if (IsNoStreamRenderer()) {
854 // no stream renderer only need to activate audio interrupt
855 state_ = RENDERER_RUNNING;
856 return true;
857 }
858
859 return GetStartStreamResult(cmdType);
860 }
861
Write(uint8_t * buffer,size_t bufferSize)862 int32_t AudioRendererPrivate::Write(uint8_t *buffer, size_t bufferSize)
863 {
864 Trace trace("AudioRenderer::Write");
865 CheckAndRestoreAudioRenderer("Write");
866 MockPcmData(buffer, bufferSize);
867 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
868 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, ERROR_ILLEGAL_STATE, "audioStream_ is nullptr");
869 int32_t size = currentStream->Write(buffer, bufferSize);
870 if (size > 0) {
871 DumpFileUtil::WriteDumpFile(dumpFile_, static_cast<void *>(buffer), size);
872 }
873 return size;
874 }
875
Write(uint8_t * pcmBuffer,size_t pcmSize,uint8_t * metaBuffer,size_t metaSize)876 int32_t AudioRendererPrivate::Write(uint8_t *pcmBuffer, size_t pcmSize, uint8_t *metaBuffer, size_t metaSize)
877 {
878 Trace trace("Write");
879 CheckAndRestoreAudioRenderer("Write");
880 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
881 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, ERROR_ILLEGAL_STATE, "audioStream_ is nullptr");
882 int32_t size = currentStream->Write(pcmBuffer, pcmSize, metaBuffer, metaSize);
883 if (size > 0) {
884 DumpFileUtil::WriteDumpFile(dumpFile_, static_cast<void *>(pcmBuffer), size);
885 }
886 return size;
887 }
888
GetStatus() const889 RendererState AudioRendererPrivate::GetStatus() const
890 {
891 if (IsNoStreamRenderer()) {
892 return state_;
893 }
894 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
895 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, RENDERER_INVALID, "audioStream_ is nullptr");
896 return static_cast<RendererState>(currentStream->GetState());
897 }
898
GetAudioTime(Timestamp & timestamp,Timestamp::Timestampbase base) const899 bool AudioRendererPrivate::GetAudioTime(Timestamp ×tamp, Timestamp::Timestampbase base) const
900 {
901 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
902 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, ERROR_ILLEGAL_STATE, "audioStream_ is nullptr");
903 return currentStream->GetAudioTime(timestamp, base);
904 }
905
GetAudioPosition(Timestamp & timestamp,Timestamp::Timestampbase base)906 bool AudioRendererPrivate::GetAudioPosition(Timestamp ×tamp, Timestamp::Timestampbase base)
907 {
908 CheckAndRestoreAudioRenderer("GetAudioPosition");
909 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
910 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, ERROR_ILLEGAL_STATE, "audioStream_ is nullptr");
911 return currentStream->GetAudioPosition(timestamp, base);
912 }
913
Drain() const914 bool AudioRendererPrivate::Drain() const
915 {
916 Trace trace("AudioRenderer::Drain");
917 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
918 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, ERROR_ILLEGAL_STATE, "audioStream_ is nullptr");
919 return currentStream->DrainAudioStream();
920 }
921
Flush() const922 bool AudioRendererPrivate::Flush() const
923 {
924 Trace trace("AudioRenderer::Flush");
925 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
926 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, ERROR_ILLEGAL_STATE, "audioStream_ is nullptr");
927 return currentStream->FlushAudioStream();
928 }
929
PauseTransitent(StateChangeCmdType cmdType)930 bool AudioRendererPrivate::PauseTransitent(StateChangeCmdType cmdType)
931 {
932 Trace trace("AudioRenderer::PauseTransitent");
933 std::lock_guard<std::shared_mutex> lock(rendererMutex_);
934 AUDIO_INFO_LOG("StreamClientState for Renderer::PauseTransitent. id: %{public}u", sessionID_);
935 if (isSwitching_) {
936 AUDIO_ERR_LOG("failed. Switching state: %{public}d", isSwitching_);
937 return false;
938 }
939
940 if (IsNoStreamRenderer()) {
941 // no stream renderer don't need to change audio stream state
942 state_ = RENDERER_PAUSED;
943 return true;
944 }
945
946 RendererState state = GetStatusInner();
947 if (state != RENDERER_RUNNING) {
948 // If the stream is not running, there is no need to pause and deactive audio interrupt
949 AUDIO_ERR_LOG("State of stream is not running. Illegal state:%{public}u", state);
950 return false;
951 }
952 bool result = audioStream_->PauseAudioStream(cmdType);
953 if (result) {
954 state_ = RENDERER_PAUSED;
955 }
956
957 return result;
958 }
959
Mute(StateChangeCmdType cmdType) const960 bool AudioRendererPrivate::Mute(StateChangeCmdType cmdType) const
961 {
962 Trace trace("AudioRenderer::Mute");
963 std::shared_lock<std::shared_mutex> lock(rendererMutex_);
964
965 AUDIO_INFO_LOG("StreamClientState for Renderer::Mute. id: %{public}u", sessionID_);
966 (void)audioStream_->SetMute(true);
967 return true;
968 }
969
Unmute(StateChangeCmdType cmdType) const970 bool AudioRendererPrivate::Unmute(StateChangeCmdType cmdType) const
971 {
972 Trace trace("AudioRenderer::Unmute");
973 std::shared_lock<std::shared_mutex> lock(rendererMutex_);
974
975 AUDIO_INFO_LOG("StreamClientState for Renderer::Unmute. id: %{public}u", sessionID_);
976 (void)audioStream_->SetMute(false);
977 return true;
978 }
979
Pause(StateChangeCmdType cmdType)980 bool AudioRendererPrivate::Pause(StateChangeCmdType cmdType)
981 {
982 Trace trace("AudioRenderer::Pause");
983 AudioXCollie audioXCollie("AudioRenderer::Pause", TIME_OUT_SECONDS);
984 std::lock_guard<std::shared_mutex> lock(rendererMutex_);
985
986 AUDIO_INFO_LOG("StreamClientState for Renderer::Pause. id: %{public}u", sessionID_);
987
988 CHECK_AND_RETURN_RET_LOG(!isSwitching_, false, "Pause failed. Switching state: %{public}d", isSwitching_);
989
990 if (IsNoStreamRenderer()) {
991 // When the cellular call stream is pausing, only need to deactivate audio interrupt.
992 if (AudioPolicyManager::GetInstance().DeactivateAudioInterrupt(audioInterrupt_) != 0) {
993 AUDIO_ERR_LOG("DeactivateAudioInterrupt Failed");
994 }
995 state_ = RENDERER_PAUSED;
996 return true;
997 }
998
999 RendererState state = GetStatusInner();
1000 CHECK_AND_RETURN_RET_LOG(state == RENDERER_RUNNING, false,
1001 "State of stream is not running. Illegal state:%{public}u", state);
1002 bool result = audioStream_->PauseAudioStream(cmdType);
1003 if (result) {
1004 state_ = RENDERER_PAUSED;
1005 }
1006
1007 // When user is intentionally pausing, deactivate to remove from audioFocusInfoList_
1008 int32_t ret = AudioPolicyManager::GetInstance().DeactivateAudioInterrupt(audioInterrupt_);
1009 if (ret != 0) {
1010 AUDIO_ERR_LOG("DeactivateAudioInterrupt Failed");
1011 }
1012 (void)audioStream_->SetDuckVolume(1.0f);
1013
1014 return result;
1015 }
1016
Stop()1017 bool AudioRendererPrivate::Stop()
1018 {
1019 AUDIO_INFO_LOG("StreamClientState for Renderer::Stop. id: %{public}u", sessionID_);
1020 std::lock_guard<std::shared_mutex> lock(rendererMutex_);
1021 CHECK_AND_RETURN_RET_LOG(!isSwitching_, false,
1022 "AudioRenderer::Stop failed. Switching state: %{public}d", isSwitching_);
1023 if (IsNoStreamRenderer()) {
1024 // When the cellular call stream is stopping, only need to deactivate audio interrupt.
1025 if (AudioPolicyManager::GetInstance().DeactivateAudioInterrupt(audioInterrupt_) != 0) {
1026 AUDIO_WARNING_LOG("DeactivateAudioInterrupt Failed");
1027 }
1028 state_ = RENDERER_STOPPED;
1029 return true;
1030 }
1031
1032 WriteUnderrunEvent();
1033 bool result = audioStream_->StopAudioStream();
1034 if (result) {
1035 state_ = RENDERER_STOPPED;
1036 }
1037 int32_t ret = AudioPolicyManager::GetInstance().DeactivateAudioInterrupt(audioInterrupt_);
1038 if (ret != 0) {
1039 AUDIO_WARNING_LOG("DeactivateAudioInterrupt Failed");
1040 }
1041 (void)audioStream_->SetDuckVolume(1.0f);
1042
1043 return result;
1044 }
1045
Release()1046 bool AudioRendererPrivate::Release()
1047 {
1048 std::unique_lock<std::shared_mutex> lock(rendererMutex_);
1049 AUDIO_INFO_LOG("StreamClientState for Renderer::Release. id: %{public}u", sessionID_);
1050
1051 bool result = audioStream_->ReleaseAudioStream();
1052
1053 // If Stop call was skipped, Release to take care of Deactivation
1054 (void)AudioPolicyManager::GetInstance().DeactivateAudioInterrupt(audioInterrupt_);
1055
1056 // Unregister the callaback in policy server
1057 (void)AudioPolicyManager::GetInstance().UnsetAudioInterruptCallback(sessionID_);
1058
1059 for (auto id : usedSessionId_) {
1060 AudioPolicyManager::GetInstance().UnregisterDeviceChangeWithInfoCallback(id);
1061 }
1062 lock.unlock();
1063 RemoveRendererPolicyServiceDiedCallback();
1064
1065 return result;
1066 }
1067
GetBufferSize(size_t & bufferSize) const1068 int32_t AudioRendererPrivate::GetBufferSize(size_t &bufferSize) const
1069 {
1070 Trace trace("AudioRenderer::GetBufferSize");
1071 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
1072 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, ERROR_ILLEGAL_STATE, "audioStream_ is nullptr");
1073 return currentStream->GetBufferSize(bufferSize);
1074 }
1075
GetAudioStreamId(uint32_t & sessionID) const1076 int32_t AudioRendererPrivate::GetAudioStreamId(uint32_t &sessionID) const
1077 {
1078 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
1079 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, ERROR_ILLEGAL_STATE, "audioStream_ is nullptr");
1080 return currentStream->GetAudioSessionID(sessionID);
1081 }
1082
SetAudioRendererDesc(AudioRendererDesc audioRendererDesc)1083 int32_t AudioRendererPrivate::SetAudioRendererDesc(AudioRendererDesc audioRendererDesc)
1084 {
1085 ContentType contentType = audioRendererDesc.contentType;
1086 StreamUsage streamUsage = audioRendererDesc.streamUsage;
1087 AudioStreamType audioStreamType = IAudioStream::GetStreamType(contentType, streamUsage);
1088 audioInterrupt_.audioFocusType.streamType = audioStreamType;
1089 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
1090 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, ERROR_ILLEGAL_STATE, "audioStream_ is nullptr");
1091 return currentStream->SetAudioStreamType(audioStreamType);
1092 }
1093
SetStreamType(AudioStreamType audioStreamType)1094 int32_t AudioRendererPrivate::SetStreamType(AudioStreamType audioStreamType)
1095 {
1096 audioInterrupt_.audioFocusType.streamType = audioStreamType;
1097 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
1098 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, ERROR_ILLEGAL_STATE, "audioStream_ is nullptr");
1099 return currentStream->SetAudioStreamType(audioStreamType);
1100 }
1101
SetVolumeMode(int32_t mode)1102 int32_t AudioRendererPrivate::SetVolumeMode(int32_t mode)
1103 {
1104 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
1105 AUDIO_INFO_LOG("SetVolumeMode mode = %{public}d", mode);
1106 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, ERROR_ILLEGAL_STATE, "audioStream_ is nullptr");
1107 rendererInfo_.volumeMode = static_cast<AudioVolumeMode>(mode);
1108 return SUCCESS;
1109 }
1110
SetVolume(float volume) const1111 int32_t AudioRendererPrivate::SetVolume(float volume) const
1112 {
1113 UpdateAudioInterruptStrategy(volume);
1114 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
1115 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, ERROR_ILLEGAL_STATE, "audioStream_ is nullptr");
1116 return currentStream->SetVolume(volume);
1117 }
1118
UpdateAudioInterruptStrategy(float volume) const1119 void AudioRendererPrivate::UpdateAudioInterruptStrategy(float volume) const
1120 {
1121 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
1122 CHECK_AND_RETURN_LOG(currentStream != nullptr, "audioStream_ is nullptr");
1123 State currentState = currentStream->GetState();
1124 if (currentState == NEW || currentState == PREPARED) {
1125 AUDIO_INFO_LOG("UpdateAudioInterruptStrategy for set volume before RUNNING, volume=%{public}f", volume);
1126 isStillMuted_ = (volume == 0);
1127 } else if (isStillMuted_ && volume > 0) {
1128 isStillMuted_ = false;
1129 audioInterrupt_.sessionStrategy.concurrencyMode =
1130 (originalStrategy_.concurrencyMode == AudioConcurrencyMode::INVALID ?
1131 AudioConcurrencyMode::DEFAULT : originalStrategy_.concurrencyMode);
1132 if (currentState == RUNNING) {
1133 AudioInterrupt audioInterrupt = audioInterrupt_;
1134 AUDIO_INFO_LOG("UpdateAudioInterruptStrategy for set volume, volume=%{public}f", volume);
1135 int ret = AudioPolicyManager::GetInstance().ActivateAudioInterrupt(audioInterrupt, 0, true);
1136 CHECK_AND_RETURN_LOG(ret == 0, "ActivateAudioInterrupt Failed at SetVolume");
1137 }
1138 }
1139 }
1140
GetVolume() const1141 float AudioRendererPrivate::GetVolume() const
1142 {
1143 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
1144 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, ERROR_ILLEGAL_STATE, "audioStream_ is nullptr");
1145 return currentStream->GetVolume();
1146 }
1147
SetRenderRate(AudioRendererRate renderRate) const1148 int32_t AudioRendererPrivate::SetRenderRate(AudioRendererRate renderRate) const
1149 {
1150 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
1151 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, ERROR_ILLEGAL_STATE, "audioStream_ is nullptr");
1152 return currentStream->SetRenderRate(renderRate);
1153 }
1154
GetRenderRate() const1155 AudioRendererRate AudioRendererPrivate::GetRenderRate() const
1156 {
1157 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
1158 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, RENDER_RATE_NORMAL, "audioStream_ is nullptr");
1159 return currentStream->GetRenderRate();
1160 }
1161
SetRendererSamplingRate(uint32_t sampleRate) const1162 int32_t AudioRendererPrivate::SetRendererSamplingRate(uint32_t sampleRate) const
1163 {
1164 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
1165 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, ERROR_ILLEGAL_STATE, "audioStream_ is nullptr");
1166 return currentStream->SetRendererSamplingRate(sampleRate);
1167 }
1168
GetRendererSamplingRate() const1169 uint32_t AudioRendererPrivate::GetRendererSamplingRate() const
1170 {
1171 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
1172 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, ERROR_ILLEGAL_STATE, "audioStream_ is nullptr");
1173 return currentStream->GetRendererSamplingRate();
1174 }
1175
SetBufferDuration(uint64_t bufferDuration) const1176 int32_t AudioRendererPrivate::SetBufferDuration(uint64_t bufferDuration) const
1177 {
1178 CHECK_AND_RETURN_RET_LOG(bufferDuration >= MINIMUM_BUFFER_SIZE_MSEC && bufferDuration <= MAXIMUM_BUFFER_SIZE_MSEC,
1179 ERR_INVALID_PARAM, "Error: Please set the buffer duration between 5ms ~ 20ms");
1180 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
1181 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, ERROR_ILLEGAL_STATE, "audioStream_ is nullptr");
1182 return currentStream->SetBufferSizeInMsec(bufferDuration);
1183 }
1184
SetChannelBlendMode(ChannelBlendMode blendMode)1185 int32_t AudioRendererPrivate::SetChannelBlendMode(ChannelBlendMode blendMode)
1186 {
1187 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
1188 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, ERROR_ILLEGAL_STATE, "audioStream_ is nullptr");
1189 return currentStream->SetChannelBlendMode(blendMode);
1190 }
1191
AudioRendererInterruptCallbackImpl(const std::shared_ptr<IAudioStream> & audioStream,const AudioInterrupt & audioInterrupt)1192 AudioRendererInterruptCallbackImpl::AudioRendererInterruptCallbackImpl(const std::shared_ptr<IAudioStream> &audioStream,
1193 const AudioInterrupt &audioInterrupt)
1194 : audioStream_(audioStream), audioInterrupt_(audioInterrupt)
1195 {
1196 AUDIO_DEBUG_LOG("AudioRendererInterruptCallbackImpl constructor");
1197 }
1198
~AudioRendererInterruptCallbackImpl()1199 AudioRendererInterruptCallbackImpl::~AudioRendererInterruptCallbackImpl()
1200 {
1201 AUDIO_DEBUG_LOG("AudioRendererInterruptCallbackImpl: instance destroy");
1202 }
1203
SaveCallback(const std::weak_ptr<AudioRendererCallback> & callback)1204 void AudioRendererInterruptCallbackImpl::SaveCallback(const std::weak_ptr<AudioRendererCallback> &callback)
1205 {
1206 callback_ = callback;
1207 }
1208
UpdateAudioStream(const std::shared_ptr<IAudioStream> & audioStream)1209 void AudioRendererInterruptCallbackImpl::UpdateAudioStream(const std::shared_ptr<IAudioStream> &audioStream)
1210 {
1211 std::lock_guard<std::mutex> lock(mutex_);
1212 audioStream_ = audioStream;
1213 }
1214
StartSwitch()1215 void AudioRendererInterruptCallbackImpl::StartSwitch()
1216 {
1217 std::lock_guard<std::mutex> lock(mutex_);
1218 switching_ = true;
1219 AUDIO_INFO_LOG("SwitchStream start, block interrupt callback");
1220 }
1221
FinishSwitch()1222 void AudioRendererInterruptCallbackImpl::FinishSwitch()
1223 {
1224 std::lock_guard<std::mutex> lock(mutex_);
1225 switching_ = false;
1226 switchStreamCv_.notify_all();
1227 AUDIO_INFO_LOG("SwitchStream finish, notify interrupt callback");
1228 }
1229
NotifyEvent(const InterruptEvent & interruptEvent)1230 void AudioRendererInterruptCallbackImpl::NotifyEvent(const InterruptEvent &interruptEvent)
1231 {
1232 if (cb_ != nullptr && interruptEvent.callbackToApp) {
1233 cb_->OnInterrupt(interruptEvent);
1234 AUDIO_DEBUG_LOG("Send interruptEvent to app successfully");
1235 } else if (cb_ == nullptr) {
1236 AUDIO_WARNING_LOG("cb_==nullptr, failed to send interruptEvent");
1237 } else {
1238 AUDIO_INFO_LOG("callbackToApp is %{public}d", interruptEvent.callbackToApp);
1239 }
1240 }
1241
HandleForceDucking(const InterruptEventInternal & interruptEvent)1242 bool AudioRendererInterruptCallbackImpl::HandleForceDucking(const InterruptEventInternal &interruptEvent)
1243 {
1244 float duckVolumeFactor = interruptEvent.duckVolume;
1245 int32_t ret = audioStream_->SetDuckVolume(duckVolumeFactor);
1246 CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, false, "Failed to set duckVolumeFactor(instance) %{public}f",
1247 duckVolumeFactor);
1248
1249 AUDIO_INFO_LOG("Set duckVolumeFactor %{public}f successfully.", duckVolumeFactor);
1250 return true;
1251 }
1252
NotifyForcePausedToResume(const InterruptEventInternal & interruptEvent)1253 void AudioRendererInterruptCallbackImpl::NotifyForcePausedToResume(const InterruptEventInternal &interruptEvent)
1254 {
1255 // Change InterruptForceType to Share, Since app will take care of resuming
1256 InterruptEvent interruptEventResume {interruptEvent.eventType, INTERRUPT_SHARE,
1257 interruptEvent.hintType};
1258 NotifyEvent(interruptEventResume);
1259 }
1260
HandleAndNotifyForcedEvent(const InterruptEventInternal & interruptEvent)1261 InterruptCallbackEvent AudioRendererInterruptCallbackImpl::HandleAndNotifyForcedEvent(
1262 const InterruptEventInternal &interruptEvent)
1263 {
1264 State currentState = audioStream_->GetState();
1265 audioStream_->GetAudioSessionID(sessionID_);
1266 switch (interruptEvent.hintType) {
1267 case INTERRUPT_HINT_PAUSE:
1268 if (currentState == RUNNING || currentState == PREPARED) {
1269 (void)audioStream_->PauseAudioStream(); // Just Pause, do not deactivate here
1270 (void)audioStream_->SetDuckVolume(1.0f);
1271 isForcePaused_ = true;
1272 } else {
1273 AUDIO_WARNING_LOG("sessionId: %{public}u, state: %{public}d. No need to pause",
1274 sessionID_, static_cast<int32_t>(currentState));
1275 return NO_EVENT;
1276 }
1277 break;
1278 case INTERRUPT_HINT_RESUME:
1279 if ((currentState != PAUSED && currentState != PREPARED) || !isForcePaused_) {
1280 AUDIO_WARNING_LOG("sessionId: %{public}u, State: %{public}d or not force pause before",
1281 sessionID_, static_cast<int32_t>(currentState));
1282 return NO_EVENT;
1283 }
1284 isForcePaused_ = false;
1285 return FORCE_PAUSED_TO_RESUME_EVENT;
1286 case INTERRUPT_HINT_STOP:
1287 (void)audioStream_->StopAudioStream();
1288 (void)audioStream_->SetDuckVolume(1.0f);
1289 break;
1290 case INTERRUPT_HINT_DUCK:
1291 if (!HandleForceDucking(interruptEvent)) {
1292 AUDIO_WARNING_LOG("Failed to duck forcely, don't notify app");
1293 return NO_EVENT;
1294 }
1295 isForceDucked_ = true;
1296 break;
1297 case INTERRUPT_HINT_UNDUCK:
1298 CHECK_AND_RETURN_RET_LOG(isForceDucked_, NO_EVENT, "It is not forced ducked, don't unduck or notify app");
1299 (void)audioStream_->SetDuckVolume(1.0f);
1300 AUDIO_INFO_LOG("Unduck Volume successfully");
1301 isForceDucked_ = NO_EVENT;
1302 break;
1303 default: // If the hintType is NONE, don't need to send callbacks
1304 return NO_EVENT;
1305 }
1306 return FORCE_EVENT;
1307 }
1308
NotifyForcedEvent(const InterruptEventInternal & interruptEvent)1309 void AudioRendererInterruptCallbackImpl::NotifyForcedEvent(const InterruptEventInternal &interruptEvent)
1310 {
1311 InterruptEvent interruptEventForced {interruptEvent.eventType, interruptEvent.forceType, interruptEvent.hintType,
1312 interruptEvent.callbackToApp};
1313 if (interruptEventForced.hintType == INTERRUPT_HINT_RESUME) {
1314 // Reusme event should be INTERRUPT_SHARE type. Change the force type before sending the interrupt event.
1315 interruptEventForced.forceType = INTERRUPT_SHARE;
1316 }
1317 NotifyEvent(interruptEventForced);
1318 }
1319
OnInterrupt(const InterruptEventInternal & interruptEvent)1320 void AudioRendererInterruptCallbackImpl::OnInterrupt(const InterruptEventInternal &interruptEvent)
1321 {
1322 std::unique_lock<std::mutex> lock(mutex_);
1323
1324 if (switching_) {
1325 AUDIO_INFO_LOG("Wait for SwitchStream");
1326 bool res = switchStreamCv_.wait_for(lock, std::chrono::milliseconds(BLOCK_INTERRUPT_CALLBACK_IN_MS),
1327 [this] {return !switching_;});
1328 if (!res) {
1329 switching_ = false;
1330 AUDIO_WARNING_LOG("Wait for SwitchStream time out, could handle interrupt event with old stream");
1331 }
1332 }
1333 cb_ = callback_.lock();
1334 InterruptForceType forceType = interruptEvent.forceType;
1335
1336 if (audioStream_ != nullptr) {
1337 audioStream_->GetAudioSessionID(sessionID_);
1338 }
1339 AUDIO_INFO_LOG("sessionId: %{public}u, forceType: %{public}d, hintType: %{public}d",
1340 sessionID_, forceType, interruptEvent.hintType);
1341
1342 if (forceType != INTERRUPT_FORCE) { // INTERRUPT_SHARE
1343 AUDIO_DEBUG_LOG("INTERRUPT_SHARE. Let app handle the event");
1344 InterruptEvent interruptEventShared {interruptEvent.eventType, interruptEvent.forceType,
1345 interruptEvent.hintType, interruptEvent.callbackToApp};
1346 NotifyEvent(interruptEventShared);
1347 return;
1348 }
1349
1350 CHECK_AND_RETURN_LOG(audioStream_ != nullptr,
1351 "Stream is not alive. No need to take forced action");
1352
1353 auto ret = HandleAndNotifyForcedEvent(interruptEvent);
1354 lock.unlock();
1355 if (ret == FORCE_EVENT) {
1356 // Notify valid forced event callbacks to app
1357 NotifyForcedEvent(interruptEvent);
1358 } else if (ret == FORCE_PAUSED_TO_RESUME_EVENT) {
1359 // sending callback is taken care in NotifyForcePausedToResume
1360 NotifyForcePausedToResume(interruptEvent);
1361 }
1362 }
1363
AudioRendererConcurrencyCallbackImpl()1364 AudioRendererConcurrencyCallbackImpl::AudioRendererConcurrencyCallbackImpl()
1365 {
1366 AUDIO_INFO_LOG("AudioRendererConcurrencyCallbackImpl ctor");
1367 }
1368
~AudioRendererConcurrencyCallbackImpl()1369 AudioRendererConcurrencyCallbackImpl::~AudioRendererConcurrencyCallbackImpl()
1370 {
1371 AUDIO_INFO_LOG("AudioRendererConcurrencyCallbackImpl dtor");
1372 }
1373
OnConcedeStream()1374 void AudioRendererConcurrencyCallbackImpl::OnConcedeStream()
1375 {
1376 std::lock_guard<std::mutex> lock(mutex_);
1377 CHECK_AND_RETURN_LOG(renderer_ != nullptr, "renderer is nullptr");
1378 renderer_->ConcedeStream();
1379 }
1380
AudioStreamCallbackRenderer(std::weak_ptr<AudioRendererPrivate> renderer)1381 AudioStreamCallbackRenderer::AudioStreamCallbackRenderer(std::weak_ptr<AudioRendererPrivate> renderer)
1382 : renderer_(renderer)
1383 {
1384 }
1385
SaveCallback(const std::weak_ptr<AudioRendererCallback> & callback)1386 void AudioStreamCallbackRenderer::SaveCallback(const std::weak_ptr<AudioRendererCallback> &callback)
1387 {
1388 callback_ = callback;
1389 }
1390
OnStateChange(const State state,const StateChangeCmdType cmdType)1391 void AudioStreamCallbackRenderer::OnStateChange(const State state, const StateChangeCmdType cmdType)
1392 {
1393 std::shared_ptr<AudioRendererPrivate> rendererObj = renderer_.lock();
1394 CHECK_AND_RETURN_LOG(rendererObj != nullptr, "rendererObj is nullptr");
1395 std::shared_ptr<AudioRendererCallback> cb = callback_.lock();
1396 CHECK_AND_RETURN_LOG(cb != nullptr, "cb == nullptr.");
1397
1398 auto renderState = static_cast<RendererState>(state);
1399 cb->OnStateChange(renderState, cmdType);
1400
1401 AudioInterrupt audioInterrupt;
1402 rendererObj->GetAudioInterrupt(audioInterrupt);
1403 audioInterrupt.state = state;
1404 rendererObj->SetAudioInterrupt(audioInterrupt);
1405 }
1406
GetSupportedFormats()1407 std::vector<AudioSampleFormat> AudioRenderer::GetSupportedFormats()
1408 {
1409 return AUDIO_SUPPORTED_FORMATS;
1410 }
1411
GetSupportedSamplingRates()1412 std::vector<AudioSamplingRate> AudioRenderer::GetSupportedSamplingRates()
1413 {
1414 return AUDIO_SUPPORTED_SAMPLING_RATES;
1415 }
1416
GetSupportedChannels()1417 std::vector<AudioChannel> AudioRenderer::GetSupportedChannels()
1418 {
1419 return RENDERER_SUPPORTED_CHANNELS;
1420 }
1421
GetSupportedEncodingTypes()1422 std::vector<AudioEncodingType> AudioRenderer::GetSupportedEncodingTypes()
1423 {
1424 return AUDIO_SUPPORTED_ENCODING_TYPES;
1425 }
1426
SetRenderMode(AudioRenderMode renderMode)1427 int32_t AudioRendererPrivate::SetRenderMode(AudioRenderMode renderMode)
1428 {
1429 AUDIO_INFO_LOG("Render mode: %{public}d", renderMode);
1430 audioRenderMode_ = renderMode;
1431 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
1432 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, ERROR_ILLEGAL_STATE, "audioStream_ is nullptr");
1433 if (renderMode == RENDER_MODE_CALLBACK && rendererInfo_.originalFlag != AUDIO_FLAG_FORCED_NORMAL &&
1434 (rendererInfo_.streamUsage == STREAM_USAGE_VOICE_COMMUNICATION ||
1435 rendererInfo_.streamUsage == STREAM_USAGE_VIDEO_COMMUNICATION)) {
1436 // both fast and direct VoIP renderer can only use RENDER_MODE_CALLBACK;
1437 int32_t flags = AudioPolicyManager::GetInstance().GetPreferredOutputStreamType(rendererInfo_);
1438 uint32_t sessionId = 0;
1439 int32_t ret = currentStream->GetAudioSessionID(sessionId);
1440 CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ret, "Get audio session Id failed");
1441 IAudioStream::StreamClass streamClass = IAudioStream::PA_STREAM;
1442 if (flags == AUDIO_FLAG_VOIP_FAST) {
1443 AUDIO_INFO_LOG("Switch to fast voip stream");
1444 streamClass = IAudioStream::VOIP_STREAM;
1445 } else if (flags == AUDIO_FLAG_VOIP_DIRECT && isDirectVoipSupported_) {
1446 AUDIO_INFO_LOG("Switch to direct voip stream");
1447 rendererInfo_.rendererFlags = AUDIO_FLAG_VOIP_DIRECT;
1448 streamClass = IAudioStream::PA_STREAM;
1449 }
1450 RestoreInfo restoreInfo;
1451 if (!SwitchToTargetStream(streamClass, restoreInfo)) {
1452 AUDIO_ERR_LOG("Switch to target stream failed");
1453 return ERROR;
1454 }
1455 // audioStream_ has been updated by SwitchToTargetStream. Update currentStream before SetRenderMode.
1456 currentStream = GetInnerStream();
1457 CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ret, "Register device change callback for new session failed");
1458 }
1459
1460 return currentStream->SetRenderMode(renderMode);
1461 }
1462
GetRenderMode() const1463 AudioRenderMode AudioRendererPrivate::GetRenderMode() const
1464 {
1465 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
1466 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, RENDER_MODE_NORMAL, "audioStream_ is nullptr");
1467 return currentStream->GetRenderMode();
1468 }
1469
GetBufferDesc(BufferDesc & bufDesc)1470 int32_t AudioRendererPrivate::GetBufferDesc(BufferDesc &bufDesc)
1471 {
1472 CheckAndRestoreAudioRenderer("GetBufferDesc");
1473 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
1474 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, ERROR_ILLEGAL_STATE, "audioStream_ is nullptr");
1475 int32_t ret = currentStream->GetBufferDesc(bufDesc);
1476 return ret;
1477 }
1478
Enqueue(const BufferDesc & bufDesc)1479 int32_t AudioRendererPrivate::Enqueue(const BufferDesc &bufDesc)
1480 {
1481 Trace trace("AudioRenderer::Enqueue");
1482 CheckAndRestoreAudioRenderer("Enqueue");
1483 MockPcmData(bufDesc.buffer, bufDesc.bufLength);
1484 DumpFileUtil::WriteDumpFile(dumpFile_, static_cast<void *>(bufDesc.buffer), bufDesc.bufLength);
1485 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
1486 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, ERROR_ILLEGAL_STATE, "audioStream_ is nullptr");
1487 int32_t ret = currentStream->Enqueue(bufDesc);
1488 return ret;
1489 }
1490
Clear() const1491 int32_t AudioRendererPrivate::Clear() const
1492 {
1493 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
1494 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, ERROR_ILLEGAL_STATE, "audioStream_ is nullptr");
1495 return currentStream->Clear();
1496 }
1497
GetBufQueueState(BufferQueueState & bufState) const1498 int32_t AudioRendererPrivate::GetBufQueueState(BufferQueueState &bufState) const
1499 {
1500 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
1501 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, ERROR_ILLEGAL_STATE, "audioStream_ is nullptr");
1502 return currentStream->GetBufQueueState(bufState);
1503 }
1504
SetRendererWriteCallback(const std::shared_ptr<AudioRendererWriteCallback> & callback)1505 int32_t AudioRendererPrivate::SetRendererWriteCallback(const std::shared_ptr<AudioRendererWriteCallback> &callback)
1506 {
1507 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
1508 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, ERROR_ILLEGAL_STATE, "audioStream_ is nullptr");
1509 return currentStream->SetRendererWriteCallback(callback);
1510 }
1511
SetRendererFirstFrameWritingCallback(const std::shared_ptr<AudioRendererFirstFrameWritingCallback> & callback)1512 int32_t AudioRendererPrivate::SetRendererFirstFrameWritingCallback(
1513 const std::shared_ptr<AudioRendererFirstFrameWritingCallback> &callback)
1514 {
1515 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
1516 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, ERROR_ILLEGAL_STATE, "audioStream_ is nullptr");
1517 return currentStream->SetRendererFirstFrameWritingCallback(callback);
1518 }
1519
SetInterruptMode(InterruptMode mode)1520 void AudioRendererPrivate::SetInterruptMode(InterruptMode mode)
1521 {
1522 AUDIO_INFO_LOG("InterruptMode %{public}d", mode);
1523 if (audioInterrupt_.mode == mode) {
1524 return;
1525 } else if (mode != SHARE_MODE && mode != INDEPENDENT_MODE) {
1526 AUDIO_ERR_LOG("Invalid interrupt mode!");
1527 return;
1528 }
1529 audioInterrupt_.mode = mode;
1530 }
1531
SetSilentModeAndMixWithOthers(bool on)1532 void AudioRendererPrivate::SetSilentModeAndMixWithOthers(bool on)
1533 {
1534 Trace trace(std::string("AudioRenderer::SetSilentModeAndMixWithOthers:") + (on ? "on" : "off"));
1535 std::shared_lock<std::shared_mutex> sharedLockSwitch(rendererMutex_);
1536 std::lock_guard<std::mutex> lock(silentModeAndMixWithOthersMutex_);
1537 if (audioStream_->GetSilentModeAndMixWithOthers() && !on) {
1538 audioInterrupt_.sessionStrategy.concurrencyMode = originalStrategy_.concurrencyMode;
1539 if (static_cast<RendererState>(audioStream_->GetState()) == RENDERER_RUNNING) {
1540 int32_t ret = AudioPolicyManager::GetInstance().ActivateAudioInterrupt(audioInterrupt_, 0, true);
1541 CHECK_AND_RETURN_LOG(ret == SUCCESS, "ActivateAudioInterrupt Failed");
1542 }
1543 audioStream_->SetSilentModeAndMixWithOthers(on);
1544 return;
1545 } else if (!audioStream_->GetSilentModeAndMixWithOthers() && on) {
1546 audioStream_->SetSilentModeAndMixWithOthers(on);
1547 audioInterrupt_.sessionStrategy.concurrencyMode = AudioConcurrencyMode::SILENT;
1548 if (static_cast<RendererState>(audioStream_->GetState()) == RENDERER_RUNNING) {
1549 int32_t ret = AudioPolicyManager::GetInstance().ActivateAudioInterrupt(audioInterrupt_, 0, true);
1550 CHECK_AND_RETURN_LOG(ret == SUCCESS, "ActivateAudioInterrupt Failed");
1551 }
1552 return;
1553 }
1554 audioStream_->SetSilentModeAndMixWithOthers(on);
1555 }
1556
GetSilentModeAndMixWithOthers()1557 bool AudioRendererPrivate::GetSilentModeAndMixWithOthers()
1558 {
1559 std::lock_guard<std::mutex> lock(silentModeAndMixWithOthersMutex_);
1560 return audioStream_->GetSilentModeAndMixWithOthers();
1561 }
1562
SetParallelPlayFlag(bool parallelPlayFlag)1563 int32_t AudioRendererPrivate::SetParallelPlayFlag(bool parallelPlayFlag)
1564 {
1565 AUDIO_PRERELEASE_LOGI("parallelPlayFlag %{public}d", parallelPlayFlag);
1566 audioInterrupt_.parallelPlayFlag = parallelPlayFlag;
1567 return SUCCESS;
1568 }
1569
SetLowPowerVolume(float volume) const1570 int32_t AudioRendererPrivate::SetLowPowerVolume(float volume) const
1571 {
1572 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
1573 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, ERROR_ILLEGAL_STATE, "audioStream_ is nullptr");
1574 return currentStream->SetLowPowerVolume(volume);
1575 }
1576
GetLowPowerVolume() const1577 float AudioRendererPrivate::GetLowPowerVolume() const
1578 {
1579 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
1580 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, ERROR_ILLEGAL_STATE, "audioStream_ is nullptr");
1581 return currentStream->GetLowPowerVolume();
1582 }
1583
SetOffloadAllowed(bool isAllowed)1584 int32_t AudioRendererPrivate::SetOffloadAllowed(bool isAllowed)
1585 {
1586 AUDIO_PRERELEASE_LOGI("offload allowed: %{public}d", isAllowed);
1587 rendererInfo_.isOffloadAllowed = isAllowed;
1588 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
1589 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, ERROR_ILLEGAL_STATE, "audioStream_ is nullptr");
1590 currentStream->SetRendererInfo(rendererInfo_);
1591 return SUCCESS;
1592 }
1593
SetOffloadMode(int32_t state,bool isAppBack) const1594 int32_t AudioRendererPrivate::SetOffloadMode(int32_t state, bool isAppBack) const
1595 {
1596 AUDIO_INFO_LOG("set offload mode for session %{public}u", sessionID_);
1597 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
1598 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, ERROR_ILLEGAL_STATE, "audioStream_ is nullptr");
1599 return currentStream->SetOffloadMode(state, isAppBack);
1600 }
1601
UnsetOffloadMode() const1602 int32_t AudioRendererPrivate::UnsetOffloadMode() const
1603 {
1604 AUDIO_INFO_LOG("session %{public}u session unset offload", sessionID_);
1605 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
1606 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, ERROR_ILLEGAL_STATE, "audioStream_ is nullptr");
1607 int32_t ret = currentStream->UnsetOffloadMode();
1608 CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ret, "unset offload failed");
1609 return SUCCESS;
1610 }
1611
GetSingleStreamVolume() const1612 float AudioRendererPrivate::GetSingleStreamVolume() const
1613 {
1614 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
1615 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, ERROR_ILLEGAL_STATE, "audioStream_ is nullptr");
1616 return currentStream->GetSingleStreamVolume();
1617 }
1618
GetMinStreamVolume() const1619 float AudioRendererPrivate::GetMinStreamVolume() const
1620 {
1621 return AudioPolicyManager::GetInstance().GetMinStreamVolume();
1622 }
1623
GetMaxStreamVolume() const1624 float AudioRendererPrivate::GetMaxStreamVolume() const
1625 {
1626 return AudioPolicyManager::GetInstance().GetMaxStreamVolume();
1627 }
1628
GetCurrentOutputDevices(AudioDeviceDescriptor & deviceInfo) const1629 int32_t AudioRendererPrivate::GetCurrentOutputDevices(AudioDeviceDescriptor &deviceInfo) const
1630 {
1631 std::vector<std::shared_ptr<AudioRendererChangeInfo>> audioRendererChangeInfos;
1632 uint32_t sessionId = static_cast<uint32_t>(-1);
1633 int32_t ret = GetAudioStreamId(sessionId);
1634 CHECK_AND_RETURN_RET_LOG(!ret, ret, " Get sessionId failed");
1635
1636 ret = AudioPolicyManager::GetInstance().GetCurrentRendererChangeInfos(audioRendererChangeInfos);
1637 CHECK_AND_RETURN_RET_LOG(!ret, ret, "Get Current Renderer devices failed");
1638
1639 for (auto it = audioRendererChangeInfos.begin(); it != audioRendererChangeInfos.end(); it++) {
1640 if ((*it)->sessionId == static_cast<int32_t>(sessionId)) {
1641 deviceInfo = (*it)->outputDeviceInfo;
1642 }
1643 }
1644 return SUCCESS;
1645 }
1646
GetUnderflowCount() const1647 uint32_t AudioRendererPrivate::GetUnderflowCount() const
1648 {
1649 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
1650 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, ERROR_ILLEGAL_STATE, "audioStream_ is nullptr");
1651 return currentStream->GetUnderflowCount();
1652 }
1653
1654
SetAudioRendererErrorCallback(std::shared_ptr<AudioRendererErrorCallback> errorCallback)1655 void AudioRendererPrivate::SetAudioRendererErrorCallback(std::shared_ptr<AudioRendererErrorCallback> errorCallback)
1656 {
1657 std::shared_lock sharedLock(rendererMutex_);
1658 std::lock_guard lock(audioRendererErrCallbackMutex_);
1659 audioRendererErrorCallback_ = errorCallback;
1660 }
1661
RegisterAudioPolicyServerDiedCb(const int32_t clientPid,const std::shared_ptr<AudioRendererPolicyServiceDiedCallback> & callback)1662 int32_t AudioRendererPrivate::RegisterAudioPolicyServerDiedCb(const int32_t clientPid,
1663 const std::shared_ptr<AudioRendererPolicyServiceDiedCallback> &callback)
1664 {
1665 AUDIO_INFO_LOG("RegisterAudioPolicyServerDiedCb client id: %{public}d", clientPid);
1666 CHECK_AND_RETURN_RET_LOG(callback != nullptr, ERR_INVALID_PARAM, "callback is null");
1667
1668 std::lock_guard<std::mutex> lock(policyServiceDiedCallbackMutex_);
1669
1670 policyServiceDiedCallback_ = callback;
1671 return AudioPolicyManager::GetInstance().RegisterAudioPolicyServerDiedCb(clientPid, callback);
1672 }
1673
UnregisterAudioPolicyServerDiedCb(const int32_t clientPid)1674 int32_t AudioRendererPrivate::UnregisterAudioPolicyServerDiedCb(const int32_t clientPid)
1675 {
1676 AUDIO_INFO_LOG("UnregisterAudioPolicyServerDiedCb client id: %{public}d", clientPid);
1677 return AudioPolicyManager::GetInstance().UnregisterAudioPolicyServerDiedCb(clientPid);
1678 }
1679
RegisterOutputDeviceChangeWithInfoCallback(const std::shared_ptr<AudioRendererOutputDeviceChangeCallback> & callback)1680 int32_t AudioRendererPrivate::RegisterOutputDeviceChangeWithInfoCallback(
1681 const std::shared_ptr<AudioRendererOutputDeviceChangeCallback> &callback)
1682 {
1683 AUDIO_INFO_LOG("in");
1684 if (callback == nullptr) {
1685 AUDIO_ERR_LOG("callback is null");
1686 return ERR_INVALID_PARAM;
1687 }
1688
1689 outputDeviceChangeCallback_->SaveCallback(callback);
1690 AUDIO_DEBUG_LOG("successful!");
1691 return SUCCESS;
1692 }
1693
UnregisterOutputDeviceChangeWithInfoCallback()1694 int32_t AudioRendererPrivate::UnregisterOutputDeviceChangeWithInfoCallback()
1695 {
1696 AUDIO_INFO_LOG("Unregister all");
1697
1698 outputDeviceChangeCallback_->RemoveCallback();
1699 return SUCCESS;
1700 }
1701
UnregisterOutputDeviceChangeWithInfoCallback(const std::shared_ptr<AudioRendererOutputDeviceChangeCallback> & callback)1702 int32_t AudioRendererPrivate::UnregisterOutputDeviceChangeWithInfoCallback(
1703 const std::shared_ptr<AudioRendererOutputDeviceChangeCallback> &callback)
1704 {
1705 AUDIO_INFO_LOG("in");
1706
1707 outputDeviceChangeCallback_->RemoveCallback(callback);
1708 return SUCCESS;
1709 }
1710
SetSwitchInfo(IAudioStream::SwitchInfo info,std::shared_ptr<IAudioStream> audioStream)1711 bool AudioRendererPrivate::SetSwitchInfo(IAudioStream::SwitchInfo info, std::shared_ptr<IAudioStream> audioStream)
1712 {
1713 CHECK_AND_RETURN_RET_LOG(audioStream, false, "stream is nullptr");
1714
1715 audioStream->SetStreamTrackerState(false);
1716 audioStream->SetClientID(info.clientPid, info.clientUid, appInfo_.appTokenId, appInfo_.appFullTokenId);
1717 audioStream->SetPrivacyType(info.privacyType);
1718 audioStream->SetRendererInfo(info.rendererInfo);
1719 audioStream->SetCapturerInfo(info.capturerInfo);
1720 int32_t res = audioStream->SetAudioStreamInfo(info.params, rendererProxyObj_);
1721 CHECK_AND_RETURN_RET_LOG(res == SUCCESS, false, "SetAudioStreamInfo failed");
1722 audioStream->SetDefaultOutputDevice(info.defaultOutputDevice);
1723 audioStream->SetRenderMode(info.renderMode);
1724 audioStream->SetAudioEffectMode(info.effectMode);
1725 audioStream->SetVolume(info.volume);
1726 audioStream->SetUnderflowCount(info.underFlowCount);
1727
1728 if (info.userSettedPreferredFrameSize.has_value()) {
1729 audioStream->SetPreferredFrameSize(info.userSettedPreferredFrameSize.value());
1730 }
1731
1732 audioStream->SetSilentModeAndMixWithOthers(info.silentModeAndMixWithOthers);
1733
1734 if (speed_.has_value()) {
1735 audioStream->SetSpeed(speed_.value());
1736 }
1737
1738 // set callback
1739 if ((info.renderPositionCb != nullptr) && (info.frameMarkPosition > 0)) {
1740 audioStream->SetRendererPositionCallback(info.frameMarkPosition, info.renderPositionCb);
1741 }
1742
1743 if ((info.capturePositionCb != nullptr) && (info.frameMarkPosition > 0)) {
1744 audioStream->SetCapturerPositionCallback(info.frameMarkPosition, info.capturePositionCb);
1745 }
1746
1747 if ((info.renderPeriodPositionCb != nullptr) && (info.framePeriodNumber > 0)) {
1748 audioStream->SetRendererPeriodPositionCallback(info.framePeriodNumber, info.renderPeriodPositionCb);
1749 }
1750
1751 if ((info.capturePeriodPositionCb != nullptr) && (info.framePeriodNumber > 0)) {
1752 audioStream->SetCapturerPeriodPositionCallback(info.framePeriodNumber, info.capturePeriodPositionCb);
1753 }
1754
1755 audioStream->SetStreamCallback(info.audioStreamCallback);
1756 audioStream->SetRendererWriteCallback(info.rendererWriteCallback);
1757
1758 audioStream->SetRendererFirstFrameWritingCallback(info.rendererFirstFrameWritingCallback);
1759 return true;
1760 }
1761
1762 // The only function that updates AudioRendererPrivate::audioStream_ in its life cycle.
UpdateRendererAudioStream(const std::shared_ptr<IAudioStream> & newAudioStream)1763 void AudioRendererPrivate::UpdateRendererAudioStream(const std::shared_ptr<IAudioStream> &newAudioStream)
1764 {
1765 audioStream_ = newAudioStream;
1766 if (audioInterruptCallback_ != nullptr) {
1767 std::shared_ptr<AudioRendererInterruptCallbackImpl> interruptCbImpl =
1768 std::static_pointer_cast<AudioRendererInterruptCallbackImpl>(audioInterruptCallback_);
1769 interruptCbImpl->UpdateAudioStream(audioStream_);
1770 }
1771 }
1772
1773 // Inner function. Must be called with AudioRendererPrivate::rendererMutex_ held;
UnsetOffloadModeInner() const1774 int32_t AudioRendererPrivate::UnsetOffloadModeInner() const
1775 {
1776 AUDIO_INFO_LOG("session %{public}u session unset offload", sessionID_);
1777 int32_t ret = audioStream_->UnsetOffloadMode();
1778 CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ret, "unset offload failed");
1779 return SUCCESS;
1780 }
1781
1782 // Inner function. Must be called with AudioRendererPrivate::rendererMutex_
1783 // or AudioRendererPrivate::streamMutex_ held.
GetStatusInner()1784 RendererState AudioRendererPrivate::GetStatusInner()
1785 {
1786 if (IsNoStreamRenderer()) {
1787 return state_;
1788 }
1789 return static_cast<RendererState>(audioStream_->GetState());
1790 }
1791
1792 // Inner function. Must be called with AudioRendererPrivate::rendererMutex_
1793 // or AudioRendererPrivate::streamMutex_ held.
SetAudioPrivacyTypeInner(AudioPrivacyType privacyType)1794 void AudioRendererPrivate::SetAudioPrivacyTypeInner(AudioPrivacyType privacyType)
1795 {
1796 CHECK_AND_RETURN_LOG(audioStream_ != nullptr, "audioStream_ is nullptr");
1797 privacyType_ = privacyType;
1798 audioStream_->SetPrivacyType(privacyType);
1799 }
1800
1801 // Inner function. Must be called with AudioRendererPrivate::rendererMutex_
1802 // or AudioRendererPrivate::streamMutex_ held.
GetAudioStreamIdInner(uint32_t & sessionID) const1803 int32_t AudioRendererPrivate::GetAudioStreamIdInner(uint32_t &sessionID) const
1804 {
1805 return audioStream_->GetAudioSessionID(sessionID);
1806 }
1807
1808 // Inner function. Must be called with AudioRendererPrivate::rendererMutex_
1809 // or AudioRendererPrivate::streamMutex_ held.
GetVolumeInner() const1810 float AudioRendererPrivate::GetVolumeInner() const
1811 {
1812 return audioStream_->GetVolume();
1813 }
1814
1815 // Inner function. Must be called with AudioRendererPrivate::rendererMutex_
1816 // or AudioRendererPrivate::streamMutex_ held.
GetUnderflowCountInner() const1817 uint32_t AudioRendererPrivate::GetUnderflowCountInner() const
1818 {
1819 return audioStream_->GetUnderflowCount();
1820 }
1821
1822 // Only called in SwitchToTargetStream, with AudioRendererPrivate::rendererMutex_ held.
InitSwitchInfo(IAudioStream::StreamClass targetClass,IAudioStream::SwitchInfo & info)1823 void AudioRendererPrivate::InitSwitchInfo(IAudioStream::StreamClass targetClass, IAudioStream::SwitchInfo &info)
1824 {
1825 audioStream_->GetSwitchInfo(info);
1826 if (targetClass == IAudioStream::VOIP_STREAM) {
1827 info.rendererInfo.originalFlag = AUDIO_FLAG_VOIP_FAST;
1828 }
1829
1830 if (rendererInfo_.rendererFlags == AUDIO_FLAG_VOIP_DIRECT) {
1831 info.rendererInfo.originalFlag = AUDIO_FLAG_VOIP_DIRECT;
1832 info.rendererInfo.rendererFlags = AUDIO_FLAG_VOIP_DIRECT;
1833 info.rendererFlags = AUDIO_FLAG_VOIP_DIRECT;
1834 } else if (rendererInfo_.rendererFlags == AUDIO_FLAG_DIRECT) {
1835 info.rendererInfo.pipeType = PIPE_TYPE_DIRECT_MUSIC;
1836 info.rendererFlags = AUDIO_FLAG_DIRECT;
1837 } else if (rendererInfo_.rendererFlags == AUDIO_FLAG_NORMAL) {
1838 info.rendererInfo.rendererFlags = AUDIO_FLAG_NORMAL;
1839 } else if (rendererInfo_.rendererFlags == AUDIO_FLAG_MMAP) {
1840 info.rendererInfo.rendererFlags = AUDIO_FLAG_MMAP;
1841 }
1842 info.params.originalSessionId = sessionID_;
1843 return;
1844 }
1845
1846 // Only called in SwitchToTargetStream, with AudioRendererPrivate::rendererMutex_ held.
UpdateFramesWritten()1847 void AudioRendererPrivate::UpdateFramesWritten()
1848 {
1849 int64_t framesWritten = audioStream_->GetFramesWritten();
1850 if (framesWritten > 0) {
1851 framesAlreadyWritten_ += framesWritten;
1852 AUDIO_INFO_LOG("Frames already written: %{public}" PRId64 ", current stream value: %{public}" PRId64 ".",
1853 framesAlreadyWritten_, framesWritten);
1854 }
1855 }
1856
1857 // Set new stream info before switching to new stream.
InitTargetStream(IAudioStream::SwitchInfo & info,std::shared_ptr<IAudioStream> & newAudioStream)1858 bool AudioRendererPrivate::InitTargetStream(IAudioStream::SwitchInfo &info,
1859 std::shared_ptr<IAudioStream> &newAudioStream)
1860 {
1861 bool initResult = SetSwitchInfo(info, newAudioStream);
1862 if (initResult != SUCCESS && info.rendererInfo.originalFlag != AUDIO_FLAG_NORMAL) {
1863 AUDIO_ERR_LOG("Re-create stream failed, crate normal ipc stream");
1864 isFastRenderer_ = false;
1865 newAudioStream = IAudioStream::GetPlaybackStream(IAudioStream::PA_STREAM, info.params,
1866 info.eStreamType, appInfo_.appPid);
1867 CHECK_AND_RETURN_RET_LOG(newAudioStream != nullptr, false, "Get ipc stream failed");
1868 initResult = SetSwitchInfo(info, newAudioStream);
1869 CHECK_AND_RETURN_RET_LOG(initResult, false, "Init ipc strean failed");
1870 }
1871 return initResult;
1872 }
1873
FinishOldStream(IAudioStream::StreamClass targetClass,RestoreInfo restoreInfo,RendererState previousState,IAudioStream::SwitchInfo & switchInfo)1874 bool AudioRendererPrivate::FinishOldStream(IAudioStream::StreamClass targetClass, RestoreInfo restoreInfo,
1875 RendererState previousState, IAudioStream::SwitchInfo &switchInfo)
1876 {
1877 audioStream_->SetMute(true); // Do not record this status in recover(InitSwitchInfo)
1878 bool switchResult = false;
1879 if (previousState == RENDERER_RUNNING) {
1880 switchResult = audioStream_->StopAudioStream();
1881 if (restoreInfo.restoreReason != SERVER_DIED) {
1882 CHECK_AND_RETURN_RET_LOG(switchResult, false, "StopAudioStream failed.");
1883 } else {
1884 switchResult = true;
1885 }
1886 }
1887 InitSwitchInfo(targetClass, switchInfo);
1888 UpdateFramesWritten();
1889 switchResult = audioStream_->ReleaseAudioStream(true, true);
1890 if (restoreInfo.restoreReason != SERVER_DIED) {
1891 CHECK_AND_RETURN_RET_LOG(switchResult, false, "release old stream failed.");
1892 } else {
1893 switchResult = true;
1894 }
1895 return switchResult;
1896 }
1897
GenerateNewStream(IAudioStream::StreamClass targetClass,RestoreInfo restoreInfo,RendererState previousState,IAudioStream::SwitchInfo & switchInfo)1898 bool AudioRendererPrivate::GenerateNewStream(IAudioStream::StreamClass targetClass, RestoreInfo restoreInfo,
1899 RendererState previousState, IAudioStream::SwitchInfo &switchInfo)
1900 {
1901 bool switchResult = false;
1902 // create new IAudioStream
1903 std::shared_ptr<IAudioStream> newAudioStream = IAudioStream::GetPlaybackStream(targetClass, switchInfo.params,
1904 switchInfo.eStreamType, appInfo_.appPid);
1905 CHECK_AND_RETURN_RET_LOG(newAudioStream != nullptr, false, "SetParams GetPlayBackStream failed.");
1906 AUDIO_INFO_LOG("Get new stream success!");
1907
1908 // set new stream info. When switch to fast stream failed, call SetSwitchInfo again
1909 // and switch to normal ipc stream to avoid silence.
1910 switchResult = SetSwitchInfo(switchInfo, newAudioStream);
1911 if (!switchResult && switchInfo.rendererInfo.originalFlag != AUDIO_FLAG_NORMAL) {
1912 AUDIO_ERR_LOG("Re-create stream failed, create normal ipc stream");
1913 newAudioStream = IAudioStream::GetPlaybackStream(IAudioStream::PA_STREAM, switchInfo.params,
1914 switchInfo.eStreamType, appInfo_.appPid);
1915 CHECK_AND_RETURN_RET_LOG(newAudioStream != nullptr, false, "Get ipc stream failed");
1916 switchResult = SetSwitchInfo(switchInfo, newAudioStream);
1917 CHECK_AND_RETURN_RET_LOG(switchResult, false, "Init ipc stream failed");
1918 }
1919
1920 // Start new stream if old stream was in running state.
1921 // When restoring for audio server died, no need for restart.
1922 if (restoreInfo.restoreReason == SERVER_DIED && IsNoStreamRenderer()) {
1923 AUDIO_INFO_LOG("Telephony scene , no need for start");
1924 } else if (previousState == RENDERER_RUNNING) {
1925 // restart audio stream
1926 switchResult = newAudioStream->StartAudioStream(CMD_FROM_CLIENT,
1927 static_cast<AudioStreamDeviceChangeReasonExt::ExtEnum>(restoreInfo.deviceChangeReason));
1928 CHECK_AND_RETURN_RET_LOG(switchResult, false, "start new stream failed.");
1929 }
1930
1931 // Update audioStream_ to newAudioStream in both AudioRendererPrivate and AudioInterruptCallbackImpl.
1932 UpdateRendererAudioStream(newAudioStream);
1933 isFastRenderer_ = IAudioStream::IsFastStreamClass(targetClass);
1934 return switchResult;
1935 }
1936
ContinueAfterConcede(IAudioStream::StreamClass & targetClass,RestoreInfo restoreInfo)1937 bool AudioRendererPrivate::ContinueAfterConcede(IAudioStream::StreamClass &targetClass, RestoreInfo restoreInfo)
1938 {
1939 CHECK_AND_RETURN_RET(restoreInfo.restoreReason == STREAM_CONCEDED, true);
1940 targetClass = IAudioStream::PA_STREAM;
1941 uint32_t sessionId = sessionID_;
1942 GetAudioStreamIdInner(sessionId);
1943 AudioPipeType pipeType = PIPE_TYPE_NORMAL_OUT;
1944 audioStream_->GetAudioPipeType(pipeType);
1945 AUDIO_INFO_LOG("session %{public}u concede from pipeType %{public}d", sessionID_, rendererInfo_.pipeType);
1946 rendererInfo_.pipeType = PIPE_TYPE_NORMAL_OUT;
1947 rendererInfo_.isOffloadAllowed = false;
1948 audioStream_->SetRendererInfo(rendererInfo_);
1949 if (pipeType == PIPE_TYPE_OFFLOAD) {
1950 UnsetOffloadModeInner();
1951 AudioPolicyManager::GetInstance().MoveToNewPipe(sessionId, PIPE_TYPE_NORMAL_OUT);
1952 audioStream_->SetRestoreStatus(NO_NEED_FOR_RESTORE);
1953 return false;
1954 }
1955 if ((pipeType == PIPE_TYPE_LOWLATENCY_OUT && audioStream_->GetStreamClass() != IAudioStream::PA_STREAM) ||
1956 pipeType == PIPE_TYPE_DIRECT_MUSIC) {
1957 return true;
1958 }
1959 audioStream_->SetRestoreStatus(NO_NEED_FOR_RESTORE);
1960 return false;
1961 }
1962
ContinueAfterSplit(RestoreInfo restoreInfo)1963 bool AudioRendererPrivate::ContinueAfterSplit(RestoreInfo restoreInfo)
1964 {
1965 CHECK_AND_RETURN_RET(restoreInfo.restoreReason == STREAM_SPLIT, true);
1966 audioStream_->FetchDeviceForSplitStream();
1967 return false;
1968 }
1969
SwitchToTargetStream(IAudioStream::StreamClass targetClass,RestoreInfo restoreInfo)1970 bool AudioRendererPrivate::SwitchToTargetStream(IAudioStream::StreamClass targetClass, RestoreInfo restoreInfo)
1971 {
1972 bool switchResult = false;
1973 Trace trace("SwitchToTargetStream:" + std::to_string(sessionID_));
1974 AUDIO_INFO_LOG("Restore AudioRenderer %{public}u, target class %{public}d, reason: %{public}d, "
1975 "device change reason %{public}d, target flag %{public}d", sessionID_, targetClass,
1976 restoreInfo.restoreReason, restoreInfo.deviceChangeReason, restoreInfo.targetStreamFlag);
1977 // Check if split stream. If true, fetch output device and return.
1978 CHECK_AND_RETURN_RET(ContinueAfterSplit(restoreInfo), true, "Stream split");
1979 // Check if continue to switch after some concede operation.
1980 CHECK_AND_RETURN_RET_LOG(ContinueAfterConcede(targetClass, restoreInfo),
1981 true, "No need for switch");
1982 isSwitching_ = true;
1983 audioStream_->SetSwitchingStatus(true);
1984 AudioScopeExit scopeExit([this] () {
1985 audioStream_->SetSwitchingStatus(false);
1986 });
1987 RendererState previousState = GetStatusInner();
1988 IAudioStream::SwitchInfo switchInfo;
1989
1990 // Stop old stream, get stream info and frames written for new stream, and release old stream.
1991 switchResult = FinishOldStream(targetClass, restoreInfo, previousState, switchInfo);
1992 CHECK_AND_RETURN_RET_LOG(switchResult, false, "Finish old stream failed");
1993
1994 // Create and start new stream.
1995 switchResult = GenerateNewStream(targetClass, restoreInfo, previousState, switchInfo);
1996 CHECK_AND_RETURN_RET_LOG(switchResult, false, "Generate new stream failed");
1997
1998 // Activate audio interrupt again when restoring for audio server died.
1999 if (restoreInfo.restoreReason == SERVER_DIED) {
2000 HandleAudioInterruptWhenServerDied();
2001 }
2002 isSwitching_ = false;
2003 switchResult = true;
2004 scopeExit.Relase();
2005 WriteSwitchStreamLogMsg();
2006 return switchResult;
2007 }
2008
HandleAudioInterruptWhenServerDied()2009 void AudioRendererPrivate::HandleAudioInterruptWhenServerDied()
2010 {
2011 InitAudioInterruptCallback(true); // Register audio interrupt callback again.
2012 if (GetStatusInner() == RENDERER_RUNNING) {
2013 int32_t ret = AudioPolicyManager::GetInstance().ActivateAudioInterrupt(audioInterrupt_);
2014 if (ret != SUCCESS) {
2015 AUDIO_ERR_LOG("active audio interrupt failed");
2016 }
2017 }
2018 }
2019
WriteSwitchStreamLogMsg()2020 void AudioRendererPrivate::WriteSwitchStreamLogMsg()
2021 {
2022 std::shared_ptr<Media::MediaMonitor::EventBean> bean = std::make_shared<Media::MediaMonitor::EventBean>(
2023 Media::MediaMonitor::ModuleId::AUDIO, Media::MediaMonitor::EventId::AUDIO_PIPE_CHANGE,
2024 Media::MediaMonitor::EventType::BEHAVIOR_EVENT);
2025 bean->Add("CLIENT_UID", appInfo_.appUid);
2026 bean->Add("IS_PLAYBACK", 1);
2027 bean->Add("STREAM_TYPE", rendererInfo_.streamUsage);
2028 bean->Add("PIPE_TYPE_BEFORE_CHANGE", PIPE_TYPE_LOWLATENCY_OUT);
2029 bean->Add("PIPE_TYPE_AFTER_CHANGE", PIPE_TYPE_NORMAL_OUT);
2030 bean->Add("REASON", Media::MediaMonitor::DEVICE_CHANGE_FROM_FAST);
2031 Media::MediaMonitor::MediaMonitorManager::GetInstance().WriteLogMsg(bean);
2032 }
2033
GetTargetStreamClass(int32_t streamFlag)2034 IAudioStream::StreamClass AudioRendererPrivate::GetTargetStreamClass(int32_t streamFlag)
2035 {
2036 IAudioStream::StreamClass targetClass = IAudioStream::PA_STREAM;
2037 switch (streamFlag) {
2038 case AUDIO_FLAG_NORMAL:
2039 rendererInfo_.rendererFlags = AUDIO_FLAG_NORMAL;
2040 targetClass = IAudioStream::PA_STREAM;
2041 break;
2042 case AUDIO_FLAG_MMAP:
2043 rendererInfo_.rendererFlags = AUDIO_FLAG_MMAP;
2044 targetClass = IAudioStream::FAST_STREAM;
2045 break;
2046 case AUDIO_FLAG_VOIP_FAST:
2047 rendererInfo_.rendererFlags = AUDIO_FLAG_VOIP_FAST;
2048 targetClass = IAudioStream::VOIP_STREAM;
2049 break;
2050 case AUDIO_FLAG_VOIP_DIRECT:
2051 rendererInfo_.rendererFlags = (isDirectVoipSupported_ && audioRenderMode_ == RENDER_MODE_CALLBACK) ?
2052 AUDIO_FLAG_VOIP_DIRECT : AUDIO_FLAG_NORMAL;
2053 targetClass = IAudioStream::PA_STREAM;
2054 break;
2055 case AUDIO_FLAG_DIRECT:
2056 rendererInfo_.rendererFlags = AUDIO_FLAG_DIRECT;
2057 break;
2058 default:
2059 AUDIO_INFO_LOG("unknown stream flag");
2060 break;
2061 }
2062 if (rendererInfo_.originalFlag == AUDIO_FLAG_FORCED_NORMAL) {
2063 rendererInfo_.rendererFlags = AUDIO_FLAG_NORMAL;
2064 targetClass = IAudioStream::PA_STREAM;
2065 }
2066 return targetClass;
2067 }
2068
2069
OnDeviceChangeWithInfo(const uint32_t sessionId,const AudioDeviceDescriptor & deviceInfo,const AudioStreamDeviceChangeReasonExt reason)2070 void OutputDeviceChangeWithInfoCallbackImpl::OnDeviceChangeWithInfo(
2071 const uint32_t sessionId, const AudioDeviceDescriptor &deviceInfo, const AudioStreamDeviceChangeReasonExt reason)
2072 {
2073 AUDIO_INFO_LOG("OnRendererStateChange");
2074 std::vector<std::shared_ptr<AudioRendererOutputDeviceChangeCallback>> callbacks;
2075
2076 {
2077 std::lock_guard<std::mutex> lock(callbackMutex_);
2078 callbacks = callbacks_;
2079 }
2080
2081 for (auto &cb : callbacks) {
2082 if (cb != nullptr) {
2083 cb->OnOutputDeviceChange(deviceInfo, reason);
2084 }
2085 }
2086
2087 AUDIO_INFO_LOG("sessionId: %{public}u, deviceType: %{public}d reason: %{public}d size: %{public}zu",
2088 sessionId, static_cast<int>(deviceInfo.deviceType_), static_cast<int>(reason), callbacks.size());
2089 }
2090
2091 // NOTIFY: Possible audioRendererPrivate destruction here.
OnRecreateStreamEvent(const uint32_t sessionId,const int32_t streamFlag,const AudioStreamDeviceChangeReasonExt reason)2092 void OutputDeviceChangeWithInfoCallbackImpl::OnRecreateStreamEvent(const uint32_t sessionId, const int32_t streamFlag,
2093 const AudioStreamDeviceChangeReasonExt reason)
2094 {
2095 std::unique_lock<std::mutex> lock(audioRendererObjMutex_);
2096 AUDIO_INFO_LOG("Enter, session id: %{public}d, stream flag: %{public}d", sessionId, streamFlag);
2097 auto sharedptrRenderer = renderer_.lock();
2098 CHECK_AND_RETURN_LOG(sharedptrRenderer != nullptr, "renderer_ is nullptr");
2099 lock.unlock();
2100 }
2101
GetAudioEffectMode() const2102 AudioEffectMode AudioRendererPrivate::GetAudioEffectMode() const
2103 {
2104 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
2105 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, EFFECT_NONE, "audioStream_ is nullptr");
2106 return currentStream->GetAudioEffectMode();
2107 }
2108
GetFramesWritten() const2109 int64_t AudioRendererPrivate::GetFramesWritten() const
2110 {
2111 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
2112 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, ERROR_ILLEGAL_STATE, "audioStream_ is nullptr");
2113 return framesAlreadyWritten_ + currentStream->GetFramesWritten();
2114 }
2115
SetAudioEffectMode(AudioEffectMode effectMode) const2116 int32_t AudioRendererPrivate::SetAudioEffectMode(AudioEffectMode effectMode) const
2117 {
2118 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
2119 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, ERROR_ILLEGAL_STATE, "audioStream_ is nullptr");
2120 return currentStream->SetAudioEffectMode(effectMode);
2121 }
2122
SetVolumeWithRamp(float volume,int32_t duration)2123 int32_t AudioRendererPrivate::SetVolumeWithRamp(float volume, int32_t duration)
2124 {
2125 AUDIO_INFO_LOG("volume:%{public}f duration:%{public}d", volume, duration);
2126 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
2127 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, ERROR_ILLEGAL_STATE, "audioStream_ is nullptr");
2128 return currentStream->SetVolumeWithRamp(volume, duration);
2129 }
2130
SetPreferredFrameSize(int32_t frameSize)2131 void AudioRendererPrivate::SetPreferredFrameSize(int32_t frameSize)
2132 {
2133 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
2134 CHECK_AND_RETURN_LOG(currentStream != nullptr, "audioStream_ is nullptr");
2135 currentStream->SetPreferredFrameSize(frameSize);
2136 }
2137
GetAudioInterrupt(AudioInterrupt & audioInterrupt)2138 void AudioRendererPrivate::GetAudioInterrupt(AudioInterrupt &audioInterrupt)
2139 {
2140 audioInterrupt = audioInterrupt_;
2141 }
2142
SetAudioInterrupt(const AudioInterrupt & audioInterrupt)2143 void AudioRendererPrivate::SetAudioInterrupt(const AudioInterrupt &audioInterrupt)
2144 {
2145 audioInterrupt_ = audioInterrupt;
2146 }
2147
2148 // Only called AudioRendererPrivate::Stop(), with AudioRendererPrivate::rendererMutex_ held.
WriteUnderrunEvent() const2149 void AudioRendererPrivate::WriteUnderrunEvent() const
2150 {
2151 AUDIO_INFO_LOG("AudioRendererPrivate WriteUnderrunEvent!");
2152 if (GetUnderflowCountInner() < WRITE_UNDERRUN_NUM) {
2153 return;
2154 }
2155 AudioPipeType pipeType = PIPE_TYPE_NORMAL_OUT;
2156 IAudioStream::StreamClass streamClass = audioStream_->GetStreamClass();
2157 if (streamClass == IAudioStream::FAST_STREAM) {
2158 pipeType = PIPE_TYPE_LOWLATENCY_OUT;
2159 } else if (streamClass == IAudioStream::PA_STREAM) {
2160 if (audioStream_->GetOffloadEnable()) {
2161 pipeType = PIPE_TYPE_OFFLOAD;
2162 } else if (audioStream_->GetSpatializationEnabled()) {
2163 pipeType = PIPE_TYPE_SPATIALIZATION;
2164 } else if (audioStream_->GetHighResolutionEnabled()) {
2165 pipeType = PIPE_TYPE_HIGHRESOLUTION;
2166 }
2167 }
2168 std::shared_ptr<Media::MediaMonitor::EventBean> bean = std::make_shared<Media::MediaMonitor::EventBean>(
2169 Media::MediaMonitor::ModuleId::AUDIO, Media::MediaMonitor::EventId::PERFORMANCE_UNDER_OVERRUN_STATS,
2170 Media::MediaMonitor::EventType::FREQUENCY_AGGREGATION_EVENT);
2171 bean->Add("IS_PLAYBACK", 1);
2172 bean->Add("CLIENT_UID", appInfo_.appUid);
2173 bean->Add("PIPE_TYPE", pipeType);
2174 bean->Add("STREAM_TYPE", rendererInfo_.streamUsage);
2175 Media::MediaMonitor::MediaMonitorManager::GetInstance().WriteLogMsg(bean);
2176 }
2177
RegisterRendererPolicyServiceDiedCallback()2178 int32_t AudioRendererPrivate::RegisterRendererPolicyServiceDiedCallback()
2179 {
2180 std::lock_guard<std::mutex> lock(rendererPolicyServiceDiedCbMutex_);
2181 AUDIO_DEBUG_LOG("RegisterRendererPolicyServiceDiedCallback");
2182 if (!audioPolicyServiceDiedCallback_) {
2183 audioPolicyServiceDiedCallback_ = std::make_shared<RendererPolicyServiceDiedCallback>();
2184 if (!audioPolicyServiceDiedCallback_) {
2185 AUDIO_ERR_LOG("Memory allocation failed!!");
2186 return ERROR;
2187 }
2188 AudioPolicyManager::GetInstance().RegisterAudioStreamPolicyServerDiedCb(audioPolicyServiceDiedCallback_);
2189 audioPolicyServiceDiedCallback_->SetAudioRendererObj(weak_from_this());
2190 audioPolicyServiceDiedCallback_->SetAudioInterrupt(audioInterrupt_);
2191 }
2192 return SUCCESS;
2193 }
2194
RemoveRendererPolicyServiceDiedCallback()2195 int32_t AudioRendererPrivate::RemoveRendererPolicyServiceDiedCallback()
2196 {
2197 std::lock_guard<std::mutex> lock(rendererPolicyServiceDiedCbMutex_);
2198 AUDIO_DEBUG_LOG("RemoveRendererPolicyServiceDiedCallback");
2199 if (audioPolicyServiceDiedCallback_) {
2200 int32_t ret = AudioPolicyManager::GetInstance().UnregisterAudioStreamPolicyServerDiedCb(
2201 audioPolicyServiceDiedCallback_);
2202 if (ret != 0) {
2203 AUDIO_ERR_LOG("RemoveRendererPolicyServiceDiedCallback failed");
2204 audioPolicyServiceDiedCallback_ = nullptr;
2205 return ERROR;
2206 }
2207 }
2208 audioPolicyServiceDiedCallback_ = nullptr;
2209 return SUCCESS;
2210 }
2211
RendererPolicyServiceDiedCallback()2212 RendererPolicyServiceDiedCallback::RendererPolicyServiceDiedCallback()
2213 {
2214 AUDIO_DEBUG_LOG("RendererPolicyServiceDiedCallback create");
2215 }
2216
~RendererPolicyServiceDiedCallback()2217 RendererPolicyServiceDiedCallback::~RendererPolicyServiceDiedCallback()
2218 {
2219 AUDIO_DEBUG_LOG("RendererPolicyServiceDiedCallback destroy");
2220 }
2221
SetAudioRendererObj(std::weak_ptr<AudioRendererPrivate> rendererObj)2222 void RendererPolicyServiceDiedCallback::SetAudioRendererObj(std::weak_ptr<AudioRendererPrivate> rendererObj)
2223 {
2224 renderer_ = rendererObj;
2225 }
2226
SetAudioInterrupt(AudioInterrupt & audioInterrupt)2227 void RendererPolicyServiceDiedCallback::SetAudioInterrupt(AudioInterrupt &audioInterrupt)
2228 {
2229 audioInterrupt_ = audioInterrupt;
2230 }
2231
OnAudioPolicyServiceDied()2232 void RendererPolicyServiceDiedCallback::OnAudioPolicyServiceDied()
2233 {
2234 AUDIO_INFO_LOG("RendererPolicyServiceDiedCallback::OnAudioPolicyServiceDied");
2235
2236 if (taskCount_.fetch_add(1) > 0) {
2237 AUDIO_INFO_LOG("direct ret");
2238 return;
2239 }
2240
2241 std::weak_ptr<RendererPolicyServiceDiedCallback> weakRefCb = weak_from_this();
2242
2243 std::thread restoreThread ([weakRefCb] {
2244 std::shared_ptr<RendererPolicyServiceDiedCallback> strongRefCb = weakRefCb.lock();
2245 CHECK_AND_RETURN_LOG(strongRefCb != nullptr, "strongRef is nullptr");
2246 do {
2247 strongRefCb->RestoreTheadLoop();
2248 } while (strongRefCb->taskCount_.fetch_sub(1) > 1);
2249 });
2250 pthread_setname_np(restoreThread.native_handle(), "OS_ARPSRestore");
2251 restoreThread.detach();
2252 }
2253
RestoreTheadLoop()2254 void RendererPolicyServiceDiedCallback::RestoreTheadLoop()
2255 {
2256 int32_t tryCounter = 10;
2257 uint32_t sleepTime = 300000;
2258 bool restoreResult = false;
2259 while (!restoreResult && tryCounter > 0) {
2260 tryCounter--;
2261 usleep(sleepTime);
2262 std::shared_ptr<AudioRendererPrivate> sharedRenderer = renderer_.lock();
2263 CHECK_AND_RETURN_LOG(sharedRenderer != nullptr, "sharedRenderer is nullptr");
2264 if (sharedRenderer->audioStream_ == nullptr || sharedRenderer->abortRestore_) {
2265 AUDIO_INFO_LOG("abort restore");
2266 break;
2267 }
2268 sharedRenderer->RestoreAudioInLoop(restoreResult, tryCounter);
2269 }
2270 }
2271
RestoreAudioInLoop(bool & restoreResult,int32_t & tryCounter)2272 void AudioRendererPrivate::RestoreAudioInLoop(bool &restoreResult, int32_t &tryCounter)
2273 {
2274 std::lock_guard<std::shared_mutex> lock(rendererMutex_);
2275 CHECK_AND_RETURN_LOG(audioStream_, "audioStream_ is nullptr, no need for restore");
2276 AUDIO_INFO_LOG("Restore audio renderer when server died, session %{public}u", sessionID_);
2277 RestoreInfo restoreInfo;
2278 restoreInfo.restoreReason = SERVER_DIED;
2279 audioStream_->SetRestoreInfo(restoreInfo);
2280 audioStream_->GetRestoreInfo(restoreInfo);
2281 // When server died, restore client stream by SwitchToTargetStream. Target stream class is
2282 // the stream class of the old stream.
2283 restoreResult = SwitchToTargetStream(audioStream_->GetStreamClass(), restoreInfo);
2284 AUDIO_INFO_LOG("Set restore status when server died, restore result %{public}d", restoreResult);
2285 return;
2286 }
2287
SetSpeed(float speed)2288 int32_t AudioRendererPrivate::SetSpeed(float speed)
2289 {
2290 AUDIO_INFO_LOG("set speed %{public}f", speed);
2291 CHECK_AND_RETURN_RET_LOG((speed >= MIN_STREAM_SPEED_LEVEL) && (speed <= MAX_STREAM_SPEED_LEVEL),
2292 ERR_INVALID_PARAM, "invaild speed index");
2293
2294 std::lock_guard lock(rendererMutex_);
2295 #ifdef SONIC_ENABLE
2296 CHECK_AND_RETURN_RET_LOG(audioStream_ != nullptr, ERROR_ILLEGAL_STATE, "audioStream_ is nullptr");
2297 audioStream_->SetSpeed(speed);
2298 #endif
2299 speed_ = speed;
2300 return SUCCESS;
2301 }
2302
GetSpeed()2303 float AudioRendererPrivate::GetSpeed()
2304 {
2305 std::shared_lock lock(rendererMutex_);
2306 #ifdef SONIC_ENABLE
2307 CHECK_AND_RETURN_RET_LOG(audioStream_ != nullptr, ERROR_ILLEGAL_STATE, "audioStream_ is nullptr");
2308 return audioStream_->GetSpeed();
2309 #endif
2310 return speed_.value_or(1.0f);
2311 }
2312
IsOffloadEnable()2313 bool AudioRendererPrivate::IsOffloadEnable()
2314 {
2315 std::shared_ptr currentStream = GetInnerStream();
2316 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, false, "audioStream_ is nullptr");
2317 bool enable = currentStream->GetOffloadEnable();
2318 AUDIO_INFO_LOG("GetOffloadEnable is [%{public}s]", (enable ? "true" : "false"));
2319 return enable;
2320 }
2321
IsFastRenderer()2322 bool AudioRendererPrivate::IsFastRenderer()
2323 {
2324 return isFastRenderer_;
2325 }
2326
2327 // Inner function. Must be called with AudioRendererPrivate::rendererMutex_
2328 // or AudioRendererPrivate::streamMutex_ held.
InitLatencyMeasurement(const AudioStreamParams & audioStreamParams)2329 void AudioRendererPrivate::InitLatencyMeasurement(const AudioStreamParams &audioStreamParams)
2330 {
2331 latencyMeasEnabled_ = AudioLatencyMeasurement::CheckIfEnabled();
2332 AUDIO_INFO_LOG("LatencyMeas enabled in renderer:%{public}d", latencyMeasEnabled_);
2333 if (!latencyMeasEnabled_) {
2334 return;
2335 }
2336 std::string bundleName = AudioSystemManager::GetInstance()->GetSelfBundleName(appInfo_.appUid);
2337 uint32_t sessionId = 0;
2338 audioStream_->GetAudioSessionID(sessionId);
2339 latencyMeasurement_ = std::make_shared<AudioLatencyMeasurement>(audioStreamParams.samplingRate,
2340 audioStreamParams.channels, audioStreamParams.format, bundleName, sessionId);
2341 }
2342
2343 // Inner function. Must be called with AudioRendererPrivate::rendererMutex_
2344 // or AudioRendererPrivate::streamMutex_ held.
MockPcmData(uint8_t * buffer,size_t bufferSize) const2345 void AudioRendererPrivate::MockPcmData(uint8_t *buffer, size_t bufferSize) const
2346 {
2347 if (!latencyMeasEnabled_) {
2348 return;
2349 }
2350 if (latencyMeasurement_->MockPcmData(buffer, bufferSize)) {
2351 std::string timestamp = GetTime();
2352 audioStream_->UpdateLatencyTimestamp(timestamp, true);
2353 }
2354 }
2355
ActivateAudioConcurrency(const AudioStreamParams & audioStreamParams,const AudioStreamType & streamType,IAudioStream::StreamClass & streamClass)2356 void AudioRendererPrivate::ActivateAudioConcurrency(const AudioStreamParams &audioStreamParams,
2357 const AudioStreamType &streamType, IAudioStream::StreamClass &streamClass)
2358 {
2359 rendererInfo_.pipeType = PIPE_TYPE_NORMAL_OUT;
2360 if (rendererInfo_.streamUsage == STREAM_USAGE_VOICE_COMMUNICATION ||
2361 rendererInfo_.streamUsage == STREAM_USAGE_VOICE_MODEM_COMMUNICATION ||
2362 rendererInfo_.streamUsage == STREAM_USAGE_VIDEO_COMMUNICATION) {
2363 rendererInfo_.pipeType = PIPE_TYPE_CALL_OUT;
2364 } else if (streamClass == IAudioStream::FAST_STREAM) {
2365 rendererInfo_.pipeType = PIPE_TYPE_LOWLATENCY_OUT;
2366 } else if (streamType == STREAM_MUSIC && audioStreamParams.samplingRate >= SAMPLE_RATE_48000 &&
2367 audioStreamParams.format >= SAMPLE_S24LE) {
2368 std::vector<std::shared_ptr<AudioDeviceDescriptor>> deviceDescriptors =
2369 AudioPolicyManager::GetInstance().GetPreferredOutputDeviceDescriptors(rendererInfo_, true);
2370 if (!deviceDescriptors.empty() && deviceDescriptors[0] != nullptr) {
2371 if ((deviceDescriptors[0]->deviceType_ == DEVICE_TYPE_USB_HEADSET ||
2372 deviceDescriptors[0]->deviceType_ == DEVICE_TYPE_WIRED_HEADSET)) {
2373 rendererInfo_.pipeType = PIPE_TYPE_DIRECT_MUSIC;
2374 }
2375 }
2376 }
2377 int32_t ret = AudioPolicyManager::GetInstance().ActivateAudioConcurrency(rendererInfo_.pipeType);
2378 if (ret != SUCCESS) {
2379 if (streamClass == IAudioStream::FAST_STREAM) {
2380 streamClass = IAudioStream::PA_STREAM;
2381 }
2382 rendererInfo_.pipeType = PIPE_TYPE_NORMAL_OUT;
2383 }
2384 return;
2385 }
2386
ConcedeStream()2387 void AudioRendererPrivate::ConcedeStream()
2388 {
2389 AUDIO_WARNING_LOG("Not in use");
2390 }
2391
EnableVoiceModemCommunicationStartStream(bool enable)2392 void AudioRendererPrivate::EnableVoiceModemCommunicationStartStream(bool enable)
2393 {
2394 isEnableVoiceModemCommunicationStartStream_ = enable;
2395 }
2396
IsNoStreamRenderer() const2397 bool AudioRendererPrivate::IsNoStreamRenderer() const
2398 {
2399 return rendererInfo_.streamUsage == STREAM_USAGE_VOICE_MODEM_COMMUNICATION &&
2400 !isEnableVoiceModemCommunicationStartStream_;
2401 }
2402
GetSourceDuration() const2403 int64_t AudioRendererPrivate::GetSourceDuration() const
2404 {
2405 return sourceDuration_;
2406 }
2407
SetSourceDuration(int64_t duration)2408 void AudioRendererPrivate::SetSourceDuration(int64_t duration)
2409 {
2410 sourceDuration_ = duration;
2411 audioStream_->SetSourceDuration(sourceDuration_);
2412 }
2413
SetDefaultOutputDevice(DeviceType deviceType)2414 int32_t AudioRendererPrivate::SetDefaultOutputDevice(DeviceType deviceType)
2415 {
2416 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
2417 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, ERROR_ILLEGAL_STATE, "audioStream_ is nullptr");
2418 if (deviceType != DEVICE_TYPE_EARPIECE && deviceType != DEVICE_TYPE_SPEAKER &&
2419 deviceType != DEVICE_TYPE_DEFAULT) {
2420 return ERR_NOT_SUPPORTED;
2421 }
2422 bool isSupportedStreamUsage = (find(AUDIO_DEFAULT_OUTPUT_DEVICE_SUPPORTED_STREAM_USAGES.begin(),
2423 AUDIO_DEFAULT_OUTPUT_DEVICE_SUPPORTED_STREAM_USAGES.end(), rendererInfo_.streamUsage) !=
2424 AUDIO_DEFAULT_OUTPUT_DEVICE_SUPPORTED_STREAM_USAGES.end());
2425 CHECK_AND_RETURN_RET_LOG(isSupportedStreamUsage, ERR_NOT_SUPPORTED, "stream usage not supported");
2426 return currentStream->SetDefaultOutputDevice(deviceType);
2427 }
2428
2429 // diffrence from GetAudioPosition only when set speed
GetAudioTimestampInfo(Timestamp & timestamp,Timestamp::Timestampbase base) const2430 int32_t AudioRendererPrivate::GetAudioTimestampInfo(Timestamp ×tamp, Timestamp::Timestampbase base) const
2431 {
2432 std::shared_ptr<IAudioStream> currentStream = GetInnerStream();
2433 CHECK_AND_RETURN_RET_LOG(currentStream != nullptr, ERROR_ILLEGAL_STATE, "audioStream_ is nullptr");
2434 return currentStream->GetAudioTimestampInfo(timestamp, base);
2435 }
2436 } // namespace AudioStandard
2437 } // namespace OHOS
2438