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