1 /*
2  * Copyright (c) 2022 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 "IAudioRendererSink"
17 #endif
18 
19 #include "i_audio_renderer_sink.h"
20 #include "i_audio_renderer_sink_intf.h"
21 
22 #include "audio_errors.h"
23 #include "audio_hdi_log.h"
24 
25 #include "audio_renderer_sink.h"
26 #include "audio_renderer_file_sink.h"
27 #include "bluetooth_renderer_sink.h"
28 #ifdef DAUDIO_ENABLE
29 #include "remote_audio_renderer_sink.h"
30 #endif
31 #include "offload_audio_renderer_sink.h"
32 #include "multichannel_audio_renderer_sink.h"
33 
34 
35 namespace OHOS {
36 namespace AudioStandard {
GetInstance(const char * devceClass,const char * deviceNetworkId)37 IAudioRendererSink *IAudioRendererSink::GetInstance(const char *devceClass, const char *deviceNetworkId)
38 {
39     CHECK_AND_RETURN_RET_LOG(devceClass != nullptr && deviceNetworkId != nullptr, nullptr,
40         "GetInstance null class or networkid");
41     AUDIO_DEBUG_LOG("%{public}s Sink:GetInstance[%{public}s]", devceClass, deviceNetworkId);
42     const char *deviceClassPrimary = "primary";
43     const char *deviceClassUsb = "usb";
44     const char *deviceClassDp = "dp";
45     const char *deviceClassA2DP = "a2dp";
46     const char *deviceClassFile = "file_io";
47 #ifdef DAUDIO_ENABLE
48     const char *deviceClassRemote = "remote";
49 #endif
50     const char *deviceClassOffload = "offload";
51     const char *deviceClassMultiChannel = "multichannel";
52 
53     IAudioRendererSink *iAudioRendererSink = nullptr;
54     if (!strcmp(devceClass, deviceClassPrimary)) {
55         iAudioRendererSink = AudioRendererSink::GetInstance("primary");
56     }
57     if (!strcmp(devceClass, deviceClassUsb)) {
58         iAudioRendererSink = AudioRendererSink::GetInstance("usb");
59     }
60     if (!strcmp(devceClass, deviceClassDp)) {
61         iAudioRendererSink = AudioRendererSink::GetInstance("dp");
62     }
63     if (!strcmp(devceClass, deviceClassA2DP)) {
64         iAudioRendererSink = BluetoothRendererSink::GetInstance();
65     }
66     if (!strcmp(devceClass, deviceClassFile)) {
67         iAudioRendererSink = AudioRendererFileSink::GetInstance();
68     }
69 #ifdef DAUDIO_ENABLE
70     if (!strcmp(devceClass, deviceClassRemote)) {
71         iAudioRendererSink = RemoteAudioRendererSink::GetInstance(deviceNetworkId);
72     }
73 #endif
74     if (!strcmp(devceClass, deviceClassOffload)) {
75         iAudioRendererSink = OffloadRendererSink::GetInstance();
76     }
77     if (!strcmp(devceClass, deviceClassMultiChannel)) {
78         iAudioRendererSink = MultiChannelRendererSink::GetInstance("multichannel");
79     }
80 
81     if (iAudioRendererSink == nullptr) {
82         AUDIO_ERR_LOG("GetInstance failed with device[%{public}s]:[%{private}s]", devceClass,
83             deviceNetworkId);
84     }
85     return iAudioRendererSink;
86 }
87 }  // namespace AudioStandard
88 }  // namespace OHOS
89 
90 #ifdef __cplusplus
91 extern "C" {
92 #endif
93 
94 using namespace OHOS::AudioStandard;
95 
FillinSinkWapper(const char * device,const char * deviceNetworkId,struct RendererSinkAdapter * adapter)96 int32_t FillinSinkWapper(const char *device, const char *deviceNetworkId, struct RendererSinkAdapter *adapter)
97 {
98     CHECK_AND_RETURN_RET_LOG(adapter != nullptr, ERR_INVALID_HANDLE, "null RendererSinkAdapter");
99     IAudioRendererSink *instance = IAudioRendererSink::GetInstance(device, deviceNetworkId);
100     if (instance != nullptr) {
101         adapter->wapper = static_cast<void *>(instance);
102     } else {
103         adapter->wapper = nullptr;
104         return ERROR;
105     }
106 
107     return SUCCESS;
108 }
109 
IAudioRendererSinkInit(struct RendererSinkAdapter * adapter,const SinkAttr * attr)110 int32_t IAudioRendererSinkInit(struct RendererSinkAdapter *adapter, const SinkAttr *attr)
111 {
112     if (adapter == nullptr || adapter->wapper == nullptr || attr == nullptr) {
113         AUDIO_ERR_LOG("%{public}s: Invalid parameter", __func__);
114         return ERROR;
115     }
116     IAudioRendererSink *audioRendererSink = static_cast<IAudioRendererSink *>(adapter->wapper);
117     CHECK_AND_RETURN_RET_LOG(audioRendererSink != nullptr, ERR_INVALID_HANDLE, "null audioRendererSink");
118     if (audioRendererSink->IsInited()) {
119         return SUCCESS;
120     }
121     IAudioSinkAttr iAttr = {};
122     iAttr.adapterName = attr->adapterName;
123     iAttr.openMicSpeaker = attr->openMicSpeaker;
124     iAttr.format = attr->format;
125     iAttr.sampleRate = attr->sampleRate;
126     iAttr.channel = attr->channel;
127     iAttr.volume = attr->volume;
128     iAttr.filePath = attr->filePath;
129     iAttr.deviceNetworkId = attr->deviceNetworkId;
130     iAttr.deviceType = attr->deviceType;
131     iAttr.channelLayout = attr->channelLayout;
132     iAttr.aux = attr->aux;
133 
134     return audioRendererSink->Init(iAttr);
135 }
136 
IAudioRendererSinkDeInit(struct RendererSinkAdapter * adapter)137 void IAudioRendererSinkDeInit(struct RendererSinkAdapter *adapter)
138 {
139     CHECK_AND_RETURN_LOG(adapter != nullptr, "null RendererSinkAdapter");
140     IAudioRendererSink *audioRendererSink = static_cast<IAudioRendererSink *>(adapter->wapper);
141     CHECK_AND_RETURN_LOG(audioRendererSink != nullptr, "null audioRendererSink");
142     // remove the sink in allsinks.
143     if (audioRendererSink->IsInited()) {
144         audioRendererSink->DeInit();
145     }
146 }
147 
IAudioRendererSinkStop(struct RendererSinkAdapter * adapter)148 int32_t IAudioRendererSinkStop(struct RendererSinkAdapter *adapter)
149 {
150     CHECK_AND_RETURN_RET_LOG(adapter != nullptr, ERR_INVALID_HANDLE, "null RendererSinkAdapter");
151     IAudioRendererSink *audioRendererSink = static_cast<IAudioRendererSink *>(adapter->wapper);
152     CHECK_AND_RETURN_RET_LOG(audioRendererSink != nullptr, ERR_INVALID_HANDLE, "null audioRendererSink");
153     if (!audioRendererSink->IsInited()) {
154         return SUCCESS;
155     }
156 
157     return audioRendererSink->Stop();
158 }
159 
IAudioRendererSinkStart(struct RendererSinkAdapter * adapter)160 int32_t IAudioRendererSinkStart(struct RendererSinkAdapter *adapter)
161 {
162     CHECK_AND_RETURN_RET_LOG(adapter != nullptr, ERR_INVALID_HANDLE, "null RendererSinkAdapter");
163     IAudioRendererSink *audioRendererSink = static_cast<IAudioRendererSink *>(adapter->wapper);
164     CHECK_AND_RETURN_RET_LOG(audioRendererSink != nullptr, ERR_INVALID_HANDLE, "null audioRendererSink");
165     CHECK_AND_RETURN_RET_LOG(audioRendererSink->IsInited(), ERR_NOT_STARTED,
166         "audioRenderer Not Inited! Init the renderer first\n");
167 
168     return audioRendererSink->Start();
169 }
170 
IAudioRendererSinkPause(struct RendererSinkAdapter * adapter)171 int32_t IAudioRendererSinkPause(struct RendererSinkAdapter *adapter)
172 {
173     CHECK_AND_RETURN_RET_LOG(adapter != nullptr, ERR_INVALID_HANDLE, "null RendererSinkAdapter");
174     IAudioRendererSink *audioRendererSink = static_cast<IAudioRendererSink *>(adapter->wapper);
175     CHECK_AND_RETURN_RET_LOG(audioRendererSink != nullptr, ERR_INVALID_HANDLE, "null audioRendererSink");
176     bool isInited = audioRendererSink->IsInited();
177     CHECK_AND_RETURN_RET_LOG(isInited, ERR_NOT_STARTED, "Renderer pause failed");
178 
179     return audioRendererSink->Pause();
180 }
181 
IAudioRendererSinkResume(struct RendererSinkAdapter * adapter)182 int32_t IAudioRendererSinkResume(struct RendererSinkAdapter *adapter)
183 {
184     CHECK_AND_RETURN_RET_LOG(adapter != nullptr, ERR_INVALID_HANDLE, "null RendererSinkAdapter");
185     IAudioRendererSink *audioRendererSink = static_cast<IAudioRendererSink *>(adapter->wapper);
186     CHECK_AND_RETURN_RET_LOG(audioRendererSink != nullptr, ERR_INVALID_HANDLE, "null audioRendererSink");
187     bool isInited = audioRendererSink->IsInited();
188     CHECK_AND_RETURN_RET_LOG(isInited, ERR_NOT_STARTED, "Renderer resume failed");
189 
190     return audioRendererSink->Resume();
191 }
192 
IAudioRendererSinkRenderFrame(struct RendererSinkAdapter * adapter,char * data,uint64_t len,uint64_t * writeLen)193 int32_t IAudioRendererSinkRenderFrame(struct RendererSinkAdapter *adapter, char *data, uint64_t len, uint64_t *writeLen)
194 {
195     CHECK_AND_RETURN_RET_LOG(adapter != nullptr, ERR_INVALID_HANDLE, "null RendererSinkAdapter");
196 
197     IAudioRendererSink *audioRendererSink = static_cast<IAudioRendererSink *>(adapter->wapper);
198     CHECK_AND_RETURN_RET_LOG(audioRendererSink != nullptr, ERR_INVALID_HANDLE, "null audioRendererSink");
199     bool isInited = audioRendererSink->IsInited();
200     CHECK_AND_RETURN_RET_LOG(isInited, ERR_NOT_STARTED, "audioRenderer Not Inited! Init the renderer first\n");
201 
202     int32_t ret = audioRendererSink->RenderFrame(*data, len, *writeLen);
203     return ret;
204 }
205 
IAudioRendererSinkSplitRenderFrame(struct RendererSinkAdapter * adapter,char * data,uint64_t len,uint64_t * writeLen,char * streamType)206 int32_t IAudioRendererSinkSplitRenderFrame(struct RendererSinkAdapter *adapter, char *data, uint64_t len,
207     uint64_t *writeLen, char *streamType)
208 {
209     CHECK_AND_RETURN_RET_LOG(adapter != nullptr, ERR_INVALID_HANDLE, "null RendererSinkAdapter");
210 
211     IRemoteAudioRendererSink *audioRendererSink = static_cast<IRemoteAudioRendererSink *>(adapter->wapper);
212     CHECK_AND_RETURN_RET_LOG(audioRendererSink != nullptr, ERR_INVALID_HANDLE, "null audioRendererSink");
213     bool isInited = audioRendererSink->IsInited();
214     CHECK_AND_RETURN_RET_LOG(isInited, ERR_NOT_STARTED, "audioRenderer Not Inited! Init the renderer first\n");
215 
216     int32_t ret = audioRendererSink->SplitRenderFrame(*data, len, *writeLen, streamType);
217     return ret;
218 }
219 
IAudioRendererSinkSetVolume(struct RendererSinkAdapter * adapter,float left,float right)220 int32_t IAudioRendererSinkSetVolume(struct RendererSinkAdapter *adapter, float left, float right)
221 {
222     CHECK_AND_RETURN_RET_LOG(adapter != nullptr, ERR_INVALID_HANDLE, "null RendererSinkAdapter");
223 
224     IAudioRendererSink *audioRendererSink = static_cast<IAudioRendererSink *>(adapter->wapper);
225     CHECK_AND_RETURN_RET_LOG(audioRendererSink != nullptr, ERR_INVALID_HANDLE, "null audioRendererSink");
226     bool isInited = audioRendererSink->IsInited();
227     CHECK_AND_RETURN_RET_LOG(isInited, ERR_NOT_STARTED, "audioRenderer Not Inited! Init the renderer first\n");
228 
229     int32_t ret = audioRendererSink->SetVolume(left, right);
230     return ret;
231 }
232 
IAudioRendererSinkGetVolume(struct RendererSinkAdapter * adapter,float * left,float * right)233 int32_t IAudioRendererSinkGetVolume(struct RendererSinkAdapter *adapter, float *left, float *right)
234 {
235     CHECK_AND_RETURN_RET_LOG(adapter != nullptr, ERR_INVALID_HANDLE, "null RendererSinkAdapter");
236 
237     IAudioRendererSink *audioRendererSink = static_cast<IAudioRendererSink *>(adapter->wapper);
238     CHECK_AND_RETURN_RET_LOG(audioRendererSink != nullptr, ERR_INVALID_HANDLE, "null audioRendererSink");
239     bool isInited = audioRendererSink->IsInited();
240     CHECK_AND_RETURN_RET_LOG(isInited, ERR_NOT_STARTED, "audioRenderer Not Inited! Init the renderer first\n");
241 
242     int32_t ret = audioRendererSink->GetVolume(*left, *right);
243     return ret;
244 }
245 
IAudioRendererSinkGetLatency(struct RendererSinkAdapter * adapter,uint32_t * latency)246 int32_t IAudioRendererSinkGetLatency(struct RendererSinkAdapter *adapter, uint32_t *latency)
247 {
248     CHECK_AND_RETURN_RET_LOG(adapter != nullptr, ERR_INVALID_HANDLE, "null RendererSinkAdapter");
249 
250     IAudioRendererSink *audioRendererSink = static_cast<IAudioRendererSink *>(adapter->wapper);
251     CHECK_AND_RETURN_RET_LOG(audioRendererSink != nullptr, ERR_INVALID_HANDLE, "null audioRendererSink");
252     bool isInited = audioRendererSink->IsInited();
253     CHECK_AND_RETURN_RET_LOG(isInited, ERR_NOT_STARTED, "audioRenderer Not Inited! Init the renderer first\n");
254 
255     CHECK_AND_RETURN_RET_LOG(latency, ERR_INVALID_PARAM, "IAudioRendererSinkGetLatency failed latency null");
256 
257     int32_t ret = audioRendererSink->GetLatency(latency);
258     return ret;
259 }
260 
IAudioRendererSinkRegCallback(struct RendererSinkAdapter * adapter,int8_t * cb,int8_t * userdata)261 int32_t IAudioRendererSinkRegCallback(struct RendererSinkAdapter *adapter, int8_t *cb, int8_t *userdata)
262 {
263     CHECK_AND_RETURN_RET_LOG(adapter != nullptr, ERR_INVALID_HANDLE, "null RendererSinkAdapter");
264 
265     IOffloadAudioRendererSink *audioRendererSink = static_cast<IOffloadAudioRendererSink *>(adapter->wapper);
266     CHECK_AND_RETURN_RET_LOG(audioRendererSink != nullptr, ERR_INVALID_HANDLE, "null audioRendererSink");
267     bool isInited = audioRendererSink->IsInited();
268     CHECK_AND_RETURN_RET_LOG(isInited, ERR_NOT_STARTED, "audioRenderer Not Inited! Init the renderer first\n");
269     auto *callback = reinterpret_cast<OnRenderCallback*>(cb);
270     audioRendererSink->RegisterRenderCallback(callback, userdata);
271     return SUCCESS;
272 }
273 
IAudioRendererSinkGetPresentationPosition(struct RendererSinkAdapter * adapter,uint64_t * frames,int64_t * timeSec,int64_t * timeNanoSec)274 int32_t IAudioRendererSinkGetPresentationPosition(struct RendererSinkAdapter *adapter, uint64_t *frames,
275     int64_t *timeSec, int64_t *timeNanoSec)
276 {
277     CHECK_AND_RETURN_RET_LOG(adapter != nullptr, ERR_INVALID_HANDLE, "null RendererSinkAdapter");
278 
279     IOffloadAudioRendererSink *audioRendererSink = static_cast<IOffloadAudioRendererSink *>(adapter->wapper);
280     CHECK_AND_RETURN_RET_LOG(audioRendererSink != nullptr, ERR_INVALID_HANDLE, "null audioRendererSink");
281     bool isInited = audioRendererSink->IsInited();
282     CHECK_AND_RETURN_RET_LOG(isInited, ERR_NOT_STARTED, "audioRenderer Not Inited! Init the renderer first\n");
283 
284     return audioRendererSink->GetPresentationPosition(*frames, *timeSec, *timeNanoSec);
285 }
286 
IAudioRendererSinkFlush(struct RendererSinkAdapter * adapter)287 int32_t IAudioRendererSinkFlush(struct RendererSinkAdapter *adapter)
288 {
289     CHECK_AND_RETURN_RET_LOG(adapter != nullptr, ERR_INVALID_HANDLE, "null RendererSinkAdapter");
290 
291     IAudioRendererSink *audioRendererSink = static_cast<IAudioRendererSink *>(adapter->wapper);
292     CHECK_AND_RETURN_RET_LOG(audioRendererSink != nullptr, ERR_INVALID_HANDLE, "null audioRendererSink");
293     bool isInited = audioRendererSink->IsInited();
294     CHECK_AND_RETURN_RET_LOG(isInited, ERR_NOT_STARTED,
295         "audioRenderer Not Inited! Init the renderer first, Renderer Flush failed\n");
296 
297     return audioRendererSink->Flush();
298 }
299 
IAudioRendererSinkReset(struct RendererSinkAdapter * adapter)300 int32_t IAudioRendererSinkReset(struct RendererSinkAdapter *adapter)
301 {
302     CHECK_AND_RETURN_RET_LOG(adapter != nullptr, ERR_INVALID_HANDLE, "null RendererSinkAdapter");
303 
304     IAudioRendererSink *audioRendererSink = static_cast<IAudioRendererSink *>(adapter->wapper);
305     CHECK_AND_RETURN_RET_LOG(audioRendererSink != nullptr, ERR_INVALID_HANDLE, "null audioRendererSink");
306     bool isInited = audioRendererSink->IsInited();
307     CHECK_AND_RETURN_RET_LOG(isInited, ERR_NOT_STARTED,
308         "audioRenderer Not Inited! Init the renderer first, Renderer Reset failed\n");
309 
310     return audioRendererSink->Reset();
311 }
312 
IAudioRendererSinkSetBufferSize(struct RendererSinkAdapter * adapter,uint32_t sizeMs)313 int32_t IAudioRendererSinkSetBufferSize(struct RendererSinkAdapter *adapter, uint32_t sizeMs)
314 {
315     CHECK_AND_RETURN_RET_LOG(adapter != nullptr, ERR_INVALID_HANDLE, "null RendererSinkAdapter");
316 
317     IOffloadAudioRendererSink *audioRendererSink = static_cast<IOffloadAudioRendererSink *>(adapter->wapper);
318     CHECK_AND_RETURN_RET_LOG(audioRendererSink != nullptr, ERR_INVALID_HANDLE, "null audioRendererSink");
319     bool isInited = audioRendererSink->IsInited();
320     CHECK_AND_RETURN_RET_LOG(isInited, ERR_NOT_STARTED,
321         "audioRenderer Not Inited! Init the renderer first, Renderer SetBufferSize failed\n");
322 
323     return audioRendererSink->SetBufferSize(sizeMs);
324 }
325 
IAudioRendererSinkOffloadRunningLockInit(struct RendererSinkAdapter * adapter)326 int32_t IAudioRendererSinkOffloadRunningLockInit(struct RendererSinkAdapter *adapter)
327 {
328     CHECK_AND_RETURN_RET_LOG(adapter != nullptr, ERR_INVALID_HANDLE, "null RendererSinkAdapter");
329 
330     IOffloadAudioRendererSink *audioRendererSink = static_cast<IOffloadAudioRendererSink *>(adapter->wapper);
331     CHECK_AND_RETURN_RET_LOG(audioRendererSink != nullptr, ERR_INVALID_HANDLE, "null audioRendererSink");
332     bool isInited = audioRendererSink->IsInited();
333     CHECK_AND_RETURN_RET_LOG(isInited, ERR_NOT_STARTED,
334         "audioRenderer Not Inited! Init the renderer first, Renderer Resume failed\n");
335 
336     return audioRendererSink->OffloadRunningLockInit();
337 }
338 
IAudioRendererSinkOffloadRunningLockLock(struct RendererSinkAdapter * adapter)339 int32_t IAudioRendererSinkOffloadRunningLockLock(struct RendererSinkAdapter *adapter)
340 {
341     CHECK_AND_RETURN_RET_LOG(adapter != nullptr, ERR_INVALID_HANDLE, "null RendererSinkAdapter");
342 
343     IOffloadAudioRendererSink *audioRendererSink = static_cast<IOffloadAudioRendererSink *>(adapter->wapper);
344     CHECK_AND_RETURN_RET_LOG(audioRendererSink != nullptr, ERR_INVALID_HANDLE, "null audioRendererSink");
345     bool isInited = audioRendererSink->IsInited();
346     CHECK_AND_RETURN_RET_LOG(isInited, ERR_NOT_STARTED,
347         "audioRenderer Not Inited! Init the renderer first, Renderer Resume failed\n");
348 
349     return audioRendererSink->OffloadRunningLockLock();
350 }
351 
IAudioRendererSinkOffloadRunningLockUnlock(struct RendererSinkAdapter * adapter)352 int32_t IAudioRendererSinkOffloadRunningLockUnlock(struct RendererSinkAdapter *adapter)
353 {
354     CHECK_AND_RETURN_RET_LOG(adapter != nullptr, ERR_INVALID_HANDLE, "null RendererSinkAdapter");
355 
356     IOffloadAudioRendererSink *audioRendererSink = static_cast<IOffloadAudioRendererSink *>(adapter->wapper);
357     CHECK_AND_RETURN_RET_LOG(audioRendererSink != nullptr, ERR_INVALID_HANDLE, "null audioRendererSink");
358     bool isInited = audioRendererSink->IsInited();
359     CHECK_AND_RETURN_RET_LOG(isInited, ERR_NOT_STARTED,
360         "audioRenderer Not Inited! Init the renderer first, Renderer Resume failed\n");
361 
362     return audioRendererSink->OffloadRunningLockUnlock();
363 }
364 
IAudioRendererSinkSetPaPower(struct RendererSinkAdapter * adapter,int32_t flag)365 int32_t IAudioRendererSinkSetPaPower(struct RendererSinkAdapter *adapter, int32_t flag)
366 {
367     CHECK_AND_RETURN_RET_LOG(adapter != nullptr, ERR_INVALID_HANDLE, "null RendererSinkAdapter");
368 
369     IAudioRendererSink *audioRendererSink = static_cast<IAudioRendererSink *>(adapter->wapper);
370     CHECK_AND_RETURN_RET_LOG(audioRendererSink != nullptr, ERR_INVALID_HANDLE, "null audioRendererSink");
371     bool isInited = audioRendererSink->IsInited();
372     CHECK_AND_RETURN_RET_LOG(isInited, ERR_NOT_STARTED,
373         "audioRenderer Not Inited! Init the renderer first, Renderer Resume failed\n");
374 
375     int32_t ret = audioRendererSink->SetPaPower(flag);
376     return ret;
377 }
378 
IAudioRendererSinkSetPriPaPower(struct RendererSinkAdapter * adapter)379 int32_t IAudioRendererSinkSetPriPaPower(struct RendererSinkAdapter *adapter)
380 {
381     CHECK_AND_RETURN_RET_LOG(adapter != nullptr, ERR_INVALID_HANDLE, "null RendererSinkAdapter");
382 
383     IAudioRendererSink *audioRendererSink = static_cast<IAudioRendererSink *>(adapter->wapper);
384     CHECK_AND_RETURN_RET_LOG(audioRendererSink != nullptr, ERR_INVALID_HANDLE, "null audioRendererSink");
385     bool isInited = audioRendererSink->IsInited();
386     CHECK_AND_RETURN_RET_LOG(isInited, ERR_NOT_STARTED,
387         "audioRenderer Not Inited! Init the renderer first, Renderer Resume failed");
388 
389     int32_t ret = audioRendererSink->SetPriPaPower();
390     return ret;
391 }
392 
IAudioRendererSinkUpdateAppsUid(struct RendererSinkAdapter * adapter,const int32_t appsUid[MAX_MIX_CHANNELS],const size_t size)393 int32_t IAudioRendererSinkUpdateAppsUid(struct RendererSinkAdapter *adapter, const int32_t appsUid[MAX_MIX_CHANNELS],
394     const size_t size)
395 {
396     CHECK_AND_RETURN_RET_LOG(adapter != nullptr, ERR_INVALID_HANDLE, "null RendererSinkAdapter");
397 
398     IAudioRendererSink *audioRendererSink = static_cast<IAudioRendererSink *>(adapter->wapper);
399     CHECK_AND_RETURN_RET_LOG(audioRendererSink != nullptr, ERR_INVALID_HANDLE, "null audioRendererSink");
400     bool isInited = audioRendererSink->IsInited();
401     CHECK_AND_RETURN_RET_LOG(isInited, ERR_NOT_STARTED,
402         "audioRenderer Not Inited! Init the renderer first, Renderer Resume failed\n");
403 
404     int32_t ret = audioRendererSink->UpdateAppsUid(appsUid, size);
405     return ret;
406 }
407 
408 #ifdef __cplusplus
409 }
410 #endif