杰理中英文提示音总结(基于AC700N-SDK1.3.6)

杰里中英文提示音总结(基于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
/*
*index:提示音索引
*preemption:抢断标志
*/
__BANK_TONE_ENTRY
int tone_play_index(u8 index, u8 preemption)
{
// 中英文切换
if(ch_en_flag){
index += 28; // 这里的28为单种语言提示音的个数,即tone_index的size / 2
}
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(),对于这种情况需要额外处理

  • ANC切换的提示音
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// \cpu\br36\audio\audio_anc.c
// 代码行数115
// 这个是SDK自带的,这个版本SDK这里貌似有拼写错误
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};

//===================================分割线===========================================
// 代码行数275、1002、1010全部改为
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
// \apps\earphone\earphone.c
// 代码行数1024后新增一个结构体对应相应的提示音
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,
} ;
//===================================分割线===========================================
// 代码行数1054,这里还附带了一个小需求:报号钱先响铃一声
#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
// \include_lib\system\syscfg_id.h
// 代码行数133
#define CFG_VM_EN_CH 2

// 在切换语言的地方将标志位写入flash
syscfg_write(CFG_VM_EN_CH, &ch_en_flag, 1);

// 代码行数1294,仿照下面的ANC TWS同步写一个语言TWS同步
#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);
}
//===================================分割线===========================================
// 代码行数133,在差不多的地方调用,进行TWS同步
bt_tws_sync_encn();