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

📄 yampp3.c

📁 fat文件系统的源码 老外写的FAT32文件系统 还是有用的
💻 C
📖 第 1 页 / 共 3 页
字号:

			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 < &timestr[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 < &timestr[5])

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -