亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? yampp3.c

?? Yet Another MP3 Player source code. It can be usefull as reference source for any project.
?? C
?? 第 1 頁 / 共 2 頁
字號(hào):
/*
  Copyright (C) 2001 Jesper Hansen <jesperh@telia.com>.

  Rewritten by: Nikolai Vorontsov <nickviz@mail.be>

  This file is part of the yampp system.

  This program is free software; you can redistribute it and/or
  modify it under the terms of the GNU General Public License
  as published by the Free Software Foundation; either version 2
  of the License, or (at your option) any later version.

  This program is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  GNU General Public License for more details.

  You should have received a copy of the GNU General Public License
  along with this program; if not, write to the Free Software Foundation, 
  Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
*/



/*
	PIN assignements on test board
	
	PA0-PA7		data bus 0..7 + Address 0..7
	PC0-PC7		address 8..15	
	
	PB0		T0		DIOW		ATA out
	PB1		T1		DIOR		ATA out
	PB2		AIN0	DREQ		VS1001 in		
	PB3		AIN1	BSYNC		VS1001 out
	PB4		SS		MP3			VS1001 out
	PB5		MOSI	SO			VS1001 out
	PB6		MISO 	SI			VS1001 in
	PB7		SCK		SCK			VS1001 out

	PD0		RxD		RS-232		UART in
	PD1		TxD		RS-232		UART out
	PD2		INT0	IR_INPUT	IR in
	PD3		INT1	KEY_INPUT	KEY in
	PD4		T0		
	PD5		T1		LCD_ENABLE	LCD out
	PD6		WR		WR			RAM out
	PD7		RD		RD			RAM out
*/


#include <stdlib.h>
#include <io.h>
#include <progmem.h>
#include <eeprom.h>
#include <sig-avr.h>
#include <interrupt.h>
#include <wdt.h>

#include "Constants.h"
#include "types.h"
#include "mem.h"
#include "delay.h"
#include "ata_if.h"
#include "fat.h"
#include "vs1001.h"
#include "rec80.h"
#include "uart.h"
#include "lcd.h"


// Amount of small steps in LCD play position bar
#define LCD_STEPS 50

// Amount of buffers writed before relinquish control
#define MAX_CONS_WRITES 128

typedef enum
{
	EV_IDLE,
	EV_PLAY,
	EV_STOP,
	EV_PAUSE,
	EV_NEXT,
	EV_PREV,
	EV_NEXT10,
	EV_PREV10,
	EV_VOLUP,
	EV_VOLDN,
	EV_NEUTRAL,
	EV_MUTE,
	EV_RANDOM,
	EV_NEXTL,
	EV_PREVL,
	EV_LOUDNESS,
	EV_LASTEVENT	
} event_e;	


// Auxilliary functions declarations
void sectordump(u32 sector);
u08* unsigned2str(u16 track, u08 *str);
event_e get_char_event(void);
event_e ir_event(void);
event_e get_key_event(void);
void send_sinewave_beeps(void);
void userchars(void);
void setvolume(u08 v);
void dispbar(void);
bool RetrieveMP3Data(void);


// Global variables
u08 scroll_length	= 0;
u08 scroll_pos		= 0;
char *scroll_line	= 0;


bool bPlaying		= false;		// Current state - play/stop
u08 *pPlayData		= 0;			// Pointer to current position in currently
									//  used buffer
u08 *pPlayBufStart	= 0;			// Pointer to currenly used buffer
u32 dwPlayed		= 0;			// Amount of already played bytes

// timer 1 routines
//
//	At 8MHz clock :			100 mS divisor		8bit overflow
//	tClk 		= 125 nS 	   200000				32 uS (31250 Hz)
//	tClk/8 		=   1 uS		50000 			   128 uS (7812.5 Hz)
//	tClk/64		=   8 uS	 	12500			   512 us (1953.125 Hz)
//	tClk/256	=  32 uS		 3125	 		  2048 uS
//	tClk/1024	= 128 uS	 	  781.25		  8192 uS
//
// prescaler set to 32 uS
// 3125 ticks = 100 mS (for 8MHz!)

#define TI1_H	(((u16)-(F_CPU / 2560)) >> 8)
#define TI1_L	(((u16)-(F_CPU / 2560)) & 0xff )

volatile u08 nDispUpd = 0;			// Counter for display update loop
volatile u08 nScrollUpd = 0;		// Counter for name scroll loop
volatile u08 nKeyTime = 0;			// Counter for keypress time check - Added by MIS

SIGNAL(SIG_OVERFLOW1)				// Timer1 overflow every 100 mS
{
	nDispUpd++;
	nScrollUpd++;
	nKeyTime++;
	outp(TI1_H, TCNT1H);			// Reload timer
	outp(TI1_L, TCNT1L);
}


// Random stuff, maximum 65535 songs on the disk!
#define MY_RAND_MAX  	65535
static u32 seed = 1;

u16 do_rand(u16 max)				// returned random value from 0 to max - 1
{
	return ((seed = seed * 1103515245L + 12345) % max);
}


u08 *randstr  = "Rand*";
u08 *loudstr  = "Loud*";
u08 trackstr[6], *pTrack, timestr[6], tot_sw = 0;

//----------------------------------------------------------------------------
// Main part
//----------------------------------------------------------------------------
int main(void)
{
	bool bAutoPlay = true, bRandom = true;	// Modificators
	bool bLoudness = true;					// Modificators
	u08 nVolume = 0;						// Current volume level
	u16 wSongNum = 0;						// Current playing song
	u16 wPlayTime;							// Current play time
	u16 wMaxSongs = 1;						// Maximum available songs
	u08 nWrites, nBursts;					// Buffering variables
	event_e event = EV_IDLE;				// Current event
	u08 nTemp, *src, *dst, *pTemp;			// Temporary variables
	u16 i;
	udiv_t divt;

//----------------------------------------------------------------------------
// B - Port
//----------------------------------------------------------------------------
	sbi(PORTB, 0);		// DIOW- hi
	sbi(DDRB,  0);		// Pin PB0 is output, DIOW- 
	sbi(PORTB, 1);		// DIOR- hi
	sbi(DDRB,  1);		// Pin PB1 is output, DIOR- 
	cbi(DDRB,  2);		// Pin PB2 is input, DEMAND
	sbi(PORTB, 2);		// Activate pullup
	// PB3 and PB4 is used for BSYNC and MP3 signals to VS1001
	// PB5 (MOSI) is used for SPI
	// PB6 (MISO) is used for SPI
	// PB7 (SCK) is used for SPI

//----------------------------------------------------------------------------
// D - Port
//----------------------------------------------------------------------------
	// PD0 and PD1 are TX and RX signals
	// PD2 is used for the IR receiver
	cbi(DDRD, 3);		// Pin PD3 is keyboard input
	// PD4 is available, but activate pullup to aviod noice problem
	sbi(PORTD, 4);	
	// PD5 is LCD_ENABLE used by LCD module
	// PD6 and PD7 are RD and WR signals
	// but we need to set their default states used
	// when the external memory interface is disabled
    // they should then both be high to avoid disturbing
	// RAM contents
	sbi(DDRD,  6);		// As outputs
	sbi(DDRD,  7);
	sbi(PORTD, 6);		// And both hi
	sbi(PORTD, 7);

//----------------------------------------------------------------------------
// Timer 1
//----------------------------------------------------------------------------
	// setup timer1 for a 100mS periodic interrupt
	outp(0, TCCR1A);
	outp(4, TCCR1B);				// Prescaler /256  tPeriod = 32 uS
	outp(TI1_H, TCNT1H);			// Load counter value hi
	outp(TI1_L, TCNT1L);			// Load counter value lo

//----------------------------------------------------------------------------
// Initialization
//----------------------------------------------------------------------------
    lcd_init(0, LCD_FUNCTION_DEFAULT);
	userchars();		// Construct some user definable characters
	lcd_clrscr();
	lcd_puts(" Hi, MP3 world!\n yampp-3 player");

	UART_Init();		// Init RS-232 link
	vs1001_init_io();	// Init IO interface for VS1001
	vs1001_reset(false);	// Init VS1001
	init_rec80();		// Set up IR receiver interface

	// Say hello to UART
 	PRINT("\n\nyampp-3 "__DATE__" "__TIME__"\nATA checking...");
						
	ATA_Init();			// Init and wait for drive
	ATA_SW_Reset();		// Reset drive
	PRINT("done.\n");

#ifdef ENABLE_WATCHDOG	// Enable watchdog (enabled by linker option)
	wdt_enable(0x07);
#endif

	seed = 1 + inp(TCNT1L);			// Init randomizer from timer 
									// (ATA init gives us random delay)

	if (!init_fat(DRIVE0))			// Read disk structure
	{
		lcd_clrscr();
		lcd_puts("Wrong disk!");
		while (true) WDR;			// Lock player
	}

	PRINT("Scanning...");
//	wMaxSongs = dirlist(DIRLIST_VERBOSE);
	wMaxSongs = dirlist(DIRLIST_SCAN);

	PRINT(unsigned2str(wMaxSongs , trackstr));	// jman number of songs in decimal
	PRINT(" entries\n");

	nVolume = eeprom_rb(EEPROM_VOLUME);			// Load and set initial volume
	if (nVolume > MIN_VOLUME)
		nVolume = MIN_VOLUME;
	setvolume(nVolume);

	send_sinewave_beeps();			// Send three sinewave beeps to indicate
									// we're starting up okay
	// load bAutoPlay and position settings
	bAutoPlay = eeprom_rb(EEPROM_AUTOPLAY);		// Load autoplay and
	bRandom	  = eeprom_rb(EEPROM_RANDOM);		//  position settings
	wSongNum  = eeprom_rw(EEPROM_SONGPOS);	
	bLoudness = eeprom_rb(EEPROM_LOUDNESS);	

	// set initial status in the strings
	*(randstr+4) = bRandom ? '+' : '-';
	*(loudstr+4) = bLoudness ? '+' : '-';

	if (bAutoPlay)
		event = EV_PLAY;

//----------------------------------------------------------------------------
// start things rolling
//----------------------------------------------------------------------------
	sbi(TIMSK, TOIE1);	 			// Enable timer1 interrupt
	while (true)					// Main loop
	{
		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();
			
		if (bPlaying && event == EV_PLAY)	// second play press does pause
			event = EV_PAUSE;

		switch (event)				// According input control
		{
			case EV_IDLE:
				break;
#ifdef ENABLE_NAV
			case EV_PREVL:			// Switch to previous start letter 
				nTemp = nLastPos - 1;
				while (nTemp < nLastPos)
					if (LetterTable[nTemp].letter < *LONG_NAME)
						break;
					else
						nTemp--;

				if (nTemp >= nLastPos)
					nTemp = nLastPos - 1;
				wSongNum = LetterTable[nTemp].song_num;
				goto PLAY;
			case EV_NEXTL:			// Switch to next start letter
				for (nTemp = 1; nTemp < nLastPos; nTemp++)
					if (LetterTable[nTemp].letter > *LONG_NAME)
						break;
				if (nTemp >= nLastPos)
					nTemp = 0;
				wSongNum = LetterTable[nTemp].song_num;
				goto PLAY;
#endif

			case EV_PREV10:	wSongNum -= 10;	goto PLAY;
			case EV_NEXT10:	wSongNum += 10;	goto PLAY;
			case EV_PREV:
				if (wSongNum == 0)
					wSongNum = wMaxSongs - 1;
				else
					wSongNum--;
				goto PLAY;
			case EV_NEXT: wSongNum++;
				// fall through
			case EV_PLAY:
PLAY:			lcd_clrscr();
				lcd_puts("Loading...");
				vs1001_reset(bLoudness);		// Mandatory!

				if (wSongNum >= wMaxSongs)		// Protect for another disk
					wSongNum = 0;
				eeprom_ww(EEPROM_SONGPOS, wSongNum);

				if (!get_dir_entry(wSongNum))	// Setup buffer for play
				{
					wSongNum = 0;				// Something wrong
					continue;
				}
				PRINT("\nPlaying #"); 
				PRINT(pTrack = unsigned2str(wSongNum + 1, trackstr)); 
				UART_SendByte(' ');	PRINT(LONG_NAME);

				scroll_line = src = LONG_NAME;
				scroll_pos	= 0;
				scroll_length = 4;				// To add ' >> ' sign

				while (*src++)
					scroll_length++;
				src--;
				// *((u32*)p)++ = 0x207E7F20L;
				*((u32*)src)++ = 0x203E3E20L;
				*src = 0;

				dwPlayed = 0;
				nScrollUpd = 0;
				nDispUpd = 5;
				tot_sw = 10;				
				ReadBuffer(BUF1);				// Preload buffers
				if (CheckAndAdvanceCluster())	// Long enough file
					ReadBuffer(BUF2);
				pPlayData = pPlayBufStart = BUFFER1P;
				bPlaying = true;

				// Special MP3 header patch to strip all invalid headers 
				// not needed for VS1001K chip
/*				for (i = 0; i < BUFFER_SIZE - 1; i++)
					if ((*(u16*)&BUFFER1P[i] & 0xfeff) != 0xfaff)
						BUFFER1P[i] = 0;
					else
						break;
				// End of special header patch
*/				
				break;
			case EV_STOP:
				bPlaying = false;
				lcd_clrscr();
				lcd_puts("yampp-3");
				break;
			case EV_VOLDN:
				if (nVolume <= MIN_VOLUME-VOL_STEP) 
				{
					nVolume += VOL_STEP;
					setvolume(nVolume);
				}
				else
					setvolume(0xfe);
				break;
			case EV_VOLUP:
				if (nVolume >= VOL_STEP) 
					nVolume -= VOL_STEP;
				setvolume(nVolume);
				break;
			case EV_NEUTRAL:
				nVolume = 12;		// -6 dB
				setvolume(nVolume);
				break;
//			case EV_MUTE:
//				mute = 1-mute;
//				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);
				nDispUpd = 5;
				tot_sw = 14;				
				break;
				
			case EV_RANDOM:
				bRandom = !bRandom;
				*(randstr+4) = bRandom ? '+' : '-';
				eeprom_wb(EEPROM_RANDOM, bRandom);
				nDispUpd = 5;
				tot_sw = 12;				
				break;

//jesper 011207	start			
			case EV_PAUSE:
				event = EV_IDLE;
				lcd_gotoxy(10,1);
				lcd_puts("Paused");
				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);
				break;
//jesper 011207 end	
				
			default:
				break;
		} // switch (event)

		event = EV_IDLE;			// We always go back to IDLE when
									//  exiting switch
									
									
									
									
									
		if (bPlaying)

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
在线观看日产精品| 国产一区欧美一区| 久久99精品久久久久久| 欧美一级黄色大片| 在线看不卡av| 91网上在线视频| 日韩高清电影一区| 中文字幕欧美激情一区| 欧美乱熟臀69xxxxxx| 国产自产高清不卡| 亚洲mv在线观看| 久久精品亚洲一区二区三区浴池| 91美女片黄在线观看91美女| 日韩成人av影视| 亚洲18影院在线观看| 久久毛片高清国产| 欧美日韩一级视频| 成人精品免费视频| 成人久久视频在线观看| 中文字幕av一区二区三区高| 国内精品久久久久影院一蜜桃| 国产精品青草久久| 久久婷婷综合激情| 69堂亚洲精品首页| 91亚洲精华国产精华精华液| 麻豆精品在线观看| 五月婷婷久久综合| 欧美日韩精品系列| 色狠狠一区二区三区香蕉| 成人中文字幕合集| 国产河南妇女毛片精品久久久 | 91丨porny丨国产| 蜜臀久久久99精品久久久久久| 亚洲精品自拍动漫在线| 久久色在线视频| 日韩区在线观看| 99re热这里只有精品视频| 成人激情免费视频| 岛国av在线一区| 国产高清亚洲一区| 国产一区二区免费看| 国产精品123区| 狠狠色丁香婷综合久久| 麻豆精品久久精品色综合| 麻豆一区二区99久久久久| 秋霞电影一区二区| 日韩不卡一二三区| 久久99精品国产麻豆婷婷洗澡| 久久 天天综合| 国产精品一区二区久久精品爱涩| 国产suv精品一区二区三区| 国产91精品一区二区麻豆网站| 成人免费毛片高清视频| 成人丝袜18视频在线观看| 99re这里只有精品首页| 欧美艳星brazzers| 日韩欧美卡一卡二| 国产日产精品一区| 一区二区三区蜜桃| 免费高清视频精品| 国产成人精品影视| 91久久香蕉国产日韩欧美9色| 欧美日韩精品一区二区三区蜜桃 | 日本一区二区三区国色天香| 国产精品久久久久一区二区三区| 亚洲资源在线观看| 麻豆国产欧美一区二区三区| 国产成人欧美日韩在线电影| 91久久香蕉国产日韩欧美9色| 欧美一区二区美女| 亚洲欧洲日韩av| 久久av中文字幕片| 日本高清不卡aⅴ免费网站| 91精品国产综合久久久蜜臀粉嫩 | 欧美美女视频在线观看| 国产三级三级三级精品8ⅰ区| 亚洲夂夂婷婷色拍ww47| 国产福利精品一区二区| 欧美日韩色综合| 欧美高清在线精品一区| 亚洲国产另类精品专区| 懂色av中文一区二区三区| 欧美一区二区精品在线| 亚洲少妇30p| 成人免费av资源| 精品福利av导航| 性久久久久久久| 在线一区二区三区| 国产精品大尺度| 国产suv精品一区二区6| 久久综合狠狠综合久久激情| 日韩中文字幕91| 欧美酷刑日本凌虐凌虐| 亚洲一区二区三区视频在线播放 | 99久久伊人网影院| 国产精品无圣光一区二区| 国产一区二区调教| 精品国产污污免费网站入口 | 亚洲精品在线电影| 美国精品在线观看| 欧美精品一区二区三区蜜臀| 本田岬高潮一区二区三区| 国产不卡在线一区| 日韩视频一区在线观看| 麻豆精品精品国产自在97香蕉| 欧美成人一区二区三区片免费| 亚洲午夜久久久| 在线免费观看成人短视频| 一区二区三区影院| 欧美偷拍一区二区| 日韩有码一区二区三区| 欧美高清性hdvideosex| 日韩高清欧美激情| 精品三级在线观看| 福利一区二区在线观看| 亚洲日本在线视频观看| 欧美日韩五月天| 麻豆国产一区二区| 欧美韩国日本综合| 在线中文字幕一区| 美女在线观看视频一区二区| 久久精品一二三| 91久久精品一区二区| 男人的j进女人的j一区| 久久欧美中文字幕| 色欧美片视频在线观看在线视频| 日韩精品久久久久久| 久久精品无码一区二区三区| 国产激情91久久精品导航| 亚洲另类一区二区| 91精品国产综合久久久久久漫画| 国产精品影视在线观看| 夜夜夜精品看看| 国产色产综合产在线视频| 欧美视频完全免费看| 久久综合一区二区| 91成人在线观看喷潮| 国产精品一区二区你懂的| 亚洲国产日韩a在线播放性色| 久久伊人蜜桃av一区二区| 欧美日韩亚洲高清一区二区| 国产成人精品免费| 欧美精品在线视频| 91在线观看下载| 狠狠色丁香久久婷婷综合_中 | 亚洲18色成人| 自拍偷在线精品自拍偷无码专区| 欧美大白屁股肥臀xxxxxx| 欧美性生交片4| 99久久精品免费| 国产99久久久精品| 国产又黄又大久久| 久久99精品一区二区三区三区| 夜夜操天天操亚洲| 亚洲精品一二三四区| 国产精品久久福利| 欧美国产激情一区二区三区蜜月| 一区在线播放视频| 久久综合久久综合九色| 日韩精品一区二区三区蜜臀 | 麻豆国产欧美日韩综合精品二区| 一级精品视频在线观看宜春院| 最好看的中文字幕久久| 国产女主播视频一区二区| 亚洲精品一线二线三线无人区| 欧美一级黄色片| 欧美电影免费观看高清完整版在线 | 欧美一区二区精品| 日韩欧美不卡一区| 欧美大片一区二区三区| 欧美videofree性高清杂交| 精品区一区二区| 久久久久久久久久久久电影| 国产欧美精品区一区二区三区| 国产欧美精品区一区二区三区| 国产精品视频你懂的| 日韩理论在线观看| 亚洲国产视频网站| 美女爽到高潮91| 国产福利精品导航| 91在线精品一区二区三区| 欧美在线观看18| 日韩欧美国产电影| 亚洲国产成人午夜在线一区| 亚洲精品国产高清久久伦理二区| 香蕉成人伊视频在线观看| 精品在线免费观看| 91视频在线看| 欧美视频第二页| 精品国精品自拍自在线| 中文字幕制服丝袜成人av| 性做久久久久久久久| 国产一区二区三区最好精华液| 一本久久精品一区二区| 久久影院午夜片一区| 一区二区三区成人在线视频| 另类综合日韩欧美亚洲| 99国产精品久久| 欧美精品一区二区三区蜜桃| 亚洲一区中文在线|