📄 yampp3.c
字号:
case EV_NEXTD: // Switch to next dir
wSongNum = checkdir() + wFirstInDir;
goto PLAY;
#ifdef ENABLE_NAVL
case EV_PREVL: // Switch to previous start letter
nTemp = nLastPosL - 1;
while (nTemp < nLastPosL)
{
if (LetterTable[nTemp].letter < *LONG_NAME)
break;
else
nTemp--;
}
if (nTemp >= nLastPosL)
nTemp = nLastPosL - 1;
wSongNum = LetterTable[nTemp].song_num;
goto PLAY;
case EV_NEXTL: // Switch to next start letter
for (nTemp = 1; nTemp < nLastPosL; nTemp++)
{
if (LetterTable[nTemp].letter > *LONG_NAME)
break;
}
if (nTemp >= nLastPosL)
nTemp = 0;
wSongNum = LetterTable[nTemp].song_num;
goto PLAY;
#endif
#ifdef ENABLE_NUMERIC
case EV_NUMBER:
pTrack = number;
tot_sw = 10;
goto DISPUPD;
#endif
case EV_PREV10: wSongNum -= 10; goto PLAY;
case EV_NEXT10: wSongNum += 10; goto PLAY;
case EV_PREV:
#ifdef NEW_PREV
if(dwPlayed > 0x0600)
goto PLAY;
#endif
if (bRandom == 0) // in normal mode
{
if (wSongNum == 0)
wSongNum = wMaxSongs - 1;
else
wSongNum--;
goto PLAY;
}
else
goto RAND; // in any random mode
case EV_NEXT:
NEXT_SONG: if (bRandom == 0)
{
wSongNum++; // in normal mode
goto PLAY;
}
RAND: switch (bRandom)
{
case 1: wSongNum = do_rand(wMaxSongs); // random from all songs on disk
break;
case 2: nTemp = do_rand(checkdir()); // random from current directory
if (nTemp == -1) // no more songs in current dir.
{
nTemp = checkdir(); // calculate number of first song
wSongNum = nTemp + wFirstInDir; // in next directory
if (wSongNum >= wMaxSongs)
wFirstInDir = wSongNum = 0;
nTemp = do_rand(checkdir()); // random from this directory
}
wSongNum = nTemp + wFirstInDir; // set new song number
break;
}
// fall through
case EV_PLAY:
eeprom_wb(EEPROM_AUTOPLAY,true); // Write autoplay flags
PLAY:
lcd_clrscr();
lcd_puts_p(PSTR("Loading..."));
vs1001_reset(bLoudness); // Mandatory!
if (wSongNum >= wMaxSongs) // Protect for song number error
wSongNum = 0;
if (!get_dir_entry(wSongNum)) // Find song
{
if (!get_dir_entry(wSongNum)) // Not found ??? Try again.
{ wSongNum = 0; // Something wrong
continue;
}
}
eeprom_ww(EEPROM_SONGPOS, wSongNum);
PRINT_p(PSTR("\nPlaying #"));
pTrack = unsigned2str(wSongNum + 1, trackstr);
PRINT(pTrack);
UART_SendByte(' ');
#if (LCD_LINES == 2)
scroll_line = src = strcat(DIR_NAME, LONG_NAME);
#else
scroll_line = src = LONG_NAME;
#ifdef DIR_SCROLL
dir_scroll_line = DIR_NAME;
dir_scroll_length = strlen(DIR_NAME);
dir_scroll_pos = 0;
#endif
#endif
scroll_pos = 0;
scroll_length = 4; // To add ' >> ' sign
while (*src++)
scroll_length++;
src--;
lcd_clrscr();
#if (LCD_LINES == 2)
PRINT(scroll_line); // directory and file name
lcd_puts(scroll_line);
#endif
if(scroll_length > LCD_LINE_LENGTH+4) // only if scrolling needed
{
*((u32*)src)++ = 0x203E3E20L; // adding " >> " sign
*src = 0;
}
#if (LCD_LINES == 4)
// dir name centering
#ifdef DIR_SCROLL
if(dir_scroll_length < LCD_LINE_LENGTH) // only if no dir name scrolling
lcd_gotoxy(LCD_LINE_LENGTH/2 - (dir_scroll_length+1)/2, 0);
#else //DIR_SCROLL
i= strlen(DIR_NAME);
if(i < LCD_LINE_LENGTH) // only if no dir name scrolling
lcd_gotoxy(LCD_LINE_LENGTH/2 - (i+1)/2, 0);
#endif //DIR_SCROLL
lcd_puts(DIR_NAME); // display directory
PRINT(DIR_NAME);
PRINT_p(PSTR(" / "));
lcd_gotoxy(0,1); // Second line = filename
lcd_puts(LONG_NAME); // Just display it
PRINT(LONG_NAME);
#endif // (LCD_LINES == 4)
wAddTime = 0;
dwPlayed = 0;
#ifdef REMAIN_TIME
wSongTime = (u16)(dwFileSize / (4 * 125)); // Song time calculation
#endif
nDispUpd = tot_sw = 10;
load_buffers();
bPlaying = true;
#ifdef OLD_VS1001
wPlayT = 0;
#endif
lcd_frame();
break;
case EV_STOP:
vs1001_reset(0); // VS1001 reset for flush buffer
bPlaying = false;
lcd_clrscr();
lcd_puts_p(PSTR(" yampp-3 STOP"));
eeprom_wb(EEPROM_AUTOPLAY,false); // write autoplay flag
LastEntry = -1;
ATA_SpinDown(); // spindown HDD
break;
case EV_VOLDN:
if (nVolume <= MIN_VOLUME-VOL_STEP)
nVolume += VOL_STEP;
else
nVolume = MIN_VOLUME;
goto SETVOL;
case EV_VOLUP:
if (nVolume >= VOL_STEP)
nVolume -= VOL_STEP;
else
nVolume = 0;
SETVOL: setvolume(nVolume);
break;
case EV_LOUDNESS:
bLoudness = !bLoudness;
*(loudstr+4) = bLoudness ? '+' : '-';
vs1001_write(VS1001_MODE, 0x0080 * (bLoudness == true)); // write bit SM_BASS to VS1001K
eeprom_wb(EEPROM_LOUDNESS, bLoudness);
tot_sw = 14;
goto DISPUPD;
#ifdef REMAIN_TIME
case EV_REMAIN:
bTimeMode = !bTimeMode;
tot_sw = 0;
goto DISPUPD;
#endif
case EV_RANDOM:
bRandom = (bRandom + 1) % 3 ; // change random mode from 0 to 2
*(randstr+4) = randmod[bRandom];
eeprom_wb(EEPROM_RANDOM, bRandom);
tot_sw = 12;
DISPUPD: nDispUpd = 10;
break;
//jesper 011207 start
case EV_PAUSE:
event = EV_IDLE;
#if (LCD_LINES == 2)
lcd_gotoxy(LCD_LINE_LENGTH - 6 - 2*(LCD_LINE_LENGTH != 16),1); // 2 line
lcd_puts_p(PSTR("Paused"));
#else
lcd_gotoxy(0,2); // 3 line
lcd_puts_p(PSTR("Paused"));
printsp();
#endif
while (rec80_active()) ; // wait for key release
do
{
WDR; // Give watchdog full time
if (UART_HasChar()) // Check all input controls
event = get_char_event();
if (rec80_active())
event = ir_event();
if (event == EV_IDLE)
event = get_key_event();
} while (event == EV_IDLE);
#if (LCD_LINES == 4)
#ifdef PROGRESBAR_II
lcd_frame();
#else
lcd_gotoxy(0,2); // 3 line
printsp();
#endif
#endif //(LCD_LINES == 4)
break;
//jesper 011207 end
#ifdef FFWD_SEARCH
case EV_FFWD:
for (i = 0; i < 0x18000 / CLUSTER_SIZE; i++) // Number of clusters to skip 6 second
{
if (!ReadNextCluster()) // Skip clusters,
goto NEXT_SONG; // Play next song
dwPlayed += CLUSTER_SIZE / 32; // Update pumped bytes counter
}
wAddTime += 6; // Its accurate only for 128kbps files
// and no room for best calculation
// on VBR files its totally imposible
SEARCHGO: vs1001_setvolume(nVolume+40, nVolume+40); // Decrease volume by 20dB for eliminate
// sound scratches
bFfwdMute = true;
load_buffers();
tot_sw = 0;
goto DISPUPD;
#endif // FFWD_SEARCH
#ifdef FREW_SEARCH
case EV_FREW:
if (wBackStepPos > 0)
{
dwCurrentCluster = Rev_Table[--wBackStepPos];
dwPlayed = wBackStepPos * (0x18000 / 32);
wAddTime -= 5;
lcd_frame();
goto SEARCHGO;
}
#endif
default:
break;
} // switch (event)
event = EV_IDLE; // We always go back to IDLE when
// exiting switch
if (bPlaying)
{
#ifdef ENABLE_NUMERIC
if (LastEvent == EV_NUMBER && (nKeyTime > 14 || pNum == number+4))
{
LastEvent = EV_IDLE;
nTemp = Numb2Int();
pNum = number;
*pNum = 0;
if (nTemp <= wMaxSongs)
{
wSongNum = nTemp-1;
goto PLAY;
}
pTrack = unsigned2str(wSongNum + 1, trackstr);
}
#endif
//-------------------READ MPEG STREAM FROM HDD AND SENDING DATA TO VS1001 ---------------------------
nWrites = MAX_CONS_WRITES; // This count prevents indefinite
// data sending to VS1001
while (bit_is_set(PINB, PB2) && pUpdBuf == 0)
{
vs1001_send_32(pPlayData); // Feed data to VS1001
pPlayData += 32; // Advance pointer
if (pPlayData == BUFFER2P+BUFFER_SIZE) // End of Buffer 2
{
pPlayData = BUFFER1P; // Pointer to Start buffer1
pUpdBuf = BUFFER2P; // Reload Buffer2
}
else if (pPlayData == BUFFER1P+BUFFER_SIZE) // End of Buffer 1
{
pUpdBuf = BUFFER1P; // Reload Buffer1
}
dwPlayed++; // Count already pumped blocks (32 bytes)
if (--nWrites == 0) // if vs1001 needs to more data
{
vs1001_reset(bLoudness); // try resetting it
break;
}
}
if (bFfwdMute && (nDispUpd == 3)) // If fast forward volume downed
{
vs1001_setvolume(nVolume,nVolume); // Restore volume
bFfwdMute = false;
}
i = CheckAndAdvanceCluster();
if (pUpdBuf && i != NO_DATA) // if any buffer need reload
{
ReadBuffer(pUpdBuf); // reload buffer
pUpdBuf = 0; // mark as just loaded
}
#ifdef CHECK_FILESIZE
if ((i == NO_DATA && pUpdBuf) || (dwPlayed >= dwFileSize)) // No more data to play
#else
if (i == NO_DATA && pUpdBuf) // No more data to play
#endif
{ // Try to autoplay next song
event = EV_NEXT;
continue;
}
if (nDispUpd >= 5) // Update display info every 500ms
{
#ifdef ENABLE_LCD
if (scroll_length > LCD_LINE_LENGTH+4) // Scroll song name every 500ms
{ // if its length is more than lcd length
lcd_gotoxy(0, LCD_LINES/2 - 1);
for (nTemp = 0; nTemp < LCD_LINE_LENGTH; nTemp++)
lcd_putchar(scroll_line[(scroll_pos + nTemp) % scroll_length]);
scroll_pos++;
}
#if (LCD_LINES == 4) && (defined DIR_SCROLL)
if (dir_scroll_length > LCD_LINE_LENGTH) // Scroll dir name
{ // if its length is more than LCD row chars
lcd_gotoxy(0,0);
for (nTemp = 0; nTemp < LCD_LINE_LENGTH; nTemp++)
lcd_putchar(dir_scroll_line[(dir_scroll_pos + nTemp) % dir_scroll_length]);
dir_scroll_pos++;
}
#endif
dispbar();
dst = timestr;
//--------------------------------------------------------------------------------------------------------------------
#if (LCD_LINES == 2)
#ifdef REMAIN_TIME
lcd_gotoxy(LCD_LINE_LENGTH - 7 - 2*(LCD_LINE_LENGTH != 16), 1); // Line 2
#else
lcd_gotoxy(LCD_LINE_LENGTH - 6 - 2*(LCD_LINE_LENGTH != 16), 1); // Line 2
#endif
if (tot_sw < 10) // 0-9
{
src = timestr;
#ifdef OLD_VS1001
wPlayTime = wPlayT / 10 + wAddTime; // seconds
#ifdef FREW_SEARCH
if (wPlayTime > 32768) wAddTime = -(wPlayT / 10);
#endif
#else //OLD_VS1001
wPlayTime = vs1001_read(VS1001_PLAYTIME) + wAddTime;
#endif //OLD_VS1001
#ifdef REMAIN_TIME
if (bTimeMode)
{
wPlayTime = wSongTime - wPlayTime;
lcd_putchar('-');
}
else
lcd_putchar(' ');
#endif
if (wPlayTime < 0) wPlayTime = 0;
divt = udiv(wPlayTime, 600);
*src++ = '0' + (u08)divt.quot % 10; // song time up to 99 min
divt = udiv(divt.rem, 60);
*src++ = '0' + (u08)divt.quot;
*src++ = ':';
divt = udiv(divt.rem, 10);
*src++ = '0' + (u08)divt.quot;
*src++ = '0' + (u08)divt.rem;
*src = 0;
}
else if (tot_sw < 12) // 10-11
{
*dst++ = '#';
src = pTrack;
while ((*dst = *src++)) dst++;
while (dst < ×tr[5])
*dst++ = ' ';
dst = timestr;
}
else if (tot_sw < 14) // 12-13
{
dst = randstr;
}
else if (tot_sw < 16) // 14-15
{
dst = loudstr;
}
#ifdef REMAIN_TIME
if (tot_sw > 9)
lcd_putchar(' ');
#endif
tot_sw += 1;
if (tot_sw >= 16)
tot_sw = 0;
lcd_puts(dst);
#if (LCD_LINE_LENGTH != 16)
lcd_putchar(' '); // separator
lcd_putchar(1); // speaker sign
#endif
#endif //(LCD_LINES == 2)
//--------------------------------------------------------------------------------------------------------------------
#if (LCD_LINES == 4)
#ifdef REMAIN_TIME
lcd_gotoxy(LCD_LINE_LENGTH - 6,2); // Line 3
#else
lcd_gotoxy(LCD_LINE_LENGTH - 5,2); // Line 3
#endif
src = timestr;
#ifdef OLD_VS1001
wPlayTime = wPlayT / 10 + wAddTime; // seconds
#ifdef FREW_SEARCH
if (wPlayTime > 32768) wAddTime = -(wPlayT / 10);
#endif
#else //OLD_VS1001
wPlayTime = vs1001_read(VS1001_PLAYTIME) + wAddTime;
#endif //OLD_VS1001
#ifdef REMAIN_TIME
if (bTimeMode)
{
wPlayTime = wSongTime - wPlayTime;
lcd_putchar('-');
}
else
lcd_putchar(' ');
#endif
if (wPlayTime < 0) wPlayTime = 0;
divt = udiv(wPlayTime, 600);
*src++ = '0' + (u08)divt.quot % 10; // song time up to 99 min
divt = udiv(divt.rem, 60);
*src++ = '0' + (u08)divt.quot;
*src++ = ':';
divt = udiv(divt.rem, 10);
*src++ = '0' + (u08)divt.quot;
*src++ = '0' + (u08)divt.rem;
*src = 0;
lcd_puts(dst); // display time, line 3, x= 15 - 19
lcd_putchar('\n'); // goto line 4
dst = timestr;
*dst++ = '#';
src = pTrack;
while ((*dst = *src++)) dst++;
while (dst < ×tr[5])
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -