⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 musicplayer_main.c

📁 Actions ucOS-II mp3方案源码,可以做参考
💻 C
字号:
/********************************************************************************
*                        SDK30F_D1
*                     music player main sub
*
*                (c) Copyright 2002, Actions Co,Ld.
*                        All Right Reserved
*
* File: musicplayer_main.c
* By  : wurui
* Version: 1> v1.00     first version     2005-10-28 8:28
*
*    $Id: musicplayer_main.c,v 1.9 2005/12/30 08:09:35 wurui Exp $
*******************************************************************************
*/
#include "MusicPlayer.h" 
#include "device.h"
#include "my_os_q.h" 
#include "task_cfg.h"
#include "FIFO.h"

/*
********************************************************************************
*             void PlayerEngine( void )
*
* Description : 播放器任务入口,负责将消息发送给当前的状态处理机.
*
* Arguments   : void
*
* Returns     : void
*
* Notes       :
*
********************************************************************************
*/
void PlayerEngine()
{
    int    result;
    music_t g_music_vars;
    msg_t    QStart_In[10];
    msg_t    QStart_Out[10];
    char buffer[512]; 
    msg_t   msg_send;
    msg_t   msg;
    BYTE    err;
    char ext[5];
    //char ext[41];
    memset(&g_music_vars, 0x00, sizeof(music_t));
    
    g_music_vars.infomation.ext = ext;
    read_var( &g_music_vars );
    g_music_vars.status = music_unvalid; 
    
    if( (g_music_vars.infomation.FifoCntNo = api_open(1, 0x00, 0x0500000))<0)
        _MusicPlayer_Exceptions(&g_music_vars, FifoErr);
    if( (result = api_SetSelMode(g_music_vars.infomation.FifoCntNo, 1, (int)g_music_vars.infomation.ext)) < 0)
        _MusicPlayer_Exceptions(&g_music_vars, FifoModeErr);
    
    g_music_vars.infomation.totalno = api_GetTotalFileNum(g_music_vars.infomation.FifoCntNo);
    MP3_Player_In = MYOSQCreate(QStart_In, 10); 
    if( MP3_Player_Out == 0 )
    {
        MP3_Player_Out = MYOSQCreate(QStart_Out, 10);  
    } 

    // 设置任务变量指针.    
    OSSetTaskOwnPtr( (unsigned int *)&g_music_vars, PLAYER_ENGINE_ID); 

    output8(REG4E_RTC_WATCH_DOG, input8(REG4E_RTC_WATCH_DOG) | 0x08);

    //lyricInit(LYRIC_SCREEN_128_32, g_comval.langid);//初始化歌词解释器
    //Timer_2HZNo_Sav = TM_SetClock((int)Music_2HZint, 1);//打开 2HZ 定时
    //MusicTimer_Sav = TM_SetTimer((int)Music_timeint, 2);//打开 20ms 定时
    
    openDAC();

    g_music_vars.bit_stream = buffer;

    music_api_open(buffer, MP3_Player_In);
    
    g_music_vars.player_status = PLAYER_WAIT_FileLocation;
    
    //output8(0xee, input8(0xee) & 0x1f);  
    //output8(0xf5, input8(0xf5) | 0x20);   
    //output8(0xf7, input8(0xf7) & 0xdf); 
    do
    {   
        MYOSQPend(MP3_Player_In, &msg, 0);
        
        switch(g_music_vars.player_status)
        {
        case PLAYER_WAIT_FileLocation:
            switch(msg.type)
            {
            case MS_SetLocation:
                if((result = MusicPlayer_SetLocation(&g_music_vars)) == 0)
                {
                    if((result = MusicPlayer_compute_music_time_start(&g_music_vars)) == 0)
                        g_music_vars.player_status = PLAYER_ComputeTotalTime;
                }
                if(result != 0)
                {
                    msg_send.type = MS_PLAYER;
                    msg_send.msg.data[0] = MS_PlayerErr;
                    msg_send.msg.data[1] = result;
                    MYOSQPost(MP3_Player_Out, &msg_send);
                }
                break;
            case MS_END:
                g_music_vars.player_status = PLAYER_EXIT;
                break;
            }
            break;
        
        case PLAYER_ComputeTotalTime:
            switch(msg.type)
            {
            case MS_Read:
                if((result = MusicPlayer_compute_music_time(&g_music_vars,&msg)) != 0)
                {
                    MusicPlayer_compute_music_time_stop(&g_music_vars);
                    g_music_vars.player_status = PLAYER_EXIT;
                    
                    msg_send.type = MS_PLAYER;
                    msg_send.msg.data[0] = MS_PlayerErr;
                    msg_send.msg.data[1] = result;
                    MYOSQPost(MP3_Player_Out, &msg_send);
                }
                break;
            default:
                MusicPlayer_ComputeTotalTime_default(&g_music_vars,&msg);
            }
            MusicPlayer_SpecialResolve_ComputeTotalTime(&g_music_vars);
            break;
            
        case PLAYER_WAIT_Play:
            switch(msg.type)
            {
            case MS_Play:
                MusicPlayer_PlayMusicStart(&g_music_vars);
                g_music_vars.player_status = PLAYER_PLAY;
                break;
            default:
                MusicPlayer_WAIT_Play_default(&g_music_vars,&msg);
            }
            break;
            
        case PLAYER_PLAY:
            switch(msg.type)
            {
            case MS_Read:
                MusicPlayer_PlayMusic(&g_music_vars, &msg);
                break;
            default:
                MusicPlayer_PLAY_default(&g_music_vars, &msg);
            }
            break;
        }
        
        MusicPlayer_SpecialResolve(&g_music_vars,&msg);
        
    }while(g_music_vars.player_status != PLAYER_EXIT);
    
    music_api_close();
    
    DisableDAC();
    
    api_close(g_music_vars.infomation.FifoCntNo);
    //TM_KillTimer(MusicTimer_Sav);//关闭 2hz 定时
    //TM_KillClock(Timer_2HZNo_Sav);//关闭 20ms 定时

    // 释放DSP资源,申请DSP资源在MAIN 任务中已经申请.
    //OSSemPost(DSP_SEM);

    // 删除消息队列 
    OS_ENTER_CRITICAL(); 
    MP3_Player_In = MYOSQDel(MP3_Player_In, OS_DEL_ALWAYS, &err);    
    MP3_Player_Out = MYOSQDel(MP3_Player_Out, OS_DEL_ALWAYS, &err); 
    MP3_Player_In = 0; 
    MP3_Player_Out = 0; 
    OS_EXIT_CRITICAL();
    
   // 任务结束.
   while(1)
   {
        output8(REG4E_RTC_WATCH_DOG, input8(REG4E_RTC_WATCH_DOG) | 0x08);
        OSTaskDel(OS_PRIO_SELF);
    }
}

/*
********************************************************************************
*            void MusicPlayer_SpecialResolve(music_t *g_music_vars,msg_t *msg)
*
* Description : 全局特殊状态处理
*
* Arguments   : g_music_vars  : musicplayer 任务变量指针  msg  : 消息指针
*               
* Returns     : void
*
* Notes       :
*
********************************************************************************
*/
void MusicPlayer_SpecialResolve(music_t *g_music_vars,msg_t *msg)
{
    int result;
    switch (msg->type)
    {
    case MS_SetVolume:
        g_music_vars->setting_info.volume = msg->msg.data[0];
        break;
    
    case MS_SetSpeed:
        g_music_vars->setting_info.play_rate = msg->msg.data[0];
        break;
    }
    if(g_music_vars->player_status == PLAYER_EXIT)
    {
        if(g_music_vars->infomation.fileflag == TRUE)
        {
            if( (result = api_CloseFile(g_music_vars->infomation.FifoCntNo)) < 0)
                _MusicPlayer_Exceptions(g_music_vars, FifoCloseErr);
            g_music_vars->infomation.fileflag = FALSE;
        }
        ClosePA();
        
/*<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
                for test now can't exit dsp
        g_music_vars->player_status = PLAYER_WAIT_FileLocation;
<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>*/
    }
}
/*
********************************************************************************
*             void openPA(uchar volume)
*
* Description : 打开PA.
*
* Arguments   : uchar volume  音量
*
* Returns     : 
*
* Notes       :
*
********************************************************************************
*/

void openPA(uchar volume)
{
    int i;
    pa_t paattr; 
        paattr.pa_in.dacin = 1;
        paattr.pa_in.fmin = 0;
        paattr.pa_in.linein = 0;
        paattr.pa_in.micin = 0;
        paattr.volume = volume;
        EnablePA(& paattr);       
        for (i = 0; i < 2000; i++)
        {
            output8(REG4E_RTC_WATCH_DOG, input8(REG4E_RTC_WATCH_DOG) | 0x08);
        }
}
/*
********************************************************************************
*             void openPA(uchar volume)
*
* Description : 关闭PA.
*
* Arguments   : uchar volume  音量
*
* Returns     : 
*
* Notes       :
*
********************************************************************************
*/

void ClosePA(void)
{   
        DisablePA();
}

/*
********************************************************************************
*             void openDAC(void)
*
* Description : 打开DAC
*
* Arguments   : void
*
* Returns     : void
*
* Notes       :
*
********************************************************************************
*/
void openDAC(void)
{
    dac_t dacattr;
    dacattr.dacselect = 0;
    dacattr.rate = FS_8K;
    EnableDAC(& dacattr); 
}
/*
********************************************************************************
*             void read_var(void)
*
* Description : 读系统变量和ap局部变量
*
* Arguments   : void
*
* Returns     : void
*
* Notes       :
*
********************************************************************************
*/

void read_var( music_t *g_music_vars )
{
    int result;
    //kval_t kval;

    //read ap vars
    //result = VMRead(& g_music_vars, VM_AP_MUSIC, sizeof(g_music_vars));

    //check if valid
//    if (g_music_vars->magic != MAGIC_MUSIC)
//    {
//        g_music_vars->magic = MAGIC_MUSIC;
        g_music_vars->setting_info.volume = 24;
        g_music_vars->setting_info.eq = 0;
        g_music_vars->setting_info.replaytimes = 5;
        g_music_vars->setting_info.replaygap = 1;
//        g_music_vars->repeat_mode = FSEL_ALL_SEQUENCE;
        g_music_vars->setting_info.play_rate = 0;
//        g_music_vars->location.disk = 'C';
//        g_music_vars->play_listmod = mlistnor;
//        g_music_vars->fselmod = FSEL_TYPE_COMMONDIR;
        g_music_vars->setting_info.MusicOpenMod = Nor_open;        
//        strcpy(g_music_vars.location.path, FS_CD_ROOT);
        //ClearTimePara();
//    }
    g_music_vars->infomation.ext[0] = 'M';
    g_music_vars->infomation.ext[1] = 'P';
    g_music_vars->infomation.ext[2] = '3';
    g_music_vars->infomation.ext[3] = 0;
    g_music_vars->infomation.ext[4] = 0;
 
/*    g_music_vars->infomation.ext[0] = 'M';
    g_music_vars->infomation.ext[1] = 'P';
    g_music_vars->infomation.ext[2] = '3';
    g_music_vars->infomation.ext[3] = 0;
    g_music_vars->infomation.ext[4] = 'W';
    g_music_vars->infomation.ext[5] = 'M';
    g_music_vars->infomation.ext[6] = 'A';
    g_music_vars->infomation.ext[7] = 0;
    g_music_vars->infomation.ext[8] = 'A';
    g_music_vars->infomation.ext[9] = 'S';
    g_music_vars->infomation.ext[10] = 'F';
    g_music_vars->infomation.ext[11] = 0;
    g_music_vars->infomation.ext[12] = 'W';
    g_music_vars->infomation.ext[13] = 'M';
    g_music_vars->infomation.ext[14] = 'V';
    g_music_vars->infomation.ext[15] = 0;
    g_music_vars->infomation.ext[16] = 'O';
    g_music_vars->infomation.ext[17] = 'G';
    g_music_vars->infomation.ext[18] = 'G';
    g_music_vars->infomation.ext[19] = 0;
    g_music_vars->infomation.ext[20] = 'W';
    g_music_vars->infomation.ext[21] = 'A';
    g_music_vars->infomation.ext[22] = 'V';
    g_music_vars->infomation.ext[23] = 0;
    g_music_vars->infomation.ext[24] = 'A';
    g_music_vars->infomation.ext[25] = 'C';
    g_music_vars->infomation.ext[26] = 'T';
    g_music_vars->infomation.ext[27] = 0;
    g_music_vars->infomation.ext[28] = 'M';
    g_music_vars->infomation.ext[29] = '4';
    g_music_vars->infomation.ext[30] = 'A';
    g_music_vars->infomation.ext[31] = 0;
    g_music_vars->infomation.ext[32] = 'A';
    g_music_vars->infomation.ext[33] = 'G';
    g_music_vars->infomation.ext[34] = '8';
    g_music_vars->infomation.ext[35] = 0;
    g_music_vars->infomation.ext[36] = 'A';
    g_music_vars->infomation.ext[37] = 'G';
    g_music_vars->infomation.ext[38] = '4';
    g_music_vars->infomation.ext[39] = 0;
    g_music_vars->infomation.ext[40] = 0;
*/
}
void _MusicPlayer_Exceptions(music_t *g_music_vars, int errtype)
{
    msg_t msg_send;
    msg_send.type = MS_PLAYER;
    msg_send.msg.data[0] = MS_PlayerErr;
    msg_send.msg.data[1] = errtype;
    MYOSQPost(MP3_Player_Out,&msg_send);
}
/*
********************************************************************************
*             int ToNextMusic( music_t *g_music_vars)
*
* Description : 自动获取下一首歌曲
*
* Arguments   : g_music_vars  : musicplayer 任务变量指针
*
* Returns     : 操作正常返回0,如果存在错误则返回错误类型
*
* Notes       :
*
********************************************************************************
*/

int ToNextMusic( music_t *g_music_vars)
{
    int    result;
    msg_t   msg_send;

            
/*    if(g_music_vars->infomation.fileflag == TRUE)
    {
        if( (result = api_CloseFile(g_music_vars->infomation.FifoCntNo)) < 0)
            _MusicPlayer_Exceptions(g_music_vars, FifoCloseErr);
        g_music_vars->infomation.fileflag = FALSE;
    }
    if( (result = api_OpenFileByNo(g_music_vars->infomation.FifoCntNo, g_music_vars->infomation.fileno)) < 0)
        _MusicPlayer_Exceptions(g_music_vars, FifoOpenErr);
    g_music_vars->infomation.fileflag = TRUE;
    //g_music_vars->music_type = CheckMusicType(g_music_vars->infomation.MusicLocationName);
    
             
    
    // 通知重画界面.
    //msg_send.type = MS_PLAYER;
    //msg_send.msg.data[0] = MS_Redraw;
    //MYOSQPost(MP3_Player_Out,&msg);
    
    if(g_music_vars->infomation.fileflag == TRUE)
    {
        if((result = GetInformation(g_music_vars)) != 0) //取文件信息 
        {
            return result;
        }
        // 获取文件的长度.
        g_music_vars->infomation.fileLength = api_GetFileLength(g_music_vars->infomation.FifoCntNo);
        if( (result = api_ReadFile(g_music_vars->infomation.FifoCntNo, g_music_vars->bit_stream, 512)) < 0)
            _MusicPlayer_Exceptions(g_music_vars, FifoReadErr);
        music_api_Play(g_music_vars->music_type, Nor_open, g_music_vars->infomation.fileLength);
    }
    else
    {
        return FSErr;
    }
    
    return 0; */
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -