• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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->GetTimestamp(stamp, base);
208     if (!ret) {
209         AUDIO_ERR_LOG("GetTimestamp 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_GetAudioTimestampInfo(OH_AudioRenderer * renderer,int64_t * framePosition,int64_t * timestamp)217 OH_AudioStream_Result OH_AudioRenderer_GetAudioTimestampInfo(OH_AudioRenderer *renderer,
218     int64_t *framePosition, int64_t *timestamp)
219 {
220     OHOS::AudioStandard::OHAudioRenderer *audioRenderer = convertRenderer(renderer);
221     CHECK_AND_RETURN_RET_LOG(audioRenderer != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert renderer failed");
222     CHECK_AND_RETURN_RET_LOG(framePosition != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "framePosition ptr err");
223     CHECK_AND_RETURN_RET_LOG(timestamp != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "timestamp ptr err");
224     Timestamp stamp;
225     Timestamp::Timestampbase base = Timestamp::Timestampbase::MONOTONIC;
226     int32_t errcode = audioRenderer->GetAudioTimestampInfo(stamp, base);
227     if (errcode != OHOS::AudioStandard::SUCCESS) {
228         return ConvertError(errcode);
229     }
230     *framePosition = stamp.framePosition;
231     *timestamp = stamp.time.tv_sec * SECOND_TO_NANOSECOND + stamp.time.tv_nsec;
232     return AUDIOSTREAM_SUCCESS;
233 }
234 
OH_AudioRenderer_GetFrameSizeInCallback(OH_AudioRenderer * renderer,int32_t * frameSize)235 OH_AudioStream_Result OH_AudioRenderer_GetFrameSizeInCallback(OH_AudioRenderer *renderer, int32_t *frameSize)
236 {
237     OHOS::AudioStandard::OHAudioRenderer *audioRenderer = convertRenderer(renderer);
238     CHECK_AND_RETURN_RET_LOG(audioRenderer != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert renderer failed");
239     *frameSize = audioRenderer->GetFrameSizeInCallback();
240     return AUDIOSTREAM_SUCCESS;
241 }
242 
OH_AudioRenderer_GetSpeed(OH_AudioRenderer * renderer,float * speed)243 OH_AudioStream_Result OH_AudioRenderer_GetSpeed(OH_AudioRenderer *renderer, float *speed)
244 {
245     OHOS::AudioStandard::OHAudioRenderer *audioRenderer = convertRenderer(renderer);
246     CHECK_AND_RETURN_RET_LOG(audioRenderer != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert renderer failed");
247     *speed = audioRenderer->GetSpeed();
248     return AUDIOSTREAM_SUCCESS;
249 }
250 
OH_AudioRenderer_SetSpeed(OH_AudioRenderer * renderer,float speed)251 OH_AudioStream_Result OH_AudioRenderer_SetSpeed(OH_AudioRenderer *renderer, float speed)
252 {
253     OHOS::AudioStandard::OHAudioRenderer *audioRenderer = convertRenderer(renderer);
254     CHECK_AND_RETURN_RET_LOG(audioRenderer != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert renderer failed");
255     audioRenderer->SetSpeed(speed);
256     return AUDIOSTREAM_SUCCESS;
257 }
258 
OH_AudioRenderer_GetUnderflowCount(OH_AudioRenderer * renderer,uint32_t * count)259 OH_AudioStream_Result OH_AudioRenderer_GetUnderflowCount(OH_AudioRenderer* renderer, uint32_t* count)
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(count != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "count is nullptr");
264     *count = audioRenderer->GetUnderflowCount();
265     return AUDIOSTREAM_SUCCESS;
266 }
267 
OH_AudioRenderer_SetVolume(OH_AudioRenderer * renderer,float volume)268 OH_AudioStream_Result OH_AudioRenderer_SetVolume(OH_AudioRenderer* renderer, float volume)
269 {
270     OHOS::AudioStandard::OHAudioRenderer *audioRenderer = convertRenderer(renderer);
271     CHECK_AND_RETURN_RET_LOG(audioRenderer != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert renderer failed");
272     CHECK_AND_RETURN_RET_LOG(((volume >= 0) && (volume <= 1)), AUDIOSTREAM_ERROR_INVALID_PARAM, "volume set invalid");
273     int32_t err = audioRenderer->SetVolume(volume);
274     return ConvertError(err);
275 }
276 
OH_AudioRenderer_SetVolumeWithRamp(OH_AudioRenderer * renderer,float volume,int32_t durationMs)277 OH_AudioStream_Result OH_AudioRenderer_SetVolumeWithRamp(OH_AudioRenderer *renderer, float volume, int32_t durationMs)
278 {
279     OHOS::AudioStandard::OHAudioRenderer *audioRenderer = convertRenderer(renderer);
280     CHECK_AND_RETURN_RET_LOG(audioRenderer != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert renderer failed");
281     CHECK_AND_RETURN_RET_LOG(((volume >= 0) && (volume <= 1)), AUDIOSTREAM_ERROR_INVALID_PARAM, "volume set invalid");
282     int32_t err = audioRenderer->SetVolumeWithRamp(volume, durationMs);
283     return ConvertError(err);
284 }
285 
OH_AudioRenderer_GetVolume(OH_AudioRenderer * renderer,float * volume)286 OH_AudioStream_Result OH_AudioRenderer_GetVolume(OH_AudioRenderer *renderer, float *volume)
287 {
288     OHOS::AudioStandard::OHAudioRenderer *audioRenderer = convertRenderer(renderer);
289     CHECK_AND_RETURN_RET_LOG(audioRenderer != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert renderer failed");
290     CHECK_AND_RETURN_RET_LOG(volume != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "volume is nullptr");
291     *volume = audioRenderer->GetVolume();
292     return AUDIOSTREAM_SUCCESS;
293 }
294 
OH_AudioRenderer_SetMarkPosition(OH_AudioRenderer * renderer,uint32_t samplePos,OH_AudioRenderer_OnMarkReachedCallback callback,void * userData)295 OH_AudioStream_Result OH_AudioRenderer_SetMarkPosition(OH_AudioRenderer *renderer, uint32_t samplePos,
296     OH_AudioRenderer_OnMarkReachedCallback callback, void *userData)
297 {
298     OHOS::AudioStandard::OHAudioRenderer *audioRenderer = convertRenderer(renderer);
299     CHECK_AND_RETURN_RET_LOG(audioRenderer != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert renderer failed");
300     CHECK_AND_RETURN_RET_LOG(samplePos > 0, AUDIOSTREAM_ERROR_INVALID_PARAM, "framePos set invalid");
301     int32_t err = audioRenderer->SetRendererPositionCallback(callback, samplePos, userData);
302     return ConvertError(err);
303 }
304 
OH_AudioRenderer_CancelMark(OH_AudioRenderer * renderer)305 OH_AudioStream_Result OH_AudioRenderer_CancelMark(OH_AudioRenderer *renderer)
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->UnsetRendererPositionCallback();
310     return AUDIOSTREAM_SUCCESS;
311 }
312 
OH_AudioRenderer_GetChannelLayout(OH_AudioRenderer * renderer,OH_AudioChannelLayout * channelLayout)313 OH_AudioStream_Result OH_AudioRenderer_GetChannelLayout(OH_AudioRenderer *renderer,
314     OH_AudioChannelLayout *channelLayout)
315 {
316     OHOS::AudioStandard::OHAudioRenderer *audioRenderer = convertRenderer(renderer);
317     CHECK_AND_RETURN_RET_LOG(audioRenderer != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert renderer failed");
318     *channelLayout = (OH_AudioChannelLayout)audioRenderer->GetChannelLayout();
319     return AUDIOSTREAM_SUCCESS;
320 }
321 
OH_AudioRenderer_GetEffectMode(OH_AudioRenderer * renderer,OH_AudioStream_AudioEffectMode * effectMode)322 OH_AudioStream_Result OH_AudioRenderer_GetEffectMode(OH_AudioRenderer *renderer,
323     OH_AudioStream_AudioEffectMode *effectMode)
324 {
325     OHOS::AudioStandard::OHAudioRenderer *audioRenderer = convertRenderer(renderer);
326     CHECK_AND_RETURN_RET_LOG(audioRenderer != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert renderer failed");
327     *effectMode = (OH_AudioStream_AudioEffectMode)audioRenderer->GetEffectMode();
328     return AUDIOSTREAM_SUCCESS;
329 }
330 
OH_AudioRenderer_SetEffectMode(OH_AudioRenderer * renderer,OH_AudioStream_AudioEffectMode effectMode)331 OH_AudioStream_Result OH_AudioRenderer_SetEffectMode(OH_AudioRenderer *renderer,
332     OH_AudioStream_AudioEffectMode effectMode)
333 {
334     OHOS::AudioStandard::OHAudioRenderer *audioRenderer = convertRenderer(renderer);
335     CHECK_AND_RETURN_RET_LOG(audioRenderer != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert renderer failed");
336     audioRenderer->SetEffectMode((OHOS::AudioStandard::AudioEffectMode)effectMode);
337     return AUDIOSTREAM_SUCCESS;
338 }
339 
OH_AudioRenderer_SetSilentModeAndMixWithOthers(OH_AudioRenderer * renderer,bool on)340 OH_AudioStream_Result OH_AudioRenderer_SetSilentModeAndMixWithOthers(
341     OH_AudioRenderer* renderer, bool on)
342 {
343     OHOS::AudioStandard::OHAudioRenderer *audioRenderer = convertRenderer(renderer);
344     CHECK_AND_RETURN_RET_LOG(audioRenderer != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert renderer failed");
345     audioRenderer->SetSilentModeAndMixWithOthers(on);
346     return AUDIOSTREAM_SUCCESS;
347 }
348 
OH_AudioRenderer_GetSilentModeAndMixWithOthers(OH_AudioRenderer * renderer,bool * on)349 OH_AudioStream_Result OH_AudioRenderer_GetSilentModeAndMixWithOthers(
350     OH_AudioRenderer* renderer, bool* on)
351 {
352     OHOS::AudioStandard::OHAudioRenderer *audioRenderer = convertRenderer(renderer);
353     CHECK_AND_RETURN_RET_LOG(audioRenderer != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert renderer failed");
354     *on = audioRenderer->GetSilentModeAndMixWithOthers();
355     return AUDIOSTREAM_SUCCESS;
356 }
357 
OH_AudioRenderer_SetDefaultOutputDevice(OH_AudioRenderer * renderer,OH_AudioDevice_Type deviceType)358 OH_AudioStream_Result OH_AudioRenderer_SetDefaultOutputDevice(
359     OH_AudioRenderer* renderer, OH_AudioDevice_Type deviceType)
360 {
361     OHOS::AudioStandard::OHAudioRenderer *audioRenderer = convertRenderer(renderer);
362     CHECK_AND_RETURN_RET_LOG(audioRenderer != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert renderer failed");
363     bool result = (deviceType == AUDIO_DEVICE_TYPE_EARPIECE || deviceType == AUDIO_DEVICE_TYPE_SPEAKER ||
364         deviceType == AUDIO_DEVICE_TYPE_DEFAULT) ? true : false;
365     CHECK_AND_RETURN_RET_LOG(result != false, AUDIOSTREAM_ERROR_INVALID_PARAM, "deviceType is not valid");
366     int32_t ret = audioRenderer->SetDefaultOutputDevice((OHOS::AudioStandard::DeviceType)deviceType);
367     if (ret == OHOS::AudioStandard::ERR_NOT_SUPPORTED) {
368         AUDIO_ERR_LOG("This audiorenderer can not reset the output device");
369         return AUDIOSTREAM_ERROR_ILLEGAL_STATE;
370     } else if (ret != AUDIOSTREAM_SUCCESS) {
371         AUDIO_ERR_LOG("system error when calling this function");
372         return AUDIOSTREAM_ERROR_SYSTEM;
373     }
374     return AUDIOSTREAM_SUCCESS;
375 }
376 
377 namespace OHOS {
378 namespace AudioStandard {
OHAudioRenderer()379 OHAudioRenderer::OHAudioRenderer()
380 {
381     AUDIO_INFO_LOG("OHAudioRenderer created!");
382 }
383 
~OHAudioRenderer()384 OHAudioRenderer::~OHAudioRenderer()
385 {
386     AUDIO_INFO_LOG("OHAudioRenderer destroyed!");
387 }
388 
Initialize(AudioRendererOptions & rendererOptions)389 bool OHAudioRenderer::Initialize(AudioRendererOptions &rendererOptions)
390 {
391     bool offloadAllowed = true;
392 
393     // unknown stream use music policy as default
394     if (rendererOptions.rendererInfo.streamUsage == STREAM_USAGE_UNKNOWN) {
395         rendererOptions.rendererInfo.streamUsage = STREAM_USAGE_MUSIC;
396         offloadAllowed = false;
397     }
398     std::string cacheDir = "/data/storage/el2/base/temp";
399     audioRenderer_ = AudioRenderer::Create(cacheDir, rendererOptions);
400     if (audioRenderer_ != nullptr) {
401         // if caller do not set usage, do not allow to use offload output
402         audioRenderer_->SetOffloadAllowed(offloadAllowed);
403     }
404 
405     return audioRenderer_ != nullptr;
406 }
407 
Start()408 bool OHAudioRenderer::Start()
409 {
410     if (audioRenderer_ == nullptr) {
411         AUDIO_ERR_LOG("renderer client is nullptr");
412         return false;
413     }
414     return audioRenderer_->Start();
415 }
416 
Pause()417 bool OHAudioRenderer::Pause()
418 {
419     if (audioRenderer_ == nullptr) {
420         AUDIO_ERR_LOG("renderer client is nullptr");
421         return false;
422     }
423     return audioRenderer_->Pause();
424 }
425 
Stop()426 bool OHAudioRenderer::Stop()
427 {
428     if (audioRenderer_ == nullptr) {
429         AUDIO_ERR_LOG("renderer client is nullptr");
430         return false;
431     }
432     return audioRenderer_->Stop();
433 }
434 
Flush()435 bool OHAudioRenderer::Flush()
436 {
437     if (audioRenderer_ == nullptr) {
438         AUDIO_ERR_LOG("renderer client is nullptr");
439         return false;
440     }
441     return audioRenderer_->Flush();
442 }
443 
Release()444 bool OHAudioRenderer::Release()
445 {
446     if (audioRenderer_ == nullptr) {
447         AUDIO_ERR_LOG("renderer client is nullptr");
448         return false;
449     }
450 
451     if (!audioRenderer_->Release()) {
452         return false;
453     }
454     audioRenderer_ = nullptr;
455     audioRendererCallback_ = nullptr;
456     return true;
457 }
458 
GetCurrentState()459 RendererState OHAudioRenderer::GetCurrentState()
460 {
461     CHECK_AND_RETURN_RET_LOG(audioRenderer_ != nullptr, RENDERER_INVALID, "renderer client is nullptr");
462     return audioRenderer_->GetStatus();
463 }
464 
GetStreamId(uint32_t & streamId)465 void OHAudioRenderer::GetStreamId(uint32_t &streamId)
466 {
467     CHECK_AND_RETURN_LOG(audioRenderer_ != nullptr, "renderer client is nullptr");
468     audioRenderer_->GetAudioStreamId(streamId);
469 }
470 
GetChannelCount()471 AudioChannel OHAudioRenderer::GetChannelCount()
472 {
473     CHECK_AND_RETURN_RET_LOG(audioRenderer_ != nullptr, MONO, "renderer client is nullptr");
474     AudioRendererParams params;
475     audioRenderer_->GetParams(params);
476     return params.channelCount;
477 }
478 
GetSamplingRate()479 int32_t OHAudioRenderer::GetSamplingRate()
480 {
481     CHECK_AND_RETURN_RET_LOG(audioRenderer_ != nullptr, MONO, "renderer client is nullptr");
482     AudioRendererParams params;
483     audioRenderer_->GetParams(params);
484     return params.sampleRate;
485 }
486 
GetSampleFormat()487 AudioSampleFormat OHAudioRenderer::GetSampleFormat()
488 {
489     CHECK_AND_RETURN_RET_LOG(audioRenderer_ != nullptr, INVALID_WIDTH, "renderer client is nullptr");
490     AudioRendererParams params;
491     audioRenderer_->GetParams(params);
492     return params.sampleFormat;
493 }
494 
GetRendererInfo(AudioRendererInfo & rendererInfo)495 void OHAudioRenderer::GetRendererInfo(AudioRendererInfo& rendererInfo)
496 {
497     CHECK_AND_RETURN_LOG(audioRenderer_ != nullptr, "renderer client is nullptr");
498     audioRenderer_->GetRendererInfo(rendererInfo);
499 }
500 
GetEncodingType()501 AudioEncodingType OHAudioRenderer::GetEncodingType()
502 {
503     CHECK_AND_RETURN_RET_LOG(audioRenderer_ != nullptr, ENCODING_INVALID, "renderer client is nullptr");
504     AudioRendererParams params;
505     audioRenderer_->GetParams(params);
506     return params.encodingType;
507 }
508 
GetFramesWritten()509 int64_t OHAudioRenderer::GetFramesWritten()
510 {
511     CHECK_AND_RETURN_RET_LOG(audioRenderer_ != nullptr, ERROR, "renderer client is nullptr");
512     return audioRenderer_->GetFramesWritten();
513 }
514 
GetTimestamp(Timestamp & timestamp,Timestamp::Timestampbase base)515 bool OHAudioRenderer::GetTimestamp(Timestamp &timestamp, Timestamp::Timestampbase base)
516 {
517     CHECK_AND_RETURN_RET_LOG(audioRenderer_ != nullptr, false, "renderer client is nullptr");
518     return audioRenderer_->GetAudioPosition(timestamp, base);
519 }
520 
GetAudioTimestampInfo(Timestamp & timestamp,Timestamp::Timestampbase base)521 int32_t OHAudioRenderer::GetAudioTimestampInfo(Timestamp &timestamp, Timestamp::Timestampbase base)
522 {
523     CHECK_AND_RETURN_RET_LOG(audioRenderer_ != nullptr, ERROR, "renderer client is nullptr");
524     return audioRenderer_->GetAudioTimestampInfo(timestamp, base);
525 }
526 
GetFrameSizeInCallback()527 int32_t OHAudioRenderer::GetFrameSizeInCallback()
528 {
529     CHECK_AND_RETURN_RET_LOG(audioRenderer_ != nullptr, ERROR, "renderer client is nullptr");
530     uint32_t frameSize;
531     audioRenderer_->GetFrameCount(frameSize);
532     return static_cast<int32_t>(frameSize);
533 }
534 
GetBufferDesc(BufferDesc & bufDesc) const535 int32_t OHAudioRenderer::GetBufferDesc(BufferDesc &bufDesc) const
536 {
537     CHECK_AND_RETURN_RET_LOG(audioRenderer_ != nullptr, ERROR, "renderer client is nullptr");
538     return audioRenderer_->GetBufferDesc(bufDesc);
539 }
540 
Enqueue(const BufferDesc & bufDesc) const541 int32_t OHAudioRenderer::Enqueue(const BufferDesc &bufDesc) const
542 {
543     CHECK_AND_RETURN_RET_LOG(audioRenderer_ != nullptr, ERROR, "renderer client is nullptr");
544     return audioRenderer_->Enqueue(bufDesc);
545 }
546 
SetSpeed(float speed)547 int32_t OHAudioRenderer::SetSpeed(float speed)
548 {
549     CHECK_AND_RETURN_RET_LOG(audioRenderer_ != nullptr, ERROR, "renderer client is nullptr");
550     return audioRenderer_->SetSpeed(speed);
551 }
552 
GetSpeed()553 float OHAudioRenderer::GetSpeed()
554 {
555     CHECK_AND_RETURN_RET_LOG(audioRenderer_ != nullptr, ERROR, "renderer client is nullptr");
556     return audioRenderer_->GetSpeed();
557 }
558 
SetVolume(float volume) const559 int32_t OHAudioRenderer::SetVolume(float volume) const
560 {
561     CHECK_AND_RETURN_RET_LOG(audioRenderer_ != nullptr, ERROR, "renderer client is nullptr");
562     return audioRenderer_->SetVolume(volume);
563 }
564 
GetVolume() const565 float OHAudioRenderer::GetVolume() const
566 {
567     CHECK_AND_RETURN_RET_LOG(audioRenderer_ != nullptr, ERROR, "renderer client is nullptr");
568     return audioRenderer_->GetVolume();
569 }
570 
SetVolumeWithRamp(float volume,int32_t duration)571 int32_t OHAudioRenderer::SetVolumeWithRamp(float volume, int32_t duration)
572 {
573     CHECK_AND_RETURN_RET_LOG(audioRenderer_ != nullptr, ERROR, "renderer client is nullptr");
574     return audioRenderer_->SetVolumeWithRamp(volume, duration);
575 }
576 
SetRendererPositionCallback(OH_AudioRenderer_OnMarkReachedCallback callback,uint32_t markPosition,void * userData)577 int32_t OHAudioRenderer::SetRendererPositionCallback(OH_AudioRenderer_OnMarkReachedCallback callback,
578     uint32_t markPosition, void *userData)
579 {
580     CHECK_AND_RETURN_RET_LOG(audioRenderer_ != nullptr, ERROR, "renderer client is nullptr");
581     CHECK_AND_RETURN_RET_LOG(callback != nullptr, ERROR, "callback is nullptr");
582     rendererPositionCallback_ = std::make_shared<OHRendererPositionCallback>(callback,
583         reinterpret_cast<OH_AudioRenderer*>(this), userData);
584     return audioRenderer_->SetRendererPositionCallback(markPosition, rendererPositionCallback_);
585 }
586 
UnsetRendererPositionCallback()587 void OHAudioRenderer::UnsetRendererPositionCallback()
588 {
589     CHECK_AND_RETURN_LOG(audioRenderer_ != nullptr, "renderer client is nullptr");
590     audioRenderer_->UnsetRendererPositionCallback();
591 }
592 
OnMarkReached(const int64_t & framePosition)593 void OHRendererPositionCallback::OnMarkReached(const int64_t &framePosition)
594 {
595     CHECK_AND_RETURN_LOG(ohAudioRenderer_ != nullptr, "renderer client is nullptr");
596     CHECK_AND_RETURN_LOG(callback_ != nullptr, "pointer to the function is nullptr");
597     callback_(ohAudioRenderer_, framePosition, userData_);
598 }
599 
GetChannelLayout()600 AudioChannelLayout OHAudioRenderer::GetChannelLayout()
601 {
602     CHECK_AND_RETURN_RET_LOG(audioRenderer_ != nullptr, CH_LAYOUT_UNKNOWN, "renderer client is nullptr");
603     AudioRendererParams params;
604     audioRenderer_->GetParams(params);
605     return params.channelLayout;
606 }
607 
GetRendererPrivacy()608 AudioPrivacyType OHAudioRenderer::GetRendererPrivacy()
609 {
610     CHECK_AND_RETURN_RET_LOG(audioRenderer_ != nullptr, PRIVACY_TYPE_PUBLIC, "renderer client is nullptr for privacy");
611     return audioRenderer_->GetAudioPrivacyType();
612 }
613 
GetEffectMode()614 AudioEffectMode OHAudioRenderer::GetEffectMode()
615 {
616     CHECK_AND_RETURN_RET_LOG(audioRenderer_ != nullptr, EFFECT_NONE, "renderer client is nullptr");
617     return audioRenderer_->GetAudioEffectMode();
618 }
619 
SetEffectMode(AudioEffectMode effectMode)620 int32_t OHAudioRenderer::SetEffectMode(AudioEffectMode effectMode)
621 {
622     CHECK_AND_RETURN_RET_LOG(audioRenderer_ != nullptr, ERROR, "renderer client is nullptr");
623     return audioRenderer_->SetAudioEffectMode(effectMode);
624 }
625 
SetWriteDataCallback(RendererCallback rendererCallbacks,void * userData,void * metadataUserData,AudioEncodingType encodingType)626 void OHAudioRenderer::SetWriteDataCallback(RendererCallback rendererCallbacks, void *userData,
627     void *metadataUserData, AudioEncodingType encodingType)
628 {
629     if (encodingType == ENCODING_AUDIOVIVID && rendererCallbacks.writeDataWithMetadataCallback != nullptr) {
630         std::shared_ptr<AudioRendererWriteCallback> callback = std::make_shared<OHAudioRendererModeCallback>(
631             rendererCallbacks.writeDataWithMetadataCallback, (OH_AudioRenderer*)this, metadataUserData, encodingType);
632         audioRenderer_->SetRendererWriteCallback(callback);
633         AUDIO_INFO_LOG("The write callback function is for AudioVivid type");
634     } else if (encodingType == ENCODING_PCM) {
635         if (writeDataCallbackType_ == WRITE_DATA_CALLBACK_WITH_RESULT &&
636             rendererCallbacks.onWriteDataCallback != nullptr) {
637             std::shared_ptr<AudioRendererWriteCallback> callback = std::make_shared<OHAudioRendererModeCallback>(
638                 rendererCallbacks.onWriteDataCallback, (OH_AudioRenderer*)this, userData, encodingType);
639             audioRenderer_->SetRendererWriteCallback(callback);
640             AUDIO_INFO_LOG("The write callback function is for PCM type with result");
641         }
642 
643         if (writeDataCallbackType_ == WRITE_DATA_CALLBACK_WITHOUT_RESULT &&
644             rendererCallbacks.callbacks.OH_AudioRenderer_OnWriteData != nullptr) {
645             std::shared_ptr<AudioRendererWriteCallback> callback = std::make_shared<OHAudioRendererModeCallback>(
646                 rendererCallbacks.callbacks, (OH_AudioRenderer*)this, userData, encodingType);
647             audioRenderer_->SetRendererWriteCallback(callback);
648             AUDIO_INFO_LOG("The write callback function is for PCM type without result");
649         }
650     } else {
651         AUDIO_WARNING_LOG("The write callback function is not set");
652     }
653 }
654 
SetInterruptCallback(RendererCallback rendererCallbacks,void * userData)655 void OHAudioRenderer::SetInterruptCallback(RendererCallback rendererCallbacks, void *userData)
656 {
657     if (rendererCallbacks.callbacks.OH_AudioRenderer_OnInterruptEvent != nullptr) {
658         audioRendererCallback_ = std::make_shared<OHAudioRendererCallback>(rendererCallbacks.callbacks,
659             (OH_AudioRenderer*)this, userData);
660         audioRenderer_->SetRendererCallback(audioRendererCallback_);
661     } else {
662         AUDIO_WARNING_LOG("The audio renderer interrupt callback function is not set");
663     }
664 }
665 
SetErrorCallback(RendererCallback rendererCallbacks,void * userData)666 void OHAudioRenderer::SetErrorCallback(RendererCallback rendererCallbacks, void *userData)
667 {
668     if (rendererCallbacks.callbacks.OH_AudioRenderer_OnError != nullptr) {
669         std::shared_ptr<AudioRendererPolicyServiceDiedCallback> callback =
670             std::make_shared<OHServiceDiedCallback>(rendererCallbacks.callbacks, (OH_AudioRenderer*)this, userData);
671         int32_t clientPid = getpid();
672         audioRenderer_->RegisterAudioPolicyServerDiedCb(clientPid, callback);
673 
674         std::shared_ptr<AudioRendererErrorCallback> errorCallback = std::make_shared<OHAudioRendererErrorCallback>(
675             rendererCallbacks.callbacks, (OH_AudioRenderer*)this, userData);
676         audioRenderer_->SetAudioRendererErrorCallback(errorCallback);
677     } else {
678         AUDIO_WARNING_LOG("The audio renderer error callback function is not set");
679     }
680 }
681 
SetRendererCallback(RendererCallback rendererCallbacks,void * userData,void * metadataUserData)682 void OHAudioRenderer::SetRendererCallback(RendererCallback rendererCallbacks, void *userData, void *metadataUserData)
683 {
684     CHECK_AND_RETURN_LOG(audioRenderer_ != nullptr, "renderer client is nullptr");
685     audioRenderer_->SetRenderMode(RENDER_MODE_CALLBACK);
686 
687     AudioEncodingType encodingType = GetEncodingType();
688     SetWriteDataCallback(rendererCallbacks, userData, metadataUserData, encodingType);
689     SetInterruptCallback(rendererCallbacks, userData);
690     SetErrorCallback(rendererCallbacks, userData);
691 }
692 
SetRendererOutputDeviceChangeCallback(OH_AudioRenderer_OutputDeviceChangeCallback callback,void * userData)693 void OHAudioRenderer::SetRendererOutputDeviceChangeCallback(OH_AudioRenderer_OutputDeviceChangeCallback callback,
694     void *userData)
695 {
696     CHECK_AND_RETURN_LOG(audioRenderer_ != nullptr, "renderer client is nullptr");
697     CHECK_AND_RETURN_LOG(callback != nullptr, "callback is nullptr");
698     audioRendererDeviceChangeCallbackWithInfo_ =
699         std::make_shared<OHAudioRendererDeviceChangeCallbackWithInfo> (callback,
700         reinterpret_cast<OH_AudioRenderer*>(this), userData);
701     audioRenderer_->RegisterOutputDeviceChangeWithInfoCallback(audioRendererDeviceChangeCallbackWithInfo_);
702 }
703 
SetPreferredFrameSize(int32_t frameSize)704 void OHAudioRenderer::SetPreferredFrameSize(int32_t frameSize)
705 {
706     audioRenderer_->SetPreferredFrameSize(frameSize);
707 }
708 
IsFastRenderer()709 bool OHAudioRenderer::IsFastRenderer()
710 {
711     return audioRenderer_->IsFastRenderer();
712 }
713 
GetUnderflowCount()714 uint32_t OHAudioRenderer::GetUnderflowCount()
715 {
716     CHECK_AND_RETURN_RET_LOG(audioRenderer_ != nullptr, ERROR, "renderer client is nullptr");
717     return audioRenderer_->GetUnderflowCount();
718 }
719 
OnWriteData(size_t length)720 void OHAudioRendererModeCallback::OnWriteData(size_t length)
721 {
722     OHAudioRenderer *audioRenderer = (OHAudioRenderer*)ohAudioRenderer_;
723     CHECK_AND_RETURN_LOG(audioRenderer != nullptr, "renderer client is nullptr");
724     CHECK_AND_RETURN_LOG(((encodingType_ == ENCODING_PCM) && (callbacks_.OH_AudioRenderer_OnWriteData != nullptr)) ||
725         ((encodingType_ == ENCODING_PCM) && (onWriteDataCallback_ != nullptr)) ||
726         ((encodingType_ == ENCODING_AUDIOVIVID) && (writeDataWithMetadataCallback_ != nullptr)),
727         "pointer to the function is nullptr");
728     BufferDesc bufDesc;
729     audioRenderer->GetBufferDesc(bufDesc);
730     if (encodingType_ == ENCODING_AUDIOVIVID && writeDataWithMetadataCallback_ != nullptr) {
731         writeDataWithMetadataCallback_(ohAudioRenderer_, metadataUserData_, (void*)bufDesc.buffer, bufDesc.bufLength,
732             (void*)bufDesc.metaBuffer, bufDesc.metaLength);
733     } else {
734         if (audioRenderer->GetRendererCallbackType() == WRITE_DATA_CALLBACK_WITHOUT_RESULT &&
735             callbacks_.OH_AudioRenderer_OnWriteData != nullptr) {
736             callbacks_.OH_AudioRenderer_OnWriteData(ohAudioRenderer_, userData_,
737                 (void*)bufDesc.buffer, bufDesc.bufLength);
738         }
739         if (audioRenderer->GetRendererCallbackType() == WRITE_DATA_CALLBACK_WITH_RESULT &&
740             onWriteDataCallback_ != nullptr) {
741             OH_AudioData_Callback_Result result = onWriteDataCallback_(ohAudioRenderer_, userData_,
742                 (void*)bufDesc.buffer, bufDesc.bufLength);
743             if (result == AUDIO_DATA_CALLBACK_RESULT_INVALID) {
744                 AUDIO_DEBUG_LOG("Data callback returned invalid, data will not be used.");
745                 bufDesc.dataLength = 0; // Ensure that the invalid data is not used.
746             }
747         }
748     }
749     audioRenderer->Enqueue(bufDesc);
750 }
751 
OnOutputDeviceChange(const AudioDeviceDescriptor & deviceInfo,const AudioStreamDeviceChangeReason reason)752 void OHAudioRendererDeviceChangeCallback::OnOutputDeviceChange(const AudioDeviceDescriptor &deviceInfo,
753     const AudioStreamDeviceChangeReason reason)
754 {
755     CHECK_AND_RETURN_LOG(ohAudioRenderer_ != nullptr, "renderer client is nullptr");
756     CHECK_AND_RETURN_LOG(callbacks_.OH_AudioRenderer_OnStreamEvent != nullptr, "pointer to the function is nullptr");
757 
758     OH_AudioStream_Event event =  AUDIOSTREAM_EVENT_ROUTING_CHANGED;
759     callbacks_.OH_AudioRenderer_OnStreamEvent(ohAudioRenderer_, userData_, event);
760 }
761 
OnInterrupt(const InterruptEvent & interruptEvent)762 void OHAudioRendererCallback::OnInterrupt(const InterruptEvent &interruptEvent)
763 {
764     CHECK_AND_RETURN_LOG(ohAudioRenderer_ != nullptr, "renderer client is nullptr");
765     CHECK_AND_RETURN_LOG(callbacks_.OH_AudioRenderer_OnInterruptEvent != nullptr, "pointer to the function is nullptr");
766     OH_AudioInterrupt_ForceType type = (OH_AudioInterrupt_ForceType)(interruptEvent.forceType);
767     OH_AudioInterrupt_Hint hint = OH_AudioInterrupt_Hint(interruptEvent.hintType);
768     callbacks_.OH_AudioRenderer_OnInterruptEvent(ohAudioRenderer_, userData_, type, hint);
769 }
770 
OnAudioPolicyServiceDied()771 void OHServiceDiedCallback::OnAudioPolicyServiceDied()
772 {
773     CHECK_AND_RETURN_LOG(ohAudioRenderer_ != nullptr, "renderer client is nullptr");
774     CHECK_AND_RETURN_LOG(callbacks_.OH_AudioRenderer_OnError != nullptr, "pointer to the function is nullptr");
775     OH_AudioStream_Result error = AUDIOSTREAM_ERROR_SYSTEM;
776     callbacks_.OH_AudioRenderer_OnError(ohAudioRenderer_, userData_, error);
777 }
778 
GetErrorResult(AudioErrors errorCode) const779 OH_AudioStream_Result OHAudioRendererErrorCallback::GetErrorResult(AudioErrors errorCode) const
780 {
781     switch (errorCode) {
782         case ERROR_ILLEGAL_STATE:
783             return AUDIOSTREAM_ERROR_ILLEGAL_STATE;
784         case ERROR_INVALID_PARAM:
785             return AUDIOSTREAM_ERROR_INVALID_PARAM;
786         case ERROR_SYSTEM:
787             return AUDIOSTREAM_ERROR_SYSTEM;
788         default:
789             return AUDIOSTREAM_ERROR_SYSTEM;
790     }
791 }
792 
OnError(AudioErrors errorCode)793 void OHAudioRendererErrorCallback::OnError(AudioErrors errorCode)
794 {
795     CHECK_AND_RETURN_LOG(ohAudioRenderer_ != nullptr && callbacks_.OH_AudioRenderer_OnError != nullptr,
796         "renderer client or error callback funtion is nullptr");
797     OH_AudioStream_Result error = GetErrorResult(errorCode);
798     callbacks_.OH_AudioRenderer_OnError(ohAudioRenderer_, userData_, error);
799 }
800 
OnOutputDeviceChange(const AudioDeviceDescriptor & deviceInfo,const AudioStreamDeviceChangeReason reason)801 void OHAudioRendererDeviceChangeCallbackWithInfo::OnOutputDeviceChange(const AudioDeviceDescriptor &deviceInfo,
802     const AudioStreamDeviceChangeReason reason)
803 {
804     CHECK_AND_RETURN_LOG(ohAudioRenderer_ != nullptr, "renderer client is nullptr");
805     CHECK_AND_RETURN_LOG(callback_ != nullptr, "pointer to the function is nullptr");
806 
807     callback_(ohAudioRenderer_, userData_, static_cast<OH_AudioStream_DeviceChangeReason>(reason));
808 }
809 
SetInterruptMode(InterruptMode mode)810 void OHAudioRenderer::SetInterruptMode(InterruptMode mode)
811 {
812     CHECK_AND_RETURN_LOG(audioRenderer_ != nullptr, "renderer client is nullptr");
813     audioRenderer_->SetInterruptMode(mode);
814 }
815 
SetRendererCallbackType(WriteDataCallbackType writeDataCallbackType)816 void OHAudioRenderer::SetRendererCallbackType(WriteDataCallbackType writeDataCallbackType)
817 {
818     writeDataCallbackType_ = writeDataCallbackType;
819 }
820 
GetRendererCallbackType()821 WriteDataCallbackType OHAudioRenderer::GetRendererCallbackType()
822 {
823     return writeDataCallbackType_;
824 }
825 
SetSilentModeAndMixWithOthers(bool on)826 void OHAudioRenderer::SetSilentModeAndMixWithOthers(bool on)
827 {
828     CHECK_AND_RETURN_LOG(audioRenderer_ != nullptr, "renderer client is nullptr");
829     audioRenderer_->SetSilentModeAndMixWithOthers(on);
830 }
831 
GetSilentModeAndMixWithOthers()832 bool OHAudioRenderer::GetSilentModeAndMixWithOthers()
833 {
834     CHECK_AND_RETURN_RET_LOG(audioRenderer_ != nullptr, false, "renderer client is nullptr");
835     return audioRenderer_->GetSilentModeAndMixWithOthers();
836 }
837 
SetDefaultOutputDevice(DeviceType deviceType)838 int32_t OHAudioRenderer::SetDefaultOutputDevice(DeviceType deviceType)
839 {
840     CHECK_AND_RETURN_RET_LOG(audioRenderer_ != nullptr, ERROR, "renderer client is nullptr");
841     return audioRenderer_->SetDefaultOutputDevice(deviceType);
842 }
843 }  // namespace AudioStandard
844 }  // namespace OHOS
845