2025-02-18 15:40:42 +08:00

207 lines
8.4 KiB
C
Raw Permalink 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.

#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_*/