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