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