Merged revisions 55954 via svnmerge from
[asterisk/asterisk.git] / channels / gentone.c
1 /* Generate a header file for a particular 
2    single or double frequency */
3
4 #include <stdio.h>
5 #include <math.h>
6 #include <string.h>
7 #include <unistd.h>
8 #include <stdlib.h>
9 #define CLIP 32635
10 #define BIAS 0x84
11 static float loudness=16384.0;
12
13 static int calc_samples(int freq)
14 {
15         int x, samples;
16         /* Calculate the number of samples at 8000hz sampling
17            we need to have this wave form */
18         samples = 8000;
19         /* Take out common 2's up to six times */
20         for (x=0;x<6;x++) 
21                 if (!(freq % 2)) {
22                         freq /= 2;
23                         samples /= 2;
24                 }
25         /* Take out common 5's (up to three times */
26         for (x=0;x<3;x++) 
27                 if (!(freq % 5)) {
28                         freq /= 5;
29                         samples /=5;
30                 }
31         /* No more common factors. */
32         return samples;
33 }
34
35 int main(int argc, char *argv[])
36 {
37         FILE *f;
38         int freq1, freq2;
39         float wlen1, wlen2;
40         float val;
41         int x, samples1, samples2=0, samples=0;
42         char fn[256];
43         if (argc < 3) {
44                 fprintf(stderr, "Usage: gensound <name> <freq1> [freq2]\n");
45                 exit(1);
46         }
47         freq1 = atoi(argv[2]);
48         if (argc > 3) 
49                 freq2 = atoi(argv[3]);
50         else
51                 freq2 = 0;
52         wlen1 = 8000.0/(float)freq1;
53         samples1 = calc_samples(freq1);
54         printf("Wavelength 1 (in samples): %10.5f\n", wlen1);
55         printf("Minimum samples (1): %d (%f.3 wavelengths)\n", samples1, samples1 / wlen1);
56         if (freq2) {
57                 wlen2 = 8000.0/(float)freq2;
58                 samples2 = calc_samples(freq2);
59                 printf("Wavelength 1 (in samples): %10.5f\n", wlen2);
60                 printf("Minimum samples (1): %d (%f.3 wavelengths)\n", samples2, samples2 / wlen2);
61         }
62         samples = samples1;
63         if (freq2) {
64                 while(samples % samples2)
65                         samples += samples1;
66         }
67         printf("Need %d samples\n", samples);
68         snprintf(fn, sizeof(fn), "%s.h", argv[1]);
69         if ((f = fopen(fn, "w"))) {
70                 if (freq2) 
71                         fprintf(f, "/* %s: Generated from frequencies %d and %d \n"
72                                    "   by gentone.  %d samples  */\n", fn, freq1, freq2, samples); 
73                 else
74                         fprintf(f, "/* %s: Generated from frequency %d\n"
75                                    "   by gentone.  %d samples  */\n", fn, freq1, samples); 
76                 fprintf(f, "static short %s[%d] = {\n\t", argv[1], samples);
77                 for (x=0;x<samples;x++) {
78                         val = loudness * sin((freq1 * 2.0 * M_PI * x)/8000.0);
79                         if (freq2)
80                                 val += loudness * sin((freq2 * 2.0 * M_PI * x)/8000.0);
81                         fprintf(f, "%5d, ", (int)val);
82                         if (!((x+1) % 8)) 
83                                 fprintf(f, "\n\t");
84                 }
85                 if (x % 15)
86                         fprintf(f, "\n");
87                 fprintf(f, "};\n");
88                 fclose(f);
89                 printf("Wrote %s\n", fn);
90         } else {
91                 fprintf(stderr, "Unable to open %s for writing\n", fn);
92                 return 1;
93         }
94         return 0;
95 }