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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? mp3play.c

?? mp3解碼源代碼
?? C
?? 第 1 頁 / 共 2 頁
字號:
/****************************************************************************//* *	mp3play.c -- Play MP3 data files * *	(C) Copyright 1999-2002, Greg Ungerer (gerg@snapgear.com) *      (C) Copyright 1997-1997, St閜hane TAVENARD *          All Rights Reserved * *	This code is a derivitive of Stephane Tavenard's mpegdev_demo.c. * * *	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., 675 Mass Ave, Cambridge, MA 02139, USA. *//****************************************************************************/#include "defs.h"#include "mpegdec.h"#include "genre.h"#include <sys/types.h>#include <sys/stat.h>#include <sys/time.h>#include <sys/uio.h>#include <sys/file.h>#include <unistd.h>#include <fcntl.h>#include <errno.h>#include <getopt.h>#include <signal.h>#include <endian.h>#include <linux/soundcard.h>#include <sys/resource.h>#include <linux/config.h>#ifdef CONFIG_KEY#include <linux/key.h>#endif/****************************************************************************/int	verbose;int	quiet;int	http_streaming;int	lcd_line, lcd_time;int	prebuflimit;int	lcdfd = -1;int	gotsigusr1;char	key[128];/* *	Keep track of start and end times. */struct timeval	tvstart, tvend;/* *	Global settings per decode stream. Used to control the final *	PCM to raw driver data conversion. */static int	stereo;static int	bits;static int	testtone;static int	quality;/****************************************************************************//* *	Master MP3 decoder settings. */static MPEGDEC_STREAM	*mps = NULL;static MPEGDEC_CTRL	mpa_ctrl;static MPEGDEC_CTRL	mpa_defctrl = {	NULL,    // Bitstream access is default file I/O	// Layers I & II settings (#3)	{ FALSE, { 1, 2, 48000 }, { 1, 2, 48000 } },	// Layer III settings (#3)	{ FALSE, { 1, 2, 48000 }, { 1, 2, 48000 } },	0,		// #2: Don't check mpeg validity at start			// (needed for mux stream)	2048		// #2: Stream Buffer size};static char *modes[] = { "stereo", "j-stereo", "dual", "mono" };/****************************************************************************//* *	MP3 data stream support (could be file or http stream). */#define MP3_BUF_SIZE	(4*1024)static char	*mp3_filename;static int	mp3_fd;static INT8	*mp3_buffer;static UINT32	mp3_buffer_size;static UINT32	mp3_buffer_offset;static UINT32	mp3_buffer_next_block;static UINT32	mp3_stream_size;static char	*rawbuf;static char	*prebuffer;int		prebufsize;int		prebufcnt;int		prebufnow;/****************************************************************************//* *	MP3 file TAG info. Output when in verbose mode. This structure is *	designed to match the in-file structure, don't change it! *	Nice printable strings are generated in the other vars below. */struct mp3tag {	char		tag[3];	char		title[30];	char		artist[30];	char		album[30];	char		year[4];	char		comments[30];	unsigned char	genre;};static struct mp3tag	mp3_tag;static int		mp3_gottag;static char		mp3_title[32];static char		mp3_artist[32];static char		mp3_year[8];static char		mp3_album[32];static char		mp3_comments[32];static char		*mp3_genre;/****************************************************************************//* *	Trivial signal handler, processing is done from the main loop. */void sigusr1handler(int signr){	gotsigusr1 = 1;}/****************************************************************************//* *	Get stream size (just file size). */static int getstreamsize(void){	struct stat	st;	if (stat(mp3_filename, &st) < 0)		return(0);	return(st.st_size);}/****************************************************************************//* *	Get another chunk of data into RAM. */static UINT32 getnextbuffer(){	int	rc;	lseek(mp3_fd, mp3_buffer_next_block, SEEK_SET);	rc = read(mp3_fd, mp3_buffer, MP3_BUF_SIZE);	mp3_buffer_size = (rc < 0) ? 0 : rc;	mp3_buffer_next_block += mp3_buffer_size;	return(mp3_buffer_size);}/****************************************************************************//* *	Start our own bitstream access routines. */INT32 bs_open(char *stream_name, INT32 buffer_size, INT32 *stream_size){#if 0	printf("bs_open: '%s'\n", stream_name);#endif	if (!mp3_buffer)		return(0);	mp3_buffer_offset = 0;	/* We know total size, we can set it */	*stream_size = mp3_stream_size;	/* Just return a dummy handle (not NULL) */	return(1);}/****************************************************************************/void bs_close(INT32 handle){#if 0	printf("bs_close\n");#endif	/* Don't need to do anything... */}/****************************************************************************/INT32 bs_read(INT32 handle, void *buffer, INT32 num_bytes){	INT32 read_size;	if (!handle )		return(-1);tryagain:	read_size = mp3_buffer_size - mp3_buffer_offset;	if (read_size > num_bytes)		read_size = num_bytes;	if (read_size > 0) {		if(!buffer)			return(-1);		memcpy(buffer, &mp3_buffer[mp3_buffer_offset], read_size);		mp3_buffer_offset += read_size;	} else {		if (getnextbuffer() > 0) {			mp3_buffer_offset = 0;			goto tryagain;		}		read_size = -1; /* End of stream */	}	return(read_size);}/****************************************************************************/int bs_seek(INT32 handle, INT32 abs_byte_seek_pos){	if (!handle)		return(-1);	if (abs_byte_seek_pos <= 0)		mp3_buffer_offset = 0;	else if (abs_byte_seek_pos >= mp3_buffer_size)		return(-1);	else		mp3_buffer_offset = abs_byte_seek_pos;	return(0);}/****************************************************************************/MPEGDEC_ACCESS bs_access = { bs_open, bs_close, bs_read, bs_seek };/****************************************************************************/void mkstring(char *str, char *buf, int size){    int i, j = 0;	char save;	for (i = size - 1; i >= 0; i--) {		if (buf[i] != ' ') {			while (buf[j] == ' ')				j++;			strncpy(str, &buf[j], i - j + 1);			str[i-j+1] = '\0';			return;		}	}}/****************************************************************************//* *	Get TAG info from mp3 file, if it is present. No point doing a *	fatal exit on errors, just assume no tag info is present. */void getmp3taginfo(void){	long	pos;	int	size;	mp3_gottag = 0;	size = sizeof(mp3_tag);	pos = mp3_stream_size - size;	if (pos < 0)		return;	if (lseek(mp3_fd, pos, SEEK_SET) < 0)		return;	if (read(mp3_fd, &mp3_tag, size) != size)		return;	if (strncmp(&mp3_tag.tag[0], "TAG", 3) != 0)		return;	/* Return file pointer to start of file */	lseek(mp3_fd, 0, SEEK_SET);	/* Construct fill NULL terminated strings */	mkstring(&mp3_title[0], &mp3_tag.title[0], sizeof(mp3_tag.title));	mkstring(&mp3_artist[0], &mp3_tag.artist[0], sizeof(mp3_tag.artist));	mkstring(&mp3_album[0], &mp3_tag.album[0], sizeof(mp3_tag.album));	mkstring(&mp3_year[0], &mp3_tag.year[0], sizeof(mp3_tag.year));	mkstring(&mp3_comments[0], &mp3_tag.comments[0], sizeof(mp3_tag.comments));	mp3_genre = (mp3_tag.genre >= genre_count) ? "Unknown" :		genre_table[mp3_tag.genre];	mp3_gottag = 1;}/****************************************************************************//* *	Print out everything we know about the MP3 stream. */void printmp3info(void){	if (quiet)		return;	if (verbose == 0) {		printf("%s: MPEG%d-%s (%ld ms)\n", mp3_filename, mps->norm,			(mps->layer == 1)?"I":(mps->layer == 2)?"II":"III",			mps->ms_duration);		return;	}	/* This is the verbose output */	printf("%s:\n", mp3_filename);	printf("    MPEG%d-%s %s %dkbps %dHz (%ld ms)\n", mps->norm,		(mps->layer == 1) ? "I" : (mps->layer == 2) ? "II" : "III",		modes[mps->mode], mps->bitrate, mps->frequency,		mps->ms_duration );	printf("    Decoding: Channels=%d Quality=%d Frequency=%dHz\n",		mps->dec_channels, mps->dec_quality, mps->dec_frequency ); 	if (mp3_gottag) {		printf("    Title:    %s\n", mp3_title);		printf("    Artist:   %s\n", mp3_artist);		printf("    Album:    %s\n", mp3_album );		printf("    Year:     %s\n", mp3_year);		printf("    Comments: %s\n", mp3_comments);		printf("    Genre:    %s\n", mp3_genre);	}}/****************************************************************************//* *	Print out the name on a display device if present. */void lcdtitle(void){	struct iovec	iv[4];	char		prebuf[10];	char		ctrl, postbuf, *name, *p;	int		ivp, namelen;	/* Install a signal handler to allow updates to be forced */	signal(SIGUSR1, sigusr1handler);	/*	 * Determine the name to display.  We use the tag if it is	 * present and the basename of the file if not.	 */	if (mp3_gottag) {		name = mp3_title;		namelen = strlen(name);	} else {		name = strrchr(mp3_filename, '/');		if (name == NULL)			name = mp3_filename;		else			name++;		p = strchr(name, '.');		if (p == NULL)			namelen = strlen(name);		else			namelen = p - name;	}	if (lcd_line) {		/* Lock the file so we can access it... */		if (flock(lcdfd, LOCK_SH | LOCK_NB) == -1)			return;		if (lcd_line == 0) {			prebuf[0] = '\f';			prebuf[1] = '\0';		} else if (lcd_line == 1) {			strcpy(prebuf, "\003\005");		} else if (lcd_line == 2) {			strcpy(prebuf, "\003\v\005");		}		/*		 * Now we'll write the title out.  We'll do this atomically		 * just in case two players decide to coexecute...		 */		ivp = 0;		iv[ivp].iov_len = strlen(prebuf) * sizeof(char);		iv[ivp++].iov_base = prebuf;				iv[ivp].iov_len = namelen * sizeof(char);		iv[ivp++].iov_base = name;				//postbuf = '\n';		//iv[ivp].iov_len = sizeof(char);		//iv[ivp++].iov_base = &postbuf;		writev(lcdfd, iv, ivp);		/* Finally, unlock it since we've finished. */		flock(lcdfd, LOCK_UN);	}}/****************************************************************************//* *	Output time info to display device. */void lcdtime(time_t sttime){	static time_t	lasttime;	time_t		t;	char		buf[15], *p;	int		m, s;	t = time(NULL) - sttime;	if (t != lasttime && flock(lcdfd, LOCK_SH | LOCK_NB) == 0) {		p = buf;		*p++ = '\003';		if (lcd_time == 2)			*p++ = '\v';		*p++ = '\005';		m = t / 60;		s = t % 60;		if (s < 0)			s += 60;		sprintf(p, "%02d:%02d", m, s);		write(lcdfd, buf, strlen(buf));		flock(lcdfd, LOCK_UN);	}	lasttime = t;}/****************************************************************************//* *	Configure DSP engine settings for playing this track. */ void setdsp(int fd, int playstereo, int playbits){	if (ioctl(fd, SNDCTL_DSP_SPEED, &mps->dec_frequency) < 0) {		fprintf(stderr, "ERROR: Unable to set frequency to %d, "

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
午夜激情一区二区| av电影天堂一区二区在线观看| 亚洲成人资源网| 亚洲综合精品久久| 亚洲精品国产a| 亚洲激情成人在线| 亚洲午夜免费福利视频| 亚洲国产一区视频| 日韩极品在线观看| 日韩国产精品久久| 蜜桃免费网站一区二区三区| 亚洲成av人片在线观看无码| 亚洲国产精品久久一线不卡| 亚洲精品写真福利| 亚洲二区在线视频| 日韩中文欧美在线| 久久99精品久久久久久久久久久久| 蜜桃av一区二区| 国产麻豆精品theporn| 高清国产一区二区三区| 不卡电影一区二区三区| 一本在线高清不卡dvd| 欧美日韩激情在线| 日韩免费高清电影| 久久女同性恋中文字幕| 国产精品女人毛片| 一区二区三区在线观看动漫 | 日产精品久久久久久久性色| 五月激情丁香一区二区三区| 精品在线观看免费| 成人午夜在线免费| 色婷婷综合久久久久中文| 欧美日韩你懂得| 精品国产91洋老外米糕| 国产精品久久久久影院色老大| 自拍偷拍亚洲综合| 亚洲gay无套男同| 久久99热99| 成人免费黄色大片| 欧美性videosxxxxx| 欧美不卡一区二区三区四区| 国产精品视频一二三区| 亚洲精品中文字幕在线观看| 蜜臀av性久久久久蜜臀av麻豆| 成人av在线影院| 欧美日韩亚洲综合在线 欧美亚洲特黄一级| 欧美日韩小视频| 欧美精品一区二区三区很污很色的 | 国产精品美女久久久久aⅴ国产馆| 亚洲欧美偷拍三级| 免费国产亚洲视频| 91麻豆视频网站| 欧美一区二区三区思思人| 国产女人aaa级久久久级| 亚洲韩国一区二区三区| 国产一区二区三区在线观看免费视频 | 中文字幕亚洲欧美在线不卡| 视频精品一区二区| jlzzjlzz亚洲日本少妇| 精品日产卡一卡二卡麻豆| 亚洲精品日产精品乱码不卡| 久久www免费人成看片高清| 91女神在线视频| 久久亚洲精精品中文字幕早川悠里| 亚洲精品欧美二区三区中文字幕| 精品在线一区二区三区| 欧洲一区在线电影| 欧美国产日韩一二三区| 日韩精品福利网| 91黄色免费看| 国产精品区一区二区三区| 久久精品国内一区二区三区| 欧美视频一区二| 日韩毛片一二三区| 国产一区二区三区久久久| 在线不卡免费欧美| 一区二区三区欧美在线观看| 顶级嫩模精品视频在线看| 日韩欧美国产成人一区二区| 亚洲综合无码一区二区| 9i在线看片成人免费| 日韩西西人体444www| 亚洲午夜电影网| 91在线云播放| 国产日韩欧美精品一区| 久久超级碰视频| 欧美一区2区视频在线观看| 夜夜精品浪潮av一区二区三区| 风间由美中文字幕在线看视频国产欧美| 制服丝袜日韩国产| 亚洲九九爱视频| 99国产精品国产精品毛片| 亚洲国产欧美另类丝袜| 成人黄色软件下载| 国产精品欧美一区二区三区| 亚洲色图20p| 亚洲444eee在线观看| 91蜜桃婷婷狠狠久久综合9色| 精品久久久三级丝袜| 日日夜夜精品视频免费| 欧美午夜寂寞影院| 亚洲综合免费观看高清完整版 | 91精品久久久久久久99蜜桃| 亚洲电影你懂得| 欧美网站大全在线观看| 一区二区久久久久| 欧美午夜免费电影| 亚洲第四色夜色| 欧美一区在线视频| 蜜臀av性久久久久蜜臀av麻豆| 日韩一区二区三区四区 | 欧美亚洲精品一区| 亚洲精品高清在线观看| 在线看日韩精品电影| 亚洲精品少妇30p| 欧美日韩一区二区三区高清| 亚洲成人精品一区| 欧美一区二区三区四区久久| 精品一区二区影视| 久久综合久久综合久久综合| 国产精品亚洲人在线观看| 国产欧美综合在线观看第十页| 高清在线观看日韩| 亚洲日穴在线视频| 欧美色视频在线| 日韩av在线播放中文字幕| 欧美成人免费网站| 国产 日韩 欧美大片| 亚洲精品国产无套在线观| 欧美日韩黄视频| 国内不卡的二区三区中文字幕| 国产日韩欧美精品综合| 色诱视频网站一区| 奇米精品一区二区三区四区 | 欧美精品日韩精品| 麻豆成人免费电影| 久久精品一区二区三区不卡| 91色视频在线| 日韩激情视频网站| 国产性天天综合网| 色哟哟国产精品| 美女一区二区三区| 中文字幕第一区第二区| 欧美日韩高清在线播放| 激情另类小说区图片区视频区| 国产精品免费看片| 欧美精品自拍偷拍| 国产成人精品三级| 亚洲一区二区美女| 精品国产乱码久久久久久久| 91视频国产资源| 久久99精品网久久| 一区二区三区日本| 久久久欧美精品sm网站 | 亚洲人成精品久久久久| 6080亚洲精品一区二区| 高清beeg欧美| 日韩中文字幕1| 亚洲欧洲www| 日韩女优电影在线观看| 色香蕉成人二区免费| 精品亚洲国内自在自线福利| 亚洲欧美另类久久久精品| 精品福利在线导航| 欧美亚日韩国产aⅴ精品中极品| 激情亚洲综合在线| 亚洲图片一区二区| 国产精品久久久久9999吃药| 777久久久精品| 97se亚洲国产综合自在线| 久久国产精品免费| 亚洲一区二区三区四区五区黄| 国产午夜精品一区二区三区嫩草| 欧美精品在线观看播放| 成人国产电影网| 精品中文字幕一区二区小辣椒| 亚洲最大成人综合| 国产精品国产自产拍高清av王其| 日韩欧美国产麻豆| 在线不卡的av| 欧美亚洲精品一区| 色综合久久中文综合久久牛| 国产一区欧美日韩| 麻豆精品久久久| 无码av免费一区二区三区试看 | 精品在线播放免费| 日韩福利电影在线| 亚洲精品国久久99热| 国产精品乱人伦| 欧美精品一区二区三区久久久 | 中文字幕一区二区三区不卡| 精品国产乱码久久久久久夜甘婷婷| 5858s免费视频成人| 欧美视频一区二区三区| 日本精品免费观看高清观看| 99久久精品费精品国产一区二区| 粗大黑人巨茎大战欧美成人| 国产精品99久久久久久有的能看| 久久成人综合网| 久久er精品视频|