home *** CD-ROM | disk | FTP | other *** search
/ Crawly Crypt Collection 1 / crawlyvol1.bin / magazine / aeo / aeo_9201 / cdial.c < prev   
C/C++ Source or Header  |  1992-04-19  |  6KB  |  234 lines

  1. /*********************************************
  2.     AUDIO TONE-DIALER ACCESSORY
  3. Mark Williams C. Compiles with:
  4. cc filename.c -o filename.acc -VGEMACC
  5. requires ASCII file "DIAL.ASC" on root of boot
  6. disk. File has format:
  7.  
  8. Name,123-4567(Return)
  9. Name,1(123) 456-7890(Return), etc.
  10. **********************************************/
  11.  
  12. #include <aesbind.h>
  13. #include <gemdefs.h>
  14. #include <obdefs.h>
  15. #include <osbind.h>
  16. #include <ctype.h>
  17. #include <stdio.h>
  18.  
  19. #define BUFLEN        1024L        /* Length of disk buffer */
  20. #define DS1        1        /* Index of first dialer string */
  21. #define DONE        13        /* Index of CANCEL button */
  22. #define DLINES        12        /* Number of dial strings */
  23. #define LONGDLY        10        /* Tone dur. in 1/60th sec. units */ 
  24. #define SHORTDLY    4        /* Intertone dur. as above */
  25. #define WRITE        0x80        /* Write command for GI sound chip */
  26. #define ENABLE        7        /* GI register 7 (enable register) */
  27. #define AVOLUME        8        /* GI channel A volume/envelope reg. */
  28. #define BVOLUME        9        /* GI channel B ditto */
  29. #define APITCH        0        /* GI channel A pitch register */
  30. #define APERLEN        1        /* GI channel A period length reg. */
  31. #define BPITCH        2        /* GI channel B pitch register */
  32. #define BPERLEN        3        /* GI channel B period length reg. */
  33. #define SMRECT        0,0,0,0        /* Small rectangle */
  34. #define BIGRECT        dial[0].ob_x,dial[0].ob_y,\
  35.                 dial[0].ob_width,dial[0].ob_height
  36. #define delay(a)    {int i = a; while(i--) Vsync();}
  37.  
  38. char buf[BUFLEN];            /* Disk transfer buffer */
  39. long count;                /* Character count */
  40.  
  41. char dum[] = "";            /* Dummy string */
  42. char *ptr[] = {                /* Array of pointers to phone numbers */
  43. dum,dum,dum,dum,dum,dum,dum,dum,dum,dum,dum,dum
  44. };
  45.  
  46. OBJECT dial[] = {            /* Dialog box OBJECT structure array */
  47. -1,1,14,20,0,16,0x21100L,120,16,264,288,
  48. 2,-1,-1,28,64,0,"",16,48,240,16,
  49. 3,-1,-1,28,64,0,"",16,64,240,16,
  50. 4,-1,-1,28,64,0,"",16,80,240,16,
  51. 5,-1,-1,28,64,0,"",16,96,240,16,
  52. 6,-1,-1,28,64,0,"",16,112,240,16,
  53. 7,-1,-1,28,64,0,"",16,128,240,16,
  54. 8,-1,-1,28,64,0,"",16,144,240,16,
  55. 9,-1,-1,28,64,0,"",16,160,240,16,
  56. 10,-1,-1,28,64,0,"",16,176,240,16,
  57. 11,-1,-1,28,64,0,"",16,192,240,16,
  58. 12,-1,-1,28,64,0,"",16,208,240,16,
  59. 13,-1,-1,28,64,0,"",16,224,240,16,
  60. 14,-1,-1,26,66,0,"Done",104,256,64,16,
  61. 0,-1,-1,28,32,0,"Audio Dial",96,16,80,16
  62. };
  63.  
  64. char fname[] = "x:\\dial.asc";            /* Name of data file */
  65.  
  66. /**********************************************
  67.     IMPORTANT STUFF STARTS HERE
  68. ***********************************************/
  69.  
  70. /* Set GI chip and generate tone pair */
  71.  
  72. tone(a,b)
  73. int a,b;
  74. {
  75. /* Enable tone channels A and B (reset bits 0 and 1 of GI register 7) */
  76.  
  77. Giaccess((char) 0xFC,WRITE | ENABLE);
  78.  
  79. /* Medium volume on A and B (set bits 0-3). Avoids distortion. */
  80.  
  81. Giaccess((char) 0x0D,WRITE | AVOLUME);
  82. Giaccess((char) 0x0D,WRITE | BVOLUME);
  83.  
  84. /* Set pitch and period length for channels A and B */
  85.  
  86. Giaccess((char) a & 0xFF,WRITE | APITCH);
  87. Giaccess((char) (a >> 8) & 0xFF,WRITE | APERLEN);
  88.  
  89. Giaccess((char) b & 0xFF,WRITE | BPITCH);
  90. Giaccess((char) (b >> 8) & 0xFF,WRITE | BPERLEN);
  91.  
  92. delay(LONGDLY); /* Wait */
  93.  
  94. /* Turn off tone for channels A and B */
  95.  
  96. Giaccess((char) 0x00,WRITE | 8);
  97. Giaccess((char) 0x00,WRITE | 9);
  98.  
  99. delay(SHORTDLY); /* Wait */
  100. }
  101.  
  102. /* Find character in string, return pointer */
  103.  
  104. char *index(s,c)
  105. char *s;
  106. char c;
  107. {
  108. while(*s != '\0'){
  109.     if (*s == c)
  110.         return(s);
  111.     s++;
  112.     }
  113. return(NULL);
  114. }
  115.  
  116. /* Find index of character in string */
  117.  
  118. int ind(s,c)
  119. char *s;
  120. char c;
  121. {
  122. char *p = index(s,c);
  123.  
  124. if (p != NULL)
  125.     return((int) p - s);
  126. return(-1);
  127. }
  128.  
  129. /* Dial number string */
  130.  
  131. do_dial(s)
  132. char *s;
  133. {
  134. int row,col,p;
  135. static int rt[4] = {178,160,145,131};    /* Row tones */
  136. static int ct[3] = {104,92,83};        /* Column tones */
  137. static char kpd[] = "11112ABC3DEF4GHI5JKL6MNO7PRS8TUV9WXY****0000####";
  138.  
  139. while(*s != '\0'){
  140.     if ((p = ind(kpd,toupper(*s++))) >= 0){  /* if char on keypad .. */
  141.         row = (int) (p / 12);    /* 12 chars per row in keypad model */
  142.         col = (int) ((p % 12) / 4);    /* 4 chars per key */
  143.         tone(rt[row],ct[col]);    /* play tones */
  144.         }
  145.     }
  146. }
  147.  
  148. /***********************************************
  149.      IMPORTANT STUFF ENDS: COSMETICS BEGIN
  150. ************************************************/
  151.  
  152. /* Draw and manage dialog box */
  153.  
  154. void do_de_dial_thang()
  155. {
  156. int ret;
  157.  
  158. form_dial(FMD_START,SMRECT,BIGRECT);
  159. form_dial(FMD_GROW,SMRECT,BIGRECT);
  160. objc_draw(dial,0,MAX_DEPTH,BIGRECT);
  161. do{
  162.     ret = form_do(dial,0);
  163.     if (ret != DONE)
  164.         do_dial(ptr[ret - DS1]);
  165.     } while (ret != DONE);
  166. form_dial(FMD_SHRINK,SMRECT,BIGRECT);
  167. form_dial(FMD_FINISH,SMRECT,BIGRECT);
  168. }
  169.  
  170. /* Read data file into buffer and set pointers */
  171.  
  172. int readin()
  173. {
  174. int i,fhandle;
  175. char *point,*s = buf;
  176.  
  177. if ((fhandle = Fopen(fname,0)) < 0)
  178.     return(-1);
  179.  
  180. if ((count = Fread(fhandle,BUFLEN,buf)) < 0)
  181.     return(-1);
  182.  
  183. Fclose(fhandle);
  184. buf[(int) count] = '\0';
  185.  
  186. for(i = DS1;i < DONE;i++){
  187.     if ((point = (char *) index(s,',')) == NULL)
  188.         break;
  189.     dial[i].ob_spec = (long) s;
  190.     *point++ = '\0';
  191.     s = point;
  192.     if ((point = (char *) index(s,(char) 13)) == NULL)
  193.         break;
  194.     ptr[i - DS1] = s;
  195.     *point++ = '\0';
  196.     if (*point == (char) 10)
  197.         *point++ = '\0';
  198.     s = point;
  199.     }
  200. return(0);
  201. }
  202.  
  203. /* Main routine */
  204.  
  205. main()
  206. {
  207. extern int gl_apid;
  208. int menu_ID,mbuf[8],flag;
  209.  
  210. /* Register accessory */
  211.  
  212. appl_init();
  213. menu_ID = menu_register(gl_apid,"  AudioDial ");
  214. fname[0] = Dgetdrv() + 'A';
  215. form_center(dial,
  216.     &dial[0].ob_x,&dial[0].ob_y,&dial[0].ob_width,&dial[0].ob_height);
  217.  
  218. /* Read in file of names and numbers */
  219.  
  220. flag = readin();
  221.  
  222. /* Manage accessory */
  223.  
  224. for(;;){
  225.     evnt_mesag(mbuf);
  226.     if (mbuf[0] == AC_OPEN){
  227.         if (flag)
  228.             form_alert(3,"[1][Sorry bud. Can't find DIAL.ASC.][Darn!]");    
  229.         else
  230.             do_de_dial_thang();
  231.         }
  232.     }
  233. }
  234.