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