first
This commit is contained in:
204
apps/earphone/wireless_mic/process/adapter_process.c
Normal file
204
apps/earphone/wireless_mic/process/adapter_process.c
Normal file
@ -0,0 +1,204 @@
|
||||
#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
|
||||
73
apps/earphone/wireless_mic/process/adapter_process.h
Normal file
73
apps/earphone/wireless_mic/process/adapter_process.h
Normal file
@ -0,0 +1,73 @@
|
||||
|
||||
|
||||
#ifndef __ADAPTER_PROCESS_H__
|
||||
#define __ADAPTER_PROCESS_H__
|
||||
|
||||
#include "app_config.h"
|
||||
#include "generic/typedef.h"
|
||||
#include "media/includes.h"
|
||||
#include "stream/stream_entry.h"
|
||||
#include "adapter_idev.h"
|
||||
#include "adapter_odev.h"
|
||||
//#include "adapter_media.h"
|
||||
|
||||
#define ADAPTER_INDEX_IDEV 0x0
|
||||
#define ADAPTER_INDEX_ODEV 0x1
|
||||
|
||||
enum adapter_event {
|
||||
/* --- 适配事件定义 --- */
|
||||
ADAPTER_EVENT_IDEV_INIT_OK = 0x0,
|
||||
ADAPTER_EVENT_IDEV_MEDIA_OPEN,
|
||||
ADAPTER_EVENT_IDEV_MEDIA_CLOSE,
|
||||
|
||||
|
||||
ADAPTER_EVENT_ODEV_INIT_OK = 0x80,
|
||||
ADAPTER_EVENT_ODEV_MEDIA_OPEN,
|
||||
ADAPTER_EVENT_ODEV_MEDIA_CLOSE,
|
||||
|
||||
|
||||
};
|
||||
|
||||
struct adapter_pro {
|
||||
/* --- 适配器process模块控制句柄 --- */
|
||||
u8 mode; /*!< 跟音频媒体media_sel一样, 指的当前媒体选择 */
|
||||
u8 dev_status; /*!< idev和odev 音频请求状态, idev&&odev都请求启动音频媒体,音频媒体才会正式启动*/
|
||||
u8 media_lock; /*!< 音频媒体锁定状态标记 */
|
||||
struct idev *in; /*!< idev控制句柄 */
|
||||
struct odev *out; /*!< odev控制句柄 */
|
||||
struct adapter_media *media; /*!< 音频媒体控制句柄 */
|
||||
int (*event_handle)(struct sys_event *event); /*!< 用户事件拦截回调函数 */
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief 适配器主流程创建
|
||||
*
|
||||
* @param in idev控制句柄
|
||||
* @param out odev控制句柄
|
||||
* @param media 音频媒体控制句柄
|
||||
* @param event 用户自定义事件拦截回调函数
|
||||
* @return 适配器主流程控制句柄
|
||||
*/
|
||||
struct adapter_pro *adapter_process_open(struct idev *in, struct odev *out, struct adapter_media *media, int (*event)(struct sys_event *event));
|
||||
/**
|
||||
* @brief 适配器主流程关闭
|
||||
*
|
||||
* @param hdl 适配器主流程控制句柄双重指针
|
||||
*/
|
||||
void adapter_process_close(struct adapter_pro **hdl);
|
||||
/**
|
||||
* @brief 适配器主流程关闭
|
||||
*
|
||||
* @param pro 适配器主流程控制句柄
|
||||
*/
|
||||
int adapter_process_run(struct adapter_pro *pro);
|
||||
/**
|
||||
* @brief 适配器主流程事件通知接口
|
||||
*
|
||||
* @param event 事件
|
||||
* @param value 事件参数或者附带内容值
|
||||
*/
|
||||
void adapter_process_event_notify(u8 event, int value);
|
||||
|
||||
#endif//__ADAPTER_PROCESS_H__
|
||||
|
||||
Reference in New Issue
Block a user