1 /*
2  * Copyright (c) 2023 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 "OHAudioRenderer"
17 #endif
18 
19 #include "OHAudioRenderer.h"
20 #include "audio_errors.h"
21 
22 using OHOS::AudioStandard::Timestamp;
23 
24 static const int64_t SECOND_TO_NANOSECOND = 1000000000;
25 
convertRenderer(OH_AudioRenderer *renderer)26 static OHOS::AudioStandard::OHAudioRenderer *convertRenderer(OH_AudioRenderer *renderer)
27 {
28     return (OHOS::AudioStandard::OHAudioRenderer*) renderer;
29 }
30 
ConvertError(int32_t err)31 static OH_AudioStream_Result ConvertError(int32_t err)
32 {
33     if (err == OHOS::AudioStandard::SUCCESS) {
34         return AUDIOSTREAM_SUCCESS;
35     } else if (err == OHOS::AudioStandard::ERR_INVALID_PARAM) {
36         return AUDIOSTREAM_ERROR_INVALID_PARAM;
37     } else if (err == OHOS::AudioStandard::ERR_ILLEGAL_STATE) {
38         return AUDIOSTREAM_ERROR_ILLEGAL_STATE;
39     }
40     return AUDIOSTREAM_ERROR_SYSTEM;
41 }
42 
OH_AudioRenderer_Start(OH_AudioRenderer *renderer)43 OH_AudioStream_Result OH_AudioRenderer_Start(OH_AudioRenderer *renderer)
44 {
45     OHOS::AudioStandard::OHAudioRenderer *audioRenderer = convertRenderer(renderer);
46     CHECK_AND_RETURN_RET_LOG(audioRenderer != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert renderer failed");
47     if (audioRenderer->Start()) {
48         return AUDIOSTREAM_SUCCESS;
49     } else {
50         return AUDIOSTREAM_ERROR_ILLEGAL_STATE;
51     }
52 }
53 
OH_AudioRenderer_Pause(OH_AudioRenderer *renderer)54 OH_AudioStream_Result OH_AudioRenderer_Pause(OH_AudioRenderer *renderer)
55 {
56     OHOS::AudioStandard::OHAudioRenderer *audioRenderer = convertRenderer(renderer);
57     CHECK_AND_RETURN_RET_LOG(audioRenderer != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert renderer failed");
58 
59     if (audioRenderer->Pause()) {
60         return AUDIOSTREAM_SUCCESS;
61     } else {
62         return AUDIOSTREAM_ERROR_ILLEGAL_STATE;
63     }
64 }
65 
OH_AudioRenderer_Stop(OH_AudioRenderer *renderer)66 OH_AudioStream_Result OH_AudioRenderer_Stop(OH_AudioRenderer *renderer)
67 {
68     OHOS::AudioStandard::OHAudioRenderer *audioRenderer = convertRenderer(renderer);
69     CHECK_AND_RETURN_RET_LOG(audioRenderer != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert renderer failed");
70 
71     if (audioRenderer->Stop()) {
72         return AUDIOSTREAM_SUCCESS;
73     } else {
74         return AUDIOSTREAM_ERROR_ILLEGAL_STATE;
75     }
76 }
77 
OH_AudioRenderer_Flush(OH_AudioRenderer *renderer)78 OH_AudioStream_Result OH_AudioRenderer_Flush(OH_AudioRenderer *renderer)
79 {
80     OHOS::AudioStandard::OHAudioRenderer *audioRenderer = convertRenderer(renderer);
81     CHECK_AND_RETURN_RET_LOG(audioRenderer != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert renderer failed");
82 
83     if (audioRenderer->Flush()) {
84         return AUDIOSTREAM_SUCCESS;
85     } else {
86         return AUDIOSTREAM_ERROR_ILLEGAL_STATE;
87     }
88 }
89 
OH_AudioRenderer_Release(OH_AudioRenderer *renderer)90 OH_AudioStream_Result OH_AudioRenderer_Release(OH_AudioRenderer *renderer)
91 {
92     OHOS::AudioStandard::OHAudioRenderer *audioRenderer = convertRenderer(renderer);
93     CHECK_AND_RETURN_RET_LOG(audioRenderer != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert renderer failed");
94 
95     if (audioRenderer->Release()) {
96         delete audioRenderer;
97         audioRenderer = nullptr;
98         return AUDIOSTREAM_SUCCESS;
99     } else {
100         return AUDIOSTREAM_ERROR_ILLEGAL_STATE;
101     }
102 }
103 
OH_AudioRenderer_GetCurrentState(OH_AudioRenderer *renderer, OH_AudioStream_State *state)104 OH_AudioStream_Result OH_AudioRenderer_GetCurrentState(OH_AudioRenderer *renderer, OH_AudioStream_State *state)
105 {
106     OHOS::AudioStandard::OHAudioRenderer *audioRenderer = convertRenderer(renderer);
107     CHECK_AND_RETURN_RET_LOG(audioRenderer != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert renderer failed");
108 
109     OHOS::AudioStandard::RendererState rendererState = audioRenderer->GetCurrentState();
110     *state = (OH_AudioStream_State)rendererState;
111     return AUDIOSTREAM_SUCCESS;
112 }
113 
OH_AudioRenderer_GetSamplingRate(OH_AudioRenderer *renderer, int32_t *rate)114 OH_AudioStream_Result OH_AudioRenderer_GetSamplingRate(OH_AudioRenderer *renderer, int32_t *rate)
115 {
116     OHOS::AudioStandard::OHAudioRenderer *audioRenderer = convertRenderer(renderer);
117     CHECK_AND_RETURN_RET_LOG(audioRenderer != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert renderer failed");
118 
119     *rate = audioRenderer->GetSamplingRate();
120     return AUDIOSTREAM_SUCCESS;
121 }
122 
OH_AudioRenderer_GetStreamId(OH_AudioRenderer *renderer, uint32_t *streamId)123 OH_AudioStream_Result OH_AudioRenderer_GetStreamId(OH_AudioRenderer *renderer, uint32_t *streamId)
124 {
125     OHOS::AudioStandard::OHAudioRenderer *audioRenderer = convertRenderer(renderer);
126     CHECK_AND_RETURN_RET_LOG(audioRenderer != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert renderer failed");
127     audioRenderer->GetStreamId(*streamId);
128     return AUDIOSTREAM_SUCCESS;
129 }
130 
OH_AudioRenderer_GetChannelCount(OH_AudioRenderer *renderer, int32_t *channelCount)131 OH_AudioStream_Result OH_AudioRenderer_GetChannelCount(OH_AudioRenderer *renderer, int32_t *channelCount)
132 {
133     OHOS::AudioStandard::OHAudioRenderer *audioRenderer = convertRenderer(renderer);
134     CHECK_AND_RETURN_RET_LOG(audioRenderer != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert renderer failed");
135     *channelCount = audioRenderer->GetChannelCount();
136     return AUDIOSTREAM_SUCCESS;
137 }
138 
OH_AudioRenderer_GetSampleFormat(OH_AudioRenderer *renderer, OH_AudioStream_SampleFormat *sampleFormat)139 OH_AudioStream_Result OH_AudioRenderer_GetSampleFormat(OH_AudioRenderer *renderer,
140     OH_AudioStream_SampleFormat *sampleFormat)
141 {
142     OHOS::AudioStandard::OHAudioRenderer *audioRenderer = convertRenderer(renderer);
143     CHECK_AND_RETURN_RET_LOG(audioRenderer != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert renderer failed");
144     *sampleFormat = (OH_AudioStream_SampleFormat)audioRenderer->GetSampleFormat();
145     return AUDIOSTREAM_SUCCESS;
146 }
147 
OH_AudioRenderer_GetLatencyMode(OH_AudioRenderer *renderer, OH_AudioStream_LatencyMode *latencyMode)148 OH_AudioStream_Result OH_AudioRenderer_GetLatencyMode(OH_AudioRenderer *renderer,
149     OH_AudioStream_LatencyMode *latencyMode)
150 {
151     OHOS::AudioStandard::OHAudioRenderer *audioRenderer = convertRenderer(renderer);
152     CHECK_AND_RETURN_RET_LOG(audioRenderer != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert renderer failed");
153     OHOS::AudioStandard::AudioRendererInfo rendererInfo;
154     audioRenderer->GetRendererInfo(rendererInfo);
155     *latencyMode = (OH_AudioStream_LatencyMode)rendererInfo.rendererFlags;
156 
157     return AUDIOSTREAM_SUCCESS;
158 }
159 
OH_AudioRenderer_GetRendererInfo(OH_AudioRenderer *renderer, OH_AudioStream_Usage *usage)160 OH_AudioStream_Result OH_AudioRenderer_GetRendererInfo(OH_AudioRenderer *renderer,
161     OH_AudioStream_Usage *usage)
162 {
163     OHOS::AudioStandard::OHAudioRenderer *audioRenderer = convertRenderer(renderer);
164     CHECK_AND_RETURN_RET_LOG(audioRenderer != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert renderer failed");
165 
166     OHOS::AudioStandard::AudioRendererInfo rendererInfo;
167     audioRenderer->GetRendererInfo(rendererInfo);
168     *usage = (OH_AudioStream_Usage)rendererInfo.streamUsage;
169     return AUDIOSTREAM_SUCCESS;
170 }
171 
OH_AudioRenderer_GetRendererPrivacy(OH_AudioRenderer* renderer, OH_AudioStream_PrivacyType* privacy)172 OH_AudioStream_Result OH_AudioRenderer_GetRendererPrivacy(OH_AudioRenderer* renderer,
173     OH_AudioStream_PrivacyType* privacy)
174 {
175     OHOS::AudioStandard::OHAudioRenderer *audioRenderer = convertRenderer(renderer);
176     CHECK_AND_RETURN_RET_LOG(audioRenderer != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert renderer failed");
177 
178     *privacy = (OH_AudioStream_PrivacyType)audioRenderer->GetRendererPrivacy();
179     return AUDIOSTREAM_SUCCESS;
180 }
181 
OH_AudioRenderer_GetEncodingType(OH_AudioRenderer *renderer, OH_AudioStream_EncodingType *encodingType)182 OH_AudioStream_Result OH_AudioRenderer_GetEncodingType(OH_AudioRenderer *renderer,
183     OH_AudioStream_EncodingType *encodingType)
184 {
185     OHOS::AudioStandard::OHAudioRenderer *audioRenderer = convertRenderer(renderer);
186     CHECK_AND_RETURN_RET_LOG(audioRenderer != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert renderer failed");
187     *encodingType = (OH_AudioStream_EncodingType)audioRenderer->GetEncodingType();
188     return AUDIOSTREAM_SUCCESS;
189 }
190 
OH_AudioRenderer_GetFramesWritten(OH_AudioRenderer *renderer, int64_t *frames)191 OH_AudioStream_Result OH_AudioRenderer_GetFramesWritten(OH_AudioRenderer *renderer, int64_t *frames)
192 {
193     OHOS::AudioStandard::OHAudioRenderer *audioRenderer = convertRenderer(renderer);
194     CHECK_AND_RETURN_RET_LOG(audioRenderer != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert renderer failed");
195     *frames = audioRenderer->GetFramesWritten();
196     return AUDIOSTREAM_SUCCESS;
197 }
198 
OH_AudioRenderer_GetTimestamp(OH_AudioRenderer *renderer, clockid_t clockId, int64_t *framePosition, int64_t *timestamp)199 OH_AudioStream_Result OH_AudioRenderer_GetTimestamp(OH_AudioRenderer *renderer,
200     clockid_t clockId, int64_t *framePosition, int64_t *timestamp)
201 {
202     OHOS::AudioStandard::OHAudioRenderer *audioRenderer = convertRenderer(renderer);
203     CHECK_AND_RETURN_RET_LOG(audioRenderer != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert renderer failed");
204     CHECK_AND_RETURN_RET_LOG(clockId == CLOCK_MONOTONIC, AUDIOSTREAM_ERROR_INVALID_PARAM, "error clockId value");
205     Timestamp stamp;
206     Timestamp::Timestampbase base = Timestamp::Timestampbase::MONOTONIC;
207     bool ret = audioRenderer->GetAudioTime(stamp, base);
208     if (!ret) {
209         AUDIO_ERR_LOG("GetAudioTime error!");
210         return AUDIOSTREAM_ERROR_ILLEGAL_STATE;
211     }
212     *framePosition = stamp.framePosition;
213     *timestamp = stamp.time.tv_sec * SECOND_TO_NANOSECOND + stamp.time.tv_nsec;
214     return AUDIOSTREAM_SUCCESS;
215 }
216 
OH_AudioRenderer_GetFrameSizeInCallback(OH_AudioRenderer *renderer, int32_t *frameSize)217 OH_AudioStream_Result OH_AudioRenderer_GetFrameSizeInCallback(OH_AudioRenderer *renderer, int32_t *frameSize)
218 {
219     OHOS::AudioStandard::OHAudioRenderer *audioRenderer = convertRenderer(renderer);
220     CHECK_AND_RETURN_RET_LOG(audioRenderer != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert renderer failed");
221     *frameSize = audioRenderer->GetFrameSizeInCallback();
222     return AUDIOSTREAM_SUCCESS;
223 }
224 
OH_AudioRenderer_GetSpeed(OH_AudioRenderer *renderer, float *speed)225 OH_AudioStream_Result OH_AudioRenderer_GetSpeed(OH_AudioRenderer *renderer, float *speed)
226 {
227     OHOS::AudioStandard::OHAudioRenderer *audioRenderer = convertRenderer(renderer);
228     CHECK_AND_RETURN_RET_LOG(audioRenderer != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert renderer failed");
229     *speed = audioRenderer->GetSpeed();
230     return AUDIOSTREAM_SUCCESS;
231 }
232 
OH_AudioRenderer_SetSpeed(OH_AudioRenderer *renderer, float speed)233 OH_AudioStream_Result OH_AudioRenderer_SetSpeed(OH_AudioRenderer *renderer, float speed)
234 {
235     OHOS::AudioStandard::OHAudioRenderer *audioRenderer = convertRenderer(renderer);
236     CHECK_AND_RETURN_RET_LOG(audioRenderer != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert renderer failed");
237     audioRenderer->SetSpeed(speed);
238     return AUDIOSTREAM_SUCCESS;
239 }
240 
OH_AudioRenderer_SetVolume(OH_AudioRenderer *renderer, float volume)241 OH_AudioStream_Result OH_AudioRenderer_SetVolume(OH_AudioRenderer *renderer, float volume)
242 {
243     OHOS::AudioStandard::OHAudioRenderer *audioRenderer = convertRenderer(renderer);
244     CHECK_AND_RETURN_RET_LOG(audioRenderer != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert renderer failed");
245     CHECK_AND_RETURN_RET_LOG(((volume >= 0) && (volume <= 1)), AUDIOSTREAM_ERROR_INVALID_PARAM, "volume set invalid");
246     int32_t err = audioRenderer->SetVolume(volume);
247     return ConvertError(err);
248 }
249 
OH_AudioRenderer_SetVolumeWithRamp(OH_AudioRenderer *renderer, float volume, int32_t durationMs)250 OH_AudioStream_Result OH_AudioRenderer_SetVolumeWithRamp(OH_AudioRenderer *renderer, float volume, int32_t durationMs)
251 {
252     OHOS::AudioStandard::OHAudioRenderer *audioRenderer = convertRenderer(renderer);
253     CHECK_AND_RETURN_RET_LOG(audioRenderer != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert renderer failed");
254     CHECK_AND_RETURN_RET_LOG(((volume >= 0) && (volume <= 1)), AUDIOSTREAM_ERROR_INVALID_PARAM, "volume set invalid");
255     int32_t err = audioRenderer->SetVolumeWithRamp(volume, durationMs);
256     return ConvertError(err);
257 }
258 
OH_AudioRenderer_GetVolume(OH_AudioRenderer *renderer, float *volume)259 OH_AudioStream_Result OH_AudioRenderer_GetVolume(OH_AudioRenderer *renderer, float *volume)
260 {
261     OHOS::AudioStandard::OHAudioRenderer *audioRenderer = convertRenderer(renderer);
262     CHECK_AND_RETURN_RET_LOG(audioRenderer != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert renderer failed");
263     CHECK_AND_RETURN_RET_LOG(volume != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "volume is nullptr");
264     *volume = audioRenderer->GetVolume();
265     return AUDIOSTREAM_SUCCESS;
266 }
267 
OH_AudioRenderer_SetMarkPosition(OH_AudioRenderer *renderer, uint32_t samplePos, OH_AudioRenderer_OnMarkReachedCallback callback, void *userData)268 OH_AudioStream_Result OH_AudioRenderer_SetMarkPosition(OH_AudioRenderer *renderer, uint32_t samplePos,
269     OH_AudioRenderer_OnMarkReachedCallback callback, void *userData)
270 {
271     OHOS::AudioStandard::OHAudioRenderer *audioRenderer = convertRenderer(renderer);
272     CHECK_AND_RETURN_RET_LOG(audioRenderer != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert renderer failed");
273     CHECK_AND_RETURN_RET_LOG(samplePos > 0, AUDIOSTREAM_ERROR_INVALID_PARAM, "framePos set invalid");
274     int32_t err = audioRenderer->SetRendererPositionCallback(callback, samplePos, userData);
275     return ConvertError(err);
276 }
277 
OH_AudioRenderer_CancelMark(OH_AudioRenderer *renderer)278 OH_AudioStream_Result OH_AudioRenderer_CancelMark(OH_AudioRenderer *renderer)
279 {
280     OHOS::AudioStandard::OHAudioRenderer *audioRenderer = convertRenderer(renderer);
281     CHECK_AND_RETURN_RET_LOG(audioRenderer != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert renderer failed");
282     audioRenderer->UnsetRendererPositionCallback();
283     return AUDIOSTREAM_SUCCESS;
284 }
285 
OH_AudioRenderer_GetChannelLayout(OH_AudioRenderer *renderer, OH_AudioChannelLayout *channelLayout)286 OH_AudioStream_Result OH_AudioRenderer_GetChannelLayout(OH_AudioRenderer *renderer,
287     OH_AudioChannelLayout *channelLayout)
288 {
289     OHOS::AudioStandard::OHAudioRenderer *audioRenderer = convertRenderer(renderer);
290     CHECK_AND_RETURN_RET_LOG(audioRenderer != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert renderer failed");
291     *channelLayout = (OH_AudioChannelLayout)audioRenderer->GetChannelLayout();
292     return AUDIOSTREAM_SUCCESS;
293 }
294 
OH_AudioRenderer_GetEffectMode(OH_AudioRenderer *renderer, OH_AudioStream_AudioEffectMode *effectMode)295 OH_AudioStream_Result OH_AudioRenderer_GetEffectMode(OH_AudioRenderer *renderer,
296     OH_AudioStream_AudioEffectMode *effectMode)
297 {
298     OHOS::AudioStandard::OHAudioRenderer *audioRenderer = convertRenderer(renderer);
299     CHECK_AND_RETURN_RET_LOG(audioRenderer != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert renderer failed");
300     *effectMode = (OH_AudioStream_AudioEffectMode)audioRenderer->GetEffectMode();
301     return AUDIOSTREAM_SUCCESS;
302 }
303 
OH_AudioRenderer_SetEffectMode(OH_AudioRenderer *renderer, OH_AudioStream_AudioEffectMode effectMode)304 OH_AudioStream_Result OH_AudioRenderer_SetEffectMode(OH_AudioRenderer *renderer,
305     OH_AudioStream_AudioEffectMode effectMode)
306 {
307     OHOS::AudioStandard::OHAudioRenderer *audioRenderer = convertRenderer(renderer);
308     CHECK_AND_RETURN_RET_LOG(audioRenderer != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert renderer failed");
309     audioRenderer->SetEffectMode((OHOS::AudioStandard::AudioEffectMode)effectMode);
310     return AUDIOSTREAM_SUCCESS;
311 }
312 
OH_AudioRenderer_GetUnderflowCount(OH_AudioRenderer* renderer, uint32_t* count)313 OH_AudioStream_Result OH_AudioRenderer_GetUnderflowCount(OH_AudioRenderer* renderer, uint32_t* count)
314 {
315     OHOS::AudioStandard::OHAudioRenderer *audioRenderer = convertRenderer(renderer);
316     CHECK_AND_RETURN_RET_LOG(audioRenderer != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert renderer failed");
317     CHECK_AND_RETURN_RET_LOG(count != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "count is nullptr");
318     *count = audioRenderer->GetUnderflowCount();
319     return AUDIOSTREAM_SUCCESS;
320 }
321 
OH_AudioRenderer_SetSilentModeAndMixWithOthers( OH_AudioRenderer* renderer, bool on)322 OH_AudioStream_Result OH_AudioRenderer_SetSilentModeAndMixWithOthers(
323     OH_AudioRenderer* renderer, bool on)
324 {
325     OHOS::AudioStandard::OHAudioRenderer *audioRenderer = convertRenderer(renderer);
326     CHECK_AND_RETURN_RET_LOG(audioRenderer != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert renderer failed");
327     audioRenderer->SetSilentModeAndMixWithOthers(on);
328     return AUDIOSTREAM_SUCCESS;
329 }
330 
OH_AudioRenderer_GetSilentModeAndMixWithOthers( OH_AudioRenderer* renderer, bool* on)331 OH_AudioStream_Result OH_AudioRenderer_GetSilentModeAndMixWithOthers(
332     OH_AudioRenderer* renderer, bool* on)
333 {
334     OHOS::AudioStandard::OHAudioRenderer *audioRenderer = convertRenderer(renderer);
335     CHECK_AND_RETURN_RET_LOG(audioRenderer != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert renderer failed");
336     *on = audioRenderer->GetSilentModeAndMixWithOthers();
337     return AUDIOSTREAM_SUCCESS;
338 }
339 
OH_AudioRenderer_SetDefaultOutputDevice( OH_AudioRenderer* renderer, OH_AudioDevice_Type deviceType)340 OH_AudioStream_Result OH_AudioRenderer_SetDefaultOutputDevice(
341     OH_AudioRenderer* renderer, OH_AudioDevice_Type deviceType)
342 {
343     OHOS::AudioStandard::OHAudioRenderer *audioRenderer = convertRenderer(renderer);
344     CHECK_AND_RETURN_RET_LOG(audioRenderer != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert renderer failed");
345     bool result = (deviceType == AUDIO_DEVICE_TYPE_EARPIECE || deviceType == AUDIO_DEVICE_TYPE_SPEAKER ||
346         deviceType == AUDIO_DEVICE_TYPE_DEFAULT) ? true : false;
347     CHECK_AND_RETURN_RET_LOG(result != false, AUDIOSTREAM_ERROR_INVALID_PARAM, "deviceType is not valid");
348     int32_t ret = audioRenderer->SetDefaultOutputDevice((OHOS::AudioStandard::DeviceType)deviceType);
349     if (ret == OHOS::AudioStandard::ERR_NOT_SUPPORTED) {
350         AUDIO_ERR_LOG("This audiorenderer can not reset the output device");
351         return AUDIOSTREAM_ERROR_ILLEGAL_STATE;
352     } else if (ret != AUDIOSTREAM_SUCCESS) {
353         AUDIO_ERR_LOG("system error when calling this function");
354         return AUDIOSTREAM_ERROR_SYSTEM;
355     }
356     return AUDIOSTREAM_SUCCESS;
357 }
358 
359 namespace OHOS {
360 namespace AudioStandard {
OHAudioRenderer()361 OHAudioRenderer::OHAudioRenderer()
362 {
363     AUDIO_INFO_LOG("OHAudioRenderer created!");
364 }
365 
~OHAudioRenderer()366 OHAudioRenderer::~OHAudioRenderer()
367 {
368     AUDIO_INFO_LOG("OHAudioRenderer destroyed!");
369 }
370 
Initialize(AudioRendererOptions &rendererOptions)371 bool OHAudioRenderer::Initialize(AudioRendererOptions &rendererOptions)
372 {
373     bool offloadAllowed = true;
374 
375     // unknown stream use music policy as default
376     if (rendererOptions.rendererInfo.streamUsage == STREAM_USAGE_UNKNOWN) {
377         rendererOptions.rendererInfo.streamUsage = STREAM_USAGE_MUSIC;
378         offloadAllowed = false;
379     }
380     std::string cacheDir = "/data/storage/el2/base/temp";
381     audioRenderer_ = AudioRenderer::Create(cacheDir, rendererOptions);
382 
383     // if caller do not set usage, do not allow to use offload output
384     if (audioRenderer_ != nullptr) {
385         audioRenderer_->SetOffloadAllowed(offloadAllowed);
386     }
387 
388     return audioRenderer_ != nullptr;
389 }
390 
Start()391 bool OHAudioRenderer::Start()
392 {
393     if (audioRenderer_ == nullptr) {
394         AUDIO_ERR_LOG("renderer client is nullptr");
395         return false;
396     }
397     return audioRenderer_->Start();
398 }
399 
Pause()400 bool OHAudioRenderer::Pause()
401 {
402     if (audioRenderer_ == nullptr) {
403         AUDIO_ERR_LOG("renderer client is nullptr");
404         return false;
405     }
406     return audioRenderer_->Pause();
407 }
408 
Stop()409 bool OHAudioRenderer::Stop()
410 {
411     if (audioRenderer_ == nullptr) {
412         AUDIO_ERR_LOG("renderer client is nullptr");
413         return false;
414     }
415     return audioRenderer_->Stop();
416 }
417 
Flush()418 bool OHAudioRenderer::Flush()
419 {
420     if (audioRenderer_ == nullptr) {
421         AUDIO_ERR_LOG("renderer client is nullptr");
422         return false;
423     }
424     return audioRenderer_->Flush();
425 }
426 
Release()427 bool OHAudioRenderer::Release()
428 {
429     if (audioRenderer_ == nullptr) {
430         AUDIO_ERR_LOG("renderer client is nullptr");
431         return false;
432     }
433 
434     if (!audioRenderer_->Release()) {
435         return false;
436     }
437     audioRenderer_ = nullptr;
438     audioRendererCallback_ = nullptr;
439     return true;
440 }
441 
GetCurrentState()442 RendererState OHAudioRenderer::GetCurrentState()
443 {
444     CHECK_AND_RETURN_RET_LOG(audioRenderer_ != nullptr, RENDERER_INVALID, "renderer client is nullptr");
445     return audioRenderer_->GetStatus();
446 }
447 
GetStreamId(uint32_t &streamId)448 void OHAudioRenderer::GetStreamId(uint32_t &streamId)
449 {
450     CHECK_AND_RETURN_LOG(audioRenderer_ != nullptr, "renderer client is nullptr");
451     audioRenderer_->GetAudioStreamId(streamId);
452 }
453 
GetChannelCount()454 AudioChannel OHAudioRenderer::GetChannelCount()
455 {
456     CHECK_AND_RETURN_RET_LOG(audioRenderer_ != nullptr, MONO, "renderer client is nullptr");
457     AudioRendererParams params;
458     audioRenderer_->GetParams(params);
459     return params.channelCount;
460 }
461 
GetSamplingRate()462 int32_t OHAudioRenderer::GetSamplingRate()
463 {
464     CHECK_AND_RETURN_RET_LOG(audioRenderer_ != nullptr, MONO, "renderer client is nullptr");
465     AudioRendererParams params;
466     audioRenderer_->GetParams(params);
467     return params.sampleRate;
468 }
469 
GetSampleFormat()470 AudioSampleFormat OHAudioRenderer::GetSampleFormat()
471 {
472     CHECK_AND_RETURN_RET_LOG(audioRenderer_ != nullptr, INVALID_WIDTH, "renderer client is nullptr");
473     AudioRendererParams params;
474     audioRenderer_->GetParams(params);
475     return params.sampleFormat;
476 }
477 
GetRendererInfo(AudioRendererInfo& rendererInfo)478 void OHAudioRenderer::GetRendererInfo(AudioRendererInfo& rendererInfo)
479 {
480     CHECK_AND_RETURN_LOG(audioRenderer_ != nullptr, "renderer client is nullptr");
481     audioRenderer_->GetRendererInfo(rendererInfo);
482 }
483 
GetEncodingType()484 AudioEncodingType OHAudioRenderer::GetEncodingType()
485 {
486     CHECK_AND_RETURN_RET_LOG(audioRenderer_ != nullptr, ENCODING_INVALID, "renderer client is nullptr");
487     AudioRendererParams params;
488     audioRenderer_->GetParams(params);
489     return params.encodingType;
490 }
491 
GetFramesWritten()492 int64_t OHAudioRenderer::GetFramesWritten()
493 {
494     CHECK_AND_RETURN_RET_LOG(audioRenderer_ != nullptr, ERROR, "renderer client is nullptr");
495     return audioRenderer_->GetFramesWritten();
496 }
497 
GetAudioTime(Timestamp &timestamp, Timestamp::Timestampbase base)498 bool OHAudioRenderer::GetAudioTime(Timestamp &timestamp, Timestamp::Timestampbase base)
499 {
500     CHECK_AND_RETURN_RET_LOG(audioRenderer_ != nullptr, false, "renderer client is nullptr");
501     return audioRenderer_->GetAudioPosition(timestamp, base);
502 }
503 
GetFrameSizeInCallback()504 int32_t OHAudioRenderer::GetFrameSizeInCallback()
505 {
506     CHECK_AND_RETURN_RET_LOG(audioRenderer_ != nullptr, ERROR, "renderer client is nullptr");
507     uint32_t frameSize;
508     audioRenderer_->GetFrameCount(frameSize);
509     return static_cast<int32_t>(frameSize);
510 }
511 
GetBufferDesc(BufferDesc &bufDesc) const512 int32_t OHAudioRenderer::GetBufferDesc(BufferDesc &bufDesc) const
513 {
514     CHECK_AND_RETURN_RET_LOG(audioRenderer_ != nullptr, ERROR, "renderer client is nullptr");
515     return audioRenderer_->GetBufferDesc(bufDesc);
516 }
517 
Enqueue(const BufferDesc &bufDesc) const518 int32_t OHAudioRenderer::Enqueue(const BufferDesc &bufDesc) const
519 {
520     CHECK_AND_RETURN_RET_LOG(audioRenderer_ != nullptr, ERROR, "renderer client is nullptr");
521     return audioRenderer_->Enqueue(bufDesc);
522 }
523 
SetSpeed(float speed)524 int32_t OHAudioRenderer::SetSpeed(float speed)
525 {
526     CHECK_AND_RETURN_RET_LOG(audioRenderer_ != nullptr, ERROR, "renderer client is nullptr");
527     return audioRenderer_->SetSpeed(speed);
528 }
529 
GetSpeed()530 float OHAudioRenderer::GetSpeed()
531 {
532     CHECK_AND_RETURN_RET_LOG(audioRenderer_ != nullptr, ERROR, "renderer client is nullptr");
533     return audioRenderer_->GetSpeed();
534 }
535 
SetVolume(float volume) const536 int32_t OHAudioRenderer::SetVolume(float volume) const
537 {
538     CHECK_AND_RETURN_RET_LOG(audioRenderer_ != nullptr, ERROR, "renderer client is nullptr");
539     return audioRenderer_->SetVolume(volume);
540 }
541 
GetVolume() const542 float OHAudioRenderer::GetVolume() const
543 {
544     CHECK_AND_RETURN_RET_LOG(audioRenderer_ != nullptr, ERROR, "renderer client is nullptr");
545     return audioRenderer_->GetVolume();
546 }
547 
SetVolumeWithRamp(float volume, int32_t duration)548 int32_t OHAudioRenderer::SetVolumeWithRamp(float volume, int32_t duration)
549 {
550     CHECK_AND_RETURN_RET_LOG(audioRenderer_ != nullptr, ERROR, "renderer client is nullptr");
551     return audioRenderer_->SetVolumeWithRamp(volume, duration);
552 }
553 
SetRendererPositionCallback(OH_AudioRenderer_OnMarkReachedCallback callback, uint32_t markPosition, void *userData)554 int32_t OHAudioRenderer::SetRendererPositionCallback(OH_AudioRenderer_OnMarkReachedCallback callback,
555     uint32_t markPosition, void *userData)
556 {
557     CHECK_AND_RETURN_RET_LOG(audioRenderer_ != nullptr, ERROR, "renderer client is nullptr");
558     CHECK_AND_RETURN_RET_LOG(callback != nullptr, ERROR, "callback is nullptr");
559     rendererPositionCallback_ = std::make_shared<OHRendererPositionCallback>(callback,
560         reinterpret_cast<OH_AudioRenderer*>(this), userData);
561     return audioRenderer_->SetRendererPositionCallback(markPosition, rendererPositionCallback_);
562 }
563 
UnsetRendererPositionCallback()564 void OHAudioRenderer::UnsetRendererPositionCallback()
565 {
566     CHECK_AND_RETURN_LOG(audioRenderer_ != nullptr, "renderer client is nullptr");
567     audioRenderer_->UnsetRendererPositionCallback();
568 }
569 
OnMarkReached(const int64_t &framePosition)570 void OHRendererPositionCallback::OnMarkReached(const int64_t &framePosition)
571 {
572     CHECK_AND_RETURN_LOG(ohAudioRenderer_ != nullptr, "renderer client is nullptr");
573     CHECK_AND_RETURN_LOG(callback_ != nullptr, "pointer to the function is nullptr");
574     callback_(ohAudioRenderer_, framePosition, userData_);
575 }
576 
GetChannelLayout()577 AudioChannelLayout OHAudioRenderer::GetChannelLayout()
578 {
579     CHECK_AND_RETURN_RET_LOG(audioRenderer_ != nullptr, CH_LAYOUT_UNKNOWN, "renderer client is nullptr");
580     AudioRendererParams params;
581     audioRenderer_->GetParams(params);
582     return params.channelLayout;
583 }
584 
GetRendererPrivacy()585 AudioPrivacyType OHAudioRenderer::GetRendererPrivacy()
586 {
587     CHECK_AND_RETURN_RET_LOG(audioRenderer_ != nullptr, PRIVACY_TYPE_PUBLIC, "renderer client is nullptr for privacy");
588     return audioRenderer_->GetAudioPrivacyType();
589 }
590 
GetEffectMode()591 AudioEffectMode OHAudioRenderer::GetEffectMode()
592 {
593     CHECK_AND_RETURN_RET_LOG(audioRenderer_ != nullptr, EFFECT_NONE, "renderer client is nullptr");
594     return audioRenderer_->GetAudioEffectMode();
595 }
596 
SetEffectMode(AudioEffectMode effectMode)597 int32_t OHAudioRenderer::SetEffectMode(AudioEffectMode effectMode)
598 {
599     CHECK_AND_RETURN_RET_LOG(audioRenderer_ != nullptr, ERROR, "renderer client is nullptr");
600     return audioRenderer_->SetAudioEffectMode(effectMode);
601 }
602 
SetWriteDataCallback(RendererCallback rendererCallbacks, void *userData, void *metadataUserData, AudioEncodingType encodingType)603 void OHAudioRenderer::SetWriteDataCallback(RendererCallback rendererCallbacks, void *userData,
604     void *metadataUserData, AudioEncodingType encodingType)
605 {
606     if (encodingType == ENCODING_AUDIOVIVID && rendererCallbacks.writeDataWithMetadataCallback != nullptr) {
607         std::shared_ptr<AudioRendererWriteCallback> callback = std::make_shared<OHAudioRendererModeCallback>(
608             rendererCallbacks.writeDataWithMetadataCallback, (OH_AudioRenderer*)this, metadataUserData, encodingType);
609         audioRenderer_->SetRendererWriteCallback(callback);
610         AUDIO_INFO_LOG("The write callback function is for AudioVivid type");
611     } else if (encodingType == ENCODING_PCM) {
612         if (writeDataCallbackType_ == WRITE_DATA_CALLBACK_WITH_RESULT &&
613             rendererCallbacks.onWriteDataCallback != nullptr) {
614             std::shared_ptr<AudioRendererWriteCallback> callback = std::make_shared<OHAudioRendererModeCallback>(
615                 rendererCallbacks.onWriteDataCallback, (OH_AudioRenderer*)this, userData, encodingType);
616             audioRenderer_->SetRendererWriteCallback(callback);
617             AUDIO_INFO_LOG("The write callback function is for PCM type with result");
618         }
619 
620         if (writeDataCallbackType_ == WRITE_DATA_CALLBACK_WITHOUT_RESULT &&
621             rendererCallbacks.callbacks.OH_AudioRenderer_OnWriteData != nullptr) {
622             std::shared_ptr<AudioRendererWriteCallback> callback = std::make_shared<OHAudioRendererModeCallback>(
623                 rendererCallbacks.callbacks, (OH_AudioRenderer*)this, userData, encodingType);
624             audioRenderer_->SetRendererWriteCallback(callback);
625             AUDIO_INFO_LOG("The write callback function is for PCM type without result");
626         }
627     } else {
628         AUDIO_WARNING_LOG("The write callback function is not set");
629     }
630 }
631 
SetInterruptCallback(RendererCallback rendererCallbacks, void *userData)632 void OHAudioRenderer::SetInterruptCallback(RendererCallback rendererCallbacks, void *userData)
633 {
634     if (rendererCallbacks.callbacks.OH_AudioRenderer_OnInterruptEvent != nullptr) {
635         audioRendererCallback_ = std::make_shared<OHAudioRendererCallback>(rendererCallbacks.callbacks,
636             (OH_AudioRenderer*)this, userData);
637         audioRenderer_->SetRendererCallback(audioRendererCallback_);
638     } else {
639         AUDIO_WARNING_LOG("The audio renderer interrupt callback function is not set");
640     }
641 }
642 
SetErrorCallback(RendererCallback rendererCallbacks, void *userData)643 void OHAudioRenderer::SetErrorCallback(RendererCallback rendererCallbacks, void *userData)
644 {
645     if (rendererCallbacks.callbacks.OH_AudioRenderer_OnError != nullptr) {
646         std::shared_ptr<AudioRendererPolicyServiceDiedCallback> callback =
647             std::make_shared<OHServiceDiedCallback>(rendererCallbacks.callbacks, (OH_AudioRenderer*)this, userData);
648         int32_t clientPid = getpid();
649         audioRenderer_->RegisterAudioPolicyServerDiedCb(clientPid, callback);
650 
651         std::shared_ptr<AudioRendererErrorCallback> errorCallback = std::make_shared<OHAudioRendererErrorCallback>(
652             rendererCallbacks.callbacks, (OH_AudioRenderer*)this, userData);
653         audioRenderer_->SetAudioRendererErrorCallback(errorCallback);
654     } else {
655         AUDIO_WARNING_LOG("The audio renderer error callback function is not set");
656     }
657 }
658 
SetRendererCallback(RendererCallback rendererCallbacks, void *userData, void *metadataUserData)659 void OHAudioRenderer::SetRendererCallback(RendererCallback rendererCallbacks, void *userData, void *metadataUserData)
660 {
661     CHECK_AND_RETURN_LOG(audioRenderer_ != nullptr, "renderer client is nullptr");
662     audioRenderer_->SetRenderMode(RENDER_MODE_CALLBACK);
663 
664     AudioEncodingType encodingType = GetEncodingType();
665     SetWriteDataCallback(rendererCallbacks, userData, metadataUserData, encodingType);
666     SetInterruptCallback(rendererCallbacks, userData);
667     SetErrorCallback(rendererCallbacks, userData);
668 }
669 
SetRendererOutputDeviceChangeCallback(OH_AudioRenderer_OutputDeviceChangeCallback callback, void *userData)670 void OHAudioRenderer::SetRendererOutputDeviceChangeCallback(OH_AudioRenderer_OutputDeviceChangeCallback callback,
671     void *userData)
672 {
673     CHECK_AND_RETURN_LOG(audioRenderer_ != nullptr, "renderer client is nullptr");
674     CHECK_AND_RETURN_LOG(callback != nullptr, "callback is nullptr");
675     audioRendererDeviceChangeCallbackWithInfo_ =
676         std::make_shared<OHAudioRendererDeviceChangeCallbackWithInfo> (callback,
677         reinterpret_cast<OH_AudioRenderer*>(this), userData);
678     audioRenderer_->RegisterOutputDeviceChangeWithInfoCallback(audioRendererDeviceChangeCallbackWithInfo_);
679 }
680 
SetPreferredFrameSize(int32_t frameSize)681 void OHAudioRenderer::SetPreferredFrameSize(int32_t frameSize)
682 {
683     audioRenderer_->SetPreferredFrameSize(frameSize);
684 }
685 
IsFastRenderer()686 bool OHAudioRenderer::IsFastRenderer()
687 {
688     return audioRenderer_->IsFastRenderer();
689 }
690 
GetUnderflowCount()691 uint32_t OHAudioRenderer::GetUnderflowCount()
692 {
693     CHECK_AND_RETURN_RET_LOG(audioRenderer_ != nullptr, ERROR, "renderer client is nullptr");
694     return audioRenderer_->GetUnderflowCount();
695 }
696 
OnWriteData(size_t length)697 void OHAudioRendererModeCallback::OnWriteData(size_t length)
698 {
699     OHAudioRenderer *audioRenderer = (OHAudioRenderer*)ohAudioRenderer_;
700     CHECK_AND_RETURN_LOG(audioRenderer != nullptr, "renderer client is nullptr");
701     CHECK_AND_RETURN_LOG(((encodingType_ == ENCODING_PCM) && (callbacks_.OH_AudioRenderer_OnWriteData != nullptr)) ||
702         ((encodingType_ == ENCODING_PCM) && (onWriteDataCallback_ != nullptr)) ||
703         ((encodingType_ == ENCODING_AUDIOVIVID) && (writeDataWithMetadataCallback_ != nullptr)),
704         "pointer to the function is nullptr");
705     BufferDesc bufDesc;
706     audioRenderer->GetBufferDesc(bufDesc);
707     if (encodingType_ == ENCODING_AUDIOVIVID && writeDataWithMetadataCallback_ != nullptr) {
708         writeDataWithMetadataCallback_(ohAudioRenderer_, metadataUserData_, (void*)bufDesc.buffer, bufDesc.bufLength,
709             (void*)bufDesc.metaBuffer, bufDesc.metaLength);
710     } else {
711         if (audioRenderer->GetRendererCallbackType() == WRITE_DATA_CALLBACK_WITHOUT_RESULT &&
712             callbacks_.OH_AudioRenderer_OnWriteData != nullptr) {
713             callbacks_.OH_AudioRenderer_OnWriteData(ohAudioRenderer_, userData_,
714                 (void*)bufDesc.buffer, bufDesc.bufLength);
715         }
716         if (audioRenderer->GetRendererCallbackType() == WRITE_DATA_CALLBACK_WITH_RESULT &&
717             onWriteDataCallback_ != nullptr) {
718             OH_AudioData_Callback_Result result = onWriteDataCallback_(ohAudioRenderer_, userData_,
719                 (void*)bufDesc.buffer, bufDesc.bufLength);
720             if (result == AUDIO_DATA_CALLBACK_RESULT_INVALID) {
721                 AUDIO_DEBUG_LOG("Data callback returned invalid, data will not be used.");
722                 bufDesc.dataLength = 0; // Ensure that the invalid data is not used.
723             }
724         }
725     }
726     audioRenderer->Enqueue(bufDesc);
727 }
728 
OnOutputDeviceChange(const DeviceInfo &deviceInfo, const AudioStreamDeviceChangeReason reason)729 void OHAudioRendererDeviceChangeCallback::OnOutputDeviceChange(const DeviceInfo &deviceInfo,
730     const AudioStreamDeviceChangeReason reason)
731 {
732     CHECK_AND_RETURN_LOG(ohAudioRenderer_ != nullptr, "renderer client is nullptr");
733     CHECK_AND_RETURN_LOG(callbacks_.OH_AudioRenderer_OnStreamEvent != nullptr, "pointer to the function is nullptr");
734 
735     OH_AudioStream_Event event =  AUDIOSTREAM_EVENT_ROUTING_CHANGED;
736     callbacks_.OH_AudioRenderer_OnStreamEvent(ohAudioRenderer_, userData_, event);
737 }
738 
OnInterrupt(const InterruptEvent &interruptEvent)739 void OHAudioRendererCallback::OnInterrupt(const InterruptEvent &interruptEvent)
740 {
741     CHECK_AND_RETURN_LOG(ohAudioRenderer_ != nullptr, "renderer client is nullptr");
742     CHECK_AND_RETURN_LOG(callbacks_.OH_AudioRenderer_OnInterruptEvent != nullptr, "pointer to the function is nullptr");
743     OH_AudioInterrupt_ForceType type = (OH_AudioInterrupt_ForceType)(interruptEvent.forceType);
744     OH_AudioInterrupt_Hint hint = OH_AudioInterrupt_Hint(interruptEvent.hintType);
745     callbacks_.OH_AudioRenderer_OnInterruptEvent(ohAudioRenderer_, userData_, type, hint);
746 }
747 
OnAudioPolicyServiceDied()748 void OHServiceDiedCallback::OnAudioPolicyServiceDied()
749 {
750     CHECK_AND_RETURN_LOG(ohAudioRenderer_ != nullptr, "renderer client is nullptr");
751     CHECK_AND_RETURN_LOG(callbacks_.OH_AudioRenderer_OnError != nullptr, "pointer to the function is nullptr");
752     OH_AudioStream_Result error = AUDIOSTREAM_ERROR_SYSTEM;
753     callbacks_.OH_AudioRenderer_OnError(ohAudioRenderer_, userData_, error);
754 }
755 
GetErrorResult(AudioErrors errorCode) const756 OH_AudioStream_Result OHAudioRendererErrorCallback::GetErrorResult(AudioErrors errorCode) const
757 {
758     switch (errorCode) {
759         case ERROR_ILLEGAL_STATE:
760             return AUDIOSTREAM_ERROR_ILLEGAL_STATE;
761         case ERROR_INVALID_PARAM:
762             return AUDIOSTREAM_ERROR_INVALID_PARAM;
763         case ERROR_SYSTEM:
764             return AUDIOSTREAM_ERROR_SYSTEM;
765         default:
766             return AUDIOSTREAM_ERROR_SYSTEM;
767     }
768 }
769 
OnError(AudioErrors errorCode)770 void OHAudioRendererErrorCallback::OnError(AudioErrors errorCode)
771 {
772     CHECK_AND_RETURN_LOG(ohAudioRenderer_ != nullptr && callbacks_.OH_AudioRenderer_OnError != nullptr,
773         "renderer client or error callback funtion is nullptr");
774     OH_AudioStream_Result error = GetErrorResult(errorCode);
775     callbacks_.OH_AudioRenderer_OnError(ohAudioRenderer_, userData_, error);
776 }
777 
OnOutputDeviceChange(const DeviceInfo &deviceInfo, const AudioStreamDeviceChangeReason reason)778 void OHAudioRendererDeviceChangeCallbackWithInfo::OnOutputDeviceChange(const DeviceInfo &deviceInfo,
779     const AudioStreamDeviceChangeReason reason)
780 {
781     CHECK_AND_RETURN_LOG(ohAudioRenderer_ != nullptr, "renderer client is nullptr");
782     CHECK_AND_RETURN_LOG(callback_ != nullptr, "pointer to the function is nullptr");
783 
784     callback_(ohAudioRenderer_, userData_, static_cast<OH_AudioStream_DeviceChangeReason>(reason));
785 }
786 
SetInterruptMode(InterruptMode mode)787 void OHAudioRenderer::SetInterruptMode(InterruptMode mode)
788 {
789     CHECK_AND_RETURN_LOG(audioRenderer_ != nullptr, "renderer client is nullptr");
790     audioRenderer_->SetInterruptMode(mode);
791 }
792 
SetSilentModeAndMixWithOthers(bool on)793 void OHAudioRenderer::SetSilentModeAndMixWithOthers(bool on)
794 {
795     CHECK_AND_RETURN_LOG(audioRenderer_ != nullptr, "renderer client is nullptr");
796     audioRenderer_->SetSilentModeAndMixWithOthers(on);
797 }
798 
GetSilentModeAndMixWithOthers()799 bool OHAudioRenderer::GetSilentModeAndMixWithOthers()
800 {
801     CHECK_AND_RETURN_RET_LOG(audioRenderer_ != nullptr, false, "renderer client is nullptr");
802     return audioRenderer_->GetSilentModeAndMixWithOthers();
803 }
804 
SetDefaultOutputDevice(DeviceType deviceType)805 int32_t OHAudioRenderer::SetDefaultOutputDevice(DeviceType deviceType)
806 {
807     CHECK_AND_RETURN_RET_LOG(audioRenderer_ != nullptr, ERROR, "renderer client is nullptr");
808     return audioRenderer_->SetDefaultOutputDevice(deviceType);
809 }
810 
SetRendererCallbackType(WriteDataCallbackType writeDataCallbackType)811 void OHAudioRenderer::SetRendererCallbackType(WriteDataCallbackType writeDataCallbackType)
812 {
813     writeDataCallbackType_ = writeDataCallbackType;
814 }
815 
GetRendererCallbackType()816 WriteDataCallbackType OHAudioRenderer::GetRendererCallbackType()
817 {
818     return writeDataCallbackType_;
819 }
820 }  // namespace AudioStandard
821 }  // namespace OHOS
822