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