蓝牙开发杰理AC700N杰理中英文提示音总结(基于AC700N-SDK1.3.6)
MT杰里中英文提示音总结(基于AC700N-SDK1.3.6)
梳理通用的提示音使用流程
一般都是调用这个方法 int tone_play_index(u8 index, u8 preemption)
通过索引index去确定播放哪个提示音,但index是一个数值,调用的时候不直观,因此建立一个枚举数组去替代
以下用一个例子概括
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| #define TONE_NUM_0 SDFILE_RES_ROOT_PATH"tone/0.*" #define TONE_NUM_1 SDFILE_RES_ROOT_PATH"tone/1.*" #define TONE_NUM_2 SDFILE_RES_ROOT_PATH"tone/2.*"
enum { IDEX_TONE_NUM_0, IDEX_TONE_NUM_1, IDEX_TONE_NUM_2, }
static const char *const tone_index[] = { TONE_NUM_0, TONE_NUM_1, TONE_NUM_2, }
|
使用例子:tone_play_index(IDEX_TONE_NUM_0, 1);
这个函数其实只是通过索引index拿到提示音的逻辑位置,然后再调用tone_play(const char *name, u8 preemption) 去进行下一步。
注意:SDK中部分地方的提示音是直接使用的tone_play(const char *name, u8 preemption),就不能传入enum枚举作为参数了
中英文切换的触发
一般通过特定按键触发,如三击、四击按键
定义一个extern变量记录系统当前的提示音语言种类,在需要使用的c文件中引用
主要操作
在清楚提示音的运行流程后,就很好搞了,这里针对使用tone_play_index的情况
1 2 3 4 5 6 7 8 9 10 11 12 13
| #define TONE_NUM_0 SDFILE_RES_ROOT_PATH"tone/0.*" #define TONE_NUM_E_0 SDFILE_RES_ROOT_PATH"tone/e_0.*"
enum { IDEX_TONE_NUM_0, IDEX_TONE_NUM_E_0 }
static const char *const tone_index[] = { TONE_NUM_0, TONE_NUM_E_0 }
|
tone_play_index()改动,使用codeblocks的Find Implication是找不到这个函数的,位置在tone_table.c中
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
__BANK_TONE_ENTRY int tone_play_index(u8 index, u8 preemption) { if(ch_en_flag){ index += 28; } printf("tone_play_index:%d,preemption:%d", index, preemption); if (index >= IDEX_TONE_NONE) { return 0; } return tone_play(tone_index[index], preemption); }
|
其他提示音情况处理
SDK并非所有语音的播放调用都使用tone_play_index(),对于这种情况需要额外处理
1 2 3 4 5 6 7 8 9 10 11 12 13 14
|
const u8 anc_tone_tab[3] = {IDEX_TONE_ANC_OFF, IDEX_TONE_ANC_ON, IDEX_TONE_TRANSPARENCY};
const u8 anc_tone_e_tab[3] = {IDEX_TONE_ANC_OFF_E, IDEX_TONE_ANC_ON_E, IDEX_TONE_trans_E};
if(!ch_en_flag){ anc_tone_play_and_mode_switch(anc_tone_tab[anc_hdl->param.mode - 1], ANC_TONE_PREEMPTION, ANC_TONE_END_MODE_SW); }else{ anc_tone_play_and_mode_switch(anc_tone_e_tab[anc_hdl->param.mode - 1], ANC_TONE_PREEMPTION, ANC_TONE_END_MODE_SW); }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
|
static const u32 num0_9_e[] = { (u32)TONE_E_NUM_0, (u32)TONE_E_NUM_1, (u32)TONE_E_NUM_2, (u32)TONE_E_NUM_3, (u32)TONE_E_NUM_4, (u32)TONE_E_NUM_5, (u32)TONE_E_NUM_6, (u32)TONE_E_NUM_7, (u32)TONE_E_NUM_8, (u32)TONE_E_NUM_9, } ;
#if BT_PHONE_NUMBER if(ch_en_flag) { lst[i] = (u32)TONE_E_RING; } else { lst[i] = (u32)TONE_RING; } i++;
if (num) { for (; i <= strlen(num); i++) { if(ch_en_flag) { lst[i] = num0_9_e[num[i] - '0'] ; } else { lst[i] = num0_9[num[i] - '0'] ; } } } #endif
|
语言切换的关机记忆功能
切换语言后关机,下次开机为上次关机前的语言
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
|
#define CFG_VM_EN_CH 2
syscfg_write(CFG_VM_EN_CH, &ch_en_flag, 1);
#define TWS_FUNC_ID_ENCN_SYNC TWS_FUNC_ID('E', 'N', 'C', 'N') static void bt_tws_encn_sync(void *_data, u16 len, bool rx) { if (rx) { u8 *data = (u8 *)_data; ch_en_flag = data[0]; }
} REGISTER_TWS_FUNC_STUB(app_encn_sync_stub) = { .func_id = TWS_FUNC_ID_ENCN_SYNC, .func = bt_tws_encn_sync, }; void bt_tws_sync_encn() { tws_api_send_data_to_slave(&ch_en_flag, 1, TWS_FUNC_ID_ENCN_SYNC); }
bt_tws_sync_encn();
|