本地提示音播放示例
功能说明
演示如何使用 app_player 播放本地 Flash 提示音,包括播放控制(播放、暂停、恢复、停止)和事件回调处理。
硬件连接
PA27: PA(功放)控制引脚,用于控制音频功放的开关
前置准备
在运行本示例前,需要先将音频文件打包并烧录到设备 Flash:
1. 打包音频文件
使用 tools/tone_tool 工具将 MP3 文件打包成 tone.bin:
cd tools/tone_tool
# 将音频文件放入 ring/ 目录(使用数字前缀命名)
# 例如:000_greeting.mp3, 001_network_suc.mp3
# 执行打包脚本
./run.sh
# 生成 ring/tone.bin 和 ring/tone.h
详细使用方法请参考:tools/tone_tool/README.md
2. 烧录 tone.bin
将生成的 tone.bin 烧录到设备 Flash 的 0x30100000 地址。
3. 复制 tone.h
将生成的 tone.h 复制到示例的 src/ 目录,用于引用音频 ID。
示例内容
初始化本地提示音系统(指定 Flash 地址
0x30100000)配置 PA 控制 GPIO
初始化 app_player 模块并创建播放器实例
注册播放事件回调函数
播放本地提示音(
TONE_ID_2)演示播放控制:
播放 1 秒后暂停
暂停 1 秒后恢复播放
恢复 1 秒后停止播放
编译
重要提示:在编译前,请先确认您使用的开发板型号。SDK 目前支持以下开发板:
arcs_evb - ARCS EVB 评估板
arcs_mini - ARCS Mini 开发板
根据您的开发板型号,选择对应的编译命令:
在示例目录下执行编译:
# 使用 arcs_evb 开发板
./build.sh -C -DBOARD=arcs_evb
# 或使用 arcs_mini 开发板
./build.sh -C -DBOARD=arcs_mini
Note
如果在 SDK 根目录执行,需要指定示例路径:
# 使用 arcs_evb 开发板
./build.sh -C -S samples/<示例路径> -DBOARD=arcs_evb
# 或使用 arcs_mini 开发板
./build.sh -C -S samples/<示例路径> -DBOARD=arcs_mini
Note
确保已安装对应的工具链。
烧录
使用以下命令烧录固件和提示音:
./tools/burn/cskburn -s /dev/ttyUSB0 -b 3000000 0x0 build/arcs.bin -C arcs
./tools/burn/cskburn -s /dev/ttyUSB0 -b 3000000 0x10000 samples/modules/app_player/local_tone/src/tone.bin -C arcs
预期输出
I/APP_PLAYER [1034:42:46.206 1 main] Resume: tone
I/samples [1034:42:46.206 1 main] PA ON
I/PA_MGR [1034:42:46.206 1 main] PA ON (immediate)
I/APP_PLAYER [1034:42:46.208 1 player_td] Player[0] tone evt=2
I/samples [1034:42:46.209 1 player_td] PA ON
I/PA_MGR [1034:42:46.209 1 player_td] PA ON (immediate)
I/samples [1034:42:46.215 1 cb_tone] Player playing
音频输出:
播放指定的本地提示音(对应
TONE_ID_2)播放过程中可听到暂停和恢复的效果
核心 API
API |
说明 |
|---|---|
|
初始化本地提示音系统,指定 Flash 地址 |
|
根据音频 ID 获取播放 URL |
|
初始化 app_player 模块 |
|
创建播放器实例 |
|
注册事件回调函数 |
|
播放指定 URL 的音频 |
|
暂停播放 |
|
恢复播放 |
|
同步停止播放(等待停止完成) |
|
销毁播放器实例 |
关键代码
初始化本地提示音
/* 初始化本地提示音文件(指定 Flash 地址)*/
app_tone_init(0x30100000);
PA 控制回调
/**
* @brief PA控制回调函数
*/
static int pa_control_callback(int onoff)
{
LOGI("PA %s", onoff ? "ON" : "OFF");
return lisa_gpio_write_pin(lisa_device_get(PA_GPIO_DEVICE),
PA_PIN_NUM,
onoff ? LISA_GPIO_HIGH : LISA_GPIO_LOW);
}
播放本地提示音
/* 获取提示音 URL */
const char *url = app_tone_get_url(TONE_ID_2);
LOGI("Playing URL: %s", url);
/* 播放提示音 */
ret = app_player_play(player, url);
if (ret != APP_PLAYER_OK) {
LOGE("Failed to play: %d", ret);
app_player_destroy(player);
return -1;
}
播放控制
/* 暂停播放 */
app_player_pause(player);
/* 恢复播放 */
app_player_resume(player);
/* 同步停止(等待停止完成)*/
app_player_stop_sync(player);
事件回调
static void player_event_callback(app_player_t *player,
app_player_event_t event,
void *user_data)
{
switch (event) {
case APP_PLAYER_EVENT_PREPARED:
LOGI("Player prepared");
break;
case APP_PLAYER_EVENT_PLAYING:
LOGI("Player playing");
break;
case APP_PLAYER_EVENT_COMPLETED:
LOGI("Player completed");
break;
case APP_PLAYER_EVENT_ERROR:
LOGE("Player error");
break;
case APP_PLAYER_EVENT_STOPPED:
LOGI("Player stopped");
break;
}
}
配置说明
Flash 地址配置
本地提示音的 Flash 地址在代码中配置:
app_tone_init(0x30100000); // Flash 地址
确保 tone.bin 烧录到相同的地址。
PA 控制引脚
PA 控制引脚在代码中定义:
#define PA_PIN_NUM 27 // PA 控制引脚号
#define PA_GPIO_DEVICE "gpioa" // GPIO 设备名
根据硬件设计修改对应的引脚和设备。
注意事项
Flash 地址一致性:
app_tone_init()中的 Flash 地址必须与tone.bin的烧录地址一致tone.h 文件: 需要将打包工具生成的
tone.h复制到src/目录,否则编译时会找不到TONE_ID_*定义PA 回调必填:
app_player_init()时必须提供pa_ctrl_callback,用于控制功放开关返回值检查: 所有 API 调用后务必检查返回值,确保操作成功
资源清理: 使用完毕后记得调用
app_player_destroy()释放资源音频格式: 本地提示音建议使用 16kHz、16bit 的 MP3 格式,以获得最佳性能