📄 nx58_dec.c
字号:
//#################################################
// NX5858 MP3 Demo program
// Contents : MP3 Decoding Function
// Hardware model : NX5858 Demo Board
// Main CPU : STANDARD 8032
// Compiler : Keil uVision2
//
// Copyrigt : NEXIA Device. INC
// Date : 2005. 8.20
// Last modifier : 2005. .
// File name : NX58_dec.c
//#################################################
#include "dec_extern.h"
#define DEC_TEST
#ifdef CLASS_D_AMP
code unsigned char nx5858_vol_value[31] = {
0x7F, 0x58, 0x54, 0x50, 0x4C, 0x49, 0x46, 0x43, 0x40, 0x3D, 0x3A,
0x37, 0x34, 0x31, 0x2E, 0x2B, 0x28, 0x25, 0x23, 0x21, 0x1F,
0x1D, 0x1B, 0x19, 0x17, 0x15, 0x14, 0x13, 0x12, 0x11, 0x10,
};
#endif
xdata UINT8 vol_mask_init = 1;
xdata UINT32 pre_DecodingSectorCnt;
xdata UINT32 pre_DecodingSectorCnt1;
#ifdef FADE_IN_FUNC
xdata UINT8 audio_fad;
#endif
xdata UINT8 eq_graph_enable;
/************************************************/
xdata UINT8 key_check; //
xdata _fileio *pFileIO = &FILE_INFO.FileIO;//NAV
#ifndef G5_BOARD
xdata UINT8 current_bat_value, previous_bat_value;
#else
xdata UINT8 previous_bat_value;
#endif
xdata UINT8 Other_process;
xdata UINT32 pre_cluster;
xdata UINT8 vol_step_up;
xdata UINT8 pre_rtc_value;
xdata UINT8 bat_check_cnt;
xdata UINT8 pre_HEADER_SamplingFreq;
#ifdef FIVE_KEY_VER
idata bit vol_change=0;
#endif
#ifdef LYRIC_FUNC
xdata UINT8 init_lyric;
#endif
void LyricTestFunction(void);
#ifdef LYRIC_FUNC
void Vbr_Lyric_Init(void){
if((Is_LRC_file == LYRIC_YES_DIS_YES) && vbr_bitrate){
xdata UINT16 kkk;
kkk = (((FILE_INFO.DecodingSectorCnt*12)/125)/vbr_bitrate);
vbr_liyric_time = ((FILE_INFO.DecodingSectorCnt*4)/vbr_bitrate) + kkk;
init_lyric = 1;
}
}
#endif
#ifdef FADE_IN_FUNC
void FAD_IN_Message(void){
if(audio_fad) {
audio_fad = 0;
in_volume_value = 0x7f;
if(FILE_INFO.HEADER.stereo)
want_volume_value = 0x10;
else
want_volume_value = 0x10;
#ifdef CLASS_D_AMP
fade_in = 0;
#else
fade_in = 1;
#endif
}
}
#endif
void setVolume(UINT8 vol_value)
{
#ifdef CLASS_D_AMP
Volume_Setting(nx5858_vol_value[vol_value]);
#else
Codec_OUT1_Volume_Control(vol_value);
#endif
}
void Dec_Get_Next_Cluster()
{
xdata _fileio *pFileIO = &FILE_INFO.FileIO;
pFileIO->cluster = get_next_cluster(FAT0, pFileIO->cluster);
pFileIO->sector_cur = getFirstSectorofCluster(pFileIO->cluster);
if(file_total_sector < FILE_INFO.DecodingSectorCnt+BootSector.BPB_SecPerClus)
pFileIO->sector_end = pFileIO->sector_cur + (file_total_sector - FILE_INFO.DecodingSectorCnt);
else
pFileIO->sector_end = pFileIO->sector_cur + BootSector.BPB_SecPerClus;
}
void Dec_Lcd_Init()
{
if(Is_LRC_file != LYRIC_YES_DIS_YES){
#if defined L128x128 || defined L320x240
LcdDisplayImage(IMG_MP3_BG);
LoadBackGroundColor(IMG_MP3_BG_BACKGROUND);
#endif
}
else {
#if defined L128x128 || defined L320x240
LcdDisplayImage(IMG_LYRIC_BG);
LoadBackGroundColor(IMG_LYRIC_BG_BACKGROUND);
#endif
}
#if defined L128x128 || defined L320x240
UI_DISPLAY(UI_VOLUME, volume_value);
#ifdef FIVE_KEY_VER
LcdDisplayImage(IMG_VOLUME);
#endif
UI_DISPLAY(UI_AB, AB_REPEAT.mode);
UI_DISPLAY(UI_BATTERY, Check_BAT());
#endif
if(Is_LRC_file != LYRIC_YES_DIS_YES){
#if defined L320x240
UI_DISPLAY(UI_TRACK, DONTCARE);
UI_DISPLAY(UI_BITRATE, DONTCARE);
if(decode_state == DECODE_STATE){
UI_DISPLAY(UI_PLAYMODE,ICON_PLAY);
}else{
UI_DISPLAY(UI_PLAYMODE,ICON_PAUSE);
}
UI_DISPLAY(UI_DEC_TIME, 0);
UI_DISPLAY(UI_FILETYPE, file_type);//mp3
UI_DISPLAY(UI_EQ, eq_mode);
UI_DISPLAY(UI_REPEAT,repeat_mode);
#elif defined L128x128
if(eq_graph_enable){
LcdDisplayImage(IMG_EQ_GRAPH_RIGHT);
}
else{
LcdDisplayImage(IMG_BPS_TRACK_RIGHT);
UI_DISPLAY(UI_TRACK, DONTCARE);
UI_DISPLAY(UI_BITRATE, DONTCARE);
}
if(decode_state == DECODE_STATE){
UI_DISPLAY(UI_PLAYMODE,ICON_PLAY);
}else{
UI_DISPLAY(UI_PLAYMODE,ICON_PAUSE);
}
UI_DISPLAY(UI_DEC_TIME, 0);
UI_DISPLAY(UI_FILETYPE, file_type);//mp3
UI_DISPLAY(UI_EQ, eq_mode);
UI_DISPLAY(UI_REPEAT,repeat_mode);
#elif defined L96x64
LcdDisplayImage(IMG_MP3_BACK_PAPER, 0, 0, 96, 64);
LoadBackGroundColor(IMG_MP3_BACKGROUND);
LCD_UI_Init();
#elif defined MONO_LCD
UI_DISPLAY(UI_TRACK, DONTCARE);
UI_DISPLAY(UI_BITRATE, DONTCARE);
UI_DISPLAY(UI_VOLUME, volume_value);
UI_DISPLAY(UI_PLAYMODE,ICON_PLAY);
UI_DISPLAY(UI_FILETYPE, file_type);//mp3
#endif
if(sub_mode_in_play == DEC_DEC) {
#if defined L128x128 || defined L320x240
UI_DISPLAY(UI_FILETYPE, file_type);//MP3
#elif defined L96x64
UI_DISPLAY(UI_FILETYPE, file_type);
#endif
}
#if defined L128x128
#elif defined L96x64
UI_DISPLAY(UI_PLAYSPEED, play_speed);
if(AB_REPEAT.mode) // if AB_REPEAT.mode != 0
UI_DISPLAY(UI_AB, AB_REPEAT.mode-1);
else
UI_DISPLAY(UI_REPEAT,repeat_mode);
#endif
#if defined L320x240
Lcd_Dis_Dir(44, IMAGE_BUFF1, F_WHITE);
#elif defined L128x128
Lcd_Dis_Dir(21, IMAGE_BUFF1, F_WHITE);
#elif defined L96x96
Lcd_Dis_Dir(21, IMAGE_BUFF1, F_BLACK);
#elif defined L96x64
#elif defined MONO_LCD
LcdDisplayImage(IMG_PMODE_MUSIC);
Lcd_Dis_Dir(2, IMAGE_BUFF1, F_WHITE);
#endif
}
else {
#if defined L320x240
UI_DISPLAY(UI_TRACK, DONTCARE);
UI_DISPLAY(UI_BITRATE, DONTCARE);
if(decode_state == DECODE_STATE){
UI_DISPLAY(UI_PLAYMODE,ICON_PLAY);
}else{
UI_DISPLAY(UI_PLAYMODE,ICON_PAUSE);
}
UI_DISPLAY(UI_DEC_TIME, 0);
UI_DISPLAY(UI_FILETYPE, file_type);//mp3
UI_DISPLAY(UI_EQ, eq_mode);
UI_DISPLAY(UI_REPEAT,repeat_mode);
#endif
}
}
UINT8 EL_Off_Check(void){
if(el_time) {
#ifdef G5_BOARD
if ((BACKLIGHT_TIME[el_time] < backlight_time_count) || (LcdOnOff_Status == LCD_DISPLAY_OFF))
#else
if(BACKLIGHT_TIME[el_time] < backlight_time_count)
#endif
{
backlight_time_count = 0;
current_key = KEY_NONE;
LcdDisplayOn(LCD_DISPLAY_ON); //DISPLAY ON
#ifdef G5_BOARD
BACKLIGHT_ON;
#endif
#if defined L320x240
Set_System_Clk(SC96M);
#endif
return 0;
}
else
backlight_time_count = 0;
}
}
void Repeat_Message(UINT8 force){
switch(repeat_mode) {
case 0:// normal
ff_rew_course = SEQ_NEXT_DSC;
break;
case 1: // repeat one
if(force)
ff_rew_course = SEQ_NEXT_DSC;
else
ff_rew_course = CURRENT;
break;
case 2: // repeat in folder
ff_rew_course = SEQ_NEXT_FOLDER;
break;
case 3: // all folder repeat
ff_rew_course = SEQ_NEXT_DSC;
break;
case 4:// random repeat in folder
ff_rew_course = RND_IN_ONE;
break;
#ifdef G5_BOARD
case 5:// intro in all folder
ff_rew_course = SEQ_NEXT_DSC;
break;
#else
case 5:// random repeat in all folder
ff_rew_course = RND_IN_TOT;
break;
case 6:// intro in all folder
ff_rew_course = SEQ_NEXT_DSC;
break;
#endif
}
}
UINT8 check_decode_key()
{
xdata _subdir_navi *SubDirInfo = ((_subdir_navi volatile xdata *)(SUBDIR_BUFF+0x10000));
xdata _subdir_navi *NAV_SubDirInfo = ((_subdir_navi volatile xdata *)(NAV_SUBDIR_BUFF+0x10000));
if(KEY.bc.bPUSH) {
KEY.bc.bPUSH = 0;
EL_Off_Check();
if(AB_REPEAT.mode != 0) {
switch(current_key) {
case KEY_VOLUP:
case KEY_VOLDN:
case KEY_REC://A_B repeat
case KEY_PLAY:
case KEY_LPLAY:
case KEY_FF:
case KEY_REW:
case KEY_LMODE:
case KEY_MODE: break;
default:
KEY.bc.bPUSH = 0;
return 0;
break;
}
}
#ifdef G5_BOARD
if(repeat_mode == 5)
#else
if(repeat_mode == 6)
#endif
{
switch(current_key) {
case KEY_FF:
case KEY_REW:
case KEY_LFF:
case KEY_LREW:
#if defined FIVE_KEY_VER
case KEY_ESC:
#endif
repeat_mode = 0;
UI_DISPLAY(UI_REPEAT,repeat_mode);
KEY.bc.bPUSH = 0;
return 0;
break;
}
}
if(decode_state == PAUSE_STATE){
switch(current_key) {
#ifndef IDLE_STOP_MODE
case KEY_FF:
case KEY_REW:
#endif
#if defined FIVE_KEY_VER
case KEY_ESC:
#endif
case KEY_LFF:
case KEY_LREW:
case KEY_REC://A_B repeat
KEY.bc.bPUSH = 0;
return 0;
break;
}
}
switch(current_key) {
#if defined FIVE_KEY_VER
case KEY_ESC:
vol_change=~vol_change;
if (!vol_change)
LcdDisplayImage(IMG_VOLUME);
else
UI_DISPLAY(UI_VOLUME, volume_value);
break;
#endif
case KEY_REW:
#if defined FIVE_KEY_VER
if(!vol_change){
#endif
#ifdef IDLE_STOP_MODE
if(decode_state == PAUSE_STATE){
sub_mode_in_play = DEC_DEC;
FuncInMode = PAUSE_STATE;
decode_state = MODE_EXIT_STATE;
ff_rew_course = CURRENT; // 泅犁邦栏肺...
return 1;
}
#endif
#ifndef G5_BOARD
if(FILE_INFO.DecodingSectorCnt/FILE_INFO.HEADER.BufcntInSec > 3){
ff_rew_course = CURRENT;
}
else{
switch(repeat_mode) {
case 0://"N" Normal
case 1://"1" repeat one
case 3://"A" All folder repeat
ff_rew_course = SEQ_REW;
break;
case 2://"F" folder repeat //弃歹 郴俊辑父 ..
ff_rew_course = SEQ_PREV_FILE;
break;
case 4://"S.F" random folder repeat
ff_rew_course = RND_IN_ONE;
break;
case 5://"S.A" all folder repeat
ff_rew_course = RND_IN_TOT;
break;
}
}
#else
ff_rew_course = SEQ_REW;
#endif
decode_state = FF_REW_STATE;
KEY.bc.bPUSH = 0;
return 1;
#if defined FIVE_KEY_VER
}
else
{
if(volume_value <= 1){
volume_value = 0;
Mp3_Mute_On();
}
else{
volume_value --;
}
setVolume(volume_value);
display_update = 3;
UI_DISPLAY(UI_VOLUME, volume_value);
}
break;
#endif
case KEY_FF:
#if defined FIVE_KEY_VER
if(!vol_change){
#endif
#ifdef IDLE_STOP_MODE
if(decode_state == PAUSE_STATE){
sub_mode_in_play = DEC_DEC;
FuncInMode = PAUSE_STATE;
decode_state = MODE_EXIT_STATE;
ff_rew_course = CURRENT; // 泅犁邦栏肺...
return 1;
}
#endif
decode_state = FF_REW_STATE;
#ifndef G5_BOARD
Repeat_Message(1);
#else
ff_rew_course = SEQ_NEXT_DSC;
#endif
KEY.bc.bPUSH = 0;
return 1;
#if defined FIVE_KEY_VER
}
else
{
volume_value ++;
if(volume_value > VOL_MAX_VALUE)
volume_value = VOL_MAX_VALUE;
else if(volume_value == 1)
Mp3_Mute_Off();
setVolume(volume_value);
display_update = 3;
UI_DISPLAY(UI_VOLUME, volume_value);
}
break;
#endif
#ifndef FIVE_KEY_VER
case KEY_LVOLUP:
case KEY_VOLUP:
volume_value ++;
if(volume_value > VOL_MAX_VALUE)
volume_value = VOL_MAX_VALUE;
else if(volume_value == 1)
Mp3_Mute_Off();
setVolume(volume_value);
display_update = 3;
UI_DISPLAY(UI_VOLUME, volume_value);
break;
case KEY_LVOLDN:
case KEY_VOLDN:
if(volume_value <= 1){
volume_value = 0;
Mp3_Mute_On();
}
else{
volume_value --;
}
setVolume(volume_value);
display_update = 3;
UI_DISPLAY(UI_VOLUME, volume_value);
break;
#endif
case KEY_REC:
if (AB_REPEAT.mode == 0){
AB_REPEAT.mode = 1;
}
else if (AB_REPEAT.mode == 1){
AB_REPEAT.mode = 2;
AB_REPEAT.end_cluster = FILE_INFO.FileIO.cluster;
}
else if (AB_REPEAT.mode == 2){
AB_REPEAT.mode = 0;
}
#ifndef L320x240
if(Is_LRC_file != LYRIC_YES_DIS_YES){
#endif
#if defined L128x128 || defined L320x240
UI_DISPLAY(UI_AB, AB_REPEAT.mode);
#elif defined L96x64
UI_DISPLAY(UI_REPEAT,repeat_mode);
#endif
#ifndef L320x240
}
#endif
break;
case KEY_LFF:
#if defined FIVE_KEY_VER
if(!vol_change){
#endif
Mp3_Mute_On();
Dma_B0_PERI2RAM_Close();
Dma_B0_RAM2PERI_Close();
if(Is_LRC_file != LYRIC_YES_DIS_YES){
UI_DISPLAY(UI_PLAYMODE, ICON_FF);
scrolltitle(SCROLL_PAGE1, 0, BG_COLOR, F_WHITE);
scrolltitle(SCROLL_PAGE2, 1, BG_COLOR, F_WHITE);
}
while(KEY.bc.bFF) {
if(FF_Search( 20)){
ff_rew_course = SEQ_FAST_NEXT;
decode_state = FF_REW_STATE;
return 1;
}
#ifndef L320x240
if(Is_LRC_file != LYRIC_YES_DIS_YES){
#endif
if(UI_DISPLAY(UI_DEC_TIME, 1));
else {
#if defined L320x240
bar_temp = (File_Size>>9)/190;
#elif defined L128x128
bar_temp = (File_Size>>9)/79;
#elif defined L96x64
bar_temp = (File_Size>>9)/42;
#elif defined MONO_LCD
bar_temp = (File_Size>>9)/80;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -