📄 musicplayer_main.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 + -