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

流媒体/Mpeg4/MP4

开发平台:

C/C++

  1. #include <sys/types.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <sys/ioctl.h>
  6. #include <unistd.h>
  7. #include <fcntl.h>
  8. #include <errno.h>
  9. #include "ixjuser.h"
  10. void closeall(void);
  11. void usage(void);
  12. int ixj1, ixj2;
  13. int main(int argc, char *argv[])
  14. {
  15.   char pname1[80], pname2[80], buff1[480], buff2[480];
  16.   unsigned long cnt, write1, write2;
  17.   int size, codec, len, depth, frame, frame1, frame2;
  18.   sprintf(pname1, "/dev/ixj%s", argv[1]);
  19.   sprintf(pname2, "/dev/ixj%s", argv[2]);
  20.   ixj1 = open(pname1, O_RDWR);
  21.   if(ixj1 < 0)
  22.   {
  23.     printf("%s open failed %d %sn" ,pname1, ixj1, strerror(errno));
  24.     exit(-1);
  25.   }
  26.   ixj2 = open(pname2, O_RDWR);
  27.   if(ixj2 < 0)
  28.   {
  29.     printf("%s open failed %d %sn" ,pname2, ixj2, strerror(errno));
  30.     exit(-1);
  31.   }
  32.   if(argc < 4)
  33.   {
  34.     usage();
  35.     exit(-1);
  36.   }
  37.   if(argc >= 6)
  38.   {
  39.     frame = atoi(argv[5]);
  40.   }
  41.   else
  42.   {
  43.     frame = 30;
  44.   }
  45.   frame1 = ioctl(ixj1, IXJCTL_FRAME, frame);
  46.   frame2 = ioctl(ixj2, IXJCTL_FRAME, frame);
  47.   atexit(closeall);
  48. //  ioctl(ixj1, IXJCTL_HZ, 300);
  49. //  ioctl(ixj1, IXJCTL_RATE, 100);
  50.   if(!ioctl(ixj1, IXJCTL_RING))
  51.   {
  52.     exit(0);
  53.   }
  54.   if(!ioctl(ixj2, IXJCTL_RING))
  55.   {
  56.     exit(0);
  57.   }
  58.   codec = atoi(argv[3]);
  59.   switch(codec)
  60.   {
  61.     case G723_63:
  62.       len = 24;
  63.       break;
  64.     case G723_53:
  65.       len = 20;
  66.       break;
  67.     case TS85:
  68.       len = 32;
  69.       break;
  70.     case TS48:
  71.       len = 18;
  72.       break;
  73.     case TS41:
  74.       len = 16;
  75.       break;
  76.     case G728:
  77.       len = 96;
  78.       break;
  79.     case G729:
  80.       len = 36;
  81.       break;
  82.     case ULAW:
  83.       switch(frame)
  84.       {
  85.         case 30:
  86.           len = 240;
  87.           break;
  88.         case 20:
  89.           len = 160;
  90.           break;
  91.         case 10:
  92.           len = 80;
  93.           break;
  94.       }
  95.       break;
  96.     case ALAW:
  97.       switch(frame)
  98.       {
  99.         case 30:
  100.           len = 240;
  101.           break;
  102.         case 20:
  103.           len = 160;
  104.           break;
  105.         case 10:
  106.           len = 80;
  107.           break;
  108.       }
  109.       break;
  110.     case LINEAR16:
  111.       switch(frame)
  112.       {
  113.         case 30:
  114.           len = 480;
  115.           break;
  116.         case 20:
  117.           len = 320;
  118.           break;
  119.         case 10:
  120.           len = 160;
  121.           break;
  122.       }
  123.       break;
  124.     case LINEAR8:
  125.       switch(frame)
  126.       {
  127.         case 30:
  128.           len = 240;
  129.           break;
  130.         case 20:
  131.           len = 160;
  132.           break;
  133.         case 10:
  134.           len = 80;
  135.           break;
  136.       }
  137.       break;
  138.     case WSS:
  139.       switch(frame)
  140.       {
  141.         case 30:
  142.           len = 240;
  143.           break;
  144.         case 20:
  145.           len = 160;
  146.           break;
  147.         case 10:
  148.           len = 80;
  149.           break;
  150.       }
  151.       break;
  152.   }
  153.   cnt = write1 = write2 = 0;
  154.   if(argc >= 5)
  155.   {
  156.     depth = atoi(argv[4]);
  157.     ioctl(ixj1, IXJCTL_PLAY_DEPTH, depth);
  158.     ioctl(ixj1, IXJCTL_REC_DEPTH, depth);
  159.     ioctl(ixj2, IXJCTL_PLAY_DEPTH, depth);
  160.     ioctl(ixj2, IXJCTL_REC_DEPTH, depth);
  161.   }
  162.   ioctl(ixj1, IXJCTL_PLAY_CODEC, codec);
  163.   ioctl(ixj1, IXJCTL_REC_CODEC, codec);
  164.   ioctl(ixj2, IXJCTL_PLAY_CODEC, codec);
  165.   ioctl(ixj2, IXJCTL_REC_CODEC, codec);
  166.   ioctl(ixj1, IXJCTL_PLAY_START);
  167.   ioctl(ixj2, IXJCTL_REC_START);
  168.   ioctl(ixj2, IXJCTL_PLAY_START);
  169.   ioctl(ixj1, IXJCTL_REC_START);
  170.   printf("Frame1 = %d, Frame2 = %d, len = %d, depth = %d, codec = %dn",
  171.           frame1, frame2, len, depth, codec);
  172.   fflush(stdout);
  173.   ioctl(ixj1, IXJCTL_AEC_START);
  174.   ioctl(ixj2, IXJCTL_AEC_START);
  175.   printf("AEC On.n");
  176.   while(ioctl(ixj1, IXJCTL_HOOKSTATE) && ioctl(ixj2, IXJCTL_HOOKSTATE))
  177.   {
  178.     size = read(ixj1, buff1, len);
  179.     if(size > 0)
  180.     {
  181.       write(ixj2, buff1, size);
  182.       write1++;
  183.     }
  184.     size = read(ixj2, buff2, len);
  185.     if(size > 0)
  186.     {
  187.       write(ixj1, buff2, size); 
  188.       write2++;
  189.     }
  190.   }
  191. printf("Write1 = %ld, Write2 = %ldn",write1,write2);
  192. getchar();
  193. }
  194. void closeall(void)
  195. {
  196.   ioctl(ixj1, IXJCTL_AEC_STOP);
  197.   ioctl(ixj2, IXJCTL_AEC_STOP);
  198.   ioctl(ixj1, IXJCTL_REC_STOP);
  199.   ioctl(ixj1, IXJCTL_PLAY_STOP);
  200.   ioctl(ixj2, IXJCTL_REC_STOP);
  201.   ioctl(ixj2, IXJCTL_PLAY_STOP);
  202.   printf("AEC Off.n");
  203.   ioctl(ixj1, IXJCTL_DSP_IDLE);
  204.   ioctl(ixj2, IXJCTL_DSP_IDLE);
  205.   close(ixj1);
  206.   close(ixj2);
  207. }
  208. void usage(void)
  209. {
  210.   printf("inter2 card1 card2 codec depth framen");
  211.   printf("tcard1 and card2 - 0 = /dev/ixj0, 1 = /dev/ixj1 etc.n");
  212.   printf("tcodec  1 = g.723.1 6.3n");
  213.   printf("t       2 = g.723.1 5.3n");
  214.   printf("t       3 = TrueSpeech 8.5n");
  215.   printf("t       4 = TrueSpeech 4.8n");
  216.   printf("t       5 = TrueSpeech 4.1n");
  217.   printf("t       6 = g.728n");
  218.   printf("t       7 = g.729n");
  219.   printf("t       8 = uLawn");
  220.   printf("t       9 = aLawn");
  221.   printf("t      10 = Linear 16 Bitn");
  222.   printf("t      11 = Linear 8 Bitn");
  223.   printf("t      12 = Windows Sound Systemn");
  224.   printf("Optional arguments:n");
  225.   printf("tdepth - DSP buffer depth in framesn");
  226.   printf("tframe - 10 = 10ms, 20 = 20ms, 30 = 30msn");
  227. }