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

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

?? libmad.c

?? windows mobile上很好用的音頻播放器希望大家會(huì)喜歡
?? C
字號(hào):

#include <windows.h>
#include "libmad.h"
#include "stream.h"
#include "frame.h"
#include "synth.h"
#include "fixed.h"

struct audio_dither {
  mad_fixed_t error[3];
  mad_fixed_t random;
};

struct audio_stats {
  unsigned long clipped_samples;
  mad_fixed_t peak_clipping;
  mad_fixed_t peak_sample;
};

typedef struct
{
	struct mad_stream stream;
	struct mad_frame frame;
	struct mad_synth synth;
	struct audio_stats stats;

	int equalizer;
	int left;
	mad_fixed_t eqfactor[32];
}dec_struct;

void equalizer_init(mad_fixed_t eqfactor[32])
{
	int i;
	for (i = 0; i < 32; i++)
		eqfactor[i] = 0x10000000;
}

HANDLE mad_init()
{
	dec_struct* dec = malloc(sizeof(dec_struct));
	if (!dec)
		return NULL;

	memset(dec, 0, sizeof(dec_struct));
	mad_stream_init(&dec->stream);
	mad_frame_init(&dec->frame);
	mad_synth_init(&dec->synth);

	equalizer_init(dec->eqfactor);
	dec->equalizer = 0;
	dec->left = 0;

	dec->stats.clipped_samples = 0;
	dec->stats.peak_clipping = 0;
	dec->stats.peak_sample = 0;

	return dec;
}

static __inline
void clip(mad_fixed_t *sample, struct audio_stats *stats)
{
	enum {
		MIN = -MAD_F_ONE,
		MAX =  MAD_F_ONE - 1
	};

	if (*sample >= stats->peak_sample) {
		if (*sample > MAX) {
			++stats->clipped_samples;
			if (*sample - MAX > stats->peak_clipping)
				stats->peak_clipping = *sample - MAX;

			*sample = MAX;
		}
		stats->peak_sample = *sample;
	}
	else if (*sample < -stats->peak_sample) {
		if (*sample < MIN) {
			++stats->clipped_samples;
			if (MIN - *sample > stats->peak_clipping)
				stats->peak_clipping = MIN - *sample;

			*sample = MIN;
		}
		stats->peak_sample = -*sample;
	}
}

static __inline
signed long audio_linear_round(unsigned int bits, mad_fixed_t sample,
			       struct audio_stats *stats)
{
	/* round */
	sample += (1L << (MAD_F_FRACBITS - bits));

	/* clip */
	clip(&sample, stats);

	/* quantize and scale */
	return sample >> (MAD_F_FRACBITS + 1 - bits);
}

static __inline
unsigned long prng(unsigned long state)
{
  return (state * 0x0019660dL + 0x3c6ef35fL) & 0xffffffffL;
}

static __inline
signed long audio_linear_dither(unsigned int bits, mad_fixed_t sample,
				struct audio_dither *dither,
				struct audio_stats *stats)
{
	unsigned int scalebits;
	mad_fixed_t output, mask, random;

	enum {
		MIN = -MAD_F_ONE,
		MAX =  MAD_F_ONE - 1
	};

	/* noise shape */
	sample += dither->error[0] - dither->error[1] + dither->error[2];

	dither->error[2] = dither->error[1];
	dither->error[1] = dither->error[0] / 2;

	/* bias */
	output = sample + (1L << (MAD_F_FRACBITS + 1 - bits - 1));

	scalebits = MAD_F_FRACBITS + 1 - bits;
	mask = (1L << scalebits) - 1;

	/* dither */
	random  = prng(dither->random);
	output += (random & mask) - (dither->random & mask);

	dither->random = random;

	/* clip */
	if (output >= stats->peak_sample) {
		if (output > MAX) {
			++stats->clipped_samples;
			if (output - MAX > stats->peak_clipping)
				stats->peak_clipping = output - MAX;

			output = MAX;

			if (sample > MAX)
				sample = MAX;
		}
		stats->peak_sample = output;
	}
	else if (output < -stats->peak_sample) {
		if (output < MIN) {
			++stats->clipped_samples;
			if (MIN - output > stats->peak_clipping)
				stats->peak_clipping = MIN - output;

			output = MIN;

			if (sample < MIN)
				sample = MIN;
		}
		stats->peak_sample = -output;
	}

	/* quantize */
	output &= ~mask;

	/* error feedback */
	dither->error[0] = sample - output;

	/* scale */
	return output >> scalebits;
}

static
unsigned int pack_pcm(unsigned char *data, unsigned int nsamples,
		      mad_fixed_t const *left, mad_fixed_t const *right,
		      int resolution, struct audio_stats *stats)
{
	static struct audio_dither left_dither, right_dither;
	unsigned char const *start;
	register signed long sample0, sample1;
	int effective, bytes;

	start     = data;
	effective = (resolution > 24) ? 24 : resolution;
	bytes     = resolution / 8;

	if (right) {  /* stereo */
		while (nsamples--) {
#ifdef LINEAR_DITHER
			sample0 = audio_linear_dither(effective, *left++, &left_dither, stats);
			sample1 = audio_linear_dither(effective, *right++, &right_dither, stats);
#else
			sample0 = audio_linear_round(effective, *left++, stats);
			sample1 = audio_linear_round(effective, *right++, stats);
#endif

			switch (resolution) {
			case 8:
				data[0] = sample0 + 0x80;
				data[1] = sample1 + 0x80;
				break;
			case 32:
				sample0 <<= 8;
				sample1 <<= 8;
				data[        3] = sample0 >> 24;
				data[bytes + 3] = sample1 >> 24;
			case 24:
				data[        2] = sample0 >> 16;
				data[bytes + 2] = sample1 >> 16;
			case 16:
				data[        1] = sample0 >>  8;
				data[bytes + 1] = sample1 >>  8;
				data[        0] = sample0 >>  0;
				data[bytes + 0] = sample1 >>  0;
			}
			data += bytes * 2;
		}
	}
	else {  /* mono */
		while (nsamples--) {
#ifdef LINEAR_DITHER
			sample0 = audio_linear_dither(effective, *left++, &left_dither, stats);
#else
			sample0 = audio_linear_round(effective, *left++, stats);
#endif
			switch (resolution) {
			case 8:
				data[0] = sample0 + 0x80;
				break;
			case 32:
				sample0 <<= 8;
				data[3] = sample0 >> 24;
			case 24:
				data[2] = sample0 >> 16;
			case 16:
				data[1] = sample0 >>  8;
				data[0] = sample0 >>  0;
			}
			data += bytes;
		}
	}
	return data - start;
}

int mad_decode(HANDLE hMad, char *inmemory,int inmemsize, char *outmemory, 
			   int outmemsize, int* read, int *done, int resolution, int halfsamplerate)
{
	int size;
	dec_struct* dec = (dec_struct*)hMad;
	
	*done = 0;
	*read = 0;

	if (dec->left) {
		size = min(outmemsize / (resolution * dec->synth.pcm.channels / 8), dec->left);
		pack_pcm(outmemory, size, &dec->synth.pcm.samples[0][dec->synth.pcm.length - dec->left],
			(dec->synth.pcm.channels == 1) ? NULL : &dec->synth.pcm.samples[1][dec->synth.pcm.length - dec->left], 
			resolution, &dec->stats);
		*done += size * resolution * dec->synth.pcm.channels / 8;
		outmemsize -= size * resolution * dec->synth.pcm.channels / 8;
	
		dec->left -= size;
		if (dec->left)
			return MAD_NEED_MORE_OUTPUT;
		if (!inmemsize)
			return MAD_OK;
	}

	mad_stream_buffer(&dec->stream, inmemory, inmemsize);
	
	if (mad_frame_decode(&dec->frame, &dec->stream) == -1) {
		if (dec->stream.error == MAD_ERROR_BUFLEN)
			return MAD_NEED_MORE_INPUT;
		return MAD_RECOVERABLE(dec->stream.error) ? MAD_ERR : MAD_FATAL_ERR;
	}

	if (dec->equalizer)
	{
		unsigned int nch, ch, ns, s, sb;

		nch = MAD_NCHANNELS(&dec->frame.header);
		ns  = MAD_NSBSAMPLES(&dec->frame.header);
		for (ch = 0; ch < nch; ++ch) {
			for (s = 0; s < ns; ++s) {
				for (sb = 0; sb < 32; ++sb) {
					dec->frame.sbsample[ch][s][sb] =
					mad_f_mul(dec->frame.sbsample[ch][s][sb], dec->eqfactor[sb]);
				}
			}
		}
	}

	if (halfsamplerate)
		dec->frame.options |= MAD_OPTION_HALFSAMPLERATE;
	else
		dec->frame.options &= ~MAD_OPTION_HALFSAMPLERATE;
	mad_synth_frame(&dec->synth, &dec->frame);

	if (outmemsize < dec->synth.pcm.length * resolution * dec->synth.pcm.channels / 8) {
		size = outmemsize / (resolution * dec->synth.pcm.channels / 8);
		pack_pcm(outmemory + *done, size, dec->synth.pcm.samples[0],
			(dec->synth.pcm.channels == 1) ? NULL : dec->synth.pcm.samples[1], resolution, &dec->stats);
		*done += size * resolution * dec->synth.pcm.channels / 8;
		*read += dec->stream.next_frame - inmemory;
		dec->left = dec->synth.pcm.length - size;
		return MAD_NEED_MORE_OUTPUT;
	}

	pack_pcm(outmemory + *done, dec->synth.pcm.length, dec->synth.pcm.samples[0],
		(dec->synth.pcm.channels == 1) ? NULL : dec->synth.pcm.samples[1], resolution, &dec->stats);
	*done += dec->synth.pcm.length * resolution * dec->synth.pcm.channels / 8;
	*read += dec->stream.next_frame - inmemory;
	return MAD_OK;
}

void mad_uninit(HANDLE hMad)
{
	dec_struct* dec = (dec_struct*)hMad;

	mad_synth_finish(&dec->synth);
	mad_frame_finish(&dec->frame);
	mad_stream_finish(&dec->stream);

	free(dec);
}

double eq_decibels(int value)
{
	/* 0-63, 0 == +20 dB, 31 == 0 dB, 63 == -20 dB */
	return (value == 31) ? 0.0 : 20.0 - (20.0 / 31.5) * value;
}

mad_fixed_t eq_factor(double db)
{
	if (db > 18)
		db = 18;

	return mad_f_tofixed(pow(10, db / 20));
}

void mad_seteq(HANDLE hMad, equalizer_value* eq)
{
	double base;
	static unsigned char const map[32] = {
	0, 1, 2, 3, 4, 5, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8,
	8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9
	};
	int i;
	dec_struct* dec = (dec_struct*)hMad;

	/* 60, 170, 310, 600, 1k, 3k, 6k, 12k, 14k, 16k */

	base = eq_decibels(eq->preamp);

	for (i = 0; i < 32; ++i)
		dec->eqfactor[i] = eq_factor(base + eq_decibels(eq->data[map[i]]));
	dec->equalizer = eq->enable;
}

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美少妇性性性| 欧美日韩一区成人| 首页亚洲欧美制服丝腿| 久久色成人在线| 欧美私模裸体表演在线观看| 国产乱子伦视频一区二区三区| 18成人在线观看| 精品国一区二区三区| 欧美日韩一区精品| 99久久精品国产一区二区三区| 日韩国产成人精品| 亚洲另类在线视频| 日本一区二区三区四区| 日韩欧美另类在线| 欧美日韩一区二区三区在线| 盗摄精品av一区二区三区| 日本aⅴ亚洲精品中文乱码| 亚洲蜜臀av乱码久久精品蜜桃| 精品久久人人做人人爽| 欧美日韩国产成人在线免费| www.日韩av| 国产高清精品在线| 精品一区二区综合| 日韩av在线发布| 亚洲国产精品麻豆| 亚洲精品老司机| 国产精品久久久爽爽爽麻豆色哟哟| 欧美电影免费观看高清完整版 | 亚洲男人的天堂一区二区| 精品国产乱码久久久久久夜甘婷婷| 欧美三级电影在线观看| 日本道精品一区二区三区| 成人av电影在线| 亚洲欧美乱综合| 亚洲欧美日韩成人高清在线一区| 亚洲欧洲av在线| 中文字幕的久久| 国产精品美女久久久久aⅴ国产馆| 久久中文字幕电影| 精品三级av在线| 日韩欧美国产三级电影视频| 欧美一激情一区二区三区| 欧美精品日韩一区| 91麻豆精品国产91| 欧美一区二区三区公司| 7777精品伊人久久久大香线蕉最新版| 欧美日韩色综合| 777午夜精品免费视频| 欧美一卡二卡三卡| 日韩你懂的在线播放| 日韩精品最新网址| 久久综合久久综合久久综合| 2021久久国产精品不只是精品| 欧美mv和日韩mv的网站| 精品国产自在久精品国产| 日韩亚洲欧美在线| 26uuu另类欧美亚洲曰本| 久久久精品国产99久久精品芒果| 久久女同精品一区二区| 中文字幕巨乱亚洲| 亚洲欧美aⅴ...| 亚洲高清不卡在线观看| 免费成人美女在线观看| 国内精品视频一区二区三区八戒| 国产精品123| 91麻豆成人久久精品二区三区| 在线观看国产精品网站| 欧美一级xxx| 中文字幕欧美激情一区| 亚洲一区二区视频在线| 久久99这里只有精品| 大陆成人av片| 欧美日本一道本在线视频| 精品99999| 自拍偷拍亚洲综合| 日韩av中文字幕一区二区| 国产成人一区在线| 欧美影视一区在线| 亚洲精品在线三区| 亚洲激情图片一区| 久久99精品久久只有精品| zzijzzij亚洲日本少妇熟睡| 精品视频123区在线观看| 26uuu欧美| 亚洲午夜日本在线观看| 国产精品66部| 欧美天堂一区二区三区| 精品国内二区三区| 亚洲最快最全在线视频| 国产又粗又猛又爽又黄91精品| 91免费国产视频网站| 91麻豆精品国产91久久久资源速度| 久久久久9999亚洲精品| 亚洲不卡av一区二区三区| 国产成人在线电影| 欧美疯狂做受xxxx富婆| 国产精品美女久久久久久久久久久 | 久久精品一区二区| 亚洲成人在线观看视频| kk眼镜猥琐国模调教系列一区二区 | 首页亚洲欧美制服丝腿| 99精品国产99久久久久久白柏| 91精品国产综合久久福利软件 | 六月丁香婷婷久久| 欧美午夜电影网| 中文字幕巨乱亚洲| 狠狠色狠狠色综合系列| 欧美久久久久久久久| 亚洲欧洲精品天堂一级 | 国产精品国产馆在线真实露脸 | 成人av电影在线观看| 538在线一区二区精品国产| 日韩欧美不卡在线观看视频| 亚洲视频在线观看三级| 久久成人麻豆午夜电影| 91国产免费看| 国产精品欧美一区喷水| 日韩电影在线一区二区| 成人av免费在线播放| 精品国产乱码久久久久久久| 午夜影院久久久| 夫妻av一区二区| 日韩一区二区三区电影在线观看| 亚洲综合男人的天堂| 国产91露脸合集magnet| 精品欧美乱码久久久久久| 午夜伊人狠狠久久| 欧洲生活片亚洲生活在线观看| 中文字幕亚洲不卡| 国产精品夜夜爽| 日韩免费高清av| 午夜欧美大尺度福利影院在线看| 92精品国产成人观看免费| 精品国产区一区| 日本va欧美va瓶| 宅男噜噜噜66一区二区66| 亚洲成av人影院在线观看网| 色综合久久99| 亚洲精品中文字幕在线观看| 99精品国产91久久久久久| 国产精品久久久久久久久免费桃花| 国产自产v一区二区三区c| 日韩一级黄色大片| 久久国产福利国产秒拍| 精品久久久久久久一区二区蜜臀| 日产国产高清一区二区三区| 欧美日韩亚洲国产综合| 亚洲精品美国一| 欧美在线免费观看亚洲| 亚洲综合免费观看高清完整版| 99精品欧美一区二区蜜桃免费| 中文字幕一区av| voyeur盗摄精品| 亚洲国产日韩精品| 欧美喷潮久久久xxxxx| 水野朝阳av一区二区三区| 欧美日韩国产经典色站一区二区三区| 日韩影院在线观看| 日韩一区二区精品| 激情图片小说一区| 欧美精品一区视频| 国产精品自在欧美一区| 一区二区中文字幕在线| 一本一道久久a久久精品| 亚洲精品美国一| 欧美日韩综合不卡| 亚洲国产精品久久久久婷婷884| 91精品久久久久久久99蜜桃| 蜜臀va亚洲va欧美va天堂 | 国产91精品露脸国语对白| 国产网站一区二区三区| 成人精品视频网站| 亚洲欧洲av在线| 欧美日韩视频不卡| 狠狠色丁香婷婷综合久久片| 亚洲国产成人私人影院tom | 国产成人小视频| 亚洲欧美日韩久久| 在线观看日韩国产| 蜜桃传媒麻豆第一区在线观看| 久久精品亚洲精品国产欧美| 91色porny| 日本免费在线视频不卡一不卡二| 精品久久免费看| 91色在线porny| 日韩电影在线免费看| 亚洲欧洲韩国日本视频| 欧美精品v日韩精品v韩国精品v| 精品一区免费av| 亚洲日本一区二区三区| 日韩三级精品电影久久久| 国产91丝袜在线播放九色| 亚洲精品伦理在线| 欧美电视剧在线观看完整版| 波多野结衣中文字幕一区二区三区| 亚洲线精品一区二区三区| 精品国产一区二区三区不卡| 一本大道久久a久久综合婷婷| 日本色综合中文字幕| 国产精品久久久久久久久免费樱桃|