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

流媒体/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 <errno.h>
  11. #include "ixjuser.h"
  12. void closeall(void);
  13. void getdata(int);
  14. int ixj1, ixj2, size1, size2, len, depth, frame, frame1, frame2;
  15. unsigned long write1, write2;
  16. char buff1[480], buff2[480];
  17. void usage(void);
  18. int main(int argc, char *argv[])
  19. {
  20.   char pname1[80], pname2[80];
  21.   int codec, oflags1, oflags2;
  22.   if(argc >= 6)
  23.   {
  24.     frame = atoi(argv[5]);
  25.   }
  26.   else
  27.   {
  28.     usage();
  29.     exit(-1);
  30.   }
  31.   sprintf(pname1, "/dev/ixj%s", argv[1]);
  32.   sprintf(pname2, "/dev/ixj%s", argv[2]);
  33.   ixj1 = open(pname1, O_RDWR);
  34.   if(ixj1 < 0)
  35.   {
  36.     printf("%s open failed %d %sn" ,pname1, ixj1, strerror(errno));
  37.     exit(-1);
  38.   }
  39.   ixj2 = open(pname2, O_RDWR);
  40.   if(ixj2 < 0)
  41.   {
  42.     printf("%s open failed %d %sn" ,pname2, ixj2, strerror(errno));
  43.     exit(-1);
  44.   }
  45.   if(argc >= 5)
  46.   {
  47.     depth = atoi(argv[4]);
  48.     ioctl(ixj1, IXJCTL_PLAY_DEPTH, depth);
  49.     ioctl(ixj1, IXJCTL_REC_DEPTH, depth);
  50.     ioctl(ixj2, IXJCTL_PLAY_DEPTH, depth);
  51.     ioctl(ixj2, IXJCTL_REC_DEPTH, depth);
  52.   }
  53.   frame1 = ioctl(ixj1, IXJCTL_FRAME, frame);
  54.   frame2 = ioctl(ixj2, IXJCTL_FRAME, frame);
  55.   atexit(closeall);
  56.   if(!ioctl(ixj1, IXJCTL_RING))
  57.   {
  58.     exit(0);
  59.   }
  60.   if(!ioctl(ixj2, IXJCTL_RING))
  61.   {
  62.     exit(0);
  63.   }
  64.   codec = atoi(argv[3]);
  65.   switch(codec)
  66.   {
  67.     case G723_63:
  68.       len = 24;
  69.       break;
  70.     case G723_53:
  71.       len = 20;
  72.       break;
  73.     case TS85:
  74.       len = 32;
  75.       break;
  76.     case TS48:
  77.       len = 18;
  78.       break;
  79.     case TS41:
  80.       len = 16;
  81.       break;
  82.     case G728:
  83.       len = 96;
  84.       break;
  85.     case G729:
  86.       len = 36;
  87.       break;
  88.     case ULAW:
  89.       switch(frame)
  90.       {
  91.         case 30:
  92.           len = 240;
  93.           break;
  94.         case 20:
  95.           len = 160;
  96.           break;
  97.         case 10:
  98.           len = 80;
  99.           break;
  100.       }
  101.       break;
  102.     case ALAW:
  103.       switch(frame)
  104.       {
  105.         case 30:
  106.           len = 240;
  107.           break;
  108.         case 20:
  109.           len = 160;
  110.           break;
  111.         case 10:
  112.           len = 80;
  113.           break;
  114.       }
  115.       break;
  116.     case LINEAR16:
  117.       switch(frame)
  118.       {
  119.         case 30:
  120.           len = 480;
  121.           break;
  122.         case 20:
  123.           len = 320;
  124.           break;
  125.         case 10:
  126.           len = 160;
  127.           break;
  128.       }
  129.       break;
  130.     case LINEAR8:
  131.       switch(frame)
  132.       {
  133.         case 30:
  134.           len = 240;
  135.           break;
  136.         case 20:
  137.           len = 160;
  138.           break;
  139.         case 10:
  140.           len = 80;
  141.           break;
  142.       }
  143.       break;
  144.     case WSS:
  145.       switch(frame)
  146.       {
  147.         case 30:
  148.           len = 240;
  149.           break;
  150.         case 20:
  151.           len = 160;
  152.           break;
  153.         case 10:
  154.           len = 80;
  155.           break;
  156.       }
  157.       break;
  158.   }
  159.   signal(SIGIO, &getdata);
  160.   fcntl(ixj1, F_SETOWN, getpid());
  161.   fcntl(ixj2, F_SETOWN, getpid());
  162.   oflags1 = fcntl(ixj1, F_GETFL);
  163.   fcntl(ixj1, F_SETFL, oflags1 | FASYNC);
  164.   oflags2 = fcntl(ixj2, F_GETFL);
  165.   fcntl(ixj2, F_SETFL, oflags2 | FASYNC);
  166.   write1 = write2 = 0;
  167.   ioctl(ixj1, IXJCTL_PLAY_CODEC, codec);
  168.   ioctl(ixj1, IXJCTL_REC_CODEC, codec);
  169.   ioctl(ixj2, IXJCTL_PLAY_CODEC, codec);
  170.   ioctl(ixj2, IXJCTL_REC_CODEC, codec);
  171.   ioctl(ixj1, IXJCTL_PLAY_START);
  172.   ioctl(ixj2, IXJCTL_REC_START);
  173.   ioctl(ixj2, IXJCTL_PLAY_START);
  174.   ioctl(ixj1, IXJCTL_REC_START);
  175.   printf("Frame1 = %d, Frame2 = %d, len = %d, depth = %d, codec = %dn",
  176.           frame1, frame2, len, depth, codec);
  177.   fflush(stdout);
  178.   
  179.   while(ioctl(ixj1, IXJCTL_HOOKSTATE) && ioctl(ixj2, IXJCTL_HOOKSTATE))
  180.   {
  181.     if(write1 == 500)
  182.     {
  183.       ioctl(ixj1, IXJCTL_AEC_START);
  184.       ioctl(ixj2, IXJCTL_AEC_START);
  185.       write1++;
  186.     }
  187.   }
  188.   printf("Write1 = %ld, Write2 = %ldn",write1,write2);
  189.   getchar();
  190. }
  191. void usage(void)
  192. {
  193.   printf("ixjasync card1 card2 codec depth framen");
  194.   printf("tcard1 and card2 - 0 = /dev/ixj0, 1 = /dev/ixj1 etc.n");
  195.   printf("tcodec  1 = g.723.1 6.3n");
  196.   printf("t       2 = g.723.1 5.3n");
  197.   printf("t       3 = TrueSpeech 8.5n");
  198.   printf("t       4 = TrueSpeech 4.8n");
  199.   printf("t       5 = TrueSpeech 4.1n");
  200.   printf("t       6 = g.728n");
  201.   printf("t       7 = g.729n");
  202.   printf("t       8 = uLawn");
  203.   printf("t       9 = aLawn");
  204.   printf("t      10 = Linear 16 Bitn");
  205.   printf("t      11 = Linear 8 Bitn");
  206.   printf("t      12 = Windows Sound Systemn");
  207.   printf("tdepth - DSP buffer depth in framesn");
  208.   printf("tframe - 10 = 10ms, 20 = 20ms, 30 = 30msn");
  209. }
  210. void closeall(void)
  211. {
  212.   ioctl(ixj1, IXJCTL_AEC_STOP);
  213.   ioctl(ixj2, IXJCTL_AEC_STOP);
  214.   ioctl(ixj1, IXJCTL_REC_STOP);
  215.   ioctl(ixj1, IXJCTL_PLAY_STOP);
  216.   ioctl(ixj2, IXJCTL_REC_STOP);
  217.   ioctl(ixj2, IXJCTL_PLAY_STOP);
  218.   close(ixj1);
  219.   close(ixj2);
  220. }
  221. void getdata(int x)
  222. {
  223.   fd_set  rfds,wfds,efds;
  224.   struct timeval  tv;
  225.   IXJ_EXCEPTION ixje1, ixje2;
  226.   int nmax, size;
  227.   char buf[480], dtmf1, dtmf2;
  228.   signal(SIGIO, &getdata);
  229.   nmax = (ixj1 > ixj2 ? ixj1+1 : ixj2+1);
  230.   FD_ZERO(&rfds);
  231.   FD_ZERO(&wfds);
  232.   FD_ZERO(&efds);
  233.   FD_SET(ixj1, &rfds);
  234.   FD_SET(ixj2, &rfds);
  235.   FD_SET(ixj1, &wfds);
  236.   FD_SET(ixj2, &wfds);
  237.   FD_SET(ixj1, &efds);
  238.   FD_SET(ixj2, &efds);
  239.   tv.tv_sec = 0;
  240.   tv.tv_usec = 300;
  241.   select(nmax,&rfds, &wfds, &efds, &tv);
  242.   if(FD_ISSET(ixj1,&rfds)) 
  243.   {
  244.     size1 = read(ixj1, buff1, len);
  245.   }
  246.   if(FD_ISSET(ixj2,&wfds)) 
  247.   {
  248.     if(size1 > 0)
  249.     {
  250.       write(ixj2, buff1, len);
  251.       write2++;
  252.       size1 = 0;
  253.     }
  254.   }
  255.   if(FD_ISSET(ixj2,&rfds)) 
  256.   {
  257.     size2 = read(ixj2, buff2, len);
  258.   }
  259.   if(FD_ISSET(ixj1,&wfds)) 
  260.   {
  261.     if(size2 > 0)
  262.     {
  263.       write(ixj1, buff2, len); 
  264.       write1++;
  265.       size2 = 0;
  266.     }
  267.   }
  268.   if(FD_ISSET(ixj1,&efds)) 
  269.   {
  270.     // Deal with DTMF
  271.     ixje1.bytes = ioctl(ixj1, IXJCTL_EXCEPTION);
  272.     if(ixje1.bits.dtmf_ready)
  273.     {
  274.       dtmf1 = ioctl(ixj1, IXJCTL_GET_DTMF_ASCII);
  275.       switch(dtmf1)
  276.       {
  277.         case '1':
  278.           ioctl(ixj1, IXJCTL_AEC_START);
  279.           printf("AEC On card1.n");
  280.           break;
  281.         case '2':
  282.           ioctl(ixj1, IXJCTL_AEC_STOP);
  283.           printf("AEC Off card1.n");
  284.           break;
  285.         default:
  286.           printf("DTMF from card 0 = %cn", dtmf1);
  287.           break;
  288.       }
  289.       fflush(stdout);
  290.     }
  291.   }
  292.   if(FD_ISSET(ixj2,&efds)) 
  293.   {
  294.     // Deal with DTMF
  295.     ixje2.bytes = ioctl(ixj2, IXJCTL_EXCEPTION);
  296.     if(ixje2.bits.dtmf_ready)
  297.     {
  298.       dtmf2 = ioctl(ixj2, IXJCTL_GET_DTMF_ASCII);
  299.       switch(dtmf2)
  300.       {
  301.         case '1':
  302.           ioctl(ixj2, IXJCTL_AEC_START);
  303.           printf("AEC On card2.n");
  304.           break;
  305.         case '2':
  306.           ioctl(ixj2, IXJCTL_AEC_STOP);
  307.           printf("AEC Off card2.n");
  308.           break;
  309.         default:
  310.           printf("DTMF from card 2 = %cn", dtmf2);
  311.           break;
  312.       }
  313.       fflush(stdout);
  314.     }
  315.   }
  316. }