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