wangzhibo
2026-09-11 659c470eba542383987aad227b7f918100f131fa
xiaozhi-esp32-2.2.6/main/boards/sening-xiaozhi-s3/system.h
@@ -36,6 +36,14 @@
#define MOUNT_POINT "/sdcard"
#define SDCARD_PATH_MAX_LEN 256
#define SDCARD_MP3_PLAYLIST_MAX 16
typedef struct {
    char path[SDCARD_PATH_MAX_LEN];
    float speed;
    int repeat;
    bool power_off_after;
} sdcard_mp3_playlist_item_t;
#define SCREEN_MIRROR_X false
#define SCREEN_MIRROR_Y false
@@ -75,14 +83,32 @@
#define BOARD_CUSTOM_WAKE_WORD_THRESHOLD_PERCENT 20
/**
 * @brief 板级 MultiNet 离线命令词配置。
 *
 * @brief 板级 MultiNet 离线命令词。只留没网也必须能用的入口:
 * 「切换模式」「模式切换」「复读机」「开始复读」「退出复读」「退出跟读」「我们聊天吧」「我们来聊天吧」。
 * 复读/跟读播音频时不上行 ASR,退出口令必须能离线识别。其它 App 的进入词仍只在 Server apps.json。
 */
#define OFFLINE_COMMAND_WORD "切换模式"
#define OFFLINE_COMMAND_WORD_PINYIN "qie huan mo shi"
#define OFFLINE_COMMAND_WORD_ALT "模式切换"
#define OFFLINE_COMMAND_WORD_ALT_PINYIN "mo shi qie huan"
#define OFFLINE_REPEATER_WORD "复读机"
#define OFFLINE_REPEATER_WORD_PINYIN "fu du ji"
#define OFFLINE_START_REPEATER_WORD "开始复读"
#define OFFLINE_START_REPEATER_WORD_PINYIN "kai shi fu du"
#define OFFLINE_EXIT_REPEATER_WORD "退出复读"
#define OFFLINE_EXIT_REPEATER_WORD_PINYIN "tui chu fu du"
#define OFFLINE_EXIT_SHADOWING_WORD "退出跟读"
#define OFFLINE_EXIT_SHADOWING_WORD_PINYIN "tui chu gen du"
#define OFFLINE_CHAT_WORD "我们聊天吧"
#define OFFLINE_CHAT_WORD_PINYIN "wo men liao tian ba"
#define OFFLINE_CHAT_WORD_FULL "我们来聊天吧"
#define OFFLINE_CHAT_WORD_FULL_PINYIN "wo men lai liao tian ba"
void Board_Offline_Command_Callback(void);
bool Board_Handle_Offline_Command(const char *command);
bool Board_Is_Mode_Switch_Command(const char *command);
bool Board_Is_Chat_Return_Command(const char *command);
bool Board_Is_App_Launch_Command(const char *command);
/**
 * @brief 使用 SNTP 网络时间同步 DS3231 RTC。
@@ -192,14 +218,26 @@
 */
esp_err_t SDCard_Play_MP3(char *mp3_name);
#define SDCARD_MP3_SPEED_MIN 0.5f
#define SDCARD_MP3_SPEED_MAX 2.0f
#define SDCARD_MP3_SPEED_DEFAULT 1.0f
/**
 * @brief 将播放倍率夹紧到 [0.5, 2.0];NaN/非法则回退 1.0。
 *
 * 实现是先按 speed 做线性时域拉伸,再用文件原始采样率转到喇叭采样率。
 * 0.5~2.0 内任意浮点均可;非 1.0 会改变音调。不要把 sample_rate*speed 交给 AE 变采样。
 */
float SDCard_Clamp_MP3_Speed(float speed);
/**
 * @brief 按文件名和速度启动 SD 卡 MP3 播放。
 *
 * speed 仅支持 0.5、0.75、1.0、1.25、1.5、2.0。非 1.0 速度通过重采样实现,会改变音调。
 * speed 取值 [0.5, 2.0],缺省 1.0;超出范围会被夹紧。非 1.0 通过重采样实现,会改变音调。
 *
 * @param mp3_name MP3 文件名或匹配关键字,不能为空。
 * @param speed 播放速度倍率。
 * @return ESP_OK 表示播放任务已成功启动;ESP_ERR_INVALID_ARG 表示速度或文件名非法。
 * @return ESP_OK 表示播放任务已成功启动;ESP_ERR_INVALID_ARG 表示文件名非法。
 */
esp_err_t SDCard_Play_MP3_With_Speed(char *mp3_name, float speed);
esp_err_t SDCard_Play_MP3_With_Speed_Repeat(char *mp3_name, float speed, int repeat, bool power_off_after);
@@ -266,16 +304,19 @@
/**
 * @brief 按完整路径和速度启动 MP3 文件播放。
 *
 * speed 仅支持 0.5、0.75、1.0、1.25、1.5、2.0。非 1.0 速度通过重采样实现,会改变音调。
 * speed 取值 [0.5, 2.0],缺省 1.0;超出范围会被夹紧。非 1.0 通过重采样实现,会改变音调。
 *
 * @param path MP3 文件完整路径,不能为空。
 * @param speed 播放速度倍率。
 * @return ESP_OK 表示播放任务已成功启动;ESP_ERR_INVALID_ARG 表示路径或速度非法。
 * @return ESP_OK 表示播放任务已成功启动;ESP_ERR_INVALID_ARG 表示路径非法。
 */
esp_err_t SDCard_Play_MP3_File_With_Speed(const char *path, float speed);
esp_err_t SDCard_Play_MP3_File_With_Speed_Repeat(const char *path, float speed, int repeat, bool power_off_after);
bool SDCard_Resolve_MP3_Path(const char *mp3_name, char *path, size_t path_size);
esp_err_t SDCard_Play_MP3_File_Playlist(const sdcard_mp3_playlist_item_t *items, int count);
int SDCard_Get_Repeat_Left(void);
esp_err_t SDCard_Map_Business_Path(const char *business_path, char *sd_path, size_t sd_path_size);
esp_err_t SDCard_Ensure_Business_Dir(const char *business_path);
esp_err_t SDCard_Prepare_Business_File(const char *business_path,
                                       char *final_path,
                                       size_t final_path_size,
@@ -394,6 +435,7 @@
void Board_Acquire_Sleep_Inhibit(void);
void Board_Release_Sleep_Inhibit(void);
bool Board_Is_Voice_Session_Active(void);
bool Board_Is_Audio_Busy(void);
void Board_Show_JPG(const char *jpg_name);
void Board_Show_Black_Screen(void);
void Board_Show_Alert(const char *status, const char *message, const char *emotion);