⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jvoipsampleconverter.cpp

📁 使用VOIP进行网络传输声音的类库
💻 CPP
📖 第 1 页 / 共 2 页
字号:
			srclen2--;		sourceadvance = 2;	}	else		sourceadvance = 1;		if (destinationbytespersample == 2)	{		destadvance = 4;		if ((dif = (destinationlen&0x03)) != 0)			dstlen2 -= dif;		destadvancehalf = 2;	}	else	{		if ((destinationlen&0x01) != 0)			dstlen2--;		destadvance = 2;		destadvancehalf = 1;	}			for (dstpos = 0 ; srcpos < srclen2 && dstpos < dstlen2 ; dstpos += destadvance)	{		int newval;		GetSixteenBitSampleValue(sourcebuffer+srcpos,newval);		EncodeSixteenBitSampleValue(destinationbuffer+dstpos,newval);		EncodeSixteenBitSampleValue(destinationbuffer+dstpos+destadvancehalf,newval);		srcpos2 += rateratio;		srcpos = ((int)(srcpos2+0.5))*sourceadvance;	}}*/void JVOIPSampleConverter::UpRate_AddStereo_Convert(){	int dif;	int destadvancehalf;	int srcpos;	double srcpos2;	int curval,nextval;	int prevadd;		srclen2 = sourcelen;	dstlen2 = destinationlen;	srcpos = 0;	srcpos2 = 0;	if (sourcebytespersample == 2)	{		if ((sourcelen&0x01) != 0)			srclen2--;		sourceadvance = 2;	}	else		sourceadvance = 1;		if (destinationbytespersample == 2)	{		destadvance = 4;		if ((dif = (destinationlen&0x03)) != 0)			dstlen2 -= dif;		destadvancehalf = 2;	}	else	{		if ((destinationlen&0x01) != 0)			dstlen2--;		destadvance = 2;		destadvancehalf = 1;	}	if (srcpos < srclen2 && dstlen2 > 0)	{		GetSixteenBitSampleValue(sourcebuffer+srcpos,curval);	}		prevadd = 0;	for (dstpos = 0 ; dstpos < dstlen2 ;          )	{		int newval,prevpos;		double pos;				prevpos = srcpos;		srcpos += sourceadvance;		if (srcpos < srclen2)		{			GetSixteenBitSampleValue(sourcebuffer+srcpos,nextval);			prevadd = nextval-curval;		}		else			nextval = curval + prevadd;				while ((pos = (srcpos2+0.5)*sourceadvance) < (double)srcpos && dstpos < dstlen2)		{			newval = (int)((double)curval+(double)(nextval-curval)*((double)pos-prevpos)/(double)sourceadvance);			newval *= factor;			EncodeSixteenBitSampleValue(destinationbuffer+dstpos,newval);			EncodeSixteenBitSampleValue(destinationbuffer+dstpos+destadvancehalf,newval);			srcpos2 += rateratio;			dstpos += destadvance;		}				curval = nextval;	}}/*void JVOIPSampleConverter::UpRate_SameStereo_Convert(){	int dif;	int sourceadvancehalf,destadvancehalf;	int srcpos;	double srcpos2;		srclen2 = sourcelen;	dstlen2 = destinationlen;	srcpos = 0;	srcpos2 = 0;		if (sourcestereo)	{		if (sourcebytespersample == 2)		{			if ((dif = (sourcelen&0x03)) != 0)				srclen2 -= dif;			sourceadvance = 4;			sourceadvancehalf = 2;		}		else		{			if ((sourcelen&0x01) != 0)				srclen2--;			sourceadvance = 2;			sourceadvancehalf = 1;	        }				if (destinationbytespersample == 2)		{			destadvance = 4;			if ((dif = (destinationlen&0x03)) != 0)				dstlen2 -= dif;			destadvancehalf = 2;		}		else		{			if ((destinationlen&0x01) != 0)				dstlen2--;			destadvance = 2;			destadvancehalf = 1;		}       					for (dstpos = 0 ; srcpos < srclen2 && dstpos < dstlen2 ; dstpos += destadvance)		{			int newlval,newrval;                				GetSixteenBitSampleValue(sourcebuffer+srcpos,newlval);			GetSixteenBitSampleValue(sourcebuffer+srcpos+sourceadvancehalf,newrval);			EncodeSixteenBitSampleValue(destinationbuffer+dstpos,newlval);			EncodeSixteenBitSampleValue(destinationbuffer+dstpos+destadvancehalf,newrval);			srcpos2 += rateratio;			srcpos = ((int)(srcpos2+0.5))*sourceadvance;		}	}	else // no stereo	{		if (sourcebytespersample == 2)		{			if ((sourcelen&0x01) != 0)				srclen2--;			sourceadvance = 2;		}		else			sourceadvance = 1;				if (destinationbytespersample == 2)		{			destadvance = 2;			if ((destinationlen&0x01) != 0)				dstlen2--;		}		else			destadvance = 1;				for (dstpos = 0 ; srcpos < srclen2 && dstpos < dstlen2 ; dstpos += destadvance)		{			int newval;                				GetSixteenBitSampleValue(sourcebuffer+srcpos,newval);			EncodeSixteenBitSampleValue(destinationbuffer+dstpos,newval);			srcpos2 += rateratio;			srcpos = ((int)(srcpos2+0.5))*sourceadvance;		}	}}*/void JVOIPSampleConverter::UpRate_SameStereo_Convert(){	int dif;	int sourceadvancehalf,destadvancehalf;	int srcpos;	double srcpos2;		srclen2 = sourcelen;	dstlen2 = destinationlen;	srcpos = 0;	srcpos2 = 0;	if (sourcestereo)	{		int currval,curlval,nextrval,nextlval;		int rprevadd,lprevadd;				if (sourcebytespersample == 2)		{			if ((dif = (sourcelen&0x03)) != 0)				srclen2 -= dif;			sourceadvance = 4;			sourceadvancehalf = 2;		}		else		{			if ((sourcelen&0x01) != 0)				srclen2--;			sourceadvance = 2;			sourceadvancehalf = 1;	        }				if (destinationbytespersample == 2)		{			destadvance = 4;			if ((dif = (destinationlen&0x03)) != 0)				dstlen2 -= dif;			destadvancehalf = 2;		}		else		{			if ((destinationlen&0x01) != 0)				dstlen2--;			destadvance = 2;			destadvancehalf = 1;		}       					if (srcpos < srclen2 && 0 < dstlen2)		{			GetSixteenBitSampleValue(sourcebuffer+srcpos,curlval);			GetSixteenBitSampleValue(sourcebuffer+srcpos+sourceadvancehalf,currval);		}				rprevadd = 0;		lprevadd = 0;		for (dstpos = 0 ; dstpos < dstlen2 ;              )		{			int prevpos;			int newlval,newrval;			double pos;						prevpos = srcpos;			srcpos += sourceadvance;			if (srcpos < srclen2)			{				GetSixteenBitSampleValue(sourcebuffer+srcpos,nextlval);				GetSixteenBitSampleValue(sourcebuffer+srcpos+sourceadvancehalf,nextrval);				rprevadd = nextrval-currval;				lprevadd = nextlval-curlval;			}			else			{				nextrval = currval+rprevadd;				nextlval = curlval+lprevadd;			}                				while ((pos = (srcpos2+0.5)*sourceadvance) < (double)srcpos && dstpos < dstlen2)			{				double factor2;								factor2 = ((double)pos-prevpos)/(double)sourceadvance;				newlval = (int)((double)curlval+(double)(nextlval-curlval)*factor2);				newrval = (int)((double)currval+(double)(nextrval-currval)*factor2);				newlval *= factor;				newrval *= factor;								EncodeSixteenBitSampleValue(destinationbuffer+dstpos,newlval);				EncodeSixteenBitSampleValue(destinationbuffer+dstpos+destadvancehalf,newrval);				srcpos2 += rateratio;				dstpos += destadvance;			}						currval = nextrval;			curlval = nextlval;		}	}	else // no stereo	{		int curval,nextval,prevadd;			if (sourcebytespersample == 2)		{			if ((sourcelen&0x01) != 0)				srclen2--;			sourceadvance = 2;		}		else			sourceadvance = 1;				if (destinationbytespersample == 2)		{			destadvance = 2;			if ((destinationlen&0x01) != 0)				dstlen2--;		}		else			destadvance = 1;				if (srcpos < srclen2 && 0 < dstlen2)			GetSixteenBitSampleValue(sourcebuffer+srcpos,curval);					prevadd = 0;		for (dstpos = 0 ; dstpos < dstlen2 ;            )		{			int newval,prevpos;			double pos;			                	prevpos = srcpos;                	srcpos += sourceadvance;                	if (srcpos < srclen2)                	{                		GetSixteenBitSampleValue(sourcebuffer+srcpos,nextval);                		prevadd = nextval-curval;			}                	else                		nextval = curval+prevadd;                	while ((pos = (srcpos2+0.5)*sourceadvance) < (double)srcpos && dstpos < dstlen2)                	{                		newval = (int)((double)curval+(double)(nextval-curval)*((double)pos-prevpos)/(double)sourceadvance);				newval *= factor;				EncodeSixteenBitSampleValue(destinationbuffer+dstpos,newval);				srcpos2 += rateratio;				dstpos += destadvance;			}						curval = nextval;		}	}}inline void JVOIPSampleConverter::SameRate_Convert(){	if (sourcestereo && !destinationstereo)		SameRate_DelStereo_Convert();	else if (!sourcestereo && destinationstereo)		SameRate_AddStereo_Convert();	else		SameRate_SameStereo_Convert();}void JVOIPSampleConverter::SameRate_DelStereo_Convert(){	int dif;	int sourceadvancehalf;	int srcpos;		srclen2 = sourcelen;	dstlen2 = destinationlen;	srcpos = 0;	if (sourcebytespersample == 2)	{		if ((dif = (sourcelen&0x03)) != 0)			srclen2 -= dif;		sourceadvance = 4;		sourceadvancehalf = 2;	}	else	{		if ((sourcelen&0x01) != 0)			srclen2--;		sourceadvance = 2;		sourceadvancehalf = 1;	}	if (destinationbytespersample == 2)	{		destadvance = 2;		if ((destinationlen&0x01) != 0)			dstlen2--;	}	else		destadvance = 1;			for (dstpos = 0 ; srcpos < srclen2 && dstpos < dstlen2 ; dstpos += destadvance)	{		int leftval,rightval;		int newval;		GetSixteenBitSampleValue(sourcebuffer+srcpos,leftval);		GetSixteenBitSampleValue(sourcebuffer+srcpos+sourceadvancehalf,rightval);		newval = (leftval+rightval)/2;		newval *= factor;		EncodeSixteenBitSampleValue(destinationbuffer+dstpos,newval);		srcpos += sourceadvance;	}}void JVOIPSampleConverter::SameRate_AddStereo_Convert(){	int dif;	int destadvancehalf;	int srcpos;		srclen2 = sourcelen;	dstlen2 = destinationlen;	srcpos = 0;	if (sourcebytespersample == 2)	{		if ((sourcelen&0x01) != 0)			srclen2--;		sourceadvance = 2;	}	else		sourceadvance = 1;		if (destinationbytespersample == 2)	{		destadvance = 4;		if ((dif = (destinationlen&0x03)) != 0)			dstlen2 -= dif;		destadvancehalf = 2;	}	else	{		if ((destinationlen&0x01) != 0)			dstlen2--;		destadvance = 2;		destadvancehalf = 1;	}			for (dstpos = 0 ; srcpos < srclen2 && dstpos < dstlen2 ; dstpos += destadvance)	{		int newval;		GetSixteenBitSampleValue(sourcebuffer+srcpos,newval);		newval *= factor;		EncodeSixteenBitSampleValue(destinationbuffer+dstpos,newval);		EncodeSixteenBitSampleValue(destinationbuffer+dstpos+destadvancehalf,newval);		srcpos += sourceadvance;	}}void JVOIPSampleConverter::SameRate_SameStereo_Convert(){	int dif;	int sourceadvancehalf,destadvancehalf;	int srcpos;		srclen2 = sourcelen;	dstlen2 = destinationlen;	srcpos = 0;		if (sourcestereo)	{		if (sourcebytespersample == 2)		{			if ((dif = (sourcelen&0x03)) != 0)				srclen2 -= dif;			sourceadvance = 4;			sourceadvancehalf = 2;		}		else		{			if ((sourcelen&0x01) != 0)				srclen2--;			sourceadvance = 2;			sourceadvancehalf = 1;	        }				if (destinationbytespersample == 2)		{			destadvance = 4;			if ((dif = (destinationlen&0x03)) != 0)				dstlen2 -= dif;			destadvancehalf = 2;		}		else		{			if ((destinationlen&0x01) != 0)				dstlen2--;			destadvance = 2;			destadvancehalf = 1;		}       					for (dstpos = 0 ; srcpos < srclen2 && dstpos < dstlen2 ; dstpos += destadvance)		{			int newlval,newrval;                				GetSixteenBitSampleValue(sourcebuffer+srcpos,newlval);			GetSixteenBitSampleValue(sourcebuffer+srcpos+sourceadvancehalf,newrval);			newlval *= factor;			newrval *= factor;			EncodeSixteenBitSampleValue(destinationbuffer+dstpos,newlval);			EncodeSixteenBitSampleValue(destinationbuffer+dstpos+destadvancehalf,newrval);			srcpos += sourceadvance;		}	}	else // no stereo	{		if (sourcebytespersample == 2)		{			if ((sourcelen&0x01) != 0)				srclen2--;			sourceadvance = 2;		}		else			sourceadvance = 1;				if (destinationbytespersample == 2)		{			destadvance = 2;			if ((destinationlen&0x01) != 0)				dstlen2--;		}		else			destadvance = 1;				for (dstpos = 0 ; srcpos < srclen2 && dstpos < dstlen2 ; dstpos += destadvance)		{			int newval;                				GetSixteenBitSampleValue(sourcebuffer+srcpos,newval);			newval *= factor;			EncodeSixteenBitSampleValue(destinationbuffer+dstpos,newval);			srcpos += sourceadvance;		}	}}void JVOIPSampleConverter::FillUp(){	double srctime;	int dsttimelen,dif;		srctime = ((double)(srclen2/sourceadvance))/((double)sourcerate);	dsttimelen = (int)(srctime*((double)destinationrate)*((double)destadvance)+0.5);	if (destadvance > 1)	{		if ((dif = (dsttimelen%destadvance)) != 0)			dsttimelen -= dif;	}	dsttimelen = (dsttimelen < dstlen2)?dsttimelen:dstlen2;		if (dstpos < dsttimelen)	{		if (dstpos != 0)		{			unsigned char *buf;			int i;						buf = destinationbuffer+dstpos-destadvance;			while (dstpos < dsttimelen)			{				for (i = 0 ; i < destadvance ; i++)					destinationbuffer[dstpos+i] = buf[i];				dstpos += destadvance;			}		}		else // fill with silence		{			if (destinationstereo)			{				int halfadvance;								halfadvance = destadvance/2;				while (dstpos < dsttimelen)				{					EncodeSixteenBitSampleValue(destinationbuffer+dstpos,0);					EncodeSixteenBitSampleValue(destinationbuffer+dstpos+halfadvance,0);					dstpos += destadvance;				}			}			else			{				while (dstpos < dsttimelen)				{					EncodeSixteenBitSampleValue(destinationbuffer+dstpos,0);					dstpos += destadvance;				}			}		}	}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -