blob: 998d7a52b13ac2b5db780700027cf697bdb1743d [file] [log] [blame]
xf.libdd93d52023-05-12 07:10:14 -07001#ifdef USE_CAP_SUPPORT
2#include <stdio.h>
3#include <unistd.h>
4#include <string.h>
5#include <stdlib.h>
6#include <stdint.h>
7#include <sys/ioctl.h>
8#include <fcntl.h>
9#include "voice_ipc.h"
xf.li742dd022023-06-08 01:43:32 -070010#include "voice_lib.h"
xf.libdd93d52023-05-12 07:10:14 -070011#include "linux/rpmsg_zx29.h"
xf.li742dd022023-06-08 01:43:32 -070012#include "softap_api.h"
13#include "pthread.h"
xf.libdd93d52023-05-12 07:10:14 -070014
15extern int sc_audio_set_voice_device_mode(int dev_mode);
16extern int sc_audio_get_voice_device_mode(int *p_dev_mode);
17extern int sc_audio_set_rx_voice_vol(int vol);
18extern int sc_audio_get_rx_voice_vol(int * p_vol);
19extern int sc_audio_set_tx_voice_vol(int vol);
20extern int sc_audio_get_tx_voice_vol(int *p_vol);
21extern int sc_audio_set_tx_voice_mute_state(int mute );
22extern int sc_audio_get_tx_voice_mute_state(int *p_mute);
23extern int sc_audio_set_rx_voice_mute_state(int mute);
24extern int sc_audio_get_rx_voice_mute_state(int *p_mute);
25extern int sc_audio_set_loopback_enable_state(int enable);
26extern int sc_audio_get_loopback_enable_state(int *p_enable);
27
xf.li742dd022023-06-08 01:43:32 -070028static int voice_ipc_fd = -1;
29static voice_ipc_control_msg voice_ctrl_recvmsg[IPC_VOICE_FUNC_MAX] = {0};
xf.libdd93d52023-05-12 07:10:14 -070030
xf.li742dd022023-06-08 01:43:32 -070031int cap_alsa_voice_open(int vmode)
32{
33 int ret = 0;
34 int msg_handle = 0;
35 MSG_BUF msg;
36 LONG msg_size = sizeof(MSG_BUF)-sizeof(LONG);
37 int module_id = MODULE_ID_VOICE_CLIENT;
38 int dst_id = MODULE_ID_VOICE_SERVER;
39 int msg_cmd = MSG_CMD_CAP_VALSA_OPEN;
40
41 //´´½¨ÏûÏ¢¶ÓÁÐ
42 msg_handle = msgget(module_id, IPC_CREAT|0600);
43
44 //·¢ËÍÏûÏ¢
45 ret = ipc_send_message(module_id, dst_id, msg_cmd, sizeof(int), (unsigned char *)(&vmode), 0);
46 if(0 != ret){
47 printf("%s: send msg error(%d)!\n", __func__, ret);
48 msgctl(msg_handle,IPC_RMID,0);
49 return ret;
50 }
51 printf("%s: send msg success(%d)!\n", __func__, ret);
52
53 //½ÓÊÕÏûÏ¢
54 while(1)
55 {
56 memset(&msg, 0x00, sizeof(MSG_BUF));
57
58 //»ñÈ¡ÏûÏ¢¶ÓÁÐÏûÏ¢²¢´¦Àí
59 ret = msgrcv(msg_handle, &msg, msg_size, 0, 0);
60 if(0 > ret){
61 continue;
62 }
63
64 //Æ¥Åäµ½ÊÇMSG_CMD_CAP_VALSA_OPENʱ²Å´¦Àí
65 if(msg_cmd == msg.usMsgCmd){
66 ret = *((int *)msg.aucDataBuf);
67 msgctl(msg_handle,IPC_RMID,0);
68 printf("%s: receive msg success(%d)!\n", __func__, ret);
69 break;
70 }
71 }
72
73 return ret;
74}
75
76int cap_alsa_voice_close(int vmode)
77{
78 int ret = 0;
79 int msg_handle = 0;
80 MSG_BUF msg;
81 LONG msg_size = sizeof(MSG_BUF)-sizeof(LONG);
82 int module_id = MODULE_ID_VOICE_CLIENT;
83 int dst_id = MODULE_ID_VOICE_SERVER;
84 int msg_cmd = MSG_CMD_CAP_VALSA_CLOSE;
85
86 //´´½¨ÏûÏ¢¶ÓÁÐ
87 msg_handle = msgget(module_id, IPC_CREAT|0600);
88
89 //·¢ËÍÏûÏ¢
90 ret = ipc_send_message(module_id, dst_id, msg_cmd, sizeof(int), (unsigned char *)(&vmode), 0);
91 if(0 != ret){
92 printf("%s: send msg error(%d)!\n", __func__, ret);
93 msgctl(msg_handle,IPC_RMID,0);
94 return ret;
95 }
96 printf("%s: send msg success(%d)!\n", __func__, ret);
97
98 //½ÓÊÕÏûÏ¢
99 while(1)
100 {
101 memset(&msg, 0x00, sizeof(MSG_BUF));
102
103 //»ñÈ¡ÏûÏ¢¶ÓÁÐÏûÏ¢²¢´¦Àí
104 ret = msgrcv(msg_handle, &msg, msg_size, 0, 0);
105 if(0 > ret){
106 continue;
107 }
108
109 //Æ¥Åäµ½ÊÇMSG_CMD_CAP_VALSA_CLOSEʱ²Å´¦Àí
110 if(msg_cmd == msg.usMsgCmd){
111 ret = *((int *)msg.aucDataBuf);
112 msgctl(msg_handle,IPC_RMID,0);
113 printf("%s: receive msg success(%d)!\n", __func__, ret);
114 break;
115 }
116 }
117
118 return ret;
119}
120
121int ipc_cap_alsa_voice_open(int vmode)
122{
123 int ret = 0;
124 int func_id = IPC_CAP_ALSA_VOICE_OPEN;
125 voice_ctrl_recvmsg[func_id].func_id = VOICE_WAIT_MSG_FROM_CAP;
126
127 ret = Voice_Ctrl_Rpmsg_Send(func_id, &vmode);
128
129 if (0 >= ret){
130 printf("%s: Voice_Ctrl_Rpmsg_Send error, return %d!\n", __func__, ret);
131 return VOICEIPC_ERROR;
132 }
133 printf("%s: Voice_Ctrl_Rpmsg_Send success, write_len=%d!\n", __func__, ret);
134
135 while(func_id != voice_ctrl_recvmsg[func_id].func_id){
136 usleep(1);
137 }
138
139 memcpy(&ret, voice_ctrl_recvmsg[func_id].param, voice_ctrl_recvmsg[func_id].param_len);
140 printf("%s: ipc receive success, ret=%d!\n", __func__, ret);
141
142 return ret;
143}
144
145int ipc_cap_alsa_voice_close(int vmode)
146{
147 int ret = 0;
148 int func_id = IPC_CAP_ALSA_VOICE_CLOSE;
149 voice_ctrl_recvmsg[func_id].func_id = VOICE_WAIT_MSG_FROM_CAP;
150
151 ret = Voice_Ctrl_Rpmsg_Send(func_id, &vmode);
152
153 if (0 >= ret){
154 printf("%s: Voice_Ctrl_Rpmsg_Send error, return %d!\n", __func__, ret);
155 return VOICEIPC_ERROR;
156 }
157 printf("%s: Voice_Ctrl_Rpmsg_Send success, write_len=%d!\n", __func__, ret);
158
159 while(func_id != voice_ctrl_recvmsg[func_id].func_id){
160 usleep(1);
161 }
162
163 memcpy(&ret, voice_ctrl_recvmsg[func_id].param, voice_ctrl_recvmsg[func_id].param_len);
164 printf("%s: ipc receive success, ret=%d!\n", __func__, ret);
165
166 return ret;
167}
168
169void ipc_set_voice_device_mode_rcv(voice_ipc_control_msg msg)
xf.libdd93d52023-05-12 07:10:14 -0700170{
171 int ret = VOICEIPC_OK;
172 int msg_len = 0;
173 int dev_mode = 0;
174
175 //memcpy(&dev_mode, msg.param, msg.param_len);
176 dev_mode = *((int *)msg.param);
177 ret = sc_audio_set_voice_device_mode(dev_mode);
178
179 //msg.func_id不变
180 msg.param_len = sizeof(int);
181 memcpy(msg.param, &ret, msg.param_len);
182 msg_len = VOICE_HEAD_LEN + msg.param_len;
183
184 ret = write(voice_ipc_fd, &msg, msg_len);
185
186 if (0 >= ret){
187 printf("%s: write error(%d)!\n", __func__, ret);
188 }
189}
190
xf.li742dd022023-06-08 01:43:32 -0700191void ipc_get_voice_device_mode_rcv(voice_ipc_control_msg msg)
xf.libdd93d52023-05-12 07:10:14 -0700192{
193 int ret = VOICEIPC_OK;
194 int msg_len = 0;
195 int *p_dev_mode = NULL;
196
197 p_dev_mode = (int *)msg.param;
198 ret = sc_audio_get_voice_device_mode(p_dev_mode);
199
200 //msg.func_id不变
201 msg.param_len = sizeof(int);
xf.li742dd022023-06-08 01:43:32 -0700202 if(0 == ret)
203 memcpy(msg.param, p_dev_mode, msg.param_len);
204 else
205 memcpy(msg.param, &ret, msg.param_len);
xf.libdd93d52023-05-12 07:10:14 -0700206 msg_len = VOICE_HEAD_LEN + msg.param_len;
207
208 ret = write(voice_ipc_fd, &msg, msg_len);
209
210 if (0 >= ret){
211 printf("%s: write error(%d)!\n", __func__, ret);
212 }
213}
214
xf.li742dd022023-06-08 01:43:32 -0700215void ipc_set_rx_voice_vol_rcv(voice_ipc_control_msg msg)
xf.libdd93d52023-05-12 07:10:14 -0700216{
217 int ret = VOICEIPC_OK;
218 int msg_len = 0;
219 int vol = 0;
220
221 //memcpy(&dev_mode, msg.param, msg.param_len);
222 vol = *((int *)msg.param);
223 ret = sc_audio_set_rx_voice_vol(vol);
224
225 //msg.func_id不变
226 msg.param_len = sizeof(int);
227 memcpy(msg.param, &ret, msg.param_len);
228 msg_len = VOICE_HEAD_LEN + msg.param_len;
229
230 ret = write(voice_ipc_fd, &msg, msg_len);
231
232 if (0 >= ret){
233 printf("%s: write error(%d)!\n", __func__, ret);
234 }
235}
236
xf.li742dd022023-06-08 01:43:32 -0700237void ipc_get_rx_voice_vol_rcv(voice_ipc_control_msg msg)
xf.libdd93d52023-05-12 07:10:14 -0700238{
239 int ret = VOICEIPC_OK;
240 int msg_len = 0;
241 int *p_vol = NULL;
242
243 p_vol = (int *)msg.param;
244 ret = sc_audio_get_rx_voice_vol(p_vol);
245
246 //msg.func_id不变
247 msg.param_len = sizeof(int);
xf.li742dd022023-06-08 01:43:32 -0700248 if(0 == ret)
249 memcpy(msg.param, p_vol, msg.param_len);
250 else
251 memcpy(msg.param, &ret, msg.param_len);
xf.libdd93d52023-05-12 07:10:14 -0700252 msg_len = VOICE_HEAD_LEN + msg.param_len;
253
254 ret = write(voice_ipc_fd, &msg, msg_len);
255
256 if (0 >= ret){
257 printf("%s: write error(%d)!\n", __func__, ret);
258 }
259}
260
xf.li742dd022023-06-08 01:43:32 -0700261void ipc_set_tx_voice_vol_rcv(voice_ipc_control_msg msg)
xf.libdd93d52023-05-12 07:10:14 -0700262{
263 int ret = VOICEIPC_OK;
264 int msg_len = 0;
265 int vol = 0;
266
267 //memcpy(&dev_mode, msg.param, msg.param_len);
268 vol = *((int *)msg.param);
269 ret = sc_audio_set_tx_voice_vol(vol);
270
271 //msg.func_id不变
272 msg.param_len = sizeof(int);
273 memcpy(msg.param, &ret, msg.param_len);
274 msg_len = VOICE_HEAD_LEN + msg.param_len;
275
276 ret = write(voice_ipc_fd, &msg, msg_len);
277
278 if (0 >= ret){
279 printf("%s: write error(%d)!\n", __func__, ret);
280 }
281}
282
xf.li742dd022023-06-08 01:43:32 -0700283void ipc_get_tx_voice_vol_rcv(voice_ipc_control_msg msg)
xf.libdd93d52023-05-12 07:10:14 -0700284{
285 int ret = VOICEIPC_OK;
286 int msg_len = 0;
287 int *p_vol = NULL;
288
289 p_vol = (int *)msg.param;
290 ret = sc_audio_get_tx_voice_vol(p_vol);
291
292 //msg.func_id不变
293 msg.param_len = sizeof(int);
xf.li742dd022023-06-08 01:43:32 -0700294 if(0 == ret)
295 memcpy(msg.param, p_vol, msg.param_len);
296 else
297 memcpy(msg.param, &ret, msg.param_len);
xf.libdd93d52023-05-12 07:10:14 -0700298 msg_len = VOICE_HEAD_LEN + msg.param_len;
299
300 ret = write(voice_ipc_fd, &msg, msg_len);
301
302 if (0 >= ret){
303 printf("%s: write error(%d)!\n", __func__, ret);
304 }
305}
306
xf.li742dd022023-06-08 01:43:32 -0700307void ipc_set_tx_voice_mute_state_rcv(voice_ipc_control_msg msg)
xf.libdd93d52023-05-12 07:10:14 -0700308{
309 int ret = VOICEIPC_OK;
310 int msg_len = 0;
311 int mute = 0;
312
313 //memcpy(&dev_mode, msg.param, msg.param_len);
314 mute = *((int *)msg.param);
315 ret = sc_audio_set_tx_voice_mute_state(mute);
316
317 //msg.func_id不变
318 msg.param_len = sizeof(int);
319 memcpy(msg.param, &ret, msg.param_len);
320 msg_len = VOICE_HEAD_LEN + msg.param_len;
321
322 ret = write(voice_ipc_fd, &msg, msg_len);
323
324 if (0 >= ret){
325 printf("%s: write error(%d)!\n", __func__, ret);
326 }
327}
328
xf.li742dd022023-06-08 01:43:32 -0700329void ipc_get_tx_voice_mute_state_rcv(voice_ipc_control_msg msg)
xf.libdd93d52023-05-12 07:10:14 -0700330{
331 int ret = VOICEIPC_OK;
332 int msg_len = 0;
333 int *p_mute = NULL;
334
335 p_mute = (int *)msg.param;
336 ret = sc_audio_get_tx_voice_mute_state(p_mute);
337
338 //msg.func_id不变
339 msg.param_len = sizeof(int);
xf.li742dd022023-06-08 01:43:32 -0700340 if(0 == ret)
341 memcpy(msg.param, p_mute, msg.param_len);
342 else
343 memcpy(msg.param, &ret, msg.param_len);
xf.libdd93d52023-05-12 07:10:14 -0700344 msg_len = VOICE_HEAD_LEN + msg.param_len;
345
346 ret = write(voice_ipc_fd, &msg, msg_len);
347
348 if (0 >= ret){
349 printf("%s: write error(%d)!\n", __func__, ret);
350 }
351}
352
xf.li742dd022023-06-08 01:43:32 -0700353void ipc_set_rx_voice_mute_state_rcv(voice_ipc_control_msg msg)
xf.libdd93d52023-05-12 07:10:14 -0700354{
355 int ret = VOICEIPC_OK;
356 int msg_len = 0;
357 int mute = 0;
358
359 //memcpy(&dev_mode, msg.param, msg.param_len);
360 mute = *((int *)msg.param);
361 ret = sc_audio_set_rx_voice_mute_state(mute);
362
363 //msg.func_id不变
364 msg.param_len = sizeof(int);
365 memcpy(msg.param, &ret, msg.param_len);
366 msg_len = VOICE_HEAD_LEN + msg.param_len;
367
368 ret = write(voice_ipc_fd, &msg, msg_len);
369
370 if (0 >= ret){
371 printf("%s: write error(%d)!\n", __func__, ret);
372 }
373}
374
xf.li742dd022023-06-08 01:43:32 -0700375void ipc_get_rx_voice_mute_state_rcv(voice_ipc_control_msg msg)
xf.libdd93d52023-05-12 07:10:14 -0700376{
377 int ret = VOICEIPC_OK;
378 int msg_len = 0;
379 int *p_mute = NULL;
380
381 p_mute = (int *)msg.param;
382 ret = sc_audio_get_rx_voice_mute_state(p_mute);
383
384 //msg.func_id不变
385 msg.param_len = sizeof(int);
xf.li742dd022023-06-08 01:43:32 -0700386 if(0 == ret)
387 memcpy(msg.param, p_mute, msg.param_len);
388 else
389 memcpy(msg.param, &ret, msg.param_len);
xf.libdd93d52023-05-12 07:10:14 -0700390 msg_len = VOICE_HEAD_LEN + msg.param_len;
391
392 ret = write(voice_ipc_fd, &msg, msg_len);
393
394 if (0 >= ret){
395 printf("%s: write error(%d)!\n", __func__, ret);
396 }
397}
398
xf.li742dd022023-06-08 01:43:32 -0700399void ipc_set_loopback_enable_state_rcv(voice_ipc_control_msg msg)
xf.libdd93d52023-05-12 07:10:14 -0700400{
401 int ret = VOICEIPC_OK;
402 int msg_len = 0;
403 int enable = 0;
404
405 //memcpy(&dev_mode, msg.param, msg.param_len);
406 enable = *((int *)msg.param);
407 ret = sc_audio_set_loopback_enable_state(enable);
408
409 //msg.func_id不变
410 msg.param_len = sizeof(int);
411 memcpy(msg.param, &ret, msg.param_len);
412 msg_len = VOICE_HEAD_LEN + msg.param_len;
413
414 ret = write(voice_ipc_fd, &msg, msg_len);
415
416 if (0 >= ret){
417 printf("%s: write error(%d)!\n", __func__, ret);
418 }
419}
420
xf.li742dd022023-06-08 01:43:32 -0700421void ipc_get_loopback_enable_state_rcv(voice_ipc_control_msg msg)
xf.libdd93d52023-05-12 07:10:14 -0700422{
423 int ret = VOICEIPC_OK;
424 int msg_len = 0;
425 int *p_enable = NULL;
426
427 p_enable = (int *)msg.param;
428 ret = sc_audio_get_loopback_enable_state(p_enable);
429
430 //msg.func_id不变
431 msg.param_len = sizeof(int);
xf.li742dd022023-06-08 01:43:32 -0700432 if(0 == ret)
433 memcpy(msg.param, p_enable, msg.param_len);
434 else
435 memcpy(msg.param, &ret, msg.param_len);
436 msg_len = VOICE_HEAD_LEN + msg.param_len;
437
438 ret = write(voice_ipc_fd, &msg, msg_len);
439
440 if (0 >= ret){
441 printf("%s: write error(%d)!\n", __func__, ret);
442 }
443}
444
445#ifdef _USE_VOICE_ALSA
446void ipc_ap_alsa_voice_open_rcv(voice_ipc_control_msg msg)
447{
448 int ret = VOICEIPC_OK;
449 int msg_len = 0;
450 int vmode = 0;
451
452 vmode = *((int *)msg.param);
453 ret = alsa_voice_open(vmode);
454
455 //msg.func_id不变
456 msg.param_len = sizeof(int);
xf.libdd93d52023-05-12 07:10:14 -0700457 memcpy(msg.param, &ret, msg.param_len);
458 msg_len = VOICE_HEAD_LEN + msg.param_len;
459
460 ret = write(voice_ipc_fd, &msg, msg_len);
461
462 if (0 >= ret){
463 printf("%s: write error(%d)!\n", __func__, ret);
464 }
465}
466
xf.li742dd022023-06-08 01:43:32 -0700467void ipc_ap_alsa_voice_close_rcv(voice_ipc_control_msg msg)
468{
469 int ret = VOICEIPC_OK;
470 int msg_len = 0;
471 int vmode = 0;
472
473 vmode = *((int *)msg.param);
474 ret = alsa_voice_close(vmode);
475
476 //msg.func_id不变
477 msg.param_len = sizeof(int);
478 memcpy(msg.param, &ret, msg.param_len);
479 msg_len = VOICE_HEAD_LEN + msg.param_len;
480
481 ret = write(voice_ipc_fd, &msg, msg_len);
482
483 if (0 >= ret){
484 printf("%s: write error(%d)!\n", __func__, ret);
485 }
486}
487#endif
488
489void voice_ipc_recv_proc(voice_ipc_control_msg msg)
xf.libdd93d52023-05-12 07:10:14 -0700490{
491 switch(msg.func_id){
492 case IPC_SET_VOICE_DEVICE_MODE:
xf.li742dd022023-06-08 01:43:32 -0700493 ipc_set_voice_device_mode_rcv(voice_ctrl_recvmsg[msg.func_id]);
xf.libdd93d52023-05-12 07:10:14 -0700494 break;
495 case IPC_GET_VOICE_DEVICE_MODE:
xf.li742dd022023-06-08 01:43:32 -0700496 ipc_get_voice_device_mode_rcv(voice_ctrl_recvmsg[msg.func_id]);
xf.libdd93d52023-05-12 07:10:14 -0700497 break;
498 case IPC_SET_RX_VOICE_VOL:
xf.li742dd022023-06-08 01:43:32 -0700499 ipc_set_rx_voice_vol_rcv(voice_ctrl_recvmsg[msg.func_id]);
xf.libdd93d52023-05-12 07:10:14 -0700500 break;
501 case IPC_GET_RX_VOICE_VOL:
xf.li742dd022023-06-08 01:43:32 -0700502 ipc_get_rx_voice_vol_rcv(voice_ctrl_recvmsg[msg.func_id]);
xf.libdd93d52023-05-12 07:10:14 -0700503 break;
504 case IPC_SET_TX_VOICE_VOL:
xf.li742dd022023-06-08 01:43:32 -0700505 ipc_set_tx_voice_vol_rcv(voice_ctrl_recvmsg[msg.func_id]);
xf.libdd93d52023-05-12 07:10:14 -0700506 break;
507 case IPC_GET_TX_VOICE_VOL:
xf.li742dd022023-06-08 01:43:32 -0700508 ipc_get_tx_voice_vol_rcv(voice_ctrl_recvmsg[msg.func_id]);
xf.libdd93d52023-05-12 07:10:14 -0700509 break;
510 case IPC_SET_TX_VOICE_MUTE_STATE:
xf.li742dd022023-06-08 01:43:32 -0700511 ipc_set_tx_voice_mute_state_rcv(voice_ctrl_recvmsg[msg.func_id]);
xf.libdd93d52023-05-12 07:10:14 -0700512 break;
513 case IPC_GET_TX_VOICE_MUTE_STATE:
xf.li742dd022023-06-08 01:43:32 -0700514 ipc_get_tx_voice_mute_state_rcv(voice_ctrl_recvmsg[msg.func_id]);
xf.libdd93d52023-05-12 07:10:14 -0700515 break;
516 case IPC_SET_RX_VOICE_MUTE_STATE:
xf.li742dd022023-06-08 01:43:32 -0700517 ipc_set_rx_voice_mute_state_rcv(voice_ctrl_recvmsg[msg.func_id]);
xf.libdd93d52023-05-12 07:10:14 -0700518 break;
519 case IPC_GET_RX_VOICE_MUTE_STATE:
xf.li742dd022023-06-08 01:43:32 -0700520 ipc_get_rx_voice_mute_state_rcv(voice_ctrl_recvmsg[msg.func_id]);
xf.libdd93d52023-05-12 07:10:14 -0700521 break;
522 case IPC_SET_LOOPBACK_ENABLE_STATE:
xf.li742dd022023-06-08 01:43:32 -0700523 ipc_set_loopback_enable_state_rcv(voice_ctrl_recvmsg[msg.func_id]);
xf.libdd93d52023-05-12 07:10:14 -0700524 break;
525 case IPC_GET_LOOPBACK_ENABLE_STATE:
xf.li742dd022023-06-08 01:43:32 -0700526 ipc_get_loopback_enable_state_rcv(voice_ctrl_recvmsg[msg.func_id]);
xf.libdd93d52023-05-12 07:10:14 -0700527 break;
xf.li742dd022023-06-08 01:43:32 -0700528#ifdef _USE_VOICE_ALSA
529 case IPC_AP_ALSA_VOICE_OPEN:
530 ipc_ap_alsa_voice_open_rcv(voice_ctrl_recvmsg[msg.func_id]);
531 break;
532 case IPC_AP_ALSA_VOICE_CLOSE:
533 ipc_ap_alsa_voice_close_rcv(voice_ctrl_recvmsg[msg.func_id]);
534 break;
535#endif
xf.libdd93d52023-05-12 07:10:14 -0700536 default:
xf.li742dd022023-06-08 01:43:32 -0700537 break;
xf.libdd93d52023-05-12 07:10:14 -0700538 }
539}
540
541void Voice_Ctrl_Rpmsg_Recv(void)
542{
543 int read_len = 0;
544 voice_ipc_control_msg tmpbuf = {0};
545
xf.li742dd022023-06-08 01:43:32 -0700546 while(1){
xf.libdd93d52023-05-12 07:10:14 -0700547 read_len = 0;
548 read_len = read(voice_ipc_fd, &tmpbuf, (VOICE_HEAD_LEN + VOICE_CONTROL_MAX_LEN));
xf.li742dd022023-06-08 01:43:32 -0700549
xf.libdd93d52023-05-12 07:10:14 -0700550 if (0 >= read_len){
xf.li742dd022023-06-08 01:43:32 -0700551 sleep(1);
xf.libdd93d52023-05-12 07:10:14 -0700552 continue;
553 }
xf.li742dd022023-06-08 01:43:32 -0700554 printf("%s: voice_ipc_fd=%d, read_len=%d\n", __func__, voice_ipc_fd, read_len);
555
556 //Êý¾Ý¶ÁÈ¡ÍêºóÔٸıäfuc_id
557 if(0 != tmpbuf.param_len){
558 memcpy(voice_ctrl_recvmsg[tmpbuf.func_id].param, tmpbuf.param, tmpbuf.param_len);
559 }
xf.libdd93d52023-05-12 07:10:14 -0700560 voice_ctrl_recvmsg[tmpbuf.func_id].param_len = tmpbuf.param_len;
561 voice_ctrl_recvmsg[tmpbuf.func_id].func_id = tmpbuf.func_id;
xf.li742dd022023-06-08 01:43:32 -0700562 printf("%s: tmpbuf.param_len=%d, tmpbuf.func_id=%d\n", __func__, tmpbuf.param_len, tmpbuf.func_id);
xf.libdd93d52023-05-12 07:10:14 -0700563
xf.li742dd022023-06-08 01:43:32 -0700564 voice_ipc_recv_proc(voice_ctrl_recvmsg[tmpbuf.func_id]);
xf.libdd93d52023-05-12 07:10:14 -0700565 }
566}
567
xf.li742dd022023-06-08 01:43:32 -0700568int Voice_Ctrl_Rpmsg_Send(int func_id, int *msg)
569{
570 voice_ipc_control_msg tmpbuf = {0};
571 int tmpbuf_len = 0;
572 int write_len = 0;
573
574 tmpbuf.func_id = func_id;
575
576 if(NULL == msg){
577 tmpbuf.param_len = 0;
578 }else{
579 tmpbuf.param_len = sizeof(int);
580 memcpy(tmpbuf.param, msg, tmpbuf.param_len);
581 }
582
583 tmpbuf_len = VOICE_HEAD_LEN + tmpbuf.param_len;
584
585 //printf("Voice_Ctrl_Rpmsg_Send, voice_ipc_fd = %d\n", voice_ipc_fd);
586 write_len = write(voice_ipc_fd, &tmpbuf, tmpbuf_len);
587
588 return write_len;
589}
590
591int voice_ipc_init(void) //通道初始åŒ?
xf.libdd93d52023-05-12 07:10:14 -0700592{
593 voice_ipc_fd = open(VOICE_IPC_CONTROL_CHANNEL, O_RDWR);
594
595 if(0 > voice_ipc_fd){
596 printf("%s: open the channel(%s) error!\n", __func__, VOICE_IPC_CONTROL_CHANNEL);
597 return VOICEIPC_ERROR;
598 }
599
600 if(0 > ioctl(voice_ipc_fd, RPMSG_CREATE_CHANNEL, VOICE_IPC_CONTROL_CHANNEL_SIZE)){
601 printf("%s: ioctl RPMSG_CREATE_CHANNEL fail!\n", __func__);
602 close(voice_ipc_fd);
603 voice_ipc_fd = -1;
604 return VOICEIPC_ERROR;
605 }
606
xf.li742dd022023-06-08 01:43:32 -0700607 if(0 > ioctl(voice_ipc_fd, RPMSG_SET_INT_FLAG, NULL)){ //写中æ–?
xf.libdd93d52023-05-12 07:10:14 -0700608 printf("%s: ioctl RPMSG_SET_INT_FLAG fail!\n", __func__);
609 close(voice_ipc_fd);
610 voice_ipc_fd = -1;
611 return VOICEIPC_ERROR;
612 }
613
xf.li742dd022023-06-08 01:43:32 -0700614 if(0 > ioctl(voice_ipc_fd, RPMSG_CLEAR_POLL_FLAG, NULL)){ //阻塞方式读数æ?
xf.libdd93d52023-05-12 07:10:14 -0700615 printf("%s: ioctl RPMSG_CLEAR_POLL_FLAG fail!\n", __func__);
616 close(voice_ipc_fd);
617 voice_ipc_fd = -1;
618 return VOICEIPC_ERROR;
619 }
xf.li742dd022023-06-08 01:43:32 -0700620
621 printf("voice_ipc_init %s create success! voice_ipc_fd = %d\n", VOICE_IPC_CONTROL_CHANNEL, voice_ipc_fd);
622
xf.libdd93d52023-05-12 07:10:14 -0700623 return VOICEIPC_OK;
624}
625
xf.li742dd022023-06-08 01:43:32 -0700626int recv_msg_proc(MSG_BUF msg)
627{
628 int ret = 0;
629 int vmode = 0;
630 int module_id = MODULE_ID_VOICE_SERVER;
631 int dst_id = MODULE_ID_VOICE_CLIENT;
632
633 switch(msg.usMsgCmd){
634 case MSG_CMD_CAP_VALSA_OPEN:
635 vmode = *((int *)msg.aucDataBuf);
636 ret = ipc_cap_alsa_voice_open(vmode);
637 //dst_id = MODULE_ID_CAP_VALSA_OPEN;
638 ret = ipc_send_message(module_id, dst_id, msg.usMsgCmd, sizeof(int), (unsigned char *)(&ret), 0);
639 if(0 != ret){
640 printf("%s: ipc_send_message error, return %d!\n", __func__, ret);
641 }
642 break;
643 case MSG_CMD_CAP_VALSA_CLOSE:
644 vmode = *((int *)msg.aucDataBuf);
645 ret = ipc_cap_alsa_voice_close(vmode);
646 //dst_id = MODULE_ID_CAP_VALSA_CLOSE;
647 ret = ipc_send_message(module_id, dst_id, msg.usMsgCmd, sizeof(int), (unsigned char *)(&ret), 0);
648 if(0 != ret){
649 printf("%s: ipc_send_message error, return %d!\n", __func__, ret);
650 }
651 break;
652 default:
653 printf("%s: msg.usMsgCmd=%d, not support!\n", __func__, msg.usMsgCmd);
654 break;
655 }
656
657 return ret;
658}
659
660void recv_cap_voice_alsa(void)
661{
662 int ret = 0;
663 int msg_handle = 0;
664 MSG_BUF msg;
665 LONG msg_size = sizeof(MSG_BUF)-sizeof(LONG);
666 int module_id = MODULE_ID_VOICE_SERVER;
667
668 //´´½¨ÏûÏ¢¶ÓÁÐ
669 msg_handle = msgget(module_id, IPC_CREAT|0600);
670
671 //½ÓÊÕÏûÏ¢
672 while(1)
673 {
674 memset(&msg, 0x00, sizeof(MSG_BUF));
675
676 //»ñÈ¡ÏûÏ¢¶ÓÁÐÏûÏ¢²¢´¦Àí
677 ret = msgrcv(msg_handle, &msg, msg_size, 0, 0);
678
679 if(0 > ret){
680 continue;
681 }
682
683 recv_msg_proc(msg);
684 }
685}
686
xf.libdd93d52023-05-12 07:10:14 -0700687int main(int argc, char **argv)
688{
689 int ret = 0;
690
xf.li742dd022023-06-08 01:43:32 -0700691 //ipcͨµÀ³õʼ»¯
xf.libdd93d52023-05-12 07:10:14 -0700692 ret = voice_ipc_init();
xf.li742dd022023-06-08 01:43:32 -0700693 if(0 > ret){
694 printf("voice_ipc_init %s error!\n", VOICE_IPC_CONTROL_CHANNEL);
xf.libdd93d52023-05-12 07:10:14 -0700695 return -1;
696 }
xf.libdd93d52023-05-12 07:10:14 -0700697
xf.li742dd022023-06-08 01:43:32 -0700698 //ipc³õʼ»¯ºó£¬´´½¨msgÏûÏ¢½ÓÊÕÏß³Ì
699 pthread_t recv_thread_tid;
700 if(0 != pthread_create(&recv_thread_tid, NULL, (void *)recv_cap_voice_alsa, NULL)){
701 printf("recv_cap_voice_alsa create error!\n");
702 }
703
704 sleep(4);
xf.libdd93d52023-05-12 07:10:14 -0700705 Voice_Ctrl_Rpmsg_Recv();
706
707 return 0;
708}
709
710#endif