示例#1
0
文件: main.c 项目: saveriob/RandSync
uint16_t run_algorithm(void) {

	if (rnd < 0x004F) send_time(sync_algorithm); 
	update_rnd();

	return 1;

}
示例#2
0
static float quantize_boost_interleave
	(void           *obuf
	,float          *in_bufs
	,size_t          chan_stride
	,unsigned        channels
	,unsigned        in_length
	,unsigned        out_length
	,uint_fast32_t  *dither_seed
	,unsigned        fmtbits
	)
{
	float maxv = 0.0f;
	uint_fast32_t rseed = *dither_seed;
	float boost;

	if (channels == 2) {
		unsigned j;
		float minv = 0.0f;
		float maxr = 0.0f;
		float minr = 0.0f;

		for (j = 0; j < in_length; j++) {
			float s1 = in_bufs[j];
			float s2 = in_bufs[chan_stride+j];
			maxv = (s1 > maxv) ? s1 : maxv;
			minv = (s1 < minv) ? s1 : minv;
			maxr = (s2 > maxr) ? s2 : maxr;
			minr = (s2 < minr) ? s2 : minr;
		}

		maxv  = (maxv > maxr) ? maxv : maxr;
		minv  = (minv < minr) ? minv : minr;
		maxv += 1.0f;
		maxv  = (maxv > -minv) ? maxv : -minv;

		if (fmtbits == 12 && channels == 2) {
			unsigned char *out_buf = obuf;
			maxv  *= 1.0f / 2048.0f;
			boost  = 1.0f / maxv;
			for (j = 0; j < in_length; j++) {
				float s1         = in_bufs[j] * boost;
				float s2         = in_bufs[chan_stride+j] * boost;
				int_fast32_t r1  = (rseed = update_rnd(rseed)) & 0x3FFFFFFFu;
				int_fast32_t r2  = (rseed = update_rnd(rseed)) & 0x3FFFFFFFu;
				int_fast32_t r3  = (rseed = update_rnd(rseed)) & 0x3FFFFFFFu;
				int_fast32_t r4  = (rseed = update_rnd(rseed)) & 0x3FFFFFFFu;
				float d1         = (r1 + r2) * (1.0f / 0x7FFFFFFF);
				float d2         = (r3 + r4) * (1.0f / 0x7FFFFFFF);
				int_fast32_t v1  = (int_fast32_t)(d1 + s1 + 2048.0f) - 2048;
				int_fast32_t v2  = (int_fast32_t)(d2 + s2 + 2048.0f) - 2048;
				v1 = (v1 > (int)0x7FF) ? 0x7FF : ((v1 < -(int)0x800) ? -(int)0x800 : v1);
				v2 = (v2 > (int)0x7FF) ? 0x7FF : ((v2 < -(int)0x800) ? -(int)0x800 : v2);
				encode2x12(out_buf + 3*j, v1, v2);
			}
			for (; j < out_length; j++) {
				encode2x12(out_buf + 3*j, 0, 0);
			}
		} else if (fmtbits == 16 && channels == 2) {
			int_least16_t *out_buf = obuf;
			maxv  *= 1.0f / 32764.0f;
			boost  = ((float)((((uint_fast64_t)1u) << 33))) / maxv;

			/* 4091ms */
			for (j = 0; j < in_length; j++) {
				uint_fast32_t d1, d2, d3, d4;
				float f1, f2;
				int_fast64_t lch, rch;
				f1     = in_bufs[j];
				f2     = in_bufs[chan_stride+j];
				d1     = update_rnd(rseed);
				d2     = update_rnd(d1);
				d3     = update_rnd(d2);
				d4     = update_rnd(d3);
				f1    *= boost;
				f2    *= boost;
				rseed  = d4;
				lch    = (int_fast64_t)f1;
				rch    = (int_fast64_t)f2;
				lch   += (int_fast64_t)(d1 & 0xFFFFFFFFu);
				rch   += (int_fast64_t)(d2 & 0xFFFFFFFFu);
				lch   += (int_fast64_t)(d3 & 0xFFFFFFFFu);
				rch   += (int_fast64_t)(d4 & 0xFFFFFFFFu);
				lch    = lch >> 33;
				rch    = rch >> 33;

				out_buf[2*j+0] = (int_least16_t)lch;
				out_buf[2*j+1] = (int_least16_t)rch;
			}
			for (; j < out_length; j++) {
				out_buf[2*j+0] = 0;
				out_buf[2*j+1] = 0;
			}
		} else {