home *** CD-ROM | disk | FTP | other *** search
/ Stars of Shareware: DFÜ und Kommunikation / SOS-DFUE.ISO / programm / dos / utility / pccp076 / voicerx.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-11-17  |  5.4 KB  |  294 lines

  1. /* Copyright (C) 1993 Peter Edward Cann */
  2.  
  3. #include<stdio.h>
  4. #include<fcntl.h>
  5. #include<sys\types.h>
  6. #include<sys\stat.h>
  7. #include<time.h>
  8. #include<signal.h>
  9. #include<bios.h>
  10. #include"port.h"
  11.  
  12.  
  13. sendchar(c)
  14.     unsigned char c;
  15.     {
  16.     while(!((inp(basereg+STATREG)&TXMTMASK)&&(inp(basereg+MSTATREG)&CTSMASK)));
  17.     outp(basereg, c);
  18.     }
  19.  
  20. #define VBUFSIZ 1024
  21.  
  22. unsigned char vbuf[VBUFSIZ];
  23. int fd, vbufi;
  24.  
  25. putbyte(c)
  26.     unsigned char c;
  27.     {
  28.     if(vbufi>=VBUFSIZ)
  29.         if(write(fd, vbuf, vbufi)!=vbufi)
  30.             {
  31.             printf("Write error; out of disk?\n");
  32.             sendchar('X'&31);
  33.             while(!(inp(basereg+STATREG)&TXSHMTMASK));
  34.             cleanup(0);
  35.             exit(138);
  36.             }
  37.         else
  38.             vbufi=0;
  39.     vbuf[vbufi++]=c;
  40.     }
  41.  
  42. int follow;
  43.  
  44. quit()
  45.     {
  46.     sendchar('X'&31);
  47.     while(!(inp(basereg+STATREG)&TXSHMTMASK));
  48.     cleanup(0);
  49.     exit(129);
  50.     }
  51.  
  52. sendstr(str)
  53.     char *str;
  54.     {
  55.     int i;
  56.     for(i=0;str[i]!='\0';++i)
  57.         sendchar(str[i]);
  58.     }
  59.  
  60. int follow;
  61.  
  62. #define NSCANS 3
  63. unsigned char scans[NSCANS][16]={"CONNECT\r\n", "ERROR\r\n", "VCON\r\n"};
  64. #define SCANTIMEOUT 16
  65.  
  66. int scan()
  67.     {
  68.     time_t timestamp;
  69.     int i, j, scani[NSCANS];
  70.     timestamp=time(NULL);
  71.     for(i=0;i<NSCANS;++i)
  72.         scani[i]=0;
  73.     while(1)
  74.         {
  75.         while(follow==index)
  76.             {
  77.             if(kbhit())
  78.                 getch();
  79.             if((time(NULL)-timestamp)>SCANTIMEOUT)
  80.                 {
  81.                 for(j=0;j<NSCANS;j++)
  82.                     scani[j]=0;
  83.                 return(-1);
  84.                 }
  85.             }
  86.         putch(buf[follow]);
  87.         for(i=0;i<NSCANS;i++)
  88.             if(scans[i][scani[i]]==buf[follow])
  89.                 {
  90.                 scani[i]++;
  91.                 if(scans[i][scani[i]]=='\0')
  92.                     {
  93.                     for(j=0;j<NSCANS;j++)
  94.                         scani[j]=0;
  95.                     follow++;
  96.                     follow%=TBUFSIZ;
  97.                     return(i);
  98.                     }
  99.                 }
  100.             else
  101.                 scani[i]=0;
  102.         follow++;
  103.         follow%=TBUFSIZ;
  104.         }
  105.     }
  106.  
  107. #define MAXCHECKS 64
  108. unsigned char checks[MAXCHECKS];
  109. int nchecks;
  110.  
  111. #define XVINIT 255
  112.  
  113. main(argc, argv)
  114.     int argc;
  115.     char **argv;
  116.     {
  117.     int dleflag, timecnt, maxsecs, i, xval, tmpi;
  118.     unsigned kc;
  119.     unsigned char c, fname[128];
  120.     time_t ts;
  121.     xval=XVINIT;
  122.     if(argc<5)
  123.         {
  124.         printf("USAGE: voicerx <comnum> <speed> <file> <max secs> [endcode] ...\n");
  125.         printf("Endcodes are shielded codes, reported as exit codes starting with 0 (first).\n");
  126.         printf("Real live errors are >128, which is play completed.\n");
  127.         printf("Multi-char args are assumed hex.\n");
  128.         exit(140);
  129.         }
  130.     if(!argv[3][0])
  131.         {
  132.         printf("File argument is null.\n");
  133.         exit(151);
  134.         }
  135.     if(argv[3][strlen(argv[3])-1]=='\\')
  136.         sprintf(fname, "%s%08lx.vce", argv[3], time(NULL));
  137.     else
  138.         strcpy(fname, argv[3]);
  139.     if((fd=open(fname, O_WRONLY|O_BINARY|O_CREAT|O_TRUNC, S_IWRITE))==-1)
  140.         {
  141.         printf("Unable to open voice file %s for write.\n", fname);
  142.         exit(150);
  143.         }
  144.     maxsecs=atoi(argv[4]);
  145.     nchecks=0;
  146.     while(1)
  147.         {
  148.         if(nchecks>=MAXCHECKS)
  149.             {
  150.             printf("Too many endcodes for this compile.\n");
  151.             exit(145);
  152.             }
  153.         if(nchecks>=(argc-5)) /* Waste a few usec; who cares? */
  154.             break;
  155.         if(!argv[nchecks+5][0])
  156.             {
  157.             printf("Endcode %d null; exiting.\n", nchecks);
  158.             exit(141);
  159.             }
  160.         if(!argv[nchecks+5][1])
  161.             checks[nchecks]=argv[nchecks+5][0];
  162.         else
  163.             if(sscanf(argv[nchecks+5], "%x", &tmpi)!=1)
  164.                 {
  165.                 printf("Bad scan endcode %d; exiting.\n", nchecks);
  166.                 exit(142);
  167.                 }
  168.             else
  169.                 checks[nchecks]=tmpi;
  170.         nchecks++;
  171.         }
  172.     vbufi=0;
  173.     comnum=atoi(argv[1])-1;
  174.     speed=atoi(argv[2]);
  175.     databits='8';
  176.     parity='n';
  177.     stopbits='1';
  178.     setport();
  179.     readset();
  180.     follow=index=0;
  181.     timecnt=0;
  182.     printf("Recording voice. Control-D to end; Control-C to nuke.\n");
  183.     setup();
  184.     signal(SIGINT, quit);
  185.     ts=time(NULL);
  186.     sendstr("AT#VRX\r");
  187.     switch(scan())
  188.         {
  189.         case -1:
  190.             cleanup(0);
  191.             printf("Timeout waiting for CONNECT.\n");
  192.             exit(130);
  193.             break;
  194.         case 0:
  195.             break;
  196.         case 1:
  197.             cleanup(0);
  198.             printf("Modem rejected play command.\n");
  199.             exit(131);
  200.             break;
  201.         default:
  202.             cleanup(0);
  203.             printf("Strange scan() return.\n");
  204.             exit(132);
  205.             break;
  206.         }
  207.     dleflag=0;
  208.     while(1)
  209.         {
  210.         while(follow==index)
  211.             if(_bios_keybrd(_KEYBRD_READY))
  212.                 {
  213.                 kc=_bios_keybrd(_KEYBRD_READ);
  214.                 if((kc&0xff)==('C'&31))
  215.                     {
  216.                     sendchar('\r'); /* Try anyway */
  217.                     quit();
  218.                     }
  219.                 else if((kc&0xff)==('D'&31))
  220.                     {
  221.                     putch('^');
  222.                     putch('D');
  223.                     sendchar('\r');
  224.                     xval=254;
  225.                     }
  226.                 }
  227.         if(timecnt++>=1024)
  228.             {
  229.             timecnt=0;
  230.             if(_bios_keybrd(_KEYBRD_READY))
  231.                 {
  232.                 kc=_bios_keybrd(_KEYBRD_READ);
  233.                 if((kc&0xff)==('C'&31))
  234.                     quit();
  235.                 else if((kc&0xff)==('D'&31))
  236.                     {
  237.                     sendchar('\r');
  238.                     xval=254;
  239.                     }
  240.                 }
  241.             if((time(NULL)-ts)>maxsecs)
  242.                 {
  243.                 sendchar('\r');
  244.                 xval=128;
  245.                 }
  246.             }
  247.         c=buf[follow++];
  248.         if(follow>=TBUFSIZ)
  249.             follow=0;
  250.         if(c==0x10)
  251.             {
  252.             if(dleflag)
  253.                 {
  254.                 putbyte(0x10);
  255.                 putbyte(0x10);
  256.                 dleflag=0;
  257.                 }
  258.             else
  259.                 dleflag=1;
  260.             }
  261.         else if(!dleflag)
  262.             putbyte(c);
  263.         else if(c==0x03)
  264.             {
  265.             putbyte(0x10);
  266.             putbyte(0x03);
  267.             if(write(fd, vbuf, vbufi)!=vbufi)
  268.                 {
  269.                 printf("Disk buffer flush error.\n");
  270.                 exit(160);
  271.                 }
  272.             scan(); /* Wait for VCON or whatever */
  273.             cleanup(0);
  274.             exit(xval);
  275.             }
  276.         else if(xval==XVINIT)
  277.             {
  278.             putch(c);
  279.             dleflag=0;
  280.             for(i=0;i<nchecks;i++)
  281.                 if(c==checks[i])
  282.                     {
  283.                     sendchar('X'&31);
  284.                     xval=i;
  285.                     }
  286.             }
  287.         else
  288.             dleflag=0;
  289.         }
  290.     printf("Programming error; fell through endless while loop!\n");
  291.     cleanup(0);
  292.     exit(250);
  293.     }
  294.