本地提示音播放示例

功能说明

演示如何使用 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。

示例内容

  1. 初始化本地提示音系统(指定 Flash 地址 0x30100000

  2. 配置 PA 控制 GPIO

  3. 初始化 app_player 模块并创建播放器实例

  4. 注册播放事件回调函数

  5. 播放本地提示音(TONE_ID_2

  6. 演示播放控制:

    • 播放 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

说明

app_tone_init()

初始化本地提示音系统,指定 Flash 地址

app_tone_get_url()

根据音频 ID 获取播放 URL

app_player_init()

初始化 app_player 模块

app_player_create()

创建播放器实例

app_player_register_callback()

注册事件回调函数

app_player_play()

播放指定 URL 的音频

app_player_pause()

暂停播放

app_player_resume()

恢复播放

app_player_stop_sync()

同步停止播放(等待停止完成)

app_player_destroy()

销毁播放器实例

关键代码

初始化本地提示音

/* 初始化本地提示音文件(指定 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 设备名

根据硬件设计修改对应的引脚和设备。

注意事项

  1. Flash 地址一致性: app_tone_init() 中的 Flash 地址必须与 tone.bin 的烧录地址一致

  2. tone.h 文件: 需要将打包工具生成的 tone.h 复制到 src/ 目录,否则编译时会找不到 TONE_ID_* 定义

  3. PA 回调必填: app_player_init() 时必须提供 pa_ctrl_callback,用于控制功放开关

  4. 返回值检查: 所有 API 调用后务必检查返回值,确保操作成功

  5. 资源清理: 使用完毕后记得调用 app_player_destroy() 释放资源

  6. 音频格式: 本地提示音建议使用 16kHz、16bit 的 MP3 格式,以获得最佳性能