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

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

?? core.c

?? Aqualung is an advanced music player primarily targeted for the GNU/Linux operating system, but als
?? C
?? 第 1 頁 / 共 5 頁
字號:
/*                                                     -*- linux-c -*-    Copyright (C) 2004 Tom Szilagyi    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.    $Id: core.c,v 1.57 2006/10/02 17:50:26 peterszilagyi Exp $*/#include <config.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <errno.h>#include <unistd.h>#include <fcntl.h>#include <math.h>#include <time.h>#include <getopt.h>#include <time.h>#include <sys/time.h>#include <sys/stat.h>#include <libxml/xmlmemory.h>#include <libxml/parser.h>#ifdef _WIN32#include <glib.h>#else#include <pthread.h>#endif /* _WIN32 */#ifdef HAVE_SRC#include <samplerate.h>#endif /* HAVE_SRC */#ifdef HAVE_OSS#include <sys/ioctl.h>#include <sys/types.h>#ifdef __FreeBSD__#include <sys/soundcard.h>#else#include <linux/soundcard.h>#endif /* __FreeBSD__ */#endif /* HAVE_OSS */#ifdef HAVE_JACK#include <sys/mman.h>#include <jack/jack.h>#endif /* HAVE_JACK */#ifdef _WIN32#include <windows.h>#include <mmsystem.h>#endif /* _WIN32 */#include "common.h"#include "version.h"#include "rb.h"#include "options.h"#include "decoder/file_decoder.h"#include "transceiver.h"#include "gui_main.h"#include "plugin.h"#include "i18n.h"#include "core.h"extern options_t options;/* JACK data */#ifdef HAVE_JACKjack_client_t * jack_client;jack_port_t * out_L_port;jack_port_t * out_R_port;char * client_name = NULL;u_int32_t jack_nframes;int jack_is_shutdown;int auto_connect = 0;int default_ports = 1;char * user_port1 = NULL;char * user_port2 = NULL;#endif /* HAVE_JACK */const size_t sample_size = sizeof(float);gint playlist_state, browser_state;/* ALSA driver parameters */#ifdef HAVE_ALSAint nperiods = 0;int period = 0;#endif /* HAVE_ALSA *//* The name of the output device e.g. "/dev/dsp" or "plughw:0,0" */char * device_name = NULL;/***** disk thread stuff *****/unsigned long long sample_offset;status_t disk_thread_status;int output = 0; /* oss/alsa/jack */#ifdef HAVE_SRCint src_type = 4;int src_type_parsed = 0;#endif /* HAVE_SRC *//* Synchronization between disk thread and output thread */AQUALUNG_MUTEX_DECLARE_INIT(disk_thread_lock)AQUALUNG_COND_DECLARE_INIT(disk_thread_wake)rb_t * rb; /* this is the audio stream carrier ringbuffer */rb_t * rb_disk2out;/* Communication between gui thread and disk thread */rb_t * rb_gui2disk;rb_t * rb_disk2gui;/* Lock critical operations that could interfere with output thread */double left_gain = 1.0;double right_gain = 1.0;/* LADSPA stuff */float * l_buf = NULL;float * r_buf = NULL;#ifdef HAVE_LADSPAvolatile int plugin_lock = 0;unsigned long ladspa_buflen = 0;int n_plugins = 0;plugin_instance * plugin_vect[MAX_PLUGINS];#endif /* HAVE_LADSPA *//* remote control */extern int immediate_start;extern int aqualung_session_id;extern int aqualung_socket_fd;extern char aqualung_socket_filename[256];float convf(char * s) {        float val, pow;        int i, sign;        for (i = 0; s[i] == ' ' || s[i] == '\n' || s[i] == '\t'; i++);        sign = 1;        if (s[i] == '+' || s[i] == '-')                sign = (s[i++] == '+') ? 1 : -1;        for (val = 0; s[i] >= '0' && s[i] <= '9'; i++)                val = 10 * val + s[i] - '0';        if ((s[i] == '.') || (s[i] == ','))                i++;        for (pow = 1; s[i] >= '0' && s[i] <= '9'; i++) {                val = 10 * val + s[i] - '0';                pow *= 10;        }        return(sign * val / pow);}/* return 1 if conversion is possible, 0 if not */intsample_rates_ok(int out_SR, int file_SR) {#ifdef HAVE_SRC	float src_ratio;	src_ratio = 1.0 * out_SR / file_SR;	if (!src_is_valid_ratio(src_ratio) ||	    src_ratio > MAX_RATIO || src_ratio < 1.0/MAX_RATIO) {		fprintf(stderr, "core.c/sample_rates_ok(): too big difference between input and "			"output sample rate!\n");#else        if (out_SR != file_SR) {		fprintf(stderr,			"Input file's samplerate (%d Hz) and output samplerate (%d Hz) differ, "			"and\nAqualung is compiled without Sample Rate Converter support. To play "			"this file,\nyou have to build Aqualung with internal Sample Rate Converter "			"support,\nor set the playback sample rate to match the file's sample rate."			"\n", file_SR, out_SR);             #endif /* HAVE_SRC */		return 0;	}	return 1;}void *disk_thread(void * arg) {	thread_info_t * info = (thread_info_t *)arg;	file_decoder_t * fdec = NULL;	unsigned int n_read = 0;	unsigned int want_read;	int n_src = 0;	int n_src_prev = 0;	int end_of_file = 0;	double src_ratio = 1.0;	void * readbuf = malloc(MAX_RATIO * info->rb_size * 2 * sample_size);	void * framebuf = malloc(MAX_RATIO * info->rb_size * 2 * sample_size);	size_t n_space;	char send_cmd, recv_cmd;	char filename[RB_CONTROL_SIZE];	seek_t seek;	cue_t cue;	int i;#ifdef HAVE_SRC	int src_type_prev;	SRC_STATE * src_state;	SRC_DATA src_data;	int src_error;        if ((src_state = src_new(src_type, 2, &src_error)) == NULL) {		fprintf(stderr, "disk thread: error: src_new() failed: %s.\n",			src_strerror(src_error));		exit(1);	}	src_type_prev = src_type;#endif /* HAVE_SRC */	if ((fdec = file_decoder_new()) == NULL) {		fprintf(stderr, "disk thread: error: file_decoder_new() failed\n");		exit(1);	}	if ((!readbuf) || (!framebuf)) {		fprintf(stderr, "disk thread: malloc error\n");		exit(1);	}	AQUALUNG_MUTEX_LOCK(disk_thread_lock)	filename[0] = '\0';	while (1) {		recv_cmd = 0;		if (rb_read_space(rb_gui2disk) > 0) {			rb_read(rb_gui2disk, &recv_cmd, 1);			switch (recv_cmd) {			case CMD_CUE:				/* read the string */				while (rb_read_space(rb_gui2disk) < sizeof(cue_t))					;				rb_read(rb_gui2disk, (void *)&cue, sizeof(cue_t));								if (cue.filename != NULL) {					strncpy(filename, cue.filename, MAXLEN-1);					free(cue.filename);				} else {					filename[0] = '\0';				}				if (fdec->file_lib != 0)					file_decoder_close(fdec);				if (filename[0] != '\0') {					if (file_decoder_open(fdec, filename)) {						fdec->samples_left = 0;						info->is_streaming = 0;						end_of_file = 1;						send_cmd = CMD_FILEREQ;						rb_write(rb_disk2gui, &send_cmd, 1);						goto sleep;					} else if (!sample_rates_ok(info->out_SR, fdec->SR)) {						fdec->file_open = 1; /* to get close_file() working */						file_decoder_close(fdec);						fdec->file_open = 0;						fdec->samples_left = 0;						info->is_streaming = 0;						end_of_file = 1;						send_cmd = CMD_FILEREQ;						rb_write(rb_disk2gui, &send_cmd, 1);						goto sleep;					} else {						file_decoder_set_rva(fdec, cue.voladj);						info->in_SR_prev = info->in_SR;						info->in_SR = fdec->SR;						info->is_mono = (fdec->channels == 1) ? 1 : 0;						sample_offset = 0;						send_cmd = CMD_FILEINFO;						rb_write(rb_disk2gui, &send_cmd,								      sizeof(send_cmd));						rb_write(rb_disk2gui,								      (char *)&(fdec->fileinfo),								      sizeof(fileinfo_t));						info->is_streaming = 1;						end_of_file = 0;					}				} else { /* STOP */					info->is_streaming = 0;					/* send a FLUSH command to output thread to stop immediately */					send_cmd = CMD_FLUSH;					rb_write(rb_disk2out, &send_cmd, 1);					goto sleep;				}				break;			case CMD_STOPWOFL: /* STOP but first flush output ringbuffer. */				info->is_streaming = 0;				goto flush;				break;			case CMD_PAUSE:				info->is_streaming = 0;				/* send a FLUSH command to output thread */				send_cmd = CMD_FLUSH;				rb_write(rb_disk2out, &send_cmd, 1);				/* roll back sample_offset samples, if possible */				sample_offset = rb_read_space(rb) /					(2 * sample_size) * src_ratio;				if (sample_offset <				    fdec->fileinfo.total_samples - fdec->samples_left)					file_decoder_seek(fdec,					   fdec->fileinfo.total_samples - fdec->samples_left					   - sample_offset);				else				        file_decoder_seek(fdec, 0);				break;			case CMD_RESUME:				info->is_streaming = 1;				break;			case CMD_FINISH:				/* send FINISH to output thread, then goto exit */				send_cmd = CMD_FINISH;				rb_write(rb_disk2out, &send_cmd, 1);				goto done;				break;			case CMD_SEEKTO:				while (rb_read_space(rb_gui2disk) < sizeof(seek_t))					;				rb_read(rb_gui2disk, (char *)&seek, sizeof(seek_t));				if (fdec->file_lib != 0) {					file_decoder_seek(fdec, seek.seek_to_pos);					/* send a FLUSH command to output thread */					send_cmd = CMD_FLUSH;					rb_write(rb_disk2out, &send_cmd, 1);				} else {					/* send dummy STATUS to gui, to set pos slider to zero */					disk_thread_status.samples_left = 0;					disk_thread_status.sample_offset = 0;					send_cmd = CMD_STATUS;					rb_write(rb_disk2gui, &send_cmd, sizeof(send_cmd));					rb_write(rb_disk2gui, (char *)&disk_thread_status,							      sizeof(status_t));				}				break;			default:				fprintf(stderr, "disk thread: received unexpected command %d\n", recv_cmd);				break;			}		} else if (end_of_file)			goto sleep;		if (!info->is_streaming)			goto sleep;		n_space = rb_write_space(rb) / (2 * sample_size);		while (n_src < 0.95 * n_space) {						src_ratio = (double)info->out_SR / (double)info->in_SR;			n_src_prev = n_src;			want_read = floor((n_space - n_src) / src_ratio);			if (want_read > MAX_RATIO * info->rb_size)				want_read = MAX_RATIO * info->rb_size;						n_read = file_decoder_read(fdec, readbuf, want_read);			if (n_read < want_read)				end_of_file = 1;						if (info->is_mono) { /* convert to stereo interleaved */				for (i = 2*n_read - 1; i >= 0; i--) {					memcpy(readbuf + i * sample_size,					       readbuf + i/2 * sample_size,					       sample_size);				}			}						if (info->in_SR == info->out_SR) {				memcpy(framebuf + n_src_prev * 2*sample_size,				       readbuf, n_read * 2*sample_size);				n_src += n_read;			} else { /* do SRC */#ifdef HAVE_SRC								if ((info->in_SR_prev != info->in_SR) ||				    (src_type_prev != src_type)) { /* reinit SRC */					src_state = src_delete(src_state);					if ((src_state = src_new(src_type, 2, &src_error)) == NULL) {						fprintf(stderr, "disk thread: error: src_new() failed: "						       "%s.\n", src_strerror(src_error));						goto done;					}					info->in_SR_prev = info->in_SR;					src_type_prev = src_type;				}								src_data.input_frames = n_read;				src_data.data_in = readbuf;				src_data.src_ratio = src_ratio;				src_data.data_out = framebuf + n_src_prev * 2*sample_size;				src_data.output_frames = n_space - n_src_prev;				if ((src_error = src_process(src_state, &src_data))) {					fprintf(stderr, "disk thread: SRC error: %s\n",					       src_strerror(src_error));					goto done;				}				n_src += src_data.output_frames_gen;#endif /* HAVE_SRC */			}						if (end_of_file) {				file_decoder_close(fdec);				/* send request for a new filename */				send_cmd = CMD_FILEREQ;				rb_write(rb_disk2gui, &send_cmd, 1);				goto sleep;			}		}	flush:		rb_write(rb, framebuf, n_src * 2*sample_size);		/* update & send STATUS */		fdec->samples_left -= n_read;		sample_offset =	rb_read_space(rb) / (2 * sample_size);		disk_thread_status.samples_left = fdec->samples_left;		disk_thread_status.sample_offset = sample_offset / src_ratio;		if (disk_thread_status.samples_left < 0) {			disk_thread_status.samples_left = 0;		}		if (!rb_read_space(rb_gui2disk)) {			send_cmd = CMD_STATUS;			rb_write(rb_disk2gui, &send_cmd, sizeof(send_cmd));			rb_write(rb_disk2gui, (char *)&disk_thread_status,					      sizeof(status_t));		}		/* cleanup buffer counters */		n_src = 0;		n_src_prev = 0;		end_of_file = 0;			sleep:		{			/* suspend thread, wake up after 100 ms */#ifdef _WIN32			GTimeVal time;			GTimeVal * timeout = &time;			g_get_current_time(timeout);			g_time_val_add(timeout, 100000);#else			struct timeval now;			struct timezone tz;			struct timespec timeout;			gettimeofday(&now, &tz);			timeout.tv_nsec = now.tv_usec * 1000 + 100000000;			timeout.tv_sec = now.tv_sec;			while (timeout.tv_nsec > 1000000000) {				timeout.tv_nsec -= 1000000000;				timeout.tv_sec += 1;			}#endif /* _WIN32 */			AQUALUNG_COND_TIMEDWAIT(disk_thread_wake, disk_thread_lock, timeout)		}	} done:	free(readbuf);	free(framebuf);#ifdef HAVE_SRC	src_state = src_delete(src_state);#endif /* HAVE_SRC */	file_decoder_delete(fdec);	AQUALUNG_MUTEX_UNLOCK(disk_thread_lock)	return 0;}/* OSS output thread */#ifdef HAVE_OSSvoid *oss_thread(void * arg) {        u_int32_t i;        thread_info_t * info = (thread_info_t *)arg;	int bufsize = 1024;        int n_avail;	int ioctl_status;	char recv_cmd;	int fd_oss = info->fd_oss;	short * oss_short_buf;	struct timespec req_time;	struct timespec rem_time;	req_time.tv_sec = 0;        req_time.tv_nsec = 100000000;

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲国产日韩a在线播放性色| 久久天堂av综合合色蜜桃网| 日韩久久一区二区| 色综合色综合色综合色综合色综合| 中文乱码免费一区二区| 成人黄色国产精品网站大全在线免费观看| 欧美国产激情二区三区 | 午夜伦欧美伦电影理论片| 欧美这里有精品| 日韩在线一区二区三区| 日韩午夜精品电影| 国产成人在线影院| 自拍偷拍国产精品| 欧美日韩国产综合一区二区三区| 日韩精品色哟哟| 久久久不卡网国产精品二区| 91在线视频18| 婷婷国产在线综合| 久久色.com| 色8久久人人97超碰香蕉987| 日韩精品亚洲一区| 欧美国产日韩亚洲一区| 欧美性做爰猛烈叫床潮| 久久不见久久见免费视频1| 国产欧美日韩在线| 欧美亚一区二区| 国产一区二区三区黄视频 | 国产精品国产自产拍在线| 在线影视一区二区三区| 久久99精品国产麻豆不卡| 国产精品久久久久影视| 91精品国产色综合久久不卡蜜臀 | 欧美日产在线观看| 国产精品99久久久久久有的能看| 一区二区三区欧美| 精品久久久久久久人人人人传媒 | 91一区二区在线| 精品一区二区在线播放| 亚洲欧美日韩国产一区二区三区| 日韩美一区二区三区| 99re6这里只有精品视频在线观看| 日产国产高清一区二区三区 | 91一区二区在线| 狠狠色丁香久久婷婷综| 亚洲综合自拍偷拍| 久久精品欧美一区二区三区麻豆| 欧美日韩一区二区电影| 成人综合日日夜夜| 久久精品99久久久| 亚洲成av人片在线观看无码| 中文字幕欧美一区| 久久精品人人做| 欧美成人免费网站| 9191国产精品| 欧洲日韩一区二区三区| www.久久精品| 福利一区二区在线观看| 精品午夜久久福利影院| 日本不卡视频在线| 午夜精品福利一区二区三区av| 亚洲欧美成人一区二区三区| 国产午夜亚洲精品理论片色戒| 日韩欧美国产一区二区在线播放 | 欧美色综合久久| 成人国产精品免费| 国产91精品入口| 色狠狠一区二区三区香蕉| 国产在线麻豆精品观看| 麻豆免费看一区二区三区| 亚洲国产日韩a在线播放| 亚洲欧美色一区| 亚洲欧美一区二区三区国产精品| 国产精品卡一卡二卡三| 中文字幕的久久| 国产精品卡一卡二| 国产精品久久久久aaaa樱花| 国产精品美女久久久久久久久久久 | 国产一区二区看久久| 日韩av一区二区在线影视| 日一区二区三区| 日韩国产欧美在线播放| 免费成人美女在线观看.| 日韩影视精彩在线| 蜜桃av一区二区| 看电视剧不卡顿的网站| 精品亚洲欧美一区| 国产精品一二三在| 不卡的看片网站| 色综合欧美在线| 欧美性感一区二区三区| 69久久夜色精品国产69蝌蚪网| 91麻豆精品国产91久久久资源速度 | 亚洲色图20p| 一区二区三区欧美激情| 石原莉奈一区二区三区在线观看| 免费欧美在线视频| 国产一区二区在线免费观看| 大白屁股一区二区视频| 色欧美片视频在线观看| 欧美三级视频在线观看| 日韩三级精品电影久久久 | 91成人看片片| 日韩亚洲欧美中文三级| 久久你懂得1024| 中文字幕一区三区| 午夜精品福利一区二区三区蜜桃| 蜜桃一区二区三区四区| 国产成人亚洲精品狼色在线| 91猫先生在线| 制服.丝袜.亚洲.中文.综合| 久久日韩粉嫩一区二区三区| 日韩毛片视频在线看| 亚洲成人av电影在线| 精彩视频一区二区| a4yy欧美一区二区三区| 欧美日韩日日摸| 久久久99精品久久| 亚洲午夜久久久久久久久电影院 | 一区二区三区国产精华| 免费在线观看成人| 成人免费三级在线| 欧美裸体bbwbbwbbw| 国产午夜精品久久久久久久| 亚洲综合激情小说| 国产一区日韩二区欧美三区| 一本到不卡免费一区二区| 6080亚洲精品一区二区| 亚洲国产精品av| 日韩精品每日更新| 97se亚洲国产综合自在线观| 欧美大白屁股肥臀xxxxxx| 亚洲三级在线播放| 久久99精品久久久久久国产越南| 色八戒一区二区三区| 久久综合九色综合97婷婷女人| 亚洲综合在线第一页| 国产成人av电影免费在线观看| 欧美高清dvd| 亚洲精品日韩专区silk| 粉嫩aⅴ一区二区三区四区| 欧美久久一区二区| 亚洲精品一卡二卡| 国产成人在线网站| 欧美成人一级视频| 日韩中文字幕麻豆| 欧洲国内综合视频| 日韩理论片在线| 成人丝袜高跟foot| 久久久欧美精品sm网站| 奇米影视在线99精品| 欧美日韩在线播放三区四区| 综合久久久久综合| 不卡欧美aaaaa| 国产欧美日韩精品a在线观看| 久久66热偷产精品| 在线综合亚洲欧美在线视频| 亚洲电影第三页| 91黄色激情网站| 亚洲一区二区精品久久av| 91香蕉视频污在线| 亚洲人成在线播放网站岛国| 99久久久免费精品国产一区二区| 久久久亚洲精品石原莉奈| 久久草av在线| 26uuu成人网一区二区三区| 裸体一区二区三区| 日韩一区二区三区四区五区六区| 丝袜亚洲另类丝袜在线| 欧美日韩国产色站一区二区三区| 亚洲一二三四在线观看| 欧美日韩一本到| 日韩高清在线一区| 日韩三区在线观看| 精品午夜一区二区三区在线观看| 精品国产区一区| 精彩视频一区二区三区| 久久久www免费人成精品| 国产一区二区三区免费观看| 久久久av毛片精品| 不卡的av在线播放| 亚洲综合自拍偷拍| 欧美日韩精品系列| 午夜精品视频在线观看| 91麻豆精品国产91久久久久| 久久精品国产精品亚洲精品 | 久久奇米777| 成人免费看视频| 亚洲色图.com| 欧美美女一区二区| 久久99国产精品麻豆| 国产偷国产偷亚洲高清人白洁 | 91免费视频观看| 亚洲第一精品在线| 精品日韩99亚洲| 99久久精品国产网站| 亚洲国产一区二区三区青草影视| 91精品福利在线一区二区三区| 国产在线精品不卡| 亚洲欧美日本在线| 日韩欧美黄色影院|