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

流媒体/Mpeg4/MP4

开发平台:

C/C++

  1. #include <sys/types.h>
  2. #include <sys/time.h>
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <strings.h>
  6. #include <signal.h>
  7. #include <sys/ioctl.h>
  8. #include <unistd.h>
  9. #include <fcntl.h>
  10. #include <asm/errno.h>
  11. #include "ixjuser.h"
  12. void closeall(void);
  13. void getdata(int);
  14. int ixj1, ixj2, size1, size2, len;
  15. unsigned long write1, write2;
  16. char buff1[480], buff2[480];
  17. int main(int argc, char *argv[])
  18. {
  19.   char pname1[80], pname2[80];
  20.   int codec, oflags1, oflags2;
  21.   sprintf(pname1, "/dev/ixj%s", argv[1]);
  22.   sprintf(pname2, "/dev/ixj%s", argv[2]);
  23.   ixj1 = open(pname1, O_RDWR);
  24.   ixj2 = open(pname2, O_RDWR);
  25.   atexit(closeall);
  26.   if(!ioctl(ixj1, IXJCTL_RING))
  27.   {
  28.     exit(0);
  29.   }
  30.   if(!ioctl(ixj2, IXJCTL_RING))
  31.   {
  32.     exit(0);
  33.   }
  34.   codec = atoi(argv[3]);
  35.   switch(codec)
  36.   {
  37.     case G723_63:
  38.       len = 24;
  39.       break;
  40.     case G723_53:
  41.       len = 20;
  42.       break;
  43.     case TS85:
  44.       len = 32;
  45.       break;
  46.     case TS48:
  47.       len = 18;
  48.       break;
  49.     case TS41:
  50.       len = 16;
  51.       break;
  52.     case G728:
  53.       len = 96;
  54.       break;
  55.     case G729:
  56.       len = 36;
  57.       break;
  58.     case ULAW:
  59.       len = 240;
  60.       break;
  61.     case ALAW:
  62.       len = 240;
  63.       break;
  64.     case LINEAR16:
  65.       len = 480;
  66.       break;
  67.     case LINEAR8:
  68.       len = 240;
  69.       break;
  70.     case WSS:
  71.       len = 240;
  72.       break;
  73.   }
  74.   signal(SIGIO, &getdata);
  75.   fcntl(ixj1, F_SETOWN, getpid());
  76.   fcntl(ixj2, F_SETOWN, getpid());
  77.   oflags1 = fcntl(ixj1, F_GETFL);
  78.   fcntl(ixj1, F_SETFL, oflags1 | FASYNC);
  79.   oflags2 = fcntl(ixj2, F_GETFL);
  80.   fcntl(ixj2, F_SETFL, oflags2 | FASYNC);
  81.   write1 = write2 = 0;
  82.   ioctl(ixj1, IXJCTL_PLAY_CODEC, codec);
  83.   ioctl(ixj1, IXJCTL_REC_CODEC, codec);
  84.   ioctl(ixj2, IXJCTL_PLAY_CODEC, codec);
  85.   ioctl(ixj2, IXJCTL_REC_CODEC, codec);
  86.   ioctl(ixj1, IXJCTL_PLAY_START);
  87.   ioctl(ixj2, IXJCTL_REC_START);
  88.   ioctl(ixj2, IXJCTL_PLAY_START);
  89.   ioctl(ixj1, IXJCTL_REC_START);
  90.   
  91.   while(ioctl(ixj1, IXJCTL_HOOKSTATE) && ioctl(ixj2, IXJCTL_HOOKSTATE))
  92.   {
  93.     if(write1 == 500)
  94.     {
  95.       ioctl(ixj1, IXJCTL_AEC_START);
  96.       ioctl(ixj2, IXJCTL_AEC_START);
  97.       printf("AEC On.n");
  98.       write1++;
  99.     }
  100.   }
  101. printf("Write1 = %ld, Write2 = %ldn",write1,write2);
  102. getchar();
  103. }
  104. void closeall(void)
  105. {
  106.   ioctl(ixj1, IXJCTL_REC_STOP);
  107.   ioctl(ixj1, IXJCTL_PLAY_STOP);
  108.   ioctl(ixj2, IXJCTL_REC_STOP);
  109.   ioctl(ixj2, IXJCTL_PLAY_STOP);
  110.   ioctl(ixj1, IXJCTL_AEC_STOP);
  111.   ioctl(ixj2, IXJCTL_AEC_STOP);
  112.   close(ixj1);
  113.   close(ixj2);
  114. }
  115. void getdata(int x)
  116. {
  117.   fd_set  rfds,wfds,efds;
  118.   struct timeval  tv;
  119.   int nmax, size;
  120.   char buf[480];
  121.   signal(SIGIO, &getdata);
  122.   nmax = (ixj1 > ixj2 ? ixj1+1 : ixj2+1);
  123.   FD_ZERO(&rfds);
  124.   FD_ZERO(&wfds);
  125.   FD_ZERO(&efds);
  126.   FD_SET(ixj1, &rfds);
  127.   FD_SET(ixj2, &rfds);
  128.   FD_SET(ixj1, &wfds);
  129.   FD_SET(ixj2, &wfds);
  130.   FD_SET(ixj1, &efds);
  131.   FD_SET(ixj2, &efds);
  132.   tv.tv_sec = 0;
  133.   tv.tv_usec = 300;
  134.   select(nmax,&rfds, &wfds, &efds, &tv);
  135.   if(FD_ISSET(ixj1,&rfds)) 
  136.   {
  137.     size1 = read(ixj1, buff1, len);
  138.   }
  139.   if(FD_ISSET(ixj1,&wfds)) 
  140.   {
  141.     if(size2 > 0)
  142.     {
  143.       write(ixj1, buff2, len); 
  144.       write1++;
  145.       size2 = 0;
  146.     }
  147.   }
  148. //  if(FD_ISSET(ixj1,&efds)) 
  149.   {
  150.     // Deal with DTMF
  151.     printf("DTMF from card 0 = %d",ioctl(ixj1, IXJCTL_GET_DTMF));
  152.   }
  153.   if(FD_ISSET(ixj2,&rfds)) 
  154.   {
  155.     size2 = read(ixj2, buff2, len);
  156.   }
  157.   if(FD_ISSET(ixj2,&wfds)) 
  158.   {
  159.     if(size1 > 0)
  160.     {
  161.       write(ixj2, buff1, len);
  162.       write2++;
  163.       size1 = 0;
  164.     }
  165.   }
  166.   if(FD_ISSET(ixj2,&efds)) 
  167.   {
  168.     // Deal with DTMF
  169.     printf("DTMF from card 1 = %d",ioctl(ixj2, IXJCTL_GET_DTMF));
  170.   }
  171. }