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

📄 dtmfgen.c

📁 基于osip、eXosip、speex、ffmpeg的VoIP源代码
💻 C
字号:
/*mediastreamer2 library - modular sound and video processing and streamingCopyright (C) 2006  Simon MORLAT (simon.morlat@linphone.org)This program is free software; you can redistribute it and/ormodify it under the terms of the GNU General Public Licenseas published by the Free Software Foundation; either version 2of 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 ofMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See theGNU General Public License for more details.You should have received a copy of the GNU General Public Licensealong with this program; if not, write to the Free SoftwareFoundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.*/#include "mediastreamer2/dtmfgen.h"#include <math.h>#ifndef M_PI#define M_PI       3.14159265358979323846#endifstruct DtmfGenState{	int rate;	int dur;	int pos;	float highfreq;	float lowfreq;	char dtmf;};typedef struct DtmfGenState DtmfGenState;static void dtmfgen_init(MSFilter *f){	DtmfGenState *s=(DtmfGenState *)ms_new(DtmfGenState,1);	s->rate=8000;	s->dur=s->rate/10;	s->pos=0;	s->dtmf=0;	f->data=s;}static void dtmfgen_uninit(MSFilter *f){	ms_free(f->data);}static int dtmfgen_put(MSFilter *f, void *arg){	DtmfGenState *s=(DtmfGenState*)f->data;	const char *dtmf=(char*)arg;	s->pos=0;	switch(dtmf[0]){		case '0':			s->lowfreq=941;			s->highfreq=1336;			break;		case '1':			s->lowfreq=697;			s->highfreq=1209;			break;		case '2':			s->lowfreq=697;			s->highfreq=1336;			break;		case '3':			s->lowfreq=697;			s->highfreq=1477;			break;		case '4':			s->lowfreq=770;			s->highfreq=1209;			break;		case '5':			s->lowfreq=770;			s->highfreq=1336;			break;		case '6':			s->lowfreq=770;			s->highfreq=1477;			break;		case '7':			s->lowfreq=852;			s->highfreq=1209;			break;		case '8':			s->lowfreq=852;			s->highfreq=1336;			break;		case '9':			s->lowfreq=852;			s->highfreq=1477;			break;		case '*':			s->lowfreq=941;			s->highfreq=1209;			break;		case '#':			s->lowfreq=941;			s->highfreq=1477;			break;		case 'A':			s->lowfreq=697;			s->highfreq=1633;			break;		case 'B':			s->lowfreq=770;			s->highfreq=1633;			break;		case 'C':			s->lowfreq=852;			s->highfreq=1633;			break;		case 'D':			s->lowfreq=941;			s->highfreq=1633;			break;			default:			ms_warning("Not a dtmf key.");			return -1;	}	s->lowfreq=s->lowfreq/s->rate;	s->highfreq=s->highfreq/s->rate;	s->dtmf=dtmf[0];	return 0;}static int dtmfgen_set_rate(MSFilter *f, void *arg){	DtmfGenState *s=(DtmfGenState*)f->data;	s->rate=*((int*)arg);	s->dur=s->rate/10;	return 0;}static void dtmfgen_process(MSFilter *f){	mblk_t *m;	DtmfGenState *s=(DtmfGenState*)f->data;	while((m=ms_queue_get(f->inputs[0]))!=NULL){		if (s->dtmf!=0){			int nsamples=(m->b_wptr-m->b_rptr)/2;			int i;			int16_t *sample=(int16_t*)m->b_rptr;			for (i=0;i<nsamples && s->pos<s->dur;i++,s->pos++){				sample[i]=(int16_t)(10000.0*sin(2*M_PI*(float)s->pos*s->lowfreq));				sample[i]+=(int16_t)(10000.0*sin(2*M_PI*(float)s->pos*s->highfreq));			}			if (s->pos==s->dur){				s->pos=0;				s->dtmf=0;			}		}		ms_queue_put(f->outputs[0],m);	}}MSFilterMethod dtmfgen_methods[]={	{	MS_FILTER_SET_SAMPLE_RATE	,	dtmfgen_set_rate	},	{	MS_DTMF_GEN_PUT			,	dtmfgen_put		},	{	0				,	NULL			}};#ifdef _MSC_VERMSFilterDesc ms_dtmf_gen_desc={	MS_DTMF_GEN_ID,	"MSDtmfGen",	"DTMF generator",	MS_FILTER_OTHER,	NULL,    1,	1,	dtmfgen_init,	NULL,    dtmfgen_process,	NULL,    dtmfgen_uninit,	dtmfgen_methods};#elseMSFilterDesc ms_dtmf_gen_desc={	.id=MS_DTMF_GEN_ID,	.name="MSDtmfGen",	.text="DTMF generator",	.category=MS_FILTER_OTHER,	.ninputs=1,	.noutputs=1,	.init=dtmfgen_init,	.process=dtmfgen_process,	.uninit=dtmfgen_uninit,	.methods=dtmfgen_methods};#endifMS_FILTER_DESC_EXPORT(ms_dtmf_gen_desc)

⌨️ 快捷键说明

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