blob: 8ccc14e9cf39ac73fef9bfbc6b055f506881cdac [file] [log] [blame]
b.liu88fbcc62024-03-18 17:10:03 +08001/*
2* mbtk_audio_ubus.c
3*
4* MBTK audio ubus client API.
5*
6*/
7/******************************************************************************
8
9 EDIT HISTORY FOR FILE
10
11 WHEN WHO WHAT,WHERE,WHY
12-------- -------- -------------------------------------------------------
132024/3/18 LiuBin Initial version
14
15******************************************************************************/
16#include <fcntl.h>
17#include <stdint.h>
18#include <limits.h>
19#include <termios.h>
20#include <stdarg.h>
21#include <dirent.h>
22#include <sys/stat.h>
23#include <sys/statfs.h>
24#include <sys/types.h>
25#include "mbtk_log.h"
26#include "mbtk_type.h"
27#include <libubox/blobmsg_json.h>
28#include "libubus.h"
29#include "mbtk_audio_ubus.h"
30
31#define AUDIO_UBUS_TIMEOUT 5000 // 3s
32
33#define AUDIO_UBUS_REQUEST_NAME "audio_if"
34#define AUDIO_UBUS_VOLUME_SET "volume_set"
35#define AUDIO_UBUS_VOLUME_GET "volume_status"
36#define AUDIO_UBUS_MODE_SET "audio_mode_set"
37#define AUDIO_UBUS_PATH_ENABLE "audio_path_enable"
38#define AUDIO_UBUS_SWITCH_PCM "switch_pcm"
39#define AUDIO_UBUS_DSP_SET "config_dspgain"
40#define AUDIO_UBUS_LOOPBACK_EN "loopback_enable"
41#define AUDIO_UBUS_LOOPBACK_DIS "loopback_disable"
42#define AUDIO_UBUS_AUDIO_GAIN_SET "audio_gain_set"
43#define AUDIO_UBUS_AUDIO_REG_SET "audio_reg_set"
44
45static struct ubus_context *audio_ctx = NULL;
46static uint32_t ubus_id_audio_if = 0;
47
48static void ubus_complete_cb(struct ubus_request *req, int rc)
49{
50 if(audio_ctx == NULL) {
51 LOGE("MBTK audio ubus not inited.");
52 return;
53 }
54 if (req)
55 {
56 free(req);
57 req = NULL;
58 }
59
60 LOGD("ubus_complete_cb() , rc = %d", rc);
61}
62
63int mbtk_audio_ubus_init()
64{
65 if(audio_ctx) {
66 LOGE("MBTK audio ubus has inited.");
67 return -1;
68 }
69
70 audio_ctx = ubus_connect(NULL);
71 if (!audio_ctx) {
72 LOGE("Failed to connect to ubus.");
73 return -1;
74 }
75
76 int ret = ubus_lookup_id(audio_ctx, AUDIO_UBUS_REQUEST_NAME, &ubus_id_audio_if);
77 if (ret) {
78 LOGE("ubus_lookup_id() fail.");
79 return ret;
80 }
81 return 0;
82}
83
84int mbtk_audio_ubus_deinit()
85{
86 if(audio_ctx) {
87 ubus_free(audio_ctx);
88 audio_ctx = NULL;
89 ubus_id_audio_if = 0;
90 }
91
92 return 0;
93}
94
95/**
96 * @brief mbtk_audio_mode_set
97 *
98 * @details detailed description
99 *
100 * @param param
101 * "param0": UINT32
102 * typedef enum {
103 * AUDIO_MODE_INVALID = -2,
104 * AUDIO_MODE_CURRENT = -1,
105 * AUDIO_MODE_NORMAL = 0,
106 * AUDIO_MODE_RINGTONE = 1,
107 * AUDIO_MODE_IN_CALL = 2,
108 * AUDIO_MODE_IN_COMMUNICATION=3,
109 * AUDIO_MODE_IN_VT_CALL= 4,
110 * AUDIO_MODE_CNT,
111 * AUDIO_MODE_MAX = AUDIO_MODE_CNT-1,
112 * } audio_mode_
113 * @return return type
114 */
115int mbtk_audio_mode_set(int mode)
116{
117 if(audio_ctx == NULL || ubus_id_audio_if == 0) {
118 LOGE("MBTK audio ubus not inited.");
119 return -1;
120 }
121 static struct blob_buf b;
122 int ret;
123 blob_buf_init(&b, 0);
124 blobmsg_add_u32(&b, "param0", mode);
125 if((ret = ubus_invoke(audio_ctx, ubus_id_audio_if, AUDIO_UBUS_MODE_SET, b.head, NULL, NULL, AUDIO_UBUS_TIMEOUT)) != UBUS_STATUS_OK) {
126 LOGE("ubus_invoke fail:%d.\n", ret);
127 return -1;
128 } else {
129 LOGD("ubus_invoke success.\n");
130 return 0;
131 }
132}
133
134/**
135 * @brief mbtk_audio_loopback_start
136 *
137 * @details detailed description
138 *
139 * @param param
140 * device: UINT32
141 * 0: earpiece
142 * 1: speaker
143 * 2: headset
144 * @return return type
145 */
146int mbtk_audio_loopback_start(int device)
147{
148 int rc = 0;
149 struct ubus_request *req = NULL;
150
151 if(audio_ctx == NULL || ubus_id_audio_if == 0) {
152 LOGE("MBTK audio ubus not inited.");
153 return -1;
154 }
155
156 req = (struct ubus_request *)malloc(sizeof(struct ubus_request));
157 if (req == NULL)
158 {
159 LOGE("leave %s: lack of memory", __FUNCTION__);
160 return -1;
161 }
162 static struct blob_buf b;
163 memset(req, 0, sizeof(struct ubus_request));
164 blob_buf_init(&b, 0);
165 blobmsg_add_u32(&b, "param0", device);
166 if ((rc = ubus_invoke_async(audio_ctx,
167 ubus_id_audio_if,
168 AUDIO_UBUS_LOOPBACK_EN,
169 b.head, req)) != UBUS_STATUS_OK) {
170 free(req);
171 LOGE("ubus_invoke_async %s failed %s", AUDIO_UBUS_LOOPBACK_EN, ubus_strerror(rc));
172 return -1;
173 }
174 else
175 {
176 LOGD("ubus_invoke_async %s success", AUDIO_UBUS_LOOPBACK_EN);
177 req->complete_cb = ubus_complete_cb;
178 ubus_complete_request_async(audio_ctx, req);
179 return 0;
180 }
181}
182
183int mbtk_audio_loopback_stop()
184{
185 int rc = 0;
186
187 if(audio_ctx == NULL || ubus_id_audio_if == 0) {
188 LOGE("MBTK audio ubus not inited.");
189 return -1;
190 }
191 static struct blob_buf b;
192 blob_buf_init(&b, 0);
193 if ((rc = ubus_invoke(audio_ctx,
194 ubus_id_audio_if,
195 AUDIO_UBUS_LOOPBACK_DIS,
196 b.head, NULL, NULL, AUDIO_UBUS_TIMEOUT)) != UBUS_STATUS_OK)
197 {
198 LOGE("ubus_invoke %s failed %s", AUDIO_UBUS_LOOPBACK_DIS, ubus_strerror(rc));
199 return -1;
200 }
201 else
202 {
203 LOGD("ubus_invoke %s success", AUDIO_UBUS_LOOPBACK_DIS);
204 return 0;
205 }
206}
207
luojian9e11c222024-06-25 19:54:52 +0800208/**
209 * @brief mbtk_audio_dsp_gain_set
210 *
211 * @details dsp gain set
212 *
213 * @param param
214 * type: 0:tx
215 * 0: tx
216 * 1: rx
217 * gain: -36~12 db
218
219 * @return return
220 */
221int mbtk_audio_dsp_gain_set(int type, int gain)
222{
223 int rc = 0;
224 struct ubus_request *req = NULL;
225
226 if(audio_ctx == NULL || ubus_id_audio_if == 0) {
227 LOGE("MBTK audio ubus not inited.");
228 return -1;
229 }
230
231 req = (struct ubus_request *)malloc(sizeof(struct ubus_request));
232 if (req == NULL)
233 {
234 LOGE("leave %s: lack of memory", __FUNCTION__);
235 return -1;
236 }
237 static struct blob_buf b;
238 memset(req, 0, sizeof(struct ubus_request));
239 blob_buf_init(&b, 0);
240 blobmsg_add_u32(&b, "type", type);
241 blobmsg_add_u32(&b, "gain", gain);
242 if ((rc = ubus_invoke_async(audio_ctx,
243 ubus_id_audio_if,
244 AUDIO_UBUS_DSP_SET,
245 b.head, req)) != UBUS_STATUS_OK) {
246 free(req);
247 LOGE("ubus_invoke_async %s failed %s", AUDIO_UBUS_DSP_SET, ubus_strerror(rc));
248 return -1;
249 }
250 else
251 {
252 LOGD("ubus_invoke_async %s success", AUDIO_UBUS_DSP_SET);
253 req->complete_cb = ubus_complete_cb;
254 ubus_complete_request_async(audio_ctx, req);
255 return 0;
256 }
257}
258