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