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

📄 voice.c

📁 VoiFax is a program that manage voice/data/fax modem in the same manner of vgetty and mgetty.VoiFax
💻 C
字号:
/*  voice *  Copyright (C) 2004  Simone Freddio & Andrea Emanuelli * *  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include "libconfig.h"#include "libevent.h"#include "libvoice.h"#include "scprot.h"#include "common.h"#include "scriptcntl.h"#include "scprot.h"#include "libevent.h"void init_script_handlers(void);int voice_handler_play				(int argc, char **argv);int voice_handler_get_tty			(int argc, char **argv);int voice_handler_get_modem		(int argc, char **argv);int voice_handler_autostop		(int argc, char **argv);int voice_handler_beep				(int argc, char **argv);int voice_handler_dial				(int argc, char **argv);int voice_handler_device			(int argc, char **argv);int voice_handler_record			(int argc, char **argv);int voice_handler_wait				(int argc, char **argv);int voice_handler_stop				(int argc, char **argv);int voice_handler_dtmf				(int argc, char **argv);int voice_handler_quote				(int argc, char **argv);int voice_handler_getfax			(int argc, char **argv);int voice_handler_sendfax			(int argc, char **argv);int voice_handler_play(int argc, char **argv){	char module[] = "voice_play_hander";	argc = argc; argv = argv;	TRC(TRC_INFO, module, "Called play_hander!");	TRC(TRC_INFO, module, argv[1]);	sp_send_playing();	if (libvoice_play(argv[1]))	{		sp_send_ready();		return true;	}	else	{		sp_send_error();		return false;	}}int voice_handler_get_tty(int argc, char **argv){	argc = argc; argv = argv;		return sp_send_tty(libvoice_getty()) && sp_send_ready();}int voice_handler_get_modem(int argc, char **argv){	argc = argc; argv = argv;	sp_send_modem("DUMMY");		return sp_send_ready();}int voice_handler_autostop(int argc, char **argv){	argc = argc; argv = argv;	/* TODO */	/*libvoice_autostop(atoi(argv[1]));*/	sp_send_ready();	return true;}int voice_handler_beep(int argc, char **argv){	argc = argc; argv = argv;	return	sp_send_beeping() &&					libvoice_beep(atoi(argv[1]), atoi(argv[2])) &&					sp_send_ready();}int voice_handler_dial(int argc, char **argv){	argc = argc; argv = argv;	return	sp_send_dialing() &&					libvoice_dial(argv[1]) &&					sp_send_ready();}int voice_handler_device(int argc, char **argv){	argc = argc; argv = argv;	return	libvoice_setdevice(atoi(argv[1])) &&					sp_send_ready();}int voice_handler_record(int argc, char **argv){	argc = argc; argv = argv;	sp_send_recording();	if (libvoice_record(argv[1]))	{		sp_send_ready();		return true;	}	else	{		sp_send_error();		return false;	}	}int voice_handler_wait(int argc, char **argv){	argc = argc; argv = argv;		return	sp_send_waiting() &&					libvoice_wait(atoi(argv[1])) &&					sp_send_ready();}int voice_handler_stop(int argc, char **argv){	argc = argc; argv = argv;	sp_send_ready();	return libvoice_stop();}int voice_handler_dtmf(int argc, char **argv){	argc = argc; argv = argv;	return sp_send_dtmfing() &&					libvoice_senddtmf(atoi(argv[1]), atoi(libconfig_getvalue("dtmf", "duration", "3"))) &&					sp_send_ready();}int voice_handler_quote(int argc, char **argv){	argc = argc; argv = argv;		if (libvoice_quote(argv[1], "OK") == -1)		return false;		return sp_send_ready();}int voice_handler_getfax(int argc, char **argv){	argc = argc; argv = argv;	/* TODO *//*	libvoice_getfax(NULL ?!?);*/	sp_send_ready();	return true;}int voice_handler_sendfax(int argc, char **argv){	argc = argc; argv = argv;	/* TODO *//*	libvoice_sendfax(NULL ?!?);*/	sp_send_ready();	return true;}void init_script_handlers(void){	libevent_add_handler(voice_handler_play,			SP_EVENT_PLAY);	libevent_add_handler(voice_handler_get_tty,		SP_EVENT_GET_TTY);	libevent_add_handler(voice_handler_get_modem,	SP_EVENT_GET_MODEM);	libevent_add_handler(voice_handler_autostop,	SP_EVENT_AUTOSTOP);	libevent_add_handler(voice_handler_beep,			SP_EVENT_BEEP);	libevent_add_handler(voice_handler_dial,			SP_EVENT_DIAL);	libevent_add_handler(voice_handler_device,		SP_EVENT_DEVICE);	libevent_add_handler(voice_handler_record,		SP_EVENT_RECORD);	libevent_add_handler(voice_handler_wait,			SP_EVENT_WAIT);	libevent_add_handler(voice_handler_stop,			SP_EVENT_STOP);	libevent_add_handler(voice_handler_dtmf,			SP_EVENT_DTMF);	libevent_add_handler(voice_handler_quote,			SP_EVENT_QUOTE);	libevent_add_handler(voice_handler_getfax,		SP_EVENT_GETFAX);	libevent_add_handler(voice_handler_sendfax,		SP_EVENT_SENDFAX);}int ringhandler(int argc, char**argv);int process(int argc, char **argv);int ringhandler(int argc, char**argv){	char module[] = "ringhandler";	char *scriptfile;	char msg[512];	argc = argc; argv = argv;		scriptfile = libconfig_getvalue(libvoice_getty(),"call_program", libconfig_getvalue("default","call_program","./default.pl")); 	libvoice_answer();	/* Impostazione delle variabili d'ambiente per l'esecuzione dello script */	sprintf(msg, "CALLER_ID=%s", " ");	putenv(msg);	sprintf(msg, "CALLED_ID=%s", " ");	putenv(msg);	sprintf(msg, "CONNECT=%s", "115200");	putenv(msg);	sprintf(msg, "DEVICE=%s", libvoice_getty());	putenv(msg);	sprintf(msg, "Starting script %s ...", scriptfile);		TRC(TRC_INFO, module, msg);	if (!sp_init(scriptfile))	{		TRC(TRC_ERR, module, "Error on sp_init");		return false;	}	return true;}int process(int argc, char **argv){	argc = argc; argv = argv;	TRC(TRC_INFO, "process", "ingresso nell'handler");	TRC(TRC_INFO, "process", argv[0]);	if (strcmp(argv[0], "LV_ONHOOK") == 0)	{		return sp_send_handset_on_hook();		/*libvoice_hangup();*/	}		if (strcmp(argv[0], "LV_OFFHOOK") == 0)	{		return sp_send_handset_off_hook();	}	if (strcmp(argv[0], "LV_DTMF") == 0)	{		return sp_send_dtmf(argv[1][0]);	}/*	if (strcmp(argv[0], "LV_PLAYING") == 0)	{		sp_send_playing();	}*//*	if (strcmp(argv[0], "LV_RECORDING") == 0)	{		sp_send_recording();	}*/	if (strcmp(argv[0], "LV_READY") == 0)	{		sp_send_ready();	}	if (strcmp(argv[0], "LV_QUIET") == 0)	{		libvoice_stop();		return sp_send_silence_detected();	}	if (strcmp(argv[0], "LV_SILENCE") == 0)	{		libvoice_stop();			return sp_send_silence_detected();	}		if (strcmp(argv[0], "LV_TONE") == 0)	{		libvoice_stop();		TRC(TRC_INFO, "process", argv[1]);		if (strcmp(argv[1], "BUSY") == 0)			return sp_send_busy_tone();		if (strcmp(argv[1], "DIALTONE") == 0)			return sp_send_dial_tone();		if (strcmp(argv[1], "DATA") == 0 && strcmp(argv[2], "CALLER") == 0)			return sp_send_data_calling_tone();		if (strcmp(argv[1], "FAX") == 0 && strcmp(argv[2], "CALLER") == 0)			return sp_send_fax_calling_tone();		if (strcmp(argv[1], "DATA") == 0 && strcmp(argv[2], "ANSWER") == 0)			return sp_send_data_or_fax_detected();		if (strcmp(argv[1], "FAX") == 0 && strcmp(argv[2], "ANSWER") == 0)			return sp_send_data_or_fax_detected();	}		return true;}int main(int argc, char **argv){	char module[] = "voice";	char dev[100];	int ext = false;	if (argc != 2)	{		TRC(TRC_ERR, module, "No tty specified");		exit(1);	}	strcpy(dev, argv[1]);	if (!libconfig_init("/etc/voifax/voiceport.conf"))	{		if (!libconfig_init("/etc/voiceport.conf"))		{			if (!libconfig_init("./voiceport.conf"))			{				TRC(TRC_ERR, module, "Impossibile trovare il file di configurazione");				return false;			}		}	}	if (!libvoice_init(argv[1]))	{		TRC(TRC_ERR, module, "libvoice_init error");		exit(EXIT_FAILURE);	}	libevent_add_handler(ringhandler, "LV_RINGING");	libevent_add_handler(process,			"LV_ONHOOK");	libevent_add_handler(process,			"LV_TONE");	libevent_add_handler(process,			"LV_DTMF");	libevent_add_handler(process,			"LV_PLAYING");	libevent_add_handler(process,			"LV_RECORDING");	libevent_add_handler(process,			"LV_READY");	libevent_add_handler(process,			"LV_QUIET");	libevent_add_handler(process,			"LV_SILENCE");	init_script_handlers();		while (ext == false)	{		usleep(10000);		switch (sp_getstatus())		{			case SP_HM_OK:				libvoice_processevent();				break;			case SP_HM_NONE:				libvoice_processevent();				break;			case SP_HM_CLOSED:				TRC(TRC_INFO, module, "Child said goodbye...");				ext = true;				break;			case SP_HM_ERROR:				TRC(TRC_ERR, module, "vcprot_handle_messages error, killing child.");				exit(EXIT_FAILURE);				break;		}		/* do something else... */	}	libvoice_hangup();	libvoice_reset();	exit(EXIT_SUCCESS);}

⌨️ 快捷键说明

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