Files
99_7018_lmx/apps/earphone/wireless_mic/process/adapter_process.c
2025-10-29 13:10:02 +08:00

205 lines
5.4 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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