📄 voice.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 + -