前言现在为止也开发了许多杰理TWS蓝牙耳机、音响项目SDK的案子在调试案子时不断的向前辈们学习到了很多关于蓝牙音响、蓝牙TWS耳机专业的知识。想在这里做一个学习汇总方便各位同行和对杰理芯片SDK感兴趣的小伙伴们学习本章详细讲解杰理AC700N芯片按键触摸提示音实现方法在调试一个TWS蓝牙耳机案子时按键通常是我们必须要添加的功能通过按键我们可以实现音量的增大/减少歌曲的播放/暂停曲目的切换开机/关机等特定功能所有我们必须在按键按下是添加提示音有提示音的存在方便我们更好的感知按键的状态在杰理SDK中有非常多可以实现按键提示音的方法。这里出一个常用稳定实现按键提示音的方法配置步骤步骤1在可视化配置工具JLstudio中配置添加按键触摸提示音在选择导出。如下图所示。特别要注意我如下画框的地方步骤2核对代码中对按键触摸音的定义是否与配置修改添加的触摸音文件名对应如不对应使其对应无论是修改代码中的文件名或者还是修改真实提示音音频文件的文件名需使得双方一一对应没有对应后果就是配置没作用如下图所示步骤3观察代码中触摸按键音的播放流程如下图所示按键提示音核心配置文件 key_tone.c 文件博主观察了如下文件中的函数作用1、检查触摸提示音文件是否存在函数static bool is_key_tone_enable()2、按键提示音消息触摸函数static int key_tone_msg_handler(int *msg)3、消息注册将 key_tone_msg_handler 注册为 APP_MSG_KEY_TONE 消息的处理者4、IO按键按下事件处理函数void key_down_event_handler(u8 key_value)5、触摸按键按下发送提示音消息函数touch_key_send_key_tone_msg(void)代码讲解/* * 内存段定义将按键提示音相关代码和数据 * 放到独立的Flash段中便于管理和优化 * */ #ifdef SUPPORT_MS_EXTENSIONS #pragma bss_seg(.key_tone.data.bss) // BSS段未初始化全局变量 #pragma data_seg(.key_tone.data) // 数据段 #pragma const_seg(.key_tone.text.const) // 只读常量段 #pragma code_seg(.key_tone.text) // 代码段 #endif #include fs/resfile.h // 文件系统接口用于读取Flash中的提示音文件 #include app_main.h // 应用主头文件 #include app_tone.h // 提示音播放接口 #include key_driver.h // 按键驱动头文件 /* * 全局标志记录是否已检测到提示音文件 * 0 未检测1 文件存在0xFF 文件不存在 * */ static u8 g_have_key_tone_file 0; /* * 函数检查提示音文件是否存在 * 逻辑首次调用时拼接Flash资源路径和提示音文件名 * 尝试打开文件。打开成功则标记为1失败标记为0xFF * 返回true 文件存在false 文件不存在 * */ static bool is_key_tone_enable() { if (g_have_key_tone_file 0) { // 首次检测 char file_path[48]; strcpy(file_path, FLASH_RES_PATH); // 复制Flash资源根路径 strcpy(file_path strlen(FLASH_RES_PATH), get_tone_files()-key_tone); // 拼接提示音文件名 void *file resfile_open(file_path); // 尝试打开文件 if (file) { g_have_key_tone_file 1; // 文件存在 resfile_close(file); } else { g_have_key_tone_file 0xff; // 文件不存在 } } return g_have_key_tone_file 1 ? true : false; } /* * 函数按键提示音消息处理器 * 这是一个APP消息回调函数当收到 APP_MSG_KEY_TONE 消息时触发 * 逻辑先检查提示音文件是否存在若存在则调用播放函数 * */ static int key_tone_msg_handler(int *msg) { if (!is_key_tone_enable()) { // 提示音文件不存在直接返回 return 0; } if (msg[0] APP_MSG_KEY_TONE) { // 收到按键提示音消息 #if LYF_KEY_TONE play_key_tone_file(get_tone_files()-key_tone); // 播放提示音文件 #endif } return 0; } /* * 消息注册将 key_tone_msg_handler 注册为 APP_MSG_KEY_TONE 消息的处理者 * owner 0xff 表示系统级消息 * from MSG_FROM_APP 表示消息来自APP层 * */ APP_MSG_HANDLER(key_tone_msg_entry) { .owner 0xff, .from MSG_FROM_APP, .handler key_tone_msg_handler, }; /* * 函数IO按键按下事件处理当宏 TCFG_IOKEY_ENABLE 开启时编译 * 逻辑检测到按键按下后发送 APP_MSG_KEY_TONE 消息 * 消息会被 key_tone_msg_handler 接收并触发提示音播放 * */ #if TCFG_IOKEY_ENABLE void key_down_event_handler(u8 key_value) { if (g_have_key_tone_file 1) { // 仅当提示音文件存在时才发送 app_send_message(APP_MSG_KEY_TONE, 0); // 发送提示音消息 } } #endif /* * 函数触摸按键发送提示音消息当宏 TCFG_LP_TOUCH_KEY_ENABLE 开启时编译 * 逻辑与 key_down_event_handler 相同用于低功耗触摸按键场景 * */ #if TCFG_LP_TOUCH_KEY_ENABLE void touch_key_send_key_tone_msg(void) { if (g_have_key_tone_file 1) { app_send_message(APP_MSG_KEY_TONE, 0); } } #endif步骤4在最接近底层的触摸按键中断处理函数中p33_ctmu_key_event_irq_handler()发送触摸按键提示音如图所示个人总结按键按下的时候发送APP_MSG_KE_TONE消息消息处理器检查文件是否存在存在则调用 play_key_tone_file(get_tone_files()-key_tone)播放tone_zh/key_tone.* 或 tone_en/key_tone.*对应的提示音文件第一步系统初始化阶段读取 Flash 中的提示音文件路径配置chinese_tone_files / english_tone_files根据当前语言中文/英文选择对应的配置表调用 is_key_tone_enable() 检测文件是否存在拼接路径FLASH_RES_PATH tone_zh/key_tone.*resfile_open() 尝试打开成功 → g_have_key_tone_file 1失败 → g_have_key_tone_file 0xFF第二步按键触发阶段两条路径路径AIO物理按键TCFG_IOKEY_ENABLEkey_down_event_handler(key_value)app_send_message(APP_MSG_KEY_TONE, 0)路径B触摸按键TCFG_LP_TOUCH_KEY_ENABLE p33_ctmu_key_event_irq_handler()收到 CTMU_P2M_CHx_FALLING_EVENT按键按下0touch_key_send_key_tone_msg()app_send_message(APP_MSG_KEY_TONE, 0)第三步消息分发阶段APP消息队列收到 APP_MSG_KEY_TONE 消息key_tone_msg_handler() 被调用检查 is_key_tone_enable() → 文件是否存在不存在 → 直接返回不播放存在 → 继续play_key_tone_file(get_tone_files()-key_tone)读取路径tone_zh/key_tone.* 或 tone_en/key_tone.*调用底层音频驱动播放提示音文件制作不易喜欢的小伙伴给个小赞赞喜欢我的小伙伴点个关注有不懂的地方和需要的资源随时问我哟
杰理可视化SDK开发-添加按键触摸音教程
前言现在为止也开发了许多杰理TWS蓝牙耳机、音响项目SDK的案子在调试案子时不断的向前辈们学习到了很多关于蓝牙音响、蓝牙TWS耳机专业的知识。想在这里做一个学习汇总方便各位同行和对杰理芯片SDK感兴趣的小伙伴们学习本章详细讲解杰理AC700N芯片按键触摸提示音实现方法在调试一个TWS蓝牙耳机案子时按键通常是我们必须要添加的功能通过按键我们可以实现音量的增大/减少歌曲的播放/暂停曲目的切换开机/关机等特定功能所有我们必须在按键按下是添加提示音有提示音的存在方便我们更好的感知按键的状态在杰理SDK中有非常多可以实现按键提示音的方法。这里出一个常用稳定实现按键提示音的方法配置步骤步骤1在可视化配置工具JLstudio中配置添加按键触摸提示音在选择导出。如下图所示。特别要注意我如下画框的地方步骤2核对代码中对按键触摸音的定义是否与配置修改添加的触摸音文件名对应如不对应使其对应无论是修改代码中的文件名或者还是修改真实提示音音频文件的文件名需使得双方一一对应没有对应后果就是配置没作用如下图所示步骤3观察代码中触摸按键音的播放流程如下图所示按键提示音核心配置文件 key_tone.c 文件博主观察了如下文件中的函数作用1、检查触摸提示音文件是否存在函数static bool is_key_tone_enable()2、按键提示音消息触摸函数static int key_tone_msg_handler(int *msg)3、消息注册将 key_tone_msg_handler 注册为 APP_MSG_KEY_TONE 消息的处理者4、IO按键按下事件处理函数void key_down_event_handler(u8 key_value)5、触摸按键按下发送提示音消息函数touch_key_send_key_tone_msg(void)代码讲解/* * 内存段定义将按键提示音相关代码和数据 * 放到独立的Flash段中便于管理和优化 * */ #ifdef SUPPORT_MS_EXTENSIONS #pragma bss_seg(.key_tone.data.bss) // BSS段未初始化全局变量 #pragma data_seg(.key_tone.data) // 数据段 #pragma const_seg(.key_tone.text.const) // 只读常量段 #pragma code_seg(.key_tone.text) // 代码段 #endif #include fs/resfile.h // 文件系统接口用于读取Flash中的提示音文件 #include app_main.h // 应用主头文件 #include app_tone.h // 提示音播放接口 #include key_driver.h // 按键驱动头文件 /* * 全局标志记录是否已检测到提示音文件 * 0 未检测1 文件存在0xFF 文件不存在 * */ static u8 g_have_key_tone_file 0; /* * 函数检查提示音文件是否存在 * 逻辑首次调用时拼接Flash资源路径和提示音文件名 * 尝试打开文件。打开成功则标记为1失败标记为0xFF * 返回true 文件存在false 文件不存在 * */ static bool is_key_tone_enable() { if (g_have_key_tone_file 0) { // 首次检测 char file_path[48]; strcpy(file_path, FLASH_RES_PATH); // 复制Flash资源根路径 strcpy(file_path strlen(FLASH_RES_PATH), get_tone_files()-key_tone); // 拼接提示音文件名 void *file resfile_open(file_path); // 尝试打开文件 if (file) { g_have_key_tone_file 1; // 文件存在 resfile_close(file); } else { g_have_key_tone_file 0xff; // 文件不存在 } } return g_have_key_tone_file 1 ? true : false; } /* * 函数按键提示音消息处理器 * 这是一个APP消息回调函数当收到 APP_MSG_KEY_TONE 消息时触发 * 逻辑先检查提示音文件是否存在若存在则调用播放函数 * */ static int key_tone_msg_handler(int *msg) { if (!is_key_tone_enable()) { // 提示音文件不存在直接返回 return 0; } if (msg[0] APP_MSG_KEY_TONE) { // 收到按键提示音消息 #if LYF_KEY_TONE play_key_tone_file(get_tone_files()-key_tone); // 播放提示音文件 #endif } return 0; } /* * 消息注册将 key_tone_msg_handler 注册为 APP_MSG_KEY_TONE 消息的处理者 * owner 0xff 表示系统级消息 * from MSG_FROM_APP 表示消息来自APP层 * */ APP_MSG_HANDLER(key_tone_msg_entry) { .owner 0xff, .from MSG_FROM_APP, .handler key_tone_msg_handler, }; /* * 函数IO按键按下事件处理当宏 TCFG_IOKEY_ENABLE 开启时编译 * 逻辑检测到按键按下后发送 APP_MSG_KEY_TONE 消息 * 消息会被 key_tone_msg_handler 接收并触发提示音播放 * */ #if TCFG_IOKEY_ENABLE void key_down_event_handler(u8 key_value) { if (g_have_key_tone_file 1) { // 仅当提示音文件存在时才发送 app_send_message(APP_MSG_KEY_TONE, 0); // 发送提示音消息 } } #endif /* * 函数触摸按键发送提示音消息当宏 TCFG_LP_TOUCH_KEY_ENABLE 开启时编译 * 逻辑与 key_down_event_handler 相同用于低功耗触摸按键场景 * */ #if TCFG_LP_TOUCH_KEY_ENABLE void touch_key_send_key_tone_msg(void) { if (g_have_key_tone_file 1) { app_send_message(APP_MSG_KEY_TONE, 0); } } #endif步骤4在最接近底层的触摸按键中断处理函数中p33_ctmu_key_event_irq_handler()发送触摸按键提示音如图所示个人总结按键按下的时候发送APP_MSG_KE_TONE消息消息处理器检查文件是否存在存在则调用 play_key_tone_file(get_tone_files()-key_tone)播放tone_zh/key_tone.* 或 tone_en/key_tone.*对应的提示音文件第一步系统初始化阶段读取 Flash 中的提示音文件路径配置chinese_tone_files / english_tone_files根据当前语言中文/英文选择对应的配置表调用 is_key_tone_enable() 检测文件是否存在拼接路径FLASH_RES_PATH tone_zh/key_tone.*resfile_open() 尝试打开成功 → g_have_key_tone_file 1失败 → g_have_key_tone_file 0xFF第二步按键触发阶段两条路径路径AIO物理按键TCFG_IOKEY_ENABLEkey_down_event_handler(key_value)app_send_message(APP_MSG_KEY_TONE, 0)路径B触摸按键TCFG_LP_TOUCH_KEY_ENABLE p33_ctmu_key_event_irq_handler()收到 CTMU_P2M_CHx_FALLING_EVENT按键按下0touch_key_send_key_tone_msg()app_send_message(APP_MSG_KEY_TONE, 0)第三步消息分发阶段APP消息队列收到 APP_MSG_KEY_TONE 消息key_tone_msg_handler() 被调用检查 is_key_tone_enable() → 文件是否存在不存在 → 直接返回不播放存在 → 继续play_key_tone_file(get_tone_files()-key_tone)读取路径tone_zh/key_tone.* 或 tone_en/key_tone.*调用底层音频驱动播放提示音文件制作不易喜欢的小伙伴给个小赞赞喜欢我的小伙伴点个关注有不懂的地方和需要的资源随时问我哟