Files
99_7018_lmx/apps/earphone/wireless_mic/process/adapter_process.c

205 lines
5.4 KiB
C
Raw Normal View History

2025-10-29 13:10:02 +08:00
#include "adapter_process.h"
//#include "adapter_media.h"
#include "app_task.h"
#include "adapter_idev.h"
#include "adapter_odev.h"
#if TCFG_WIRELESS_MIC_ENABLE
#include "clock_cfg.h"
static int adapter_process_media_start_callback(void *priv, u8 mode, u8 status, void *parm)
{
struct adapter_pro *pro = (struct adapter_pro *)priv;
if (pro == NULL || pro->media == NULL) {
return 0;
}
adapter_media_stop(pro->media);
pro->media->idev = pro->in;
pro->media->odev = pro->out;
adapter_media_start(pro->media);
pro->media_lock = 0;
return 0;
}
struct adapter_pro *adapter_process_open(struct idev *in, struct odev *out, struct adapter_media *media, int (*event)(struct sys_event *event))
{
struct adapter_pro *pro = zalloc(sizeof(struct adapter_pro));
if (pro == NULL) {
return NULL;
}
pro->in = in;
pro->out = out;
pro->media = media;
pro->event_handle = event;
clock_add_set(ADAPTER_PROCESS_CLK);
return pro;
}
void adapter_process_close(struct adapter_pro **hdl)
{
if (hdl == NULL || *hdl == NULL) {
return ;
}
struct adapter_pro *pro = *hdl;
//其他模块关闭
adapter_media_stop(pro->media);
adapter_idev_stop(pro->in);
adapter_odev_stop(pro->out);
//释放句柄
local_irq_disable();
free(pro);
*hdl = NULL;
local_irq_enable();
clock_remove_set(ADAPTER_PROCESS_CLK);
}
static int adapter_device_event_parse(struct adapter_pro *pro, struct sys_event *e)
{
u8 event = e->u.dev.event;
int value = e->u.dev.value;
switch (event) {
//初始化完成
case ADAPTER_EVENT_IDEV_INIT_OK:
printf("ADAPTER_EVENT_IDEV_INIT_OK\n");
adapter_idev_start(pro->in, pro->media);
break;
case ADAPTER_EVENT_ODEV_INIT_OK:
printf("ADAPTER_EVENT_ODEV_INIT_OK\n");
adapter_odev_start(pro->out, pro->media);
break;
//媒体相关事件
case ADAPTER_EVENT_IDEV_MEDIA_OPEN:
printf("ADAPTER_EVENT_IDEV_MEDIA_OPEN\n");
pro->mode = (u8)value;
pro->dev_status |= BIT(ADAPTER_INDEX_IDEV);
if ((pro->dev_status & 0x3) == 0x3) {
//prepare media
if (pro->media_lock == 0) {
pro->media_lock = 1;
if (adapter_odev_media_prepare(pro->out, pro->mode, adapter_process_media_start_callback, (void *)pro)) {
//prepare 返回值为非0 需要主动启动媒体
printf("adapter_odev_media_prepare null\n");
adapter_process_media_start_callback(pro, pro->mode, 1, NULL);
}
} else {
g_f_printf("%s, %d, pro->media_lock!!!!!\n", __FUNCTION__, __LINE__);
}
}
break;
case ADAPTER_EVENT_IDEV_MEDIA_CLOSE:
pro->mode = 0xff;
pro->dev_status &= ~BIT(ADAPTER_INDEX_IDEV);
adapter_odev_media_pp(pro->out, 0);
adapter_media_stop(pro->media);
break;
case ADAPTER_EVENT_ODEV_MEDIA_OPEN:
printf("==================ADAPTER_EVENT_ODEV_MEDIA_OPEN\n");
pro->dev_status |= BIT(ADAPTER_INDEX_ODEV);
if ((pro->dev_status & 0x3) == 0x3) {
//prepare media
if (pro->media_lock == 0) {
pro->media_lock = 1;
if (adapter_odev_media_prepare(pro->out, pro->mode, adapter_process_media_start_callback, (void *)pro)) {
//prepare 返回值为非0 需要主动启动媒体
printf("adapter_odev_media_prepare null\n");
adapter_process_media_start_callback(pro, pro->mode, 1, NULL);
}
} else {
g_f_printf("%s, %d, pro->media_lock!!!!!\n", __FUNCTION__, __LINE__);
}
}
break;
case ADAPTER_EVENT_ODEV_MEDIA_CLOSE:
pro->media_lock = 0;
pro->dev_status &= ~BIT(ADAPTER_INDEX_ODEV);
adapter_media_stop(pro->media);
break;
default:
break;
}
return 0;
}
static int adapter_process_event_parse(struct adapter_pro *pro, struct sys_event *e)
{
int ret = 0;
//输入设备事件处理
ret = adapter_idev_event_deal(pro->in, e);
if (ret) {
return ret;
}
//输出设备事件处理
ret = adapter_odev_event_deal(pro->out, e);
if (ret) {
return ret;
}
//公共事件处理
switch (e->type) {
case SYS_KEY_EVENT:
break;
case SYS_DEVICE_EVENT:
switch ((u32)e->arg) {
case DEVICE_EVENT_FROM_ADAPTER:
ret = adapter_device_event_parse(pro, e);
break;
default:
break;
}
break;
default:
break;
}
return ret;
}
int adapter_process_run(struct adapter_pro *pro)
{
if (pro == NULL) {
return false;
}
int msg[32];
int ret = 0;
while (1) {
app_task_get_msg(msg, ARRAY_SIZE(msg), 1);
if (adapter_process_event_parse(pro, (struct sys_event *)&msg[1]) == 0) {
if (pro->event_handle) {
ret = pro->event_handle((struct sys_event *)(&msg[1]));
}
}
if (ret) {
break;
}
}
return ret;
}
void adapter_process_event_notify(u8 event, int value)
{
struct sys_event e;
e.type = SYS_DEVICE_EVENT;
e.arg = (void *)DEVICE_EVENT_FROM_ADAPTER;
e.u.dev.event = event;
e.u.dev.value = value;
sys_event_notify(&e);
}
#endif