207 lines
8.4 KiB
C
Raw Permalink Normal View History

2025-02-18 15:40:42 +08:00
#ifndef _PHONE_MESSAGE_
#define _PHONE_MESSAGE_
#include "application/audio_dec_app.h"
#include "btstack/avctp_user.h"
#include "classic/tws_api.h"
#include "app_config.h"
#include "app_main.h"
#define PHONE_MESSAGE_TWS_ENABLE 0
#if (TCFG_PHONE_MESSAGE_ENABLE)
//////////////////////////////////////////////////////////////////////////////
#if TCFG_USER_TWS_ENABLE
#undef PHONE_MESSAGE_TWS_ENABLE
#define PHONE_MESSAGE_TWS_ENABLE 1 // 通话留言TWS使能
#endif
#define PHONE_MESSAGE_ENC_USE_TASK (1) // 使用单独线程存储录音数据
#define PHONE_MESSAGE_DEC_GET_INFO_ONLY_ENC 0 // 仅在播录音过程中可以获取信息
#define PHONE_MESSAGE_DEC_GET_INFO_LIMIT_TIME (10*1000) // 在限制时间内获取有效
#define PHONE_MESSAGE_TWS_BUF_LEN (4*1024) // tws转发buf
#define PHONE_MESSAGE_TWS_PKT_LEN (512) // 每一包最大长度
#define PHONE_MESSAGE_USE_BUF_LEN (1*1024) // 留言推提示音和录音buf
// 通话留言按键响应类型
#define CONFIG_PHONE_MESSAGE_KEY_ALL 1 // 都可以响应
#define CONFIG_PHONE_MESSAGE_KEY_LEFT 2 // 仅左耳可以响应
#define CONFIG_PHONE_MESSAGE_KEY_RIGHT 3 // 仅右耳可以响应
#define CONFIG_PHONE_MESSAGE_ENC_KEY_TYPE CONFIG_PHONE_MESSAGE_KEY_ALL//CONFIG_PHONE_MESSAGE_KEY_RIGHT
#define CONFIG_PHONE_MESSAGE_PLAY_KEY_TYPE CONFIG_PHONE_MESSAGE_KEY_ALL
#define PHONE_MESSAGE_ENC_HEAD SDFILE_RES_ROOT_PATH"tone/msg_head.*"
#define PHONE_MESSAGE_ENC_TAIL SDFILE_RES_ROOT_PATH"tone/msg_tail.*"
#define PHONE_MESSAGE_DEC_HAVE SDFILE_RES_ROOT_PATH"tone/msg_have.*"
#define PHONE_MESSAGE_DEC_NONE SDFILE_RES_ROOT_PATH"tone/msg_none.*"
enum {
PHONE_MESSAGE_EVENT_NULL = 0,
PHONE_MESSAGE_EVENT_HEAD_TONE_END, // head提示音播放结束
PHONE_MESSAGE_EVENT_TIMEOUT, // 超时
PHONE_MESSAGE_EVENT_ENERGY, // 能量检测结束
PHONE_MESSAGE_EVENT_WRITE_FILE_ERROR, // 写文件失败
PHONE_MESSAGE_EVENT_STOP, // 留言已结束
};
enum {
PHONE_MESSAGE_STATUS_IDLE = 0,
PHONE_MESSAGE_STATUS_PLAY_HEAD, // 正在推送起始提示音
PHONE_MESSAGE_STATUS_ENC, // 正在录音
PHONE_MESSAGE_STATUS_PLAY_TAIL, // 正在推送结束提示音
PHONE_MESSAGE_STATUS_WAIT_STOP, // 等待结束
};
enum {
PHONE_MESSAGE_USE_BUF_TYPE_NULL = 0,
PHONE_MESSAGE_USE_BUF_TYPE_OUT, // buf用于推送提示音
PHONE_MESSAGE_USE_BUF_TYPE_ENC, // buf用于录音
};
enum {
PHONE_MESSAGE_DEC_STATUS_IDLE = 0,
PHONE_MESSAGE_DEC_STATUS_PLAY_HAVE, // 播放 有留言 提示音
PHONE_MESSAGE_DEC_STATUS_PLAY_NONE, // 播放 没有留言 提示音
PHONE_MESSAGE_DEC_STATUS_PLAY_ENC, // 播放留言内容
PHONE_MESSAGE_DEC_STATUS_WAIT_STOP, // 等待结束
};
struct phone_message_hdl {
u32 status : 4; // 留言状态
volatile u32 init_ok : 1; // 已经初始化
u32 time_check : 1; // 留言超时使能
u32 energy_check : 1; // 留言能量检测使能
u32 energy_flag : 1; // 标记全程是否有能量检测达标
u32 min_time_check : 1; // 时间太短,删除
u32 enc_limit_energy : 1; // 整个过程中能量都不达标,删除
u32 esco_dec_mute : 1; // 近端静音
u32 tws : 1; // 1:tws模式0:普通模式,本地播放
void *head_file_hdl; // 留言起始提示音
void *tail_file_hdl; // 留言结束提示音
struct audio_dec_app_hdl *dec; // 解码句柄
u16 mic_sr; // mic采样率
u8 mic_ch; // mic通道数
u8 pkt_len; // 帧长
u8 phone_num[12]; // 电话号码
u16 sample_rate; // 留言数据采样率
u32 coding_type; // 留言数据类型
u32 out_need_points; // mic输出点数统计
u32 out_cur_points; // 当前输出点数
u32 out_mute_points; // 静音点数
cbuffer_t out_cbuf; // 输出循环buf
#if PHONE_MESSAGE_ENC_USE_TASK
volatile u8 enc_task_stop; // 留言任务stop
u8 enc_task_init_ok : 1; // 留言任务初始化完成
u8 enc_write_err : 1; // 留言任务写出错
u16 enc_lost; // 留言写数据丢失统计
OS_SEM enc_task_sem; // 留言任务信号量
cbuffer_t enc_cbuf; // 留言写数循环buf
#endif
u8 *use_buf; // 使用buf
u8 use_buf_type; // 使用buf类型
u32 energy_limit; // 能量阀值
u16 energy_max; // 连续最大能量不达标次数
u16 energy_cnt; // 能量不达标计数
unsigned long max_time; // 留言最大时间限制
unsigned long min_time; // 留言最小时间限制
unsigned long pause_time; // 临时停了多长时间
unsigned long start_limit_time; // 起始提示音启动限制时间
void *evt_priv; // 事件回调私有句柄
int (*evt_cb)(void *priv, int event, int *param); // 事件回调
};
struct phone_message_dec_hdl {
u32 status : 4; // 播放状态
u32 del_enc : 1; // 是否删除文件
u32 limit_time_check : 1; // 获取留言信息时间限制使能
u32 tws : 1; // 1:tws模式0:普通模式,本地播放
u32 tws_master : 1; // 主机。留言所在的机器
u32 tws_file_end : 1; // 留言文件已经读完。并不意味着tws已经发送完
u32 tws_no_put_close : 1; // 不推送close消息
void *file_hdl; // 文件句柄
struct audio_dec_app_hdl *dec; // 解码句柄
char *name_mic_have; // 有留言 提示音
char *name_mic_none; // 没有留言 提示音
u8 pkt_len; // 留言数据帧长
u8 phone_num[12]; // 留言电话号码
u16 sample_rate; // 留言数据采样率
u32 coding_type; // 留言数据类型
unsigned long limit_time; // 获取留言信息时间限制
u32 create_time; // 当前解码创建时的时间
#if PHONE_MESSAGE_TWS_ENABLE
void *tws_buf; // tws buf
u8 *tws_pkt_data; // tws数据起始位置
int tws_pkt_len; // tws数据总长
int tws_pkt_ptr; // tws数据已经使用长度
#endif
};
//////////////////////////////////////////////////////////////////////////////
extern u8 phone_message_have;
extern u8 phone_message_idx;
extern struct phone_message_hdl *phone_message;
extern struct phone_message_dec_hdl *phone_message_dec;
//////////////////////////////////////////////////////////////////////////////
// call
int phone_message_call_open(void);
void phone_message_close(void);
struct phone_message_hdl *phone_message_create(void);
int phone_message_mic_write(s16 *data, int len); // 负数:非电话留言
int phone_message_output_read(s16 *data, int len); // 负数:非电话留言
int phone_message_enc_write(u8 *data, int len); // 负数:非电话留言
void phone_message_enc_file_del(void);
//////////////////////////////////////////////////////////////////////////////
// play
void phone_message_dec_close(void);
struct phone_message_dec_hdl *phone_massage_dec_create(void);
int phone_massage_dec(struct phone_message_dec_hdl *dec, u8 have);
int phone_message_dec_open(u8 del_enc);
//////////////////////////////////////////////////////////////////////////////
// api
void phone_message_call_api_close(void);
int phone_message_call_api_open(void);
int phone_message_call_api_start(void);
int phone_message_call_api_stop(void);
int phone_message_call_api_set_info(u32 coding_type, u16 sr, u8 *num);
int phone_message_call_api_get_info(u32 *p_coding_type, u16 *p_sr, u8 *num, u8 num_len);
int phone_message_call_api_is_work(void);
int phone_message_call_api_esco_out_data(s16 *data, int len);
void phone_message_play_api_close(void);
int phone_message_play_api_open(u8 del_enc);
int phone_message_play_api_get_info(u32 *p_coding_type, u16 *p_sr, u8 *num, u8 num_len, u8 always);
int phone_message_play_api_is_work(void);
//////////////////////////////////////////////////////////////////////////////
// tws
int phone_message_tws_call_open(void);
int phone_message_tws_play_open(u8 have, u8 del_enc);
void phone_message_tws_play_close(void);
void phone_message_tws_enc_del(void);
int phone_message_tws_event_deal(struct bt_event *evt);
// tws dec
int phone_message_tws_dec_init(struct phone_message_dec_hdl *play);
void phone_message_tws_dec_release(struct phone_message_dec_hdl *play);
int phone_message_tws_dec_trans_read(struct phone_message_dec_hdl *play, void *buf, u32 len);
int phone_message_tws_dec_probe(struct phone_message_dec_hdl *play);
void phone_message_tws_dec_output_data(struct phone_message_dec_hdl *play, void *data, int len);
#endif /*(TCFG_PHONE_MESSAGE_ENABLE)*/
#endif /*_PHONE_MESSAGE_*/