1 /*
2 * Copyright (c) 2022 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "audio_errors.h"
17 #include "audio_policy_manager.h"
18 #include "audio_renderer_gateway.h"
19 #include "audio_container_stream_base.h"
20 #include "audio_log.h"
21 #include "audio_renderer.h"
22
23 namespace OHOS {
24 namespace AudioStandard {
25
26 static const int32_t MAX_VOLUME_LEVEL = 15;
27 static const int32_t CONST_FACTOR = 100;
28
VolumeToDb(int32_t volumeLevel)29 static float VolumeToDb(int32_t volumeLevel)
30 {
31 float value = static_cast<float>(volumeLevel) / MAX_VOLUME_LEVEL;
32 float roundValue = static_cast<int>(value * CONST_FACTOR);
33
34 return static_cast<float>(roundValue) / CONST_FACTOR;
35 }
36
37 std::map<pid_t, std::map<AudioStreamType, AudioInterrupt>> AudioRendererGateway::sharedInterrupts_;
38
39 AudioRenderer::~AudioRenderer() = default;
~AudioRendererGateway()40 AudioRendererGateway::~AudioRendererGateway()
41 {
42 RendererState state = GetStatus();
43 if (state != RENDERER_RELEASED && state != RENDERER_NEW) {
44 Release();
45 }
46 }
47
AudioRendererGateway(AudioStreamType audioStreamType)48 AudioRendererGateway::AudioRendererGateway(AudioStreamType audioStreamType)
49 {
50 audioStream_ = std::make_shared<AudioContainerRenderStream>(audioStreamType, AUDIO_MODE_PLAYBACK);
51 audioInterrupt_.streamType = audioStreamType;
52 }
53
GetFrameCount(uint32_t & frameCount) const54 int32_t AudioRendererGateway::GetFrameCount(uint32_t &frameCount) const
55 {
56 return audioStream_->GetFrameCount(frameCount);
57 }
58
GetLatency(uint64_t & latency) const59 int32_t AudioRendererGateway::GetLatency(uint64_t &latency) const
60 {
61 return audioStream_->GetLatency(latency);
62 }
63
SetParams(const AudioRendererParams params)64 int32_t AudioRendererGateway::SetParams(const AudioRendererParams params)
65 {
66 AudioStreamParams audioStreamParams;
67 audioStreamParams.format = params.sampleFormat;
68 audioStreamParams.samplingRate = params.sampleRate;
69 audioStreamParams.channels = params.channelCount;
70 audioStreamParams.encoding = params.encodingType;
71
72 int32_t ret = audioStream_->SetAudioStreamInfo(audioStreamParams);
73
74 AUDIO_INFO_LOG("AudioRendererGateway::SetParams SetAudioStreamInfo Success");
75 if (ret) {
76 AUDIO_ERR_LOG("AudioRendererGateway::SetParams SetAudioStreamInfo Failed");
77 return ret;
78 }
79
80 if (audioStream_->GetAudioSessionID(sessionID_) != 0) {
81 AUDIO_ERR_LOG("AudioRendererGateway::SetParams GetAudioSessionID Failed");
82 return ERR_INVALID_INDEX;
83 }
84 audioInterrupt_.sessionID = sessionID_;
85
86 if (audioInterruptCallback_ == nullptr) {
87 audioInterruptCallback_ = std::make_shared<AudioInterruptCallbackGateway>(audioStream_, audioInterrupt_);
88 if (audioInterruptCallback_ == nullptr) {
89 AUDIO_ERR_LOG("AudioRendererGateway::Failed to allocate memory for audioInterruptCallback_");
90 return ERROR;
91 }
92 }
93
94 return AudioPolicyManager::GetInstance().SetAudioInterruptCallback(sessionID_, audioInterruptCallback_);
95 }
96
GetParams(AudioRendererParams & params) const97 int32_t AudioRendererGateway::GetParams(AudioRendererParams ¶ms) const
98 {
99 AudioStreamParams audioStreamParams;
100 int32_t result = audioStream_->GetAudioStreamInfo(audioStreamParams);
101 if (!result) {
102 params.sampleFormat = static_cast<AudioSampleFormat>(audioStreamParams.format);
103 params.sampleRate = static_cast<AudioSamplingRate>(audioStreamParams.samplingRate);
104 params.channelCount = static_cast<AudioChannel>(audioStreamParams.channels);
105 params.encodingType = static_cast<AudioEncodingType>(audioStreamParams.encoding);
106 }
107
108 return result;
109 }
110
GetRendererInfo(AudioRendererInfo & rendererInfo) const111 int32_t AudioRendererGateway::GetRendererInfo(AudioRendererInfo &rendererInfo) const
112 {
113 rendererInfo = rendererInfo_;
114
115 return SUCCESS;
116 }
117
GetStreamInfo(AudioStreamInfo & streamInfo) const118 int32_t AudioRendererGateway::GetStreamInfo(AudioStreamInfo &streamInfo) const
119 {
120 AudioStreamParams audioStreamParams;
121 int32_t result = audioStream_->GetAudioStreamInfo(audioStreamParams);
122 if (!result) {
123 streamInfo.format = static_cast<AudioSampleFormat>(audioStreamParams.format);
124 streamInfo.samplingRate = static_cast<AudioSamplingRate>(audioStreamParams.samplingRate);
125 streamInfo.channels = static_cast<AudioChannel>(audioStreamParams.channels);
126 streamInfo.encoding = static_cast<AudioEncodingType>(audioStreamParams.encoding);
127 }
128
129 return result;
130 }
131
SetRendererCallback(const std::shared_ptr<AudioRendererCallback> & callback)132 int32_t AudioRendererGateway::SetRendererCallback(const std::shared_ptr<AudioRendererCallback> &callback)
133 {
134 // If the client is using the deprecated SetParams API. SetRendererCallback must be invoked, after SetParams.
135 // In general, callbacks can only be set after the renderer state is PREPARED.
136 RendererState state = GetStatus();
137 if (state == RENDERER_NEW || state == RENDERER_RELEASED) {
138 AUDIO_DEBUG_LOG("AudioRendererGateway::SetRendererCallback incorrect state:%{public}d to register cb", state);
139 return ERR_ILLEGAL_STATE;
140 }
141 if (callback == nullptr) {
142 AUDIO_ERR_LOG("AudioRendererGateway::SetRendererCallback callback param is null");
143 return ERR_INVALID_PARAM;
144 }
145
146 // Save reference for interrupt callback
147 if (audioInterruptCallback_ == nullptr) {
148 AUDIO_ERR_LOG("AudioRendererGateway::SetRendererCallback audioInterruptCallback_ == nullptr");
149 return ERROR;
150 }
151 std::shared_ptr<AudioInterruptCallbackGateway> cbInterrupt =
152 std::static_pointer_cast<AudioInterruptCallbackGateway>(audioInterruptCallback_);
153 cbInterrupt->SaveCallback(callback);
154
155 // Save and Set reference for stream callback. Order is important here.
156 if (audioStreamCallback_ == nullptr) {
157 audioStreamCallback_ = std::make_shared<AudioStreamRenderCallback>();
158 if (audioStreamCallback_ == nullptr) {
159 AUDIO_ERR_LOG("AudioRendererGateway::Failed to allocate memory for audioStreamCallback_");
160 return ERROR;
161 }
162 }
163
164 std::shared_ptr<AudioStreamRenderCallback> cbStream =
165 std::static_pointer_cast<AudioStreamRenderCallback>(audioStreamCallback_);
166 cbStream->SaveCallback(callback);
167 AUDIO_INFO_LOG("AudioRendererGateway::SetRendererCallback callback audioStreamCallback_");
168 (void)audioStream_->SetStreamCallback(audioStreamCallback_);
169
170 return SUCCESS;
171 }
172
SetRendererPositionCallback(int64_t markPosition,const std::shared_ptr<RendererPositionCallback> & callback)173 int32_t AudioRendererGateway::SetRendererPositionCallback(int64_t markPosition,
174 const std::shared_ptr<RendererPositionCallback> &callback)
175 {
176 if ((callback == nullptr) || (markPosition <= 0)) {
177 AUDIO_ERR_LOG("AudioRendererGateway::SetRendererPositionCallback input param is invalid");
178 return ERR_INVALID_PARAM;
179 }
180
181 audioStream_->SetRendererPositionCallback(markPosition, callback);
182
183 return SUCCESS;
184 }
185
UnsetRendererPositionCallback()186 void AudioRendererGateway::UnsetRendererPositionCallback()
187 {
188 audioStream_->UnsetRendererPositionCallback();
189 }
190
SetRendererPeriodPositionCallback(int64_t frameNumber,const std::shared_ptr<RendererPeriodPositionCallback> & callback)191 int32_t AudioRendererGateway::SetRendererPeriodPositionCallback(int64_t frameNumber,
192 const std::shared_ptr<RendererPeriodPositionCallback> &callback)
193 {
194 if ((callback == nullptr) || (frameNumber <= 0)) {
195 AUDIO_ERR_LOG("AudioRendererGateway::SetRendererPeriodPositionCallback input param is invalid");
196 return ERR_INVALID_PARAM;
197 }
198
199 audioStream_->SetRendererPeriodPositionCallback(frameNumber, callback);
200
201 return SUCCESS;
202 }
203
UnsetRendererPeriodPositionCallback()204 void AudioRendererGateway::UnsetRendererPeriodPositionCallback()
205 {
206 audioStream_->UnsetRendererPeriodPositionCallback();
207 }
208
Start(StateChangeCmdType cmdType) const209 bool AudioRendererGateway::Start(StateChangeCmdType cmdType) const
210 {
211 AUDIO_INFO_LOG("AudioRendererGateway::Start()");
212 RendererState state = GetStatus();
213 if ((state != RENDERER_PREPARED) && (state != RENDERER_STOPPED) && (state != RENDERER_PAUSED)) {
214 AUDIO_ERR_LOG("AudioRendererGateway::Start() Illegal state:%{public}u, Start failed", state);
215 return false;
216 }
217 AudioInterrupt audioInterrupt;
218 switch (mode_) {
219 case InterruptMode::SHARE_MODE:
220 audioInterrupt = sharedInterrupt_;
221 break;
222 case InterruptMode::INDEPENDENT_MODE:
223 audioInterrupt = audioInterrupt_;
224 break;
225 default:
226 break;
227 }
228
229 if (audioInterrupt_.streamType == STREAM_DEFAULT || audioInterrupt_.sessionID == INVALID_SESSION) {
230 return false;
231 }
232
233 int32_t ret = AudioPolicyManager::GetInstance().ActivateAudioInterrupt(audioInterrupt);
234 if (ret != 0) {
235 AUDIO_ERR_LOG("AudioRendererGateway::ActivateAudioInterrupt Failed");
236 return false;
237 }
238
239 return audioStream_->StartAudioStream();
240 }
241
Write(uint8_t * buffer,size_t bufferSize)242 int32_t AudioRendererGateway::Write(uint8_t *buffer, size_t bufferSize)
243 {
244 return audioStream_->Write(buffer, bufferSize);
245 }
246
GetStatus() const247 RendererState AudioRendererGateway::GetStatus() const
248 {
249 return static_cast<RendererState>(audioStream_->GetState());
250 }
251
GetAudioTime(Timestamp & timestamp,Timestamp::Timestampbase base) const252 bool AudioRendererGateway::GetAudioTime(Timestamp ×tamp, Timestamp::Timestampbase base) const
253 {
254 return audioStream_->GetAudioTime(timestamp, base);
255 }
256
Drain() const257 bool AudioRendererGateway::Drain() const
258 {
259 return audioStream_->DrainAudioStream();
260 }
261
Flush() const262 bool AudioRendererGateway::Flush() const
263 {
264 return audioStream_->FlushAudioStream();
265 }
266
Pause(StateChangeCmdType cmdType) const267 bool AudioRendererGateway::Pause(StateChangeCmdType cmdType) const
268 {
269 bool result = audioStream_->PauseAudioStream();
270 AudioInterrupt audioInterrupt;
271 switch (mode_) {
272 case InterruptMode::SHARE_MODE:
273 audioInterrupt = sharedInterrupt_;
274 break;
275 case InterruptMode::INDEPENDENT_MODE:
276 audioInterrupt = audioInterrupt_;
277 break;
278 default:
279 break;
280 }
281 // When user is intentionally pausing , Deactivate to remove from active/pending owners list
282 int32_t ret = AudioPolicyManager::GetInstance().DeactivateAudioInterrupt(audioInterrupt);
283 if (ret != 0) {
284 AUDIO_ERR_LOG("AudioRendererGateway: DeactivateAudioInterrupt Failed");
285 }
286
287 return result;
288 }
289
Stop() const290 bool AudioRendererGateway::Stop() const
291 {
292 bool result = audioStream_->StopAudioStream();
293 AudioInterrupt audioInterrupt;
294 switch (mode_) {
295 case InterruptMode::SHARE_MODE:
296 audioInterrupt = sharedInterrupt_;
297 break;
298 case InterruptMode::INDEPENDENT_MODE:
299 audioInterrupt = audioInterrupt_;
300 break;
301 default:
302 break;
303 }
304 int32_t ret = AudioPolicyManager::GetInstance().DeactivateAudioInterrupt(audioInterrupt);
305 if (ret != 0) {
306 AUDIO_ERR_LOG("AudioRendererGateway: DeactivateAudioInterrupt Failed");
307 }
308
309 return result;
310 }
311
Release() const312 bool AudioRendererGateway::Release() const
313 {
314 // If Stop call was skipped, Release to take care of Deactivation
315 (void)AudioPolicyManager::GetInstance().DeactivateAudioInterrupt(audioInterrupt_);
316
317 // Unregister the callaback in policy server
318 (void)AudioPolicyManager::GetInstance().UnsetAudioInterruptCallback(sessionID_);
319
320 return audioStream_->ReleaseAudioStream();
321 }
322
GetBufferSize(size_t & bufferSize) const323 int32_t AudioRendererGateway::GetBufferSize(size_t &bufferSize) const
324 {
325 return audioStream_->GetBufferSize(bufferSize);
326 }
327
GetAudioStreamId(uint32_t & sessionID) const328 int32_t AudioRendererGateway::GetAudioStreamId(uint32_t &sessionID) const
329 {
330 return audioStream_->GetAudioSessionID(sessionID);
331 }
332
SetAudioRendererDesc(AudioRendererDesc audioRendererDesc) const333 int32_t AudioRendererGateway::SetAudioRendererDesc(AudioRendererDesc audioRendererDesc) const
334 {
335 ContentType contentType = audioRendererDesc.contentType;
336 StreamUsage streamUsage = audioRendererDesc.streamUsage;
337 AudioStreamType audioStreamType = audioStream_->GetStreamType(contentType, streamUsage);
338 return audioStream_->SetAudioStreamType(audioStreamType);
339 }
340
SetStreamType(AudioStreamType audioStreamType) const341 int32_t AudioRendererGateway::SetStreamType(AudioStreamType audioStreamType) const
342 {
343 return audioStream_->SetAudioStreamType(audioStreamType);
344 }
345
SetVolume(float volume) const346 int32_t AudioRendererGateway::SetVolume(float volume) const
347 {
348 return audioStream_->SetVolume(volume);
349 }
350
GetVolume() const351 float AudioRendererGateway::GetVolume() const
352 {
353 return audioStream_->GetVolume();
354 }
355
SetRenderRate(AudioRendererRate renderRate) const356 int32_t AudioRendererGateway::SetRenderRate(AudioRendererRate renderRate) const
357 {
358 return audioStream_->SetRenderRate(renderRate);
359 }
360
GetRenderRate() const361 AudioRendererRate AudioRendererGateway::GetRenderRate() const
362 {
363 return audioStream_->GetRenderRate();
364 }
365
SetBufferDuration(uint64_t bufferDuration) const366 int32_t AudioRendererGateway::SetBufferDuration(uint64_t bufferDuration) const
367 {
368 if (bufferDuration < MINIMUM_BUFFER_SIZE_MSEC || bufferDuration > MAXIMUM_BUFFER_SIZE_MSEC) {
369 AUDIO_ERR_LOG("Error: Please set the buffer duration between 5ms ~ 20ms");
370 return ERR_INVALID_PARAM;
371 }
372
373 return audioStream_->SetBufferSizeInMsec(bufferDuration);
374 }
375
AudioInterruptCallbackGateway(const std::shared_ptr<AudioContainerRenderStream> & audioStream,const AudioInterrupt & audioInterrupt)376 AudioInterruptCallbackGateway::AudioInterruptCallbackGateway(
377 const std::shared_ptr<AudioContainerRenderStream> &audioStream, const AudioInterrupt &audioInterrupt)
378 : audioStream_(audioStream), audioInterrupt_(audioInterrupt)
379 {
380 AUDIO_INFO_LOG("AudioInterruptCallbackGateway constructor");
381 }
382
~AudioInterruptCallbackGateway()383 AudioInterruptCallbackGateway::~AudioInterruptCallbackGateway()
384 {
385 AUDIO_DEBUG_LOG("AudioInterruptCallbackGateway: instance destroy");
386 }
387
SaveCallback(const std::weak_ptr<AudioRendererCallback> & callback)388 void AudioInterruptCallbackGateway::SaveCallback(const std::weak_ptr<AudioRendererCallback> &callback)
389 {
390 callback_ = callback;
391 }
392
NotifyEvent(const InterruptEvent & interruptEvent)393 void AudioInterruptCallbackGateway::NotifyEvent(const InterruptEvent &interruptEvent)
394 {
395 AUDIO_DEBUG_LOG("AudioRendererGateway: NotifyEvent: Hint: %{public}d", interruptEvent.hintType);
396 AUDIO_DEBUG_LOG("AudioRendererGateway: NotifyEvent: eventType: %{public}d", interruptEvent.eventType);
397
398 if (cb_ != nullptr) {
399 cb_->OnInterrupt(interruptEvent);
400 AUDIO_DEBUG_LOG("AudioRendererGateway: OnInterrupt : NotifyEvent to app complete");
401 } else {
402 AUDIO_DEBUG_LOG("AudioRendererGateway: cb_ == nullptr cannont NotifyEvent to app");
403 }
404 }
405
HandleForceDucking(const InterruptEventInternal & interruptEvent)406 bool AudioInterruptCallbackGateway::HandleForceDucking(const InterruptEventInternal &interruptEvent)
407 {
408 int32_t systemVolumeLevel = AudioPolicyManager::GetInstance().GetSystemVolumeLevel(audioInterrupt_.streamType);
409 float systemVolumeDb = VolumeToDb(systemVolumeLevel);
410 float duckVolumeDb = interruptEvent.duckVolume;
411 int32_t ret = 0;
412
413 if (systemVolumeDb <= duckVolumeDb || FLOAT_COMPARE_EQ(systemVolumeDb, 0.0f)) {
414 AUDIO_INFO_LOG("AudioRendererGateway: systemVolumeDb: %{public}f <= duckVolumeDb: %{public}f",
415 systemVolumeDb, duckVolumeDb);
416 AUDIO_INFO_LOG("AudioRendererGateway: No need to duck further return");
417 return false;
418 }
419
420 instanceVolBeforeDucking_ = audioStream_->GetVolume();
421 float duckInstanceVolume = duckVolumeDb / systemVolumeDb;
422 if (FLOAT_COMPARE_EQ(instanceVolBeforeDucking_, 0.0f) || instanceVolBeforeDucking_ < duckInstanceVolume) {
423 AUDIO_INFO_LOG("AudioRendererGateway: No need to duck further return");
424 return false;
425 }
426
427 ret = audioStream_->SetVolume(duckInstanceVolume);
428 if (ret) {
429 AUDIO_DEBUG_LOG("AudioRendererGateway: set duckVolumeDb(instance) %{pubic}f failed", duckInstanceVolume);
430 return false;
431 }
432
433 AUDIO_DEBUG_LOG("AudioRendererGateway: set duckVolumeDb(instance) %{pubic}f succeeded", duckInstanceVolume);
434 return true;
435 }
436
NotifyForcePausedToResume(const InterruptEventInternal & interruptEvent)437 void AudioInterruptCallbackGateway::NotifyForcePausedToResume(const InterruptEventInternal &interruptEvent)
438 {
439 // Change InterruptForceType to Share, Since app will take care of resuming
440 InterruptEvent interruptEventResume {interruptEvent.eventType, INTERRUPT_SHARE,
441 interruptEvent.hintType};
442 NotifyEvent(interruptEventResume);
443 }
444
HandleAndNotifyForcedEvent(const InterruptEventInternal & interruptEvent)445 void AudioInterruptCallbackGateway::HandleAndNotifyForcedEvent(const InterruptEventInternal &interruptEvent)
446 {
447 InterruptHint hintType = interruptEvent.hintType;
448 AUDIO_DEBUG_LOG("AudioRendererGateway ForceType: INTERRUPT_FORCE, Force handle the event and notify the app");
449 AUDIO_DEBUG_LOG("AudioRendererGateway: HandleAndNotifyForcedEvent: Hint: %{public}d eventType: %{public}d",
450 interruptEvent.hintType, interruptEvent.eventType);
451
452 switch (hintType) {
453 case INTERRUPT_HINT_PAUSE:
454 if (audioStream_->GetState() != RUNNING) {
455 AUDIO_DEBUG_LOG("AudioRendererGateway::OnInterrupt state is not running no need to pause");
456 return;
457 }
458 (void)audioStream_->PauseAudioStream(); // Just Pause, do not deactivate here
459 isForcePaused_ = true;
460 break;
461 case INTERRUPT_HINT_RESUME:
462 if (audioStream_->GetState() != PAUSED || !isForcePaused_) {
463 AUDIO_DEBUG_LOG("AudioRendererGateway::OnInterrupt state is not paused or not forced paused");
464 return;
465 }
466 isForcePaused_ = false;
467 NotifyForcePausedToResume(interruptEvent);
468 return; // return, sending callback is taken care in NotifyForcePausedToResume
469 case INTERRUPT_HINT_STOP:
470 (void)audioStream_->StopAudioStream();
471 break;
472 case INTERRUPT_HINT_DUCK:
473 if (!HandleForceDucking(interruptEvent)) {
474 AUDIO_DEBUG_LOG("AudioRendererGateway:: It is not forced ducked, no need notify app, return");
475 return;
476 }
477 isForceDucked_ = true;
478 break;
479 case INTERRUPT_HINT_UNDUCK:
480 if (!isForceDucked_) {
481 AUDIO_DEBUG_LOG("AudioRendererGateway:: It is not forced ducked, no need to unduck or notify app");
482 return;
483 }
484 (void)audioStream_->SetVolume(instanceVolBeforeDucking_);
485 AUDIO_DEBUG_LOG("AudioRendererGateway: unduck Volume(instance) complete: %{public}f",
486 instanceVolBeforeDucking_);
487 isForceDucked_ = false;
488 break;
489 default:
490 break;
491 }
492 // Notify valid forced event callbacks to app
493 InterruptEvent interruptEventForced {interruptEvent.eventType, interruptEvent.forceType, interruptEvent.hintType};
494 NotifyEvent(interruptEventForced);
495 }
496
OnInterrupt(const InterruptEventInternal & interruptEvent)497 void AudioInterruptCallbackGateway::OnInterrupt(const InterruptEventInternal &interruptEvent)
498 {
499 cb_ = callback_.lock();
500 InterruptForceType forceType = interruptEvent.forceType;
501 AUDIO_DEBUG_LOG("AudioRendererGateway: OnInterrupt InterruptForceType: %{public}d", forceType);
502
503 if (forceType != INTERRUPT_FORCE) { // INTERRUPT_SHARE
504 AUDIO_DEBUG_LOG("AudioRendererGateway ForceType: INTERRUPT_SHARE. Let app handle the event");
505 InterruptEvent interruptEventShared {interruptEvent.eventType, interruptEvent.forceType,
506 interruptEvent.hintType};
507 NotifyEvent(interruptEventShared);
508 return;
509 }
510
511 if (audioStream_ == nullptr) {
512 AUDIO_DEBUG_LOG("AudioInterruptCallbackGateway::OnInterrupt: stream is null. No need to take forced action");
513 return;
514 }
515
516 HandleAndNotifyForcedEvent(interruptEvent);
517 }
518
SaveCallback(const std::weak_ptr<AudioRendererCallback> & callback)519 void AudioStreamRenderCallback::SaveCallback(const std::weak_ptr<AudioRendererCallback> &callback)
520 {
521 std::shared_ptr<AudioRendererCallback> cb = callback.lock();
522 AUDIO_ERR_LOG("AudioStreamRenderCallback::SaveCallback cb");
523 callback_ = callback;
524 }
525
OnStateChange(const State state,StateChangeCmdType cmdType)526 void AudioStreamRenderCallback::OnStateChange(const State state, StateChangeCmdType cmdType)
527 {
528 std::shared_ptr<AudioRendererCallback> cb = callback_.lock();
529 if (cb == nullptr) {
530 AUDIO_ERR_LOG("AudioStreamRenderCallback::OnStateChange cb == nullptr.");
531 return;
532 }
533 AUDIO_ERR_LOG("AudioStreamRenderCallback::OnStateChange cb");
534 cb->OnStateChange(static_cast<RendererState>(state));
535 }
536
SetRenderMode(AudioRenderMode renderMode) const537 int32_t AudioRendererGateway::SetRenderMode(AudioRenderMode renderMode) const
538 {
539 return audioStream_->SetRenderMode(renderMode);
540 }
541
GetRenderMode() const542 AudioRenderMode AudioRendererGateway::GetRenderMode() const
543 {
544 return audioStream_->GetRenderMode();
545 }
546
GetBufferDesc(BufferDesc & bufDesc) const547 int32_t AudioRendererGateway::GetBufferDesc(BufferDesc &bufDesc) const
548 {
549 return audioStream_->GetBufferDesc(bufDesc);
550 }
551
Enqueue(const BufferDesc & bufDesc) const552 int32_t AudioRendererGateway::Enqueue(const BufferDesc &bufDesc) const
553 {
554 return audioStream_->Enqueue(bufDesc);
555 }
556
Clear() const557 int32_t AudioRendererGateway::Clear() const
558 {
559 return audioStream_->Clear();
560 }
561
GetBufQueueState(BufferQueueState & bufState) const562 int32_t AudioRendererGateway::GetBufQueueState(BufferQueueState &bufState) const
563 {
564 return audioStream_->GetBufQueueState(bufState);
565 }
566
SetApplicationCachePath(const std::string cachePath)567 void AudioRendererGateway::SetApplicationCachePath(const std::string cachePath)
568 {
569 audioStream_->SetApplicationCachePath(cachePath);
570 }
571
SetRendererWriteCallback(const std::shared_ptr<AudioRendererWriteCallback> & callback)572 int32_t AudioRendererGateway::SetRendererWriteCallback(const std::shared_ptr<AudioRendererWriteCallback> &callback)
573 {
574 return audioStream_->SetRendererWriteCallback(callback);
575 }
576
SetInterruptMode(InterruptMode mode)577 void AudioRendererGateway::SetInterruptMode(InterruptMode mode)
578 {
579 AUDIO_INFO_LOG("AudioRendererGateway: SetInterruptMode: InterruptMode %{pubilc}d", mode);
580 mode_ = mode;
581 }
582
SetLowPowerVolume(float volume) const583 int32_t AudioRendererGateway::SetLowPowerVolume(float volume) const
584 {
585 return 0;
586 }
587
GetLowPowerVolume() const588 float AudioRendererGateway::GetLowPowerVolume() const
589 {
590 return 0;
591 }
592
GetSingleStreamVolume() const593 float AudioRendererGateway::GetSingleStreamVolume() const
594 {
595 return 0;
596 }
597 } // namespace AudioStandard
598 } // namespace OHOS
599