#include "include.h"
#if DAC_EN
void wav_res_play_kick(u32 addr, u32 len);
void wav_res_dec_process(void);
bool wav_res_is_play(void);
bool wav_res_stop(void);
void wav_res_play_user_kick(void);

/******************
使用说明：
    1. 把wav提示音放到res-》wav文件夹下。
    2. 编译sdk，生成res.h文件。
    3. 在res.h文件中，找到对应提示音的XX_BUF_XX和XX_LEN_XX这两个宏
    4. 调用播放接口wav_res_play_user_init(XX_BUF_XX, XX_LEN_XX);
******************/

#define     WAV_PLAY_KICK_CMD       0XFC
/**创建wav播放线程*/
void user_thread_enter(void *param);
thread_tbl_typedef thread_tbl_user = {
    .thread_name = "user_thread",
    .msg_size = 4,
    .msg_max_num = 8,
    .stack_size = 128,
    .priority = 11,
    .enter_func = user_thread_enter,
    .index = -1,
};
/*******************/
//播放函数
void wav_res_play_user_init(u32 addr, u32 len)
{
    if (len == 0) {
        return;
    }
    static bool thread_create = false;
    if (thread_create == false) {
        user_thread_create(&thread_tbl_user);
        thread_create = true;
    }

    printf("%s: addr: %x, len: %x\n", __func__, addr, len);
    bsp_change_volume(WARNING_VOLUME);
    wav_res_play_kick(addr, len);
    //系统一次读取512字节，对于单声道就是256个样点，双声道就是128个样点
    //16Khz，单声道举例：256个样点持续时间256/16000 = 16ms。考虑dac调速，所以定时器间隔要小于16/2，即小于等于8ms
    //目前demo只有这个线程干活，如果实际还有更高优先级的线程与提示音线程抢占，那么定时器间隔要小于8ms，具体看实际调整
    //定时器间隔多少，就是给mian线程多少时间跑
    //间隔过大：main线程有更多时间跑，但提示音会卡顿、变音
    //间隔过小：main线程没啥时间跑，但提示音正常播放

    timer3_init(8000-1);
    wav_res_play_user_kick();
}
//这里由线程调用，线程由wav_res_play_user_init主动调用一次，以及定时器定时驱动
void wav_res_play_user_do(void)
{
    if (wav_res_is_play()) {
        wav_res_dec_process();
    } else {
        tmr_cmd(TMR3, DISABLE);
        wav_res_stop();
        bsp_change_volume(sys_cb.vol);
    }
}

AT(.com_text.user_thread)
void wav_res_play_user_kick(void)
{
    u32 mq_msg = WAV_PLAY_KICK_CMD;
    user_thread_msg_enqueue(thread_tbl_user.index, (u8*)&mq_msg, thread_tbl_user.msg_size);
}
//播放线程函数
AT(.com_text.user_thread)
void user_thread_enter(void *param)
{
    u32 mq_msg;
    while (1)
    {
        user_thread_msg_dequeue(thread_tbl_user.index, (u8*)&mq_msg, thread_tbl_user.msg_size);
        if(mq_msg == WAV_PLAY_KICK_CMD)
        {
            wav_res_play_user_do();
        }
    }
}

#endif
