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

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

?? rdpsnd.c

?? LInux 下的遠(yuǎn)程桌面工具 Rdesktop
?? C
?? 第 1 頁(yè) / 共 2 頁(yè)
字號(hào):
/* -*- c-basic-offset: 8 -*-   rdesktop: A Remote Desktop Protocol client.   Sound Channel Process Functions   Copyright 2006-2007 Pierre Ossman <ossman@cendio.se> for Cendio AB   Copyright (C) Matthew Chapman 2003-2007   Copyright (C) GuoJunBo guojunbo@ict.ac.cn 2003   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 <assert.h>#include "rdesktop.h"#include "rdpsnd.h"#include "rdpsnd_dsp.h"#define RDPSND_CLOSE		1#define RDPSND_WRITE		2#define RDPSND_SET_VOLUME	3#define RDPSND_UNKNOWN4		4#define RDPSND_COMPLETION	5#define RDPSND_PING			6#define RDPSND_NEGOTIATE	7#define RDPSND_REC_NEGOTIATE	39#define RDPSND_REC_START		40#define RDPSND_REC_STOP			41#define RDPSND_REC_DATA			42#define RDPSND_REC_SET_VOLUME	43#define RDPSND_FLAG_RECORD		0x00800000#define MAX_FORMATS		10#define MAX_QUEUE		50static VCHANNEL *rdpsnd_channel;static VCHANNEL *rdpsnddbg_channel;static struct audio_driver *drivers = NULL;struct audio_driver *current_driver = NULL;static RD_BOOL device_open;static RD_BOOL rec_device_open;static RD_WAVEFORMATEX formats[MAX_FORMATS];static unsigned int format_count;static unsigned int current_format;static RD_WAVEFORMATEX rec_formats[MAX_FORMATS];static unsigned int rec_format_count;static unsigned int rec_current_format;unsigned int queue_hi, queue_lo, queue_pending;struct audio_packet packet_queue[MAX_QUEUE];static char record_buffer[8192];static uint32 record_buffer_size;static uint8 packet_opcode;static struct stream packet;void (*wave_out_play) (void);static void rdpsnd_queue_write(STREAM s, uint16 tick, uint8 index);static void rdpsnd_queue_init(void);static void rdpsnd_queue_complete_pending(void);static long rdpsnd_queue_next_completion(void);static STREAMrdpsnd_init_packet(uint16 type, uint16 size){	STREAM s;	s = channel_init(rdpsnd_channel, size + 4);	out_uint16_le(s, type);	out_uint16_le(s, size);	return s;}static voidrdpsnd_send(STREAM s){	channel_send(s, rdpsnd_channel);}static voidrdpsnd_send_completion(uint16 tick, uint8 packet_index){	STREAM s;	s = rdpsnd_init_packet(RDPSND_COMPLETION, 4);	out_uint16_le(s, tick);	out_uint8(s, packet_index);	out_uint8(s, 0);	s_mark_end(s);	rdpsnd_send(s);	DEBUG_SOUND(("RDPSND: -> RDPSND_COMPLETION(tick: %u, index: %u)\n",		     (unsigned) tick, (unsigned) packet_index));}static voidrdpsnd_flush_record(void){	STREAM s;	unsigned int chunk_size;	char *data;	if (record_buffer_size == 0)		return;	assert(record_buffer_size <= sizeof(record_buffer));	data = record_buffer;	/*	 * Microsoft's RDP server keeps dropping chunks, so we need to	 * transmit everything inside one channel fragment or we risk	 * making the rdpsnd server go out of sync with the byte stream.	 */	while (record_buffer_size)	{		if (record_buffer_size < 1596)			chunk_size = record_buffer_size;		else			chunk_size = 1596;		s = rdpsnd_init_packet(RDPSND_REC_DATA, chunk_size);		out_uint8p(s, data, chunk_size);		s_mark_end(s);		rdpsnd_send(s);		data = data + chunk_size;		record_buffer_size -= chunk_size;		DEBUG_SOUND(("RDPSND: -> RDPSND_REC_DATA(length: %u)\n", (unsigned) chunk_size));	}	record_buffer_size = 0;}voidrdpsnd_record(const void *data, unsigned int size){	uint32 remain, chunk;	assert(rec_device_open);	while (size)	{		remain = sizeof(record_buffer) - record_buffer_size;		if (size >= remain)			chunk = remain;		else			chunk = size;		memcpy(record_buffer + record_buffer_size, data, chunk);#ifdef B_ENDIAN		if (current_driver->need_byteswap_on_be)			rdpsnd_dsp_swapbytes(record_buffer + record_buffer_size,					     chunk, &rec_formats[rec_current_format]);#endif		record_buffer_size += chunk;		data = (const char *) data + chunk;		size -= chunk;		if (record_buffer_size == sizeof(record_buffer))			rdpsnd_flush_record();	}}static RD_BOOLrdpsnd_auto_select(void){	static RD_BOOL failed = False;	if (!failed)	{		current_driver = drivers;		while (current_driver != NULL)		{			DEBUG(("trying %s...\n", current_driver->name));			if (current_driver->wave_out_open())			{				DEBUG(("selected %s\n", current_driver->name));				current_driver->wave_out_close();				return True;			}			current_driver = current_driver->next;		}		warning("no working audio-driver found\n");		failed = True;		current_driver = NULL;	}	return False;}static voidrdpsnd_process_negotiate(STREAM in){	uint16 in_format_count, i;	uint8 pad;	uint16 version;	RD_WAVEFORMATEX *format;	STREAM out;	RD_BOOL device_available = False;	int readcnt;	int discardcnt;	in_uint8s(in, 14);	/* initial bytes not valid from server */	in_uint16_le(in, in_format_count);	in_uint8(in, pad);	in_uint16_le(in, version);	in_uint8s(in, 1);	/* padding */	DEBUG_SOUND(("RDPSND: RDPSND_NEGOTIATE(formats: %d, pad: 0x%02x, version: %x)\n",		     (int) in_format_count, (unsigned) pad, (unsigned) version));	if (!current_driver)		device_available = rdpsnd_auto_select();	if (current_driver && !device_available && current_driver->wave_out_open())	{		current_driver->wave_out_close();		device_available = True;	}	format_count = 0;	if (s_check_rem(in, 18 * in_format_count))	{		for (i = 0; i < in_format_count; i++)		{			format = &formats[format_count];			in_uint16_le(in, format->wFormatTag);			in_uint16_le(in, format->nChannels);			in_uint32_le(in, format->nSamplesPerSec);			in_uint32_le(in, format->nAvgBytesPerSec);			in_uint16_le(in, format->nBlockAlign);			in_uint16_le(in, format->wBitsPerSample);			in_uint16_le(in, format->cbSize);			/* read in the buffer of unknown use */			readcnt = format->cbSize;			discardcnt = 0;			if (format->cbSize > MAX_CBSIZE)			{				fprintf(stderr, "cbSize too large for buffer: %d\n",					format->cbSize);				readcnt = MAX_CBSIZE;				discardcnt = format->cbSize - MAX_CBSIZE;			}			in_uint8a(in, format->cb, readcnt);			in_uint8s(in, discardcnt);			if (current_driver && current_driver->wave_out_format_supported(format))			{				format_count++;				if (format_count == MAX_FORMATS)					break;			}		}	}	out = rdpsnd_init_packet(RDPSND_NEGOTIATE | 0x200, 20 + 18 * format_count);	out_uint32_le(out, 0x00800003);	/* flags */	out_uint32(out, 0xffffffff);	/* volume */	out_uint32(out, 0);	/* pitch */	out_uint16(out, 0);	/* UDP port */	out_uint16_le(out, format_count);	out_uint8(out, 0);	/* padding */	out_uint16_le(out, 2);	/* version */	out_uint8(out, 0);	/* padding */	for (i = 0; i < format_count; i++)	{		format = &formats[i];		out_uint16_le(out, format->wFormatTag);		out_uint16_le(out, format->nChannels);		out_uint32_le(out, format->nSamplesPerSec);		out_uint32_le(out, format->nAvgBytesPerSec);		out_uint16_le(out, format->nBlockAlign);		out_uint16_le(out, format->wBitsPerSample);		out_uint16(out, 0);	/* cbSize */	}	s_mark_end(out);	DEBUG_SOUND(("RDPSND: -> RDPSND_NEGOTIATE(formats: %d)\n", (int) format_count));	rdpsnd_send(out);}static voidrdpsnd_process_ping(STREAM in){	uint16 tick;	STREAM out;	in_uint16_le(in, tick);	DEBUG_SOUND(("RDPSND: RDPSND_PING(tick: 0x%04x)\n", (unsigned) tick));	out = rdpsnd_init_packet(RDPSND_PING | 0x2300, 4);	out_uint16_le(out, tick);	out_uint16_le(out, 0);	s_mark_end(out);	rdpsnd_send(out);	DEBUG_SOUND(("RDPSND: -> (tick: 0x%04x)\n", (unsigned) tick));}static voidrdpsnd_process_rec_negotiate(STREAM in){	uint16 in_format_count, i;	uint16 version;	RD_WAVEFORMATEX *format;	STREAM out;	RD_BOOL device_available = False;	int readcnt;	int discardcnt;	in_uint8s(in, 8);	/* initial bytes not valid from server */	in_uint16_le(in, in_format_count);	in_uint16_le(in, version);	DEBUG_SOUND(("RDPSND: RDPSND_REC_NEGOTIATE(formats: %d, version: %x)\n",		     (int) in_format_count, (unsigned) version));	if (!current_driver)		device_available = rdpsnd_auto_select();	if (current_driver && !device_available && current_driver->wave_in_open	    && current_driver->wave_in_open())	{		current_driver->wave_in_close();		device_available = True;	}	rec_format_count = 0;	if (s_check_rem(in, 18 * in_format_count))	{		for (i = 0; i < in_format_count; i++)		{			format = &rec_formats[rec_format_count];			in_uint16_le(in, format->wFormatTag);			in_uint16_le(in, format->nChannels);			in_uint32_le(in, format->nSamplesPerSec);			in_uint32_le(in, format->nAvgBytesPerSec);			in_uint16_le(in, format->nBlockAlign);			in_uint16_le(in, format->wBitsPerSample);			in_uint16_le(in, format->cbSize);			/* read in the buffer of unknown use */			readcnt = format->cbSize;			discardcnt = 0;			if (format->cbSize > MAX_CBSIZE)			{				fprintf(stderr, "cbSize too large for buffer: %d\n",					format->cbSize);				readcnt = MAX_CBSIZE;				discardcnt = format->cbSize - MAX_CBSIZE;			}			in_uint8a(in, format->cb, readcnt);			in_uint8s(in, discardcnt);			if (current_driver && current_driver->wave_in_format_supported			    && current_driver->wave_in_format_supported(format))			{				rec_format_count++;				if (rec_format_count == MAX_FORMATS)					break;			}		}	}	out = rdpsnd_init_packet(RDPSND_REC_NEGOTIATE, 12 + 18 * rec_format_count);	out_uint32_le(out, 0x00000000);	/* flags */	out_uint32_le(out, 0xffffffff);	/* volume */	out_uint16_le(out, rec_format_count);	out_uint16_le(out, 1);	/* version */	for (i = 0; i < rec_format_count; i++)	{		format = &rec_formats[i];		out_uint16_le(out, format->wFormatTag);		out_uint16_le(out, format->nChannels);		out_uint32_le(out, format->nSamplesPerSec);		out_uint32_le(out, format->nAvgBytesPerSec);		out_uint16_le(out, format->nBlockAlign);		out_uint16_le(out, format->wBitsPerSample);		out_uint16(out, 0);	/* cbSize */	}	s_mark_end(out);	DEBUG_SOUND(("RDPSND: -> RDPSND_REC_NEGOTIATE(formats: %d)\n", (int) rec_format_count));	rdpsnd_send(out);}static voidrdpsnd_process_packet(uint8 opcode, STREAM s){	uint16 vol_left, vol_right;	static uint16 tick, format;	static uint8 packet_index;	switch (opcode)	{		case RDPSND_WRITE:			in_uint16_le(s, tick);			in_uint16_le(s, format);			in_uint8(s, packet_index);			in_uint8s(s, 3);			DEBUG_SOUND(("RDPSND: RDPSND_WRITE(tick: %u, format: %u, index: %u, data: %u bytes)\n", (unsigned) tick, (unsigned) format, (unsigned) packet_index, (unsigned) s->size - 8));			if (format >= MAX_FORMATS)			{				error("RDPSND: Invalid format index\n");				break;			}			if (!device_open || (format != current_format))			{				/*				 * If we haven't selected a device by now, then either				 * we've failed to find a working device, or the server				 * is sending bogus RDPSND_WRITE.				 */				if (!current_driver)

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品综合一区二区三区| 激情文学综合插| 91精品视频网| 丰满少妇在线播放bd日韩电影| 亚洲美女视频在线| 精品第一国产综合精品aⅴ| 色视频一区二区| 国产精品18久久久久久久久久久久| 亚洲日本丝袜连裤袜办公室| 久久久久久久久久久久电影| 在线成人av网站| 91成人在线精品| 成人免费三级在线| 国产一区二区三区免费看| 亚洲成人激情自拍| 亚洲女子a中天字幕| 国产清纯在线一区二区www| 欧美精品在线观看一区二区| 91在线视频播放| 成人自拍视频在线观看| 精一区二区三区| 三级一区在线视频先锋 | 久久精品国产99久久6| 亚洲乱码国产乱码精品精的特点 | 大白屁股一区二区视频| 欧美在线色视频| 懂色av一区二区夜夜嗨| 国产尤物一区二区在线| 美女网站视频久久| 日本少妇一区二区| 日日噜噜夜夜狠狠视频欧美人| 一区二区三区免费| 亚洲影视资源网| 亚洲一区免费观看| 亚洲一区二区五区| 亚洲成人自拍网| 亚洲第一成年网| 午夜视频一区二区| 五月综合激情日本mⅴ| 午夜激情一区二区三区| 天堂av在线一区| 日本不卡123| 琪琪一区二区三区| 久久se精品一区二区| 奇米色一区二区三区四区| 蜜桃av一区二区三区| 久久99久久久久久久久久久| 九九九久久久精品| 国产精品白丝av| 成人综合婷婷国产精品久久蜜臀| 国产乱一区二区| 懂色av一区二区三区免费观看| 成人aa视频在线观看| 97久久精品人人做人人爽| 色呦呦一区二区三区| 91黄色激情网站| 欧美久久久久久久久中文字幕| 亚洲在线中文字幕| 三级亚洲高清视频| 国产一区二区在线观看免费| 国产91精品一区二区麻豆亚洲| 99精品国产热久久91蜜凸| 日本国产一区二区| 91麻豆精品国产91久久久久 | 国产女主播视频一区二区| 国产精品久久久久一区二区三区共| 综合色天天鬼久久鬼色| 亚洲国产精品综合小说图片区| 日本成人中文字幕| 国产资源精品在线观看| 国产成人av一区二区三区在线| 99精品热视频| 91 com成人网| 国产精品无遮挡| 亚洲午夜在线电影| 九一九一国产精品| 96av麻豆蜜桃一区二区| 777xxx欧美| 日本一区二区高清| 婷婷综合在线观看| 国精产品一区一区三区mba桃花 | 日本久久电影网| 日韩欧美在线网站| 综合欧美一区二区三区| 秋霞成人午夜伦在线观看| 成人在线一区二区三区| 欧美高清视频在线高清观看mv色露露十八| 欧美zozozo| 亚洲在线视频网站| 国产一区二区三区在线观看免费| 欧洲一区二区三区在线| 国产无遮挡一区二区三区毛片日本| 亚洲一区二区3| 高清久久久久久| 日韩亚洲欧美综合| 亚洲激情一二三区| 国产suv一区二区三区88区| 欧美视频中文一区二区三区在线观看| 久久―日本道色综合久久| 亚洲va韩国va欧美va精品| 成人免费毛片a| 精品久久国产字幕高潮| 亚洲中国最大av网站| 国产不卡在线一区| 精品久久久久久久久久久久久久久久久 | 一区二区在线观看av| 国产在线观看免费一区| 欧美美女直播网站| 亚洲精品国产高清久久伦理二区| 国产精品1区2区3区| 日韩视频国产视频| 亚洲二区视频在线| 91成人在线免费观看| 国产精品国产精品国产专区不蜜| 国产综合一区二区| 日韩一区二区在线观看视频| 亚洲一区二区三区免费视频| 91丨porny丨在线| 国产精品天天摸av网| 国产一区二区视频在线| 日韩美女视频在线| 免费欧美高清视频| 88在线观看91蜜桃国自产| 亚洲一区电影777| 色婷婷综合久久久久中文 | 久久午夜免费电影| 久久国产精品99精品国产| 88在线观看91蜜桃国自产| 亚洲午夜三级在线| 欧美性一二三区| 亚洲愉拍自拍另类高清精品| 91女厕偷拍女厕偷拍高清| 国产精品嫩草影院com| 成人看片黄a免费看在线| 亚洲国产高清在线| 成人免费视频免费观看| 国产精品久久久久久久久晋中| 成人精品高清在线| 成人免费一区二区三区视频| 成人午夜视频在线观看| 国产精品欧美极品| 色综合天天综合网天天狠天天| 日韩美女视频一区二区| 色视频一区二区| 亚洲一区二区三区在线播放| 欧美性极品少妇| 天涯成人国产亚洲精品一区av| 欧美猛男男办公室激情| 免费精品99久久国产综合精品| 精品免费99久久| 国产成人在线视频播放| 亚洲色图制服诱惑| 在线视频观看一区| 同产精品九九九| 欧美精品一区二区三区在线 | www成人在线观看| 国产成人激情av| 成人免费黄色大片| 亚洲视频网在线直播| 欧美特级限制片免费在线观看| 午夜精品123| 久久天天做天天爱综合色| 成人激情视频网站| 亚洲一卡二卡三卡四卡五卡| 在线成人免费观看| 国产高清在线精品| 亚洲精品成人悠悠色影视| 欧美一区二区三区免费| 国产一区999| 一区二区三区四区在线| 欧美一级欧美一级在线播放| 国产成人精品午夜视频免费| 亚洲三级在线免费| 欧美一三区三区四区免费在线看| 国产精品中文字幕一区二区三区| 亚洲精品成人在线| 精品国产乱码久久久久久浪潮 | 日韩一区二区三区电影| 粉嫩aⅴ一区二区三区四区| 亚洲国产精品精华液网站| 精品国产a毛片| 欧美午夜电影在线播放| 国产乱人伦偷精品视频免下载| 亚洲最大成人综合| 国产无一区二区| 欧美高清dvd| 成人h版在线观看| 丝袜诱惑亚洲看片| 中文字幕日韩精品一区| 日韩一区二区三区观看| 色综合久久久久综合体 | 在线观看亚洲精品视频| 激情av综合网| 午夜精品久久久久久久蜜桃app| 国产嫩草影院久久久久| 欧美一区二区三区人| 91久久线看在观草草青青| 国产夫妻精品视频| 日本中文在线一区| 成人av网址在线|