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