📄 mp3_play.c
字号:
/*
DM270 ARM Evaluation Software
(c)Texas Instruments 2003
*/
#include <system/armsys270.h>
#include <system/dspc270.h>
#include <system/uart270.h>
#include <system/gio270.h>
#include <user/armdsp.h>
#include <user/intc.h>
#include <appl/mp3_play.h>
#include <demo/mem_alloc.h>
#include <demo/menu.h>
#include <demo/ui.h>
#include <util/mem_fs.h>
#include <dsp/dspsource.h>
#include <demo_gui/demo_gui.h>
MP3_CTRL Mp3Ctrl;
MP3_CMD Mp3Cmd;
MP3_STATUS Mp3Status;
STATUS MP3_init() {
Mp3Cmd.DataBuffAddrHigh = HIGH_WORD( AUDIO_BUFFER_OFFSET );
Mp3Cmd.DataBuffAddrLow = LOW_WORD ( AUDIO_BUFFER_OFFSET );
Mp3Cmd.DataBuffSizeHigh = HIGH_WORD( AUDIO_BUFFER_SIZE );
Mp3Cmd.DataBuffSizeLow = LOW_WORD ( AUDIO_BUFFER_SIZE );
Mp3Cmd.FeedTime = 1;
Mp3Cmd.Volume = 35;
Mp3Cmd.DataSizeHigh = 0;
Mp3Cmd.DataSizeLow = 0;
Mp3Cmd.DataBuffOffsetHigh = 0;
Mp3Cmd.DataBuffOffsetLow = 0;
Mp3Cmd.UpdateInterval = MP3_CMD_INT_16K;
#ifdef MP3_FS_FILE
Mp3Ctrl.Mp3FileIndex = -1;
Mp3Ctrl.Mp3MaxFileIndex = -1;
strcpy( Mp3Ctrl.Mp3DirName, MP3_DEFAULT_DIR_NAME );
#endif
return E_PASS;
}
STATUS MP3_deviceNameSet(char *dev_name) {
strcpy( Mp3Ctrl.Mp3DevName, dev_name );
return E_PASS;
}
void MP3_PLAY_MAIN_MENU_run() {
char ch;
#ifdef MP3_FS_FILE
if(MP3_showFileList()!=E_PASS) {
UART_sendString( UART0, "\r\n\n Cannot play MP3. Please try again later.\r\n\n" );
return;
}
MP3_firstFile();
#endif
GUI_controlPanelClear();
GUI_controlPanelReset();
GUI_controlPanelDraw();
GUI_controlPanelMediaNameSet(" MP3 ");
while ( 1 ) {
UART_sendString( UART0, mp3_play_main_menu );
ch = UI_getInput();
switch( ch ) {
case '0' :
GUI_fileInfoPanelClear();
GUI_controlPanelClear();
GUI_controlPanelReset();
return;
case '1' :
DraftPreview(TRUE);
break;
case '2' :
GUI_controlPanelReset();
MP3_PLAY_run();
break;
case '3' :
#ifdef MP3_FS_FILE
GUI_controlPanelReset();
GUI_controlPanelButtonStateSet(&BUTTON_PLAY_PREV);
MP3_prevFile();
GUI_fileInfoPanelSetInfo(Mp3Ctrl.Mp3FileIndex);
GUI_controlPanelButtonStateSet(&BUTTON_PLAY_STOP);
#endif
break;
case '4' :
#ifdef MP3_FS_FILE
GUI_controlPanelReset();
GUI_controlPanelButtonStateSet(&BUTTON_PLAY_NEXT);
MP3_nextFile();
GUI_fileInfoPanelSetInfo(Mp3Ctrl.Mp3FileIndex);
GUI_controlPanelButtonStateSet(&BUTTON_PLAY_STOP);
#endif
break;
case '5' :
#ifdef MP3_FS_FILE
MP3_showFileList();
MP3_firstFile();
#endif
break;
}
}
}
STATUS MP3_PLAY_START_run() {
MP3_AIC23_init();
if( DSPLoadCode( mp3_decode ) != E_PASS ) {
UART_sendString( UART0, "\r\n ERROR : DSPLoadCode(). ");
return E_DEVICE;
}
if( MP3_initMp3Ctrl() != E_PASS )
return E_DEVICE;
MP3_readBuff(0);
MP3_readBuff(1);
INTC_enable( INT_DSP, FALSE );
INTCAttachISR( INT_DSP, MP3_PLAY_isr );
INTC_enable( INT_DSP, TRUE );
MP3_sendCmd( MP3_CMD_PLAY );
GUI_controlPanelButtonStateSet(&BUTTON_PLAY_START);
return E_PASS;
}
Uint32 Mp3PlaybackCount;
void MP3_PLAY_run() {
BOOL stopped, nextFile, prevFile, forwardDir, errorFile;
char ch;
UART_sendString( UART0, mp3_play_menu );
if(MP3_PLAY_START_run() != E_PASS ) {
MP3_PLAY_STOP_run();
errorFile=TRUE;
} else {
errorFile=FALSE;
Mp3PlaybackCount=1;
}
stopped = nextFile = prevFile = FALSE;
forwardDir = TRUE;
while(1) {
ch = UI_checkInput();
switch(ch) {
case '0':
MP3_PLAY_STOP_run();
return;
case '1':
DraftPreview(FALSE);
break;
case '2' :
MP3_togglePause();
break;
case '3' :
MP3_toggleFF();
break;
case '4' :
MP3_PLAY_STOP_run();
prevFile = FALSE;
nextFile = TRUE;
stopped = TRUE;
forwardDir = TRUE;
break;
case '5' :
MP3_PLAY_STOP_run();
prevFile = TRUE;
nextFile = FALSE;
stopped = TRUE;
forwardDir = FALSE;
break;
default :
if(!stopped && !errorFile ) {
GUI_controlPanelSeekBarUpdate(Mp3Ctrl.DecDataSize);
GUI_controlPanelTimerUpdate(Mp3Ctrl.DecTime/10);
if(Mp3Ctrl.Stop) {
MP3_PLAY_STOP_run();
stopped = TRUE;
}
else {
MP3_PLAY_IN_PROGRESS_run();
}
} else {
if(nextFile || forwardDir ) {
GUI_controlPanelReset();
GUI_controlPanelButtonStateSet(&BUTTON_PLAY_NEXT);
MP3_nextFile();
forwardDir = TRUE;
} else
if(prevFile || !forwardDir ) {
GUI_controlPanelReset();
GUI_controlPanelButtonStateSet(&BUTTON_PLAY_PREV);
MP3_prevFile();
forwardDir = FALSE;
}
nextFile = FALSE;
prevFile = FALSE;
UART_sendString( UART0, mp3_play_menu );
if( MP3_PLAY_START_run() != E_PASS ) {
MP3_PLAY_STOP_run();
errorFile = TRUE;
stopped = TRUE;
} else {
stopped = FALSE;
errorFile = FALSE;
Mp3PlaybackCount++;
sprintf( UART_outBuff, "\r\n\n Playing Mp3 No. : %ld \r\n", Mp3PlaybackCount);
UART_sendString( UART0, UART_outBuff );
}
}
break;
}
}
}
void MP3_PLAY_IN_PROGRESS_run() {
if( MP3_PLAY_isDataBuffEmpty() == TRUE )
MP3_readBuff( (Mp3Ctrl.CurBuff + 1 )%3 );
}
BOOL MP3_PLAY_isDataBuffEmpty() {
Uint32 dec_size;
dec_size = Mp3Ctrl.DecDataSize;
if( dec_size % Mp3Ctrl.BufferSize < Mp3Ctrl.BufferSize/3 ) {
/* i.e offset into buffer 0 */
if( Mp3Ctrl.CurBuff == 2 ) {
/* set current active buffer as Buffer 0 */
Mp3Ctrl.CurBuff = 0;
return TRUE;
} else
return FALSE;
} else
if( dec_size % Mp3Ctrl.BufferSize < (Mp3Ctrl.BufferSize/3)*2 ) {
/* i.e offset into buffer 1 */
if( Mp3Ctrl.CurBuff == 0 ) {
/* set current active buffer as Buffer 1 */
Mp3Ctrl.CurBuff = 1;
return TRUE;
} else
return FALSE;
} else
if( dec_size % Mp3Ctrl.BufferSize < Mp3Ctrl.BufferSize ) { /* i.e offset into buffer 2 */
if( Mp3Ctrl.CurBuff == 1 ) {
/* set current active buffer as Buffer 2 */
Mp3Ctrl.CurBuff = 2;
return TRUE;
} else
return FALSE;
}
return FALSE;
}
STATUS MP3_PLAY_STOP_run() {
INTC_enable( INT_DSP, FALSE );
INTCDetachISR( INT_DSP );
if( Mp3Ctrl.Pause == TRUE ) {
MP3_sendCmd( MP3_CMD_RESUME );
INTC_waitForInt( INT_DSP, 0);
}
MP3_sendCmd( MP3_CMD_STOP );
#ifdef MP3_FS_FILE
FILE_close( Mp3Ctrl.File, 0 );
#else
MEM_FILE_close( &Mp3Ctrl.File );
#endif
UART_sendString( UART0, "\r\n"
"\r\n Mp3 Stopped."
"\r\n"
);
MP3_AIC23_stop();
GUI_controlPanelButtonStateSet(&BUTTON_PLAY_STOP);
return E_PASS;
}
void MP3_togglePause() {
volatile Uint16 cmd;
cmd = 0;
DSPC_writeData((char*)&cmd, 1, ARM_DSP_DSPCCR);
if( Mp3Ctrl.Pause == TRUE ) {
Mp3Ctrl.Pause = FALSE;
MP3_sendCmd( MP3_CMD_RESUME );
UART_sendString( UART0, "\r\n MP3 RESUMED");
GUI_controlPanelButtonStateSet(&BUTTON_PLAY_START);
} else {
Mp3Ctrl.Pause = TRUE;
MP3_sendCmd( MP3_CMD_PAUSE );
UART_sendString( UART0, "\r\n MP3 PAUSED");
GUI_controlPanelButtonStateSet(&BUTTON_PLAY_PAUSE);
}
TMRDelay(20);
do {
DSPC_readData((char*)&cmd, 1, ARM_DSP_DSPCCR);
} while( (cmd&DSP_CMD_MASK) != MP3_DECODE );
}
void MP3_toggleFF() {
volatile Uint16 cmd;
if( Mp3Ctrl.Pause == TRUE )
return;
cmd = 0;
DSPC_writeData((char*)&cmd, 1, ARM_DSP_DSPCCR);
if( Mp3Ctrl.FF == TRUE ) {
Mp3Ctrl.FF = FALSE;
MP3_sendCmd( MP3_CMD_RESUME );
UART_sendString( UART0, "\r\n MP3 RESUMED");
} else {
Mp3Ctrl.FF = TRUE;
MP3_sendCmd( MP3_CMD_FF );
UART_sendString( UART0, "\r\n MP3 FF in Progress");
}
TMRDelay(20);
do {
DSPC_readData((char*)&cmd, 1, ARM_DSP_DSPCCR);
} while( (cmd&DSP_CMD_MASK) != MP3_DECODE );
}
void MP3_PLAY_isr() {
Uint16 cmd;
ARMDSP_getArmCmd( &cmd, (Uint16*)&Mp3Status, sizeof(Mp3Status)/2 );
if( ( cmd & 0xFFF ) == ARM_CMD_MP3 ) {
if( Mp3Status.Status == MP3_STATUS_ERROR ||
Mp3Status.Status == MP3_STATUS_DEC_DONE
) {
Mp3Ctrl.Stop = TRUE;
} else {
Mp3Ctrl.NumBlksDecoded++;
Mp3Ctrl.DecDataSize = MAKE_WORD32( Mp3Status.DecSizeHigh, Mp3Status.DecSizeLow );
Mp3Ctrl.DecTime = Mp3Status.DecTime;
}
}
}
STATUS MP3_readBuff( Uint16 nBuff ) {
#ifdef MP3_FS_FILE
FILE_read( Mp3Ctrl.File, (char*)( Mp3Ctrl.BufferAddr + (Mp3Ctrl.BufferSize/3)*nBuff ),
Mp3Ctrl.BufferSize/3
);
#else
MEM_FILE_read( &Mp3Ctrl.File, (char*)(Mp3Ctrl.BufferAddr + (Mp3Ctrl.BufferSize/3)*nBuff ), Mp3Ctrl.BufferSize/3 );
#endif
UART_sendString(UART0, "." );
return E_PASS;
}
STATUS MP3_initMp3Ctrl() {
Mp3Ctrl.BufferAddr = AUDIO_BUFFER_ADDR;
Mp3Ctrl.BufferSize = AUDIO_BUFFER_SIZE;
Mp3Ctrl.CurBuff = 0;
Mp3Ctrl.NumBlksDecoded = 0;
Mp3Ctrl.Stop = FALSE;
Mp3Ctrl.Pause = FALSE;
Mp3Ctrl.FF = FALSE;
Mp3Ctrl.DecTime = 0;
#ifdef MP3_FS_FILE
{
char fname[300];
if( MP3_genFileName( fname ) != E_PASS ) {
sprintf( UART_outBuff, "\r\n\r\n E_DEVICE : MP3 files not found !!! ");
UART_sendString( UART0, UART_outBuff );
return E_DEVICE;
}
GUI_fileInfoPanelSetInfo(Mp3Ctrl.Mp3FileIndex);
Mp3Ctrl.File = FILE_open( fname, "rb", 0 );
if(Mp3Ctrl.File==NULL) {
sprintf( UART_outBuff, "\r\n\r\n E_DEVICE : [%s] MP3 file not found !!! ", fname );
UART_sendString( UART0, UART_outBuff );
return E_DEVICE;
}
FILE_sizeGet( Mp3Ctrl.File, (int*)&Mp3Ctrl.DecDataSize );
}
#else
Mp3Ctrl.DecDataSize = 0x600000; /* for now */
MEM_FILE_open( &Mp3Ctrl.File, MEM_FS_BUFFER_ADDR, "rb" );
#endif
Mp3Cmd.DataSizeHigh = HIGH_WORD( Mp3Ctrl.DecDataSize );
Mp3Cmd.DataSizeLow = LOW_WORD ( Mp3Ctrl.DecDataSize );
GUI_controlPanelSeekBarMaxPositionSet(Mp3Ctrl.DecDataSize);
Mp3Ctrl.DecDataSize = 0;
return E_PASS;
}
STATUS MP3_sendCmd( MP3_ACTION_ID mp3_action ) {
Mp3Cmd.ActionId = mp3_action;
ARMDSP_sendDspCmd( MP3_DECODE, (Uint16*)&Mp3Cmd, sizeof(Mp3Cmd)/2 );
return E_PASS;
}
void MP3_AIC23_init() {
// to enable Clock to 11.2896Mhz OSC in U1 socket on DM270 EVM. This used as clock by AIC23
{
GIO_ConfigData gio2;
gio2.dir = GIO_OUTPUT;
gio2.altUse = FALSE;
GIO_setConfig( GIO2, &gio2 );
GIO_clearBit( GIO2 );
}
AIC23_selectMode(FALSE);
AIC23_reset();
AIC23_L_lin_vol( 0, 0, 0x1F );
AIC23_R_lin_vol( 0, 0, 0x1F );
AIC23_L_hp_vol( 0, 1, 0x3F );
AIC23_R_hp_vol( 0, 1, 0x3F );
AIC23_A_path( 0, 0, 1, 0, 0, 1, 0);
AIC23_D_path( 0, 1, 0 );
AIC23_pow_ctrl( 0, 0, 0, 0, 0, 0, 0, 0);
AIC23_D_audio_fmt( 0, 0, 0, 0, 3);
AIC23_smpl_rate( 0, 0, 8, 0, 0);
AIC23_D_interface( 1 );
}
void MP3_AIC23_stop() {
AIC23_selectMode(FALSE);
AIC23_reset();
AIC23_pow_ctrl( 1, 1, 1, 1, 1, 1, 1, 1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -