• 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 #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 &timestamp, 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 &timestamp, 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