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

📄 musicplayer_playing.c

📁 Actions ucOS-II mp3方案源码,可以做参考
💻 C
字号:
/********************************************************************************
*                        SDK30F_D1
*                     music player main sub
*
*                (c) Copyright 2002, Actions Co,Ld.
*                        All Right Reserved
*
* File: musicplayer_Playing.c
* By  : wurui
* Version: 1> v1.00     first version     2005-10-28 8:28
*
*    $Id: musicplayer_Playing.c,v 1.10 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 MusicPlayer_PlayMusic(music_t *g_music_vars,  msg_t *msg)
*
* Description : 播放等待状态下处理DSP的读请求,播放音乐文件块
*
* Arguments   : g_music_vars  : musicplayer 任务变量指针  msg : 消息指针
*               
* Returns     : void
*
* Notes       :
*
********************************************************************************
*/

void MusicPlayer_PlayMusic(music_t *g_music_vars, msg_t *msg)
{
    int result;
    msg_t msg_send;
    
    result = MusicPlayer_read_bit_stream(g_music_vars, msg);  
    
    if(result !=0)
    {
        if(result == FS_ERR_EOF) // 到文件尾.
        {
            if(g_music_vars->status == music_FFStep)   // 如快进,停止快进.
            {
                music_api_StopFFRorRv();
                music_api_BitstreamToDsp();
                music_api_StopPlay();
                g_music_vars->status = music_NormalPlay;
                g_music_vars->last_operate = MS_FsEof;
                return;
            }
            else if(g_music_vars->status == music_FBStep)
            {
                music_api_StopFFRorRv();
                g_music_vars->status = music_NormalPlay;
            }
            else                //正常播放时到达文件尾
            {
                music_api_StopPlay();                
                g_music_vars->last_operate = MS_FsEof;
            }
        }
        else                // 系统错误.
        {
            music_api_StopPlay();
            
            msg_send.type = MS_PLAYER;
            msg_send.msg.data[0] = MS_PlayerErr;
            msg_send.msg.data[1] = result;
            MYOSQPost(MP3_Player_Out,&msg_send);
            g_music_vars->player_status = PLAYER_EXIT;
        }
    }
    music_api_BitstreamToDsp();   // 读数据给DSP,启动DSP.  
    if(g_music_vars->status == music_ABLoopPlay) // 是否是AB复读.
    {
        if( (api_GetFileTell( g_music_vars->infomation.FifoCntNo )) >= (g_music_vars->setting_info.BreakPTSave.BpointSave) )
        {         
            music_api_SetABPlay(0x88);        // 到B点,
            if( (result = api_SeekFile(g_music_vars->infomation.FifoCntNo, 0, g_music_vars->setting_info.BreakPTSave.ApointSave)) < 0)
                _MusicPlayer_Exceptions(g_music_vars, FifoSeekErr);
        }
    } 
}
/*
********************************************************************************
*            void MusicPlayer_PLAY_default(music_t *g_music_vars,  msg_t *msg)
*
* Description : 播放状态下进行异常消息处理
*
* Arguments   : g_music_vars  : musicplayer 任务变量指针  msg : 消息指针
*               
* Returns     : void
*
* Notes       :
*
********************************************************************************
*/

void MusicPlayer_PLAY_default(music_t *g_music_vars, msg_t *msg)
{
    msg_t msg_send;  
    int result; 
    switch(msg->type)
    {
    case MS_SetLocation:                   // 播放下一首歌曲,歌曲路径存于  g_music_vars->infomation.
        music_api_StopPlay();
        g_music_vars->last_operate = MS_SetLocation; 
        break;

    case MS_END:
        music_api_StopPlay();
        g_music_vars->last_operate = MS_END;
        break;
        
    case MS_DSP_Err:
        if(g_music_vars->last_operate == MS_END)
        {
            g_music_vars->player_status = PLAYER_EXIT;
            g_music_vars->last_operate =0;
            break;
        }
        g_music_vars->status = music_err;   
        msg_send.type = MS_PLAYER;
        msg_send.msg.data[0] = MS_PlayerErr;
        msg_send.msg.data[1] = DSPErr;
        MYOSQPost(MP3_Player_Out,&msg_send);  
        music_api_StopPlay();
        g_music_vars->player_status = PLAYER_EXIT;
        break;
        

       
    case MS_SetVolume:
        g_music_vars->setting_info.volume = msg->msg.data[0];
//        music_api_SetVolume(g_music_vars->setting_info.volume);
//        if( g_music_vars->status >music_stop )
            SetPAVolume(g_music_vars->setting_info.volume);
        break;
        
    case MS_SetSpeed:
        g_music_vars->setting_info.play_rate = msg->msg.data[0];
        music_api_SetSpeed(g_music_vars->setting_info.play_rate);
        break;
        
    case MS_SetEQ:
        g_music_vars->setting_info.eq = msg->msg.data[0];
        music_api_SetEQ(g_music_vars->setting_info.eq);
        break;
        
    
    case MS_Stop:
        g_music_vars->last_operate == MS_Stop;
        music_api_StopPlay();
        break;
        
            
    case MS_SetAB:       // 设置或取消AB点播放.
        if(g_music_vars->status == music_NormalPlay)
        {
            music_api_SetABPlay(0x22);
            g_music_vars->status = music_WaitSetA;
        }
        else if(g_music_vars->status == music_WaitSetA)
        {
            music_api_SetABPlay(0xaa);
            g_music_vars->status = music_WaitSetB;
        }
        else
        {
            music_api_StopABPlay();
            g_music_vars->status = music_NormalPlay;
        }
        break;
        
    case MS_SetStep:
        // 设置快进快退.
        if(msg->msg.data[0] == MusicPlayer_StepFF)
        {
            music_api_SetFFRorRv(0x55, 3, msg->msg.data[1]); 
            g_music_vars->status = music_FFStep; 
        }
        else if(msg->msg.data[0] == MusicPlayer_StepRv)
        {
            music_api_SetFFRorRv(0xaa, 3, msg->msg.data[1]); 
            g_music_vars->status = music_FBStep; 
        }
        else
        {       
            music_api_StopFFRorRv();          
            g_music_vars->status = music_NormalPlay; 
        }
        break;
        
    case MS_Play:   // 取消或暂停.
        if(g_music_vars->status > music_CompareAB)
        {
            music_api_StopFFRorRv();  
        }
        else if(g_music_vars->status > music_NormalPlay)
        {
            music_api_StopABPlay();  
        }
        g_music_vars->last_operate = MS_Play;
        music_api_FadeOut(0x02);         //Noise FadeOut
        g_music_vars->status = music_pause;  
        break;
        
    case MS_FOEnd:      // DSP 淡出完成.
        music_api_StopPlay();
        break;
        
    case MS_DSPExit:     // DSP退出完成.     
        if( g_music_vars->last_operate == MS_END )
        {    
            g_music_vars->status = music_stop; 
            music_api_GetDspInfo( &g_music_vars->setting_info.BreakPTSave ); 
            g_music_vars->player_status = PLAYER_EXIT;
        }
        else if(g_music_vars->last_operate == MS_SetLocation)     // 播放下一首歌曲.
        {
            g_music_vars->status = music_stop; 
            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;
            }
            msg_send.type = MS_SetLocation;
            MYOSQPost(MP3_Player_In,&msg_send);  

            g_music_vars->player_status = PLAYER_WAIT_FileLocation;
        }
        else if(g_music_vars->last_operate == MS_Play)     // 播放下一首歌曲.
        {
            g_music_vars->setting_info.BreakPTSave.breakPT = api_GetFileTell(g_music_vars->infomation.FifoCntNo);
            g_music_vars->setting_info.BreakPTSave.breakPT >>= 9;        //除法耗时太长,就应由移位完成
            music_api_GetDspInfo(&g_music_vars->setting_info.BreakPTSave);
            g_music_vars->player_status = PLAYER_WAIT_Play;
            g_music_vars->last_operate = 0;
            return;

/*            if((result = ToNextMusic( g_music_vars )) != 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);  
                
                g_music_vars->player_status = PLAYER_WAIT_FileLocation;
            }*/
        }
        else    // 等待歌曲.
        {
            g_music_vars->status = music_stop; 
            if( g_music_vars->last_operate == MS_FsEof)
            {
                msg_send.type = MS_PLAYER;
                msg_send.msg.data[0] = MS_DecEnd;
                MYOSQPost(MP3_Player_Out,&msg_send);     
                g_music_vars->infomation.fileno++;/////////////////////////////
                msg_send.type = MS_SetLocation;
                MYOSQPost(MP3_Player_In,&msg_send);
                msg_send.type = MS_Play;
                MYOSQPost(MP3_Player_In,&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;
            }
            ClosePA();
            g_music_vars->player_status = PLAYER_WAIT_FileLocation;
        }

        g_music_vars->last_operate = 0;
        MusicPlayer_ResetVars(g_music_vars);
        break;
        
    case MS_AB:
        // DSP 设置断点完成,获取文件系统的断点.
        if(g_music_vars->status == music_WaitSetA)
        {
            g_music_vars->setting_info.BreakPTSave.ApointSave = api_GetFileTell( g_music_vars->infomation.FifoCntNo ) + msg->msg.data[0] * 512;
            g_music_vars->setting_info.BreakPTSave.ApointSave-=512;
        }
        else if(g_music_vars->status == music_WaitSetB)
        {
            g_music_vars->setting_info.BreakPTSave.BpointSave = api_GetFileTell( g_music_vars->infomation.FifoCntNo ) + msg->msg.data[0] * 512; 
            g_music_vars->setting_info.BreakPTSave.BpointSave-=512;
            if( (result = api_SeekFile(g_music_vars->infomation.FifoCntNo, 0, g_music_vars->setting_info.BreakPTSave.ApointSave)) < 0)
                _MusicPlayer_Exceptions(g_music_vars, FifoSeekErr); 
            g_music_vars->status = music_ABLoopPlay;
        }
        break;
        
    case MS_CurTime:
        music_api_GetCurInfo(&g_music_vars->cur_info);
        msg_send.type = MS_PLAYER;
        msg_send.msg.data[0] = MS_RedrawInfo;
        MYOSQPost(MP3_Player_Out,&msg_send);
        break;

    case MS_GetTime:
    case MS_GetLrc:
    case MS_GetInfo:

        break;
    default:
        msg_send.type = MS_PLAYER;
        msg_send.msg.data[0] = MS_PlayerErr;
        msg_send.msg.data[1] = UnknowErr;
        MYOSQPost(MP3_Player_Out,&msg_send);
        
    }
}
/*
********************************************************************************
*            int MusicPlayer_read_bit_stream( music_t *g_music_vars, msg_t *msg)
*
* Description : 播放音乐时读DSP指定文件块到Player的文件缓存区
*
* Arguments   : g_music_vars  : musicplayer 任务变量指针  msg : 消息指针
*               
* Returns     : 操作正常返回0,如果存在错误则返回错误类型
*
* Notes       :
*
********************************************************************************
*/

int MusicPlayer_read_bit_stream( music_t *g_music_vars, msg_t *msg)
{
    int    result = 0;
    int    fs_errno; 
    long    offset_pages; 
    decReadFilePara_t  *readparam;    

    if(g_music_vars->infomation.fileflag == FALSE)
        return FALSE;   
         
    //output8(0xf7, input8(0xf7) | 0x20);
     
    readparam = (decReadFilePara_t *)msg->msg.pointer;    
    switch(readparam->ReadFileDir)
    {
         case FWREAD: 
             offset_pages =  readparam->ReadFilePages - 1;
             if( offset_pages > 0 )
             {
                result = api_SeekFile(g_music_vars->infomation.FifoCntNo, SEEK_CUR, offset_pages * 512);
             }
             if(result >= 0)
             {
                result = api_ReadFile(g_music_vars->infomation.FifoCntNo, readparam->ReadAddr, 512);
             }
             break;
         case BWREAD: 
             if( readparam->ReadFilePages )
             {
                offset_pages = readparam->ReadFilePages + 1;
                result = api_SeekFile(g_music_vars->infomation.FifoCntNo, SEEK_CUR, offset_pages * (-512));  
             }
             if(result >= 0)
             {
                result = api_ReadFile(g_music_vars->infomation.FifoCntNo, readparam->ReadAddr, 512);
             }
             break;
         default:
             break;
    }
    //output8(0xf7, input8(0xf7) & 0xdf);
    if(result == 0)
    {
        return FS_ERR_EOF;
    }
    else if(result < 0)
        return FSErr;   
    return 0;
}

void MusicPlayer_ResetVars(music_t *g_music_vars)
{
    g_music_vars->status = music_NormalPlay;
}

⌨️ 快捷键说明

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