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

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

?? mp3.cpp

?? EM8511s中使用的mp3播放器
?? CPP
?? 第 1 頁 / 共 2 頁
字號(hào):
#include "mp3.h"// 1 to enable verbose debug output#define MP3_VERBOSE	0#if 0static void debug_break (void){}#define ASSERT(exp)					((void)((exp)?1:(printf ("ASSERT failed: line %d, file %s\n", __LINE__,__FILE__), debug_break(), 0)))#define DEBUGMSG(cond,printf_exp)	((void)((cond)?(printf printf_exp),1:0))#else#define ASSERT(exp)#define DEBUGMSG(cond,printf_exp)#endif#define MP3_STATE_INIT					0#define MP3_STATE_DECODING_FILE			1	#define MP3_SUBSTATE_GET_MP3_BUFFER	0	#define MP3_SUBSTATE_GET_PCM_BUFFER	1	#define MP3_SUBSTATE_DECODE_DATA	2	#define MP3_SUBSTATE_PUT_PCM_1		3	#define MP3_SUBSTATE_PUT_PCM_2		4#define MP3_STATE_DECODING_BUFFER		2#define MP3_STATE_EOF					3MP3Decoder::MP3Decoder (){	DEBUGMSG (1, ("MP3Decoder::MP3Decoder\n"));	m_CallbackTable.fclose = 0;	Init ();	resetEqualizer (&m_Equalizer);}MP3Decoder::~MP3Decoder (){	DEBUGMSG (1, ("MP3Decoder::~MP3Decoder\n"));	if (m_handle)	{		ASSERT (m_CallbackTable.fclose);		m_CallbackTable.fclose (m_handle, m_CallbackTable.context);	}}MP3_DECODER_ERROR MP3Decoder::EnableMP3BufferQ (RMint32 enable){	m_enableMP3Q = enable;	return MP3_DECODER_ERROR_NO_ERROR;}MP3_DECODER_ERROR MP3Decoder::Init (void){	DEBUGMSG (1, ("MP3Decoder::Init\n"));	if (m_handle)	{		if (m_CallbackTable.fclose)			m_CallbackTable.fclose (m_handle, m_CallbackTable.context);	}	m_handle = 0;	m_CallbackTable.context = 0;	m_CallbackTable.fopen = 0;	m_CallbackTable.fseek = 0;	m_CallbackTable.ftell = 0;	m_CallbackTable.fread = 0;	m_CallbackTable.fclose = 0;	m_CallbackTable.addref = 0;	m_CallbackTable.release = 0;	m_CallbackTable.info = 0;	m_CallbackTable.putPCM = 0;	m_CallbackTable.getPCM = 0;	m_CallbackTable.getMP3 = 0;	m_State = MP3_STATE_INIT;	m_MP3DataUsed = 0;	m_pcmbuffer = 0;	m_mp3buffer = 0;	m_TotalBytesProcessed = 0;	m_mutePCM = 0;	m_enableMP3Q = 0;	return MP3_DECODER_ERROR_NO_ERROR;}MP3_DECODER_ERROR MP3Decoder::InitCallbackTable (MP3_CALLBACK_TABLE *pCallbackTable){	DEBUGMSG (1, ("MP3Decoder::InitCallbackTable\n"));	m_CallbackTable.context = pCallbackTable->context;	m_CallbackTable.fopen = pCallbackTable->fopen;		m_CallbackTable.fseek = pCallbackTable->fseek;		m_CallbackTable.ftell = pCallbackTable->ftell;		m_CallbackTable.fread = pCallbackTable->fread;	m_CallbackTable.fclose = pCallbackTable->fclose;	m_CallbackTable.addref = pCallbackTable->addref;	m_CallbackTable.release = pCallbackTable->release;	m_CallbackTable.info = pCallbackTable->info;	m_CallbackTable.putPCM = pCallbackTable->putPCM;	m_CallbackTable.getPCM = pCallbackTable->getPCM;	m_CallbackTable.getMP3 = pCallbackTable->getMP3;	return MP3_DECODER_ERROR_NO_ERROR;}MP3_DECODER_ERROR MP3Decoder::DecodeFile (RMint8 *filename){	DEBUGMSG (1, ("MP3Decoder::DecodeFile (%s)\n", filename));	ASSERT (m_handle == 0);	ASSERT (m_CallbackTable.fopen);#if 0	// XXX code disabled ...	// purpose: check that this really is an mp3 file	// why disabled? this method is crappy - what is a better method?	RMint32 length = strlen (filename);	if (filename[length-4] != '.')	{		return MP3_DECODER_ERROR_NOT_A_MP3_FILE;	}	if ((filename[length-3] != 'm') && (filename[length-3] != 'M'))	{		return MP3_DECODER_ERROR_NOT_A_MP3_FILE;	}	if ((filename[length-2] != 'p') && (filename[length-2] != 'P'))	{		return MP3_DECODER_ERROR_NOT_A_MP3_FILE;	}	if (filename[length-1] != '3')	{		return MP3_DECODER_ERROR_NOT_A_MP3_FILE;	}#endif	ASSERT (m_CallbackTable.fopen);	m_handle = m_CallbackTable.fopen (filename, m_CallbackTable.context);	ASSERT (m_handle);	if (m_handle == 0)	{		return MP3_DECODER_ERROR_NOT_A_MP3_FILE;	}		mad_stream_init (&m_Stream);	mad_frame_init (&m_Frame);	mad_synth_init (&m_Synth);	mad_timer_reset (&m_mp3Timer);	ASSERT (m_MP3DataUsed == 0);	m_MP3DataUsed = 0;	m_State = MP3_STATE_DECODING_FILE;	m_SubState = MP3_SUBSTATE_GET_MP3_BUFFER;	ASSERT (m_CallbackTable.fseek);	ASSERT (m_CallbackTable.ftell);	m_CallbackTable.fseek (m_handle, 0, SEEK_END, m_CallbackTable.context);	m_filelength = m_CallbackTable.ftell (m_handle, m_CallbackTable.context);	ASSERT ((RMint32)m_filelength > 0);	DEBUGMSG (1, ("MP3 filelength: %d bytes\n", (int)m_filelength));	m_CallbackTable.fseek (m_handle, 0, SEEK_SET, m_CallbackTable.context);	m_mp3Q.reset ();	m_eof = 0;	return MP3_DECODER_ERROR_NO_ERROR;}MP3_DECODER_ERROR MP3Decoder::Schedule (){	RMint32 n;	RMuint32 ok;	MP3_BUFFER *pqueuedbuffer;	if (m_State == MP3_STATE_INIT)	{		DEBUGMSG (MP3_VERBOSE, ("MP3Decoder::Schedule (MP3_STATE_INIT)\n"));		return MP3_DECODER_ERROR_NO_ERROR;	}	else if (m_State == MP3_STATE_EOF)	{		return MP3_DECODER_ERROR_FILE_DONE;	}	switch (m_SubState)	{	case MP3_SUBSTATE_GET_MP3_BUFFER:		DEBUGMSG (MP3_VERBOSE, ("MP3Decoder::Schedule (MP3_SUBSTATE_GET_MP3_BUFFER)\n"));		ASSERT (m_mp3buffer == 0);		ASSERT (m_CallbackTable.getMP3);		// shall we get another buffer or is one already queued?		pqueuedbuffer = m_mp3Q.dequeue ();		if (pqueuedbuffer)		{			m_mp3buffer = pqueuedbuffer->buffer;			m_mp3length = pqueuedbuffer->length;			ok = 0;			ASSERT (m_CallbackTable.release);			ASSERT (m_mp3buffer);		}		else		{			ok = m_CallbackTable.getMP3 (&m_mp3buffer, &m_mp3length, m_CallbackTable.context);			ASSERT (m_CallbackTable.addref);			m_CallbackTable.addref (m_mp3buffer, m_CallbackTable.context);			ASSERT (m_CallbackTable.fread);			ASSERT (m_handle);			m_mp3length = m_CallbackTable.fread (m_handle, m_mp3buffer, m_mp3length, m_CallbackTable.context);		}		if (ok == 0)		{			m_pmp3 = m_mp3buffer;			m_TotalBytesProcessed += m_mp3length;			if (m_mp3length == 0)			{				mad_synth_finish (&m_Synth);					mad_frame_finish (&m_Frame);				mad_stream_finish (&m_Stream);				ASSERT (m_handle);				ASSERT (m_CallbackTable.fclose);				m_CallbackTable.fclose (m_handle, m_CallbackTable.context);				m_handle = 0;				m_State = MP3_STATE_EOF;				return MP3_DECODER_ERROR_FILE_DONE; 			}			else			{				m_SubState = MP3_SUBSTATE_GET_PCM_BUFFER;			}			mad_stream_buffer (&m_Stream, m_pmp3, m_mp3length);		}		break;	case MP3_SUBSTATE_GET_PCM_BUFFER:			DEBUGMSG (MP3_VERBOSE, ("MP3Decoder::Schedule (MP3_SUBSTATE_GET_PCM_BUFFER)\n"));		ASSERT (m_pcmbuffer == 0);		ASSERT (m_CallbackTable.getPCM);		if (m_CallbackTable.getPCM (&m_pcmbuffer, &m_pcmlength, m_CallbackTable.context) == 0)		{			ASSERT (m_pcmlength >= (1152 * 4));			ASSERT (m_CallbackTable.addref);			m_CallbackTable.addref (m_pcmbuffer, m_CallbackTable.context);			m_SubState = MP3_SUBSTATE_DECODE_DATA;		}		break;	case MP3_SUBSTATE_DECODE_DATA:		DEBUGMSG (MP3_VERBOSE, ("MP3Decoder::Schedule (MP3_SUBSTATE_DECODE_DATA)\n"));		// decode one mp3 frame				if (m_MP3DataUsed)		{			n = sizeof (m_MP3Data) - m_MP3DataUsed;			if ((RMint32)m_mp3length < n)				n = m_mp3length;			memcpy (m_MP3Data + m_MP3DataUsed, m_pmp3, n);			m_pBufferStart = m_MP3Data + m_MP3DataUsed;			m_MP3DataUsed += n;			ASSERT (m_MP3Data[0] == 0xff);			ASSERT ((m_MP3Data[1] & 0xf0) == 0xf0);			mad_stream_buffer (&m_Stream, m_MP3Data, m_MP3DataUsed);			do			{				m_Stream.error = MAD_ERROR_NONE;				mad_frame_decode (&m_Frame, &m_Stream);				if (m_Stream.error != MAD_ERROR_NONE)				{					if (MAD_RECOVERABLE (m_Stream.error))					{						m_mutePCM = MUTE_TIMEOUT;						DEBUGMSG (1, ("recoverable mp3 frame error: 0x%08lx\n", m_Stream.error));						m_decodeError = 1;						continue;					}				}				break;			} while (1);			if (m_Stream.error == MAD_ERROR_BUFLEN || m_Stream.buffer == 0)			{				ASSERT (n == (RMint32)m_mp3length);				n = m_Stream.bufend - m_Stream.next_frame;				memmove (m_MP3Data, m_Stream.next_frame, n);				m_MP3DataUsed = n;				if (m_mp3buffer)				{					ASSERT (m_CallbackTable.release);					ASSERT (m_mp3buffer);					m_CallbackTable.release (m_mp3buffer, m_CallbackTable.context);					m_mp3buffer = 0;				}				ASSERT (m_pcmbuffer);				ASSERT (m_CallbackTable.release);				m_CallbackTable.release (m_pcmbuffer, m_CallbackTable.context);				m_pcmbuffer = 0;				m_SubState = MP3_SUBSTATE_GET_MP3_BUFFER;				return MP3_DECODER_ERROR_NO_ERROR;			}			ASSERT (m_Stream.error == MAD_ERROR_NONE);			MP3_DECODE_INFO mp3info;			mp3info.NumberOfBitsPerSample = 16;			mp3info.NumberOfChannels = MAD_NCHANNELS(&m_Frame.header);			mp3info.SamplesPerSecond = m_Frame.header.samplerate;			DEBUGMSG (0, ("mp3info: %lu bits/sample\n", mp3info.NumberOfBitsPerSample));			DEBUGMSG (0, ("mp3info: %lu channels\n", mp3info.NumberOfChannels));			DEBUGMSG (0, ("mp3info: %lu samples/second\n", mp3info.SamplesPerSecond));			if (m_CallbackTable.info)				m_CallbackTable.info (MP3_MSG_MP3_DECODE_INFO, &mp3info, m_CallbackTable.context);			Equalize (&m_Frame, &m_Equalizer);						mad_synth_frame (&m_Synth, &m_Frame, (short*)m_pcmbuffer);			m_SubState = MP3_SUBSTATE_PUT_PCM_2;			return MP3_DECODER_ERROR_NO_ERROR;		}				do		{			m_Stream.error = MAD_ERROR_NONE;			mad_frame_decode (&m_Frame, &m_Stream);			if (m_Stream.error != MAD_ERROR_NONE)			{				if (MAD_RECOVERABLE (m_Stream.error))				{

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产大陆a不卡| 色嗨嗨av一区二区三区| 亚洲精品五月天| 欧美一区二区黄色| 色婷婷av一区| 国产成人av资源| 首页综合国产亚洲丝袜| 国产精品视频免费看| 日韩一二三区不卡| 欧美最猛黑人xxxxx猛交| 国产激情91久久精品导航 | 亚洲精品美腿丝袜| 久久人人爽人人爽| 欧美猛男超大videosgay| 不卡av免费在线观看| 久久99国内精品| 三级不卡在线观看| 亚洲综合免费观看高清完整版在线| 国产亚洲成av人在线观看导航| 69堂成人精品免费视频| 欧美午夜精品一区二区蜜桃| 成人爱爱电影网址| 国产精品99久久久久久久女警| 日韩经典一区二区| 五月婷婷欧美视频| 亚洲在线成人精品| 一区二区视频在线| 亚洲色图视频免费播放| 国产精品色呦呦| 国产欧美日韩视频在线观看| 久久亚洲私人国产精品va媚药| 日韩欧美综合一区| 亚洲欧洲日韩av| 2020国产精品| 精品精品国产高清一毛片一天堂| 91精品国产综合久久久蜜臀粉嫩| 在线观看亚洲精品| 欧美写真视频网站| 欧美性感一类影片在线播放| 91成人免费电影| 欧日韩精品视频| 91精品福利在线| 欧美色窝79yyyycom| 欧美亚洲国产一区二区三区va| 91在线丨porny丨国产| 色哟哟一区二区在线观看| 91欧美激情一区二区三区成人| 91浏览器在线视频| 在线免费精品视频| 精品视频色一区| 日韩一区二区三区观看| 日韩欧美一区在线| 久久麻豆一区二区| 国产精品久久三区| 一区二区三区四区在线| 香蕉久久一区二区不卡无毒影院 | 欧美精品视频www在线观看| 欧美日韩一区二区三区在线看| 欧美视频完全免费看| 日韩一区二区在线免费观看| 精品成人一区二区三区| 国产欧美日本一区二区三区| 国产精品久久久久久久久免费桃花 | 国产欧美日韩在线看| 欧美国产日本视频| 一区二区三区.www| 老司机午夜精品| 成人丝袜18视频在线观看| 色88888久久久久久影院野外| 欧美日韩大陆一区二区| 欧美大片顶级少妇| 中文字幕一区二区在线观看| 亚洲成人一区在线| 国产麻豆精品久久一二三| 91视频xxxx| 欧美电影免费观看高清完整版 | 亚洲电影一区二区三区| 蜜臀av一区二区| 成人福利在线看| 欧美日韩一区二区三区不卡 | 欧美一区二区在线观看| 日韩综合一区二区| 国产精品18久久久久久久久久久久| 94-欧美-setu| 日韩视频中午一区| 日韩美女视频一区二区| 日本女优在线视频一区二区| 风流少妇一区二区| 欧美日韩1区2区| 国产精品色哟哟| 日韩精品一卡二卡三卡四卡无卡| 国产精品正在播放| 欧美久久久久免费| 国产精品美女久久久久aⅴ国产馆| 亚洲bt欧美bt精品777| 国产69精品久久久久毛片| 欧美日韩国产a| 国产精品久久99| 久久99国内精品| 欧美在线不卡视频| 国产欧美日韩在线视频| 视频一区视频二区在线观看| 成人性生交大片免费看视频在线| 91精品国产一区二区三区| 亚洲日本一区二区三区| 国产真实乱子伦精品视频| 欧美性色黄大片手机版| 国产精品福利av| 国产一区在线精品| 欧美一区二区三区在线观看视频| 亚洲日本丝袜连裤袜办公室| 国产黑丝在线一区二区三区| 日韩一区二区三区三四区视频在线观看 | 日本中文字幕一区二区视频 | 欧美日韩的一区二区| 亚洲视频资源在线| 国产suv精品一区二区6| 精品国产亚洲一区二区三区在线观看| 亚洲小说春色综合另类电影| 不卡视频在线观看| 欧美激情综合五月色丁香小说| 久久国产精品第一页| 欧美日韩夫妻久久| 亚洲国产日产av| 欧美亚洲动漫精品| 一区二区三区在线视频免费| 97se亚洲国产综合自在线| 亚洲国产激情av| 成人自拍视频在线| 国产欧美精品国产国产专区| 精品一区二区三区免费毛片爱| 7777女厕盗摄久久久| 五月天激情综合| 欧美日韩精品欧美日韩精品一| 一区二区三区产品免费精品久久75| 91亚洲国产成人精品一区二区三| 国产精品网站在线播放| 成av人片一区二区| 国产精品美女久久久久av爽李琼 | 欧美麻豆精品久久久久久| 亚洲成人免费视| 亚洲人成网站在线| 色综合av在线| 亚洲成人午夜影院| 4438x亚洲最大成人网| 日韩在线一区二区三区| 91精品国产综合久久香蕉麻豆| 蜜臀av国产精品久久久久| 欧美不卡一区二区三区四区| 国产乱对白刺激视频不卡| 国产亚洲人成网站| www.欧美色图| 亚洲电影中文字幕在线观看| 91精品国产高清一区二区三区| 蜜桃av一区二区三区| 久久久精品免费观看| 99久久国产免费看| 午夜亚洲福利老司机| 精品国产青草久久久久福利| 国产黄色精品网站| 亚洲人成小说网站色在线 | 精品一区二区日韩| 久久嫩草精品久久久精品| 99精品热视频| 日韩电影在线观看一区| 久久精品日韩一区二区三区| 91亚洲男人天堂| 日本三级亚洲精品| 国产喷白浆一区二区三区| 一本一道波多野结衣一区二区| 日本美女一区二区三区视频| 国产欧美视频一区二区| 在线看日韩精品电影| 蜜桃一区二区三区在线| 国产精品久久久久久久久免费相片 | 久久综合99re88久久爱| 91首页免费视频| 五月婷婷另类国产| 日本一区二区不卡视频| 欧美色图天堂网| 国产美女视频91| 艳妇臀荡乳欲伦亚洲一区| 日韩欧美久久久| 91天堂素人约啪| 久久不见久久见免费视频7 | 午夜不卡在线视频| 国产精品色一区二区三区| 欧美日韩aaaaa| 成人av第一页| 美女尤物国产一区| 亚洲女人的天堂| 久久久电影一区二区三区| 欧美日韩国产首页| 不卡在线观看av| 老司机午夜精品| 亚洲午夜成aⅴ人片| 国产精品乱码久久久久久| 欧美日本不卡视频| 91老师片黄在线观看| 韩国精品主播一区二区在线观看|