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 ×tamp, Timestamp::Timestampbase base)498 bool OHAudioRenderer::GetAudioTime(Timestamp ×tamp, 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