1 /*
2 * Copyright (c) 2021-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 "RendererSinkAdapter"
17 #endif
18
19 #include <stdlib.h>
20 #include <stdio.h>
21 #include <string.h>
22
23 #include "renderer_sink_adapter.h"
24 #include "audio_hdi_log.h"
25
26 #ifdef __cplusplus
27 extern "C" {
28 #endif
29
30 const int32_t SUCCESS = 0;
31 const int32_t ERROR = -1;
32
33 const int32_t CLASS_TYPE_PRIMARY = 0;
34 const int32_t CLASS_TYPE_A2DP = 1;
35 const int32_t CLASS_TYPE_FILE = 2;
36 const int32_t CLASS_TYPE_REMOTE = 3;
37 const int32_t CLASS_TYPE_USB = 4;
38 const int32_t CLASS_TYPE_OFFLOAD = 5;
39 const int32_t CLASS_TYPE_MULTICHANNEL = 6;
40 const int32_t CLASS_TYPE_DP = 7;
41
42 const char *DEVICE_CLASS_PRIMARY = "primary";
43 const char *DEVICE_CLASS_USB = "usb";
44 const char *DEVICE_CLASS_A2DP = "a2dp";
45 const char *DEVICE_CLASS_FILE = "file_io";
46 const char *DEVICE_CLASS_REMOTE = "remote";
47 const char *DEVICE_CLASS_OFFLOAD = "offload";
48 const char *DEVICE_CLASS_MULTICHANNEL = "multichannel";
49 const char *DEVICE_CLASS_DP = "dp";
50
LoadSinkAdapter(const char * device,const char * deviceNetworkId,struct RendererSinkAdapter ** sinkAdapter)51 int32_t LoadSinkAdapter(const char *device, const char *deviceNetworkId, struct RendererSinkAdapter **sinkAdapter)
52 {
53 AUDIO_INFO_LOG("%{public}s: device:[%{public}s]", __func__, device);
54 CHECK_AND_RETURN_RET_LOG((device != NULL) && (sinkAdapter != NULL), ERROR, "Invalid parameter");
55
56 struct RendererSinkAdapter *adapter = (struct RendererSinkAdapter *)calloc(1, sizeof(*adapter));
57 CHECK_AND_RETURN_RET_LOG(adapter != NULL, ERROR, "alloc sink adapter failed");
58
59 if (FillinSinkWapper(device, deviceNetworkId, adapter) != SUCCESS) {
60 AUDIO_ERR_LOG("%{public}s: Device not supported", __func__);
61 free(adapter);
62 return ERROR;
63 }
64 // fill deviceClass for hdi_sink.c
65 adapter->deviceClass = !strcmp(device, DEVICE_CLASS_PRIMARY) ? CLASS_TYPE_PRIMARY : adapter->deviceClass;
66 adapter->deviceClass = !strcmp(device, DEVICE_CLASS_USB) ? CLASS_TYPE_USB : adapter->deviceClass;
67 adapter->deviceClass = !strcmp(device, DEVICE_CLASS_A2DP) ? CLASS_TYPE_A2DP : adapter->deviceClass;
68 adapter->deviceClass = !strcmp(device, DEVICE_CLASS_FILE) ? CLASS_TYPE_FILE : adapter->deviceClass;
69 adapter->deviceClass = !strcmp(device, DEVICE_CLASS_REMOTE) ? CLASS_TYPE_REMOTE : adapter->deviceClass;
70 adapter->deviceClass = !strcmp(device, DEVICE_CLASS_OFFLOAD) ? CLASS_TYPE_OFFLOAD : adapter->deviceClass;
71 adapter->deviceClass = !strcmp(device, DEVICE_CLASS_MULTICHANNEL) ? CLASS_TYPE_MULTICHANNEL : adapter->deviceClass;
72 adapter->deviceClass = !strcmp(device, DEVICE_CLASS_DP) ? CLASS_TYPE_DP : adapter->deviceClass;
73
74 adapter->RendererSinkInit = IAudioRendererSinkInit;
75 adapter->RendererSinkDeInit = IAudioRendererSinkDeInit;
76 adapter->RendererSinkStart = IAudioRendererSinkStart;
77 adapter->RendererSinkStop = IAudioRendererSinkStop;
78 adapter->RendererSinkPause = IAudioRendererSinkPause;
79 adapter->RendererSinkResume = IAudioRendererSinkResume;
80 adapter->RendererRenderFrame = IAudioRendererSinkRenderFrame;
81 adapter->RendererSplitRenderFrame = IAudioRendererSinkSplitRenderFrame;
82 adapter->RendererSinkSetVolume = IAudioRendererSinkSetVolume;
83 adapter->RendererSinkGetVolume = IAudioRendererSinkGetVolume;
84 adapter->RendererSinkGetLatency = IAudioRendererSinkGetLatency;
85 adapter->RendererRegCallback = IAudioRendererSinkRegCallback;
86 adapter->RendererSinkGetPresentationPosition = IAudioRendererSinkGetPresentationPosition;
87 adapter->RendererSinkFlush = IAudioRendererSinkFlush;
88 adapter->RendererSinkReset = IAudioRendererSinkReset;
89 adapter->RendererSinkSetBufferSize = IAudioRendererSinkSetBufferSize;
90 adapter->RendererSinkOffloadRunningLockInit = IAudioRendererSinkOffloadRunningLockInit;
91 adapter->RendererSinkOffloadRunningLockLock = IAudioRendererSinkOffloadRunningLockLock;
92 adapter->RendererSinkOffloadRunningLockUnlock = IAudioRendererSinkOffloadRunningLockUnlock;
93 adapter->RendererSinkSetPaPower = IAudioRendererSinkSetPaPower;
94 adapter->RendererSinkSetPriPaPower = IAudioRendererSinkSetPriPaPower;
95 adapter->RendererSinkUpdateAppsUid = IAudioRendererSinkUpdateAppsUid;
96
97 *sinkAdapter = adapter;
98
99 return SUCCESS;
100 }
101
UnLoadSinkAdapter(struct RendererSinkAdapter * sinkAdapter)102 int32_t UnLoadSinkAdapter(struct RendererSinkAdapter *sinkAdapter)
103 {
104 CHECK_AND_RETURN_RET_LOG(sinkAdapter != NULL, ERROR, "Invalid parameter");
105
106 free(sinkAdapter);
107 return SUCCESS;
108 }
109
GetDeviceClass(int32_t deviceClass)110 const char *GetDeviceClass(int32_t deviceClass)
111 {
112 if (deviceClass == CLASS_TYPE_PRIMARY) {
113 return DEVICE_CLASS_PRIMARY;
114 } else if (deviceClass == CLASS_TYPE_USB) {
115 return DEVICE_CLASS_USB;
116 } else if (deviceClass == CLASS_TYPE_A2DP) {
117 return DEVICE_CLASS_A2DP;
118 } else if (deviceClass == CLASS_TYPE_FILE) {
119 return DEVICE_CLASS_FILE;
120 } else if (deviceClass == CLASS_TYPE_REMOTE) {
121 return DEVICE_CLASS_REMOTE;
122 } else if (deviceClass == CLASS_TYPE_OFFLOAD) {
123 return DEVICE_CLASS_OFFLOAD;
124 } else if (deviceClass == CLASS_TYPE_MULTICHANNEL) {
125 return DEVICE_CLASS_MULTICHANNEL;
126 } else if (deviceClass == CLASS_TYPE_DP) {
127 return DEVICE_CLASS_DP;
128 } else {
129 return "";
130 }
131 }
132 #ifdef __cplusplus
133 }
134 #endif
135