#include "Sound_Player.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_Start_Up();
}




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)
           Buzzer_Stop_Play();

        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_Play();
                }

                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_Track(SndAttributeTable[SoundPlayCtrl.Playing].Index);
                    else
                    {
                        if ( SoundPlayCtrl.Status == SND_PLAYER_PLAY_REQ )
                            Buzzer_Repeat_Play_Track(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_Play();
                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;
                }
            }
        }
    }
}