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

📄 mp3_play.c

📁 dm270 source code
💻 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 + -