tpjack.c
上传用户:sy_wanhua
上传日期:2013-07-25
资源大小:3048k
文件大小:7k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

C/C++

  1. /*----------------------------------------------------------------------*
  2.   tpjack.c                                                 
  3.   
  4.   Version:     1.0   3/99
  5.                1.1   4/99 
  6.                1.2   4/27/99 - select() support enabled
  7.                1.3   4/28/99 - echo cancellation added
  8.                1.4   5/25/99 - added support for new module
  9.                1.5   6/10/99 - changed license to LGPL
  10.                
  11.   This module is the client to connect to tpjackd daemons.
  12.   
  13.   Copyright (c) 1999 Quicknet Technologies, Inc.
  14.     
  15.   Written by Ed Okerson <eokerson@quicknet.net> and
  16.   Greg Herlein <gherlein@quicknet.net> 
  17.   
  18.  * This is free software; you can redistribute it and/or
  19.  * modify it under the terms of the GNU Lesser General Public
  20.  * License (LGPL) as published by the Free Software Foundation; either
  21.  * version 2 of the License, or (at your option) any later version.
  22.  *
  23.  * This software is distributed in the hope that it will be useful,
  24.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  25.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  26.  * General Public License for more details.
  27.  *
  28.  * You should have received a copy of the GNU Lesser General Public
  29.  * License along with this library; if not, write to the
  30.  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
  31.  * Boston, MA 02111-1307, USA.  It is also available online at 
  32.  * http://www.gnu.org/copyleft/lesser.html
  33.  
  34. ----------------------------------------------------------------------*/
  35. /*-------------------------------< RCS >--------------------------------*/
  36. static char RCS_ID[] = "$Id: tpjack.c,v 1.1.1.1 1999/08/05 21:17:32 luan Exp $";
  37. /*----------------------------< Defines >-------------------------------*/
  38. /* stdlib */
  39. #include <stdio.h>
  40. #include <varargs.h>
  41. #include <sys/socket.h>
  42. #include <sys/ioctl.h>
  43. #include <sys/time.h>
  44. #include <sys/types.h>
  45. #include <fcntl.h>
  46. #include <netinet/in.h>
  47. #include <netdb.h>
  48. #include <unistd.h>
  49. #include <errno.h>
  50. #include <syslog.h>
  51. /* other */
  52. #include "ixjuser.h"
  53. #include "udp.h"
  54. /*----------------------------< Includes >------------------------------*/
  55. /*---------------------------< Definitions >----------------------------*/
  56. #define LINELEN 128
  57. #define BUFSIZE 480
  58. /*--------------------------< Declarations >----------------------------*/
  59. /*------------------------< Global Variables >--------------------------*/
  60. static char        szDevice[32];
  61. /*-------------------------< Local Variables >--------------------------*/
  62. /*----------------------------------------------------------------------*/
  63. /*----------------------------------------------------------------------*/
  64. int
  65. main(int argc, char *argv[])
  66. {
  67.   char            *host="localhost";
  68.   int             nPort=7000;
  69.   switch(argc)
  70.   {
  71.     case 2:
  72.       strncpy(szDevice,argv[1],sizeof(szDevice));
  73.       break;
  74.     case 3:
  75.       strncpy(szDevice,argv[1],sizeof(szDevice));
  76.       host=argv[2];
  77.       break;
  78.     case 4:
  79.       strncpy(szDevice,argv[1],sizeof(szDevice));
  80.       host=argv[2];
  81.       nPort=atoi(argv[3]);
  82.       break;
  83.     default:
  84.       fprintf(stderr,"usage: tpjack dev [host [port]]n");
  85.       fprintf(stderr," - dev is probably /dev/ixj0n");
  86.       exit(1);
  87.   }
  88.   UDPjack(host,nPort);
  89.   exit(0);
  90. }
  91. /*----------------------------------------------------------------------*/
  92. int
  93. UDPjack(char *host,int nPort)
  94. {
  95.   char inbuf[BUFSIZE], outbuf[BUFSIZE], serv[16];
  96.   int  fd,read_fd, send_fd, cc, ixj, hook,retval,nMax;
  97.   fd_set          rfds;
  98.   struct timeval  tv;
  99.   printf("Opening Phone Jack (%s)n",szDevice);
  100.   ixj = open(szDevice, O_RDWR);
  101.   if(ixj<0)
  102.   {
  103.     printf("Error opening voice card, exitingn");
  104.     return -1;
  105.   }
  106.   printf("Waiting for hookswitchn");
  107.   hook = ioctl(ixj, IXJCTL_HOOKSTATE);
  108.   while(hook!=1)
  109.   {
  110.     hook = ioctl(ixj, IXJCTL_HOOKSTATE);
  111.   }
  112.   /* connect the signalling port */
  113.   sprintf(serv,"%d",nPort);
  114.   fd=connectTCP(host,serv);
  115.   printf("connecting to %sn", host);
  116.   printf(" - signalling on port %d with tcp socket %dn",nPort,fd);
  117.   /* connect the data ports */
  118.   read_fd=GetRecvSocket(nPort);
  119.   send_fd=GetSendSocket(host,nPort);
  120.   if((read_fd<0)||(send_fd<0)) errexit("failure on udp socketn");
  121.   printf(" - voice on port %d using udp sockets %d and %dn",
  122.          nPort+1,read_fd,send_fd);
  123.   tv.tv_sec = 0;
  124.   tv.tv_usec = 300;
  125.   if(nMax<ixj) nMax=ixj;
  126.   if(nMax<fd) nMax=fd;
  127.   if(nMax<read_fd) nMax=read_fd;
  128.   if(nMax<send_fd) nMax=send_fd;
  129.   nMax++;
  130.   
  131.   /* do the loop */
  132.   if(read_fd != 0)
  133.   {
  134.     ioctl(ixj,IXJCTL_PLAY_CODEC,LINEAR16);
  135.     ioctl(ixj,IXJCTL_REC_CODEC,LINEAR16);
  136.     ioctl(ixj,IXJCTL_REC_START);
  137.     ioctl(ixj,IXJCTL_PLAY_START);
  138.     ioctl(ixj,IXJCTL_AEC_START);
  139.     while(hook=ioctl(ixj,IXJCTL_HOOKSTATE))
  140.     {
  141.       FD_ZERO(&rfds);
  142.       FD_SET(read_fd, &rfds);
  143.       FD_SET(ixj, &rfds);
  144.       tv.tv_sec = 0;
  145.       tv.tv_usec = 300;
  146.       retval = select(nMax,&rfds,NULL, NULL,&tv);
  147.       if(FD_ISSET(ixj,&rfds))
  148.       {
  149.         cc = read(ixj, outbuf, 480);
  150. //        printf("ixj --> %dn",cc);
  151.         if(cc > 0)
  152.         {
  153.           write(send_fd,outbuf,cc);
  154. //          printf("udp <-- %dn",cc);
  155.         }
  156.       }
  157.       if(FD_ISSET(read_fd,&rfds))
  158.       {
  159.         cc = ReadUDP(read_fd,inbuf,sizeof inbuf);
  160. //        printf("udp --> %dn",cc);
  161.         if(cc > 0)
  162.         {
  163.           write(ixj, inbuf, cc);
  164. //          printf("ixj <-- %dn",cc);
  165.         }
  166.         if(cc < 0)
  167.         {
  168.           if(errno!=EAGAIN)
  169.           {
  170.             ioctl(ixj, IXJCTL_AEC_STOP);
  171.             ioctl(ixj, IXJCTL_REC_STOP);
  172.             ioctl(ixj, IXJCTL_PLAY_STOP);
  173.             errexit("echo read: %sn",sys_errlist[errno]);
  174.           }
  175.         }
  176.       } /* end if(retval) */
  177.     } /* end while() */
  178.   }
  179.   close(read_fd);
  180.   close(send_fd);
  181.   close(fd);
  182.   close(ixj);
  183.   return 0;
  184. }
  185. /*----------------------------------------------------------------------*/
  186. int
  187. connectTCP(char *host,char *service)
  188. {
  189. return connectsock(host,service,"tcp");
  190. }
  191. /*----------------------------------------------------------------------*/
  192. int
  193. connectsock(char *host, char *service, char *protocol)
  194. {
  195. struct hostent *phe;
  196. struct servent *pse;
  197. struct protoent *ppe;
  198. struct sockaddr_in sin;
  199. int s,type;
  200. bzero((char *)&sin, sizeof(sin));
  201. sin.sin_family=AF_INET;
  202. if (pse=getservbyname(service,protocol))
  203. sin.sin_port=pse->s_port;
  204. else if ((sin.sin_port=htons((u_short)atoi(service)))==0)
  205. errexit("can't get "%s" service entryn",service);
  206. if (phe=gethostbyname(host))
  207. bcopy(phe->h_addr,(char *)&sin.sin_addr,phe->h_length);
  208. else if ((sin.sin_addr.s_addr = inet_addr(host)) == INADDR_NONE)
  209.  errexit("can't get "%s" host entryn",host);
  210. if ((ppe=getprotobyname(protocol))==0)
  211.  errexit("can't get "%s" protocol entryn",protocol);
  212. if (strcmp(protocol,"udp")==0)
  213. type=SOCK_DGRAM;
  214. else
  215. type=SOCK_STREAM;
  216. s=socket(PF_INET,type,ppe->p_proto);
  217. if (s<0)
  218. errexit("can't create socket: %sn",sys_errlist[errno]);
  219. if (connect(s,(struct sockaddr *)&sin,sizeof(sin))<0)
  220. errexit("can't connect to %s.%s: %sn",host,service,sys_errlist[errno]);
  221. return s;
  222. }
  223. /*----------------------------------------------------------------------*/
  224. int
  225. errexit(format, va_alist)
  226. char *format;
  227. va_dcl
  228. {
  229.   va_list        args;
  230.   char           szMsg[512];
  231.   va_start(args);
  232.   vsprintf(szMsg,format,args);
  233.   va_end(args);
  234.   openlog("tpjack",LOG_CONS,LOG_DAEMON);
  235.   syslog(LOG_ERR,szMsg);
  236.   closelog();
  237.   exit(1);
  238. }
  239. /*-------------------------------< End >--------------------------------*/