#include "Sound_Player.h"
#include "Buzzer.h"

SoundPlayCtrlStruct     SoundPlayCtrl;

void Sound_Player_Init ( void )
{
    SoundPlayCtrl.Playing = SND_SRC_NONE;               //加载要播放的声音
    SoundPlayCtrl.Timer   = 0;
    SoundPlayCtrl.Cycle   = 0;
    SoundPlayCtrl.Status  = SND_PLAYER_IDLE;
    SoundPlayCtrl.VolInit = 1;
    Buzzer_Init();
}

uint8_t Sound_Play ( uint8_t SoundID )
{
    if ( SoundPlayCtrl.VolInit )                        //首次播放时初始化音量
    {
        SoundPlayCtrl.VolInit = 0;
    }

    if ( SoundID < SND_TOTAL_NUM )
    {
        if ( SoundPlayCtrl.Status != SND_PLAYER_IDLE )    //如果有声音正在播放,则返回播放失败
            return 1;

        SoundPlayCtrl.Playing = SoundID;                  //加载要播放的声音
        SoundPlayCtrl.Timer   = 0;
        SoundPlayCtrl.Cycle   = SndAttributeTable[SoundID].Cycle;
        SoundPlayCtrl.Status  = SND_PLAYER_PLAY_REQ;
        return 0;                                         //返回播放成功
    }
    else
        return 2;                                         //返回错误状态
}

uint8_t Sound_Stop ( uint8_t SoundID )
{
    if ( SoundID < SND_TOTAL_NUM )
    {
        if ( ( SoundPlayCtrl.Status == SND_PLAYER_IDLE ) || \
                ( SoundPlayCtrl.Playing != SoundID ) )        //如果播放器已停止播放或正在播放的声音不是请求停止播放的声音
            return 0;                                       //返回停止成功

        if ( SoundPlayCtrl.Status == SND_PLAYER_PLAY_REQ ) //请求停止播放的声音是刚请求播放的声音
        {
            SoundPlayCtrl.Playing = SND_SRC_NONE;
            SoundPlayCtrl.Timer   = 0;
            SoundPlayCtrl.Cycle   = 0;
            SoundPlayCtrl.Status = SND_PLAYER_IDLE;         //取消播放请求
            return 0;                                       //返回停止成功
        }

        SoundPlayCtrl.Status = SND_PLAYER_STOP_REQ;       //请求停止播放声音
        return 1;                                         //返回停止失败
    }
    else
        return 2;                                         //返回错误状态
}

void Sound_Clear ( void )
{
    if ( SoundPlayCtrl.Status == SND_PLAYER_IDLE )
        return;
    else if ( SoundPlayCtrl.Status == SND_PLAYER_PLAY_REQ )
    {
        SoundPlayCtrl.Playing = SND_SRC_NONE;
        SoundPlayCtrl.Timer   = 0;
        SoundPlayCtrl.Cycle   = 0;
        SoundPlayCtrl.Status = SND_PLAYER_IDLE;           //取消播放请求
        return;
    }
    else
    {
        if ( SoundPlayCtrl.Playing < SND_TOTAL_NUM )
        {
            if ( SndAttributeTable[SoundPlayCtrl.Playing].Mode == SND_MODE_SINGLE )
                Buzzer_Stop_All_Track();
            else
                Buzzer_Stop_All_Track();
        }

        SoundPlayCtrl.Playing = SND_SRC_NONE;
        SoundPlayCtrl.Timer   = 0;
        SoundPlayCtrl.Cycle   = 0;
        SoundPlayCtrl.Status = SND_PLAYER_IDLE;           //取消播放请求
    }
}

uint8_t Sound_Priority_Query ( uint8_t SoundID )
{
    if ( SoundID == SND_SRC_CURRENT )
    {
        if ( SoundPlayCtrl.Playing < SND_TOTAL_NUM )
            return SndAttributeTable[SoundPlayCtrl.Playing].Priority;
        else
            return 0xFF;
    }
    else if ( SoundID < SND_TOTAL_NUM )
        return SndAttributeTable[SoundID].Priority;
    else
        return 0xFF;
}

//10ms
void Sound_Play_Service ( void )
{
    if ( SoundPlayCtrl.Status == SND_PLAYER_IDLE )
        return;

    if ( SoundPlayCtrl.Timer >= 10 )
        SoundPlayCtrl.Timer -= 10;
    else if ( SoundPlayCtrl.Timer > 0 )
        SoundPlayCtrl.Timer  = 0;

    if ( ( SoundPlayCtrl.Status == SND_PLAYER_PLAYING ) || ( SoundPlayCtrl.Status == SND_PLAYER_PLAY_REQ ) )
    {
        if ( SoundPlayCtrl.Timer == 0 )
        {
            if ( SoundPlayCtrl.Cycle == 0 )
            {
                if ( SoundPlayCtrl.Playing < SND_TOTAL_NUM )
                {
                    if ( SndAttributeTable[SoundPlayCtrl.Playing].Mode != SND_MODE_SINGLE )
                        Buzzer_Stop_All_Track();
                }

                SoundPlayCtrl.Playing = SND_SRC_NONE;
                SoundPlayCtrl.Status  = SND_PLAYER_IDLE;
            }
            else
            {
                if ( SoundPlayCtrl.Playing < SND_TOTAL_NUM )
                {
                    if ( SndAttributeTable[SoundPlayCtrl.Playing].Mode == SND_MODE_SINGLE )
                        Buzzer_Play_Sound ( SndAttributeTable[SoundPlayCtrl.Playing].Index );
                    else
                    {
                        if ( SoundPlayCtrl.Status == SND_PLAYER_PLAY_REQ )
                            Buzzer_Play_Sound ( SndAttributeTable[SoundPlayCtrl.Playing].Index );
                    }

                    SoundPlayCtrl.Timer = SndAttributeTable[SoundPlayCtrl.Playing].Period;
                    SoundPlayCtrl.Status  = SND_PLAYER_PLAYING;

                    if ( SoundPlayCtrl.Cycle != SND_CYCLE_NONSTOP )
                        SoundPlayCtrl.Cycle--;
                }
                else
                {
                    SoundPlayCtrl.Playing = SND_SRC_NONE;
                    SoundPlayCtrl.Cycle   = 0;
                    SoundPlayCtrl.Status  = SND_PLAYER_IDLE;           //取消播放请求
                }
            }
        }
    }
    else                                                       //当前声音被请求停止播放
    {
        if ( SoundPlayCtrl.Playing < SND_TOTAL_NUM )
        {
            if ( SndAttributeTable[SoundPlayCtrl.Playing].Mode != SND_MODE_SINGLE )
            {
                Buzzer_Stop_All_Track();
                SoundPlayCtrl.Playing = SND_SRC_NONE;
                SoundPlayCtrl.Cycle   = 0;
                SoundPlayCtrl.Status  = SND_PLAYER_IDLE;
            }
            else
            {
                if ( SoundPlayCtrl.Timer == 0 )
                {
                    SoundPlayCtrl.Playing = SND_SRC_NONE;
                    SoundPlayCtrl.Cycle   = 0;
                    SoundPlayCtrl.Status  = SND_PLAYER_IDLE;
                }
            }
        }
    }
}