• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 &params) 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 &timestamp, 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 &timestamp, 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 &timestamp, 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