00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include <stdlib.h>
00025 #include <stdio.h>
00026
00027 #define NB_CHANNELS 2
00028 #define FE 44100
00029
00030 static unsigned int myrnd(unsigned int *seed_ptr, int n)
00031 {
00032 unsigned int seed, val;
00033
00034 seed = *seed_ptr;
00035 seed = (seed * 314159) + 1;
00036 if (n == 256) {
00037 val = seed >> 24;
00038 } else {
00039 val = seed % n;
00040 }
00041 *seed_ptr = seed;
00042 return val;
00043 }
00044
00045 #define FRAC_BITS 16
00046 #define FRAC_ONE (1 << FRAC_BITS)
00047
00048 #define COS_TABLE_BITS 7
00049
00050
00051 static const unsigned short cos_table[(1 << COS_TABLE_BITS) + 2] = {
00052 0x8000, 0x7ffe, 0x7ff6, 0x7fea, 0x7fd9, 0x7fc2, 0x7fa7, 0x7f87,
00053 0x7f62, 0x7f38, 0x7f0a, 0x7ed6, 0x7e9d, 0x7e60, 0x7e1e, 0x7dd6,
00054 0x7d8a, 0x7d3a, 0x7ce4, 0x7c89, 0x7c2a, 0x7bc6, 0x7b5d, 0x7aef,
00055 0x7a7d, 0x7a06, 0x798a, 0x790a, 0x7885, 0x77fb, 0x776c, 0x76d9,
00056 0x7642, 0x75a6, 0x7505, 0x7460, 0x73b6, 0x7308, 0x7255, 0x719e,
00057 0x70e3, 0x7023, 0x6f5f, 0x6e97, 0x6dca, 0x6cf9, 0x6c24, 0x6b4b,
00058 0x6a6e, 0x698c, 0x68a7, 0x67bd, 0x66d0, 0x65de, 0x64e9, 0x63ef,
00059 0x62f2, 0x61f1, 0x60ec, 0x5fe4, 0x5ed7, 0x5dc8, 0x5cb4, 0x5b9d,
00060 0x5a82, 0x5964, 0x5843, 0x571e, 0x55f6, 0x54ca, 0x539b, 0x5269,
00061 0x5134, 0x4ffb, 0x4ec0, 0x4d81, 0x4c40, 0x4afb, 0x49b4, 0x486a,
00062 0x471d, 0x45cd, 0x447b, 0x4326, 0x41ce, 0x4074, 0x3f17, 0x3db8,
00063 0x3c57, 0x3af3, 0x398d, 0x3825, 0x36ba, 0x354e, 0x33df, 0x326e,
00064 0x30fc, 0x2f87, 0x2e11, 0x2c99, 0x2b1f, 0x29a4, 0x2827, 0x26a8,
00065 0x2528, 0x23a7, 0x2224, 0x209f, 0x1f1a, 0x1d93, 0x1c0c, 0x1a83,
00066 0x18f9, 0x176e, 0x15e2, 0x1455, 0x12c8, 0x113a, 0x0fab, 0x0e1c,
00067 0x0c8c, 0x0afb, 0x096b, 0x07d9, 0x0648, 0x04b6, 0x0324, 0x0192,
00068 0x0000, 0x0000,
00069 };
00070
00071 #define CSHIFT (FRAC_BITS - COS_TABLE_BITS - 2)
00072
00073 static int int_cos(int a)
00074 {
00075 int neg, v, f;
00076 const unsigned short *p;
00077
00078 a = a & (FRAC_ONE - 1);
00079 if (a >= (FRAC_ONE / 2))
00080 a = FRAC_ONE - a;
00081 neg = 0;
00082 if (a > (FRAC_ONE / 4)) {
00083 neg = -1;
00084 a = (FRAC_ONE / 2) - a;
00085 }
00086 p = cos_table + (a >> CSHIFT);
00087
00088 f = a & ((1 << CSHIFT) - 1);
00089 v = p[0] + (((p[1] - p[0]) * f + (1 << (CSHIFT - 1))) >> CSHIFT);
00090 v = (v ^ neg) - neg;
00091 v = v << (FRAC_BITS - 15);
00092 return v;
00093 }
00094
00095 FILE *outfile;
00096
00097 static void put_sample(int v)
00098 {
00099 fputc(v & 0xff, outfile);
00100 fputc((v >> 8) & 0xff, outfile);
00101 }
00102
00103 int main(int argc, char **argv)
00104 {
00105 int i, a, v, j, f, amp, ampa;
00106 unsigned int seed = 1;
00107 int tabf1[NB_CHANNELS], tabf2[NB_CHANNELS];
00108 int taba[NB_CHANNELS];
00109
00110 if (argc != 2) {
00111 printf("usage: %s file\n"
00112 "generate a test raw 16 bit stereo audio stream\n", argv[0]);
00113 exit(1);
00114 }
00115
00116 outfile = fopen(argv[1], "wb");
00117 if (!outfile) {
00118 perror(argv[1]);
00119 return 1;
00120 }
00121
00122
00123 a = 0;
00124 for(i=0;i<1 * FE;i++) {
00125 v = (int_cos(a) * 10000) >> FRAC_BITS;
00126 for(j=0;j<NB_CHANNELS;j++)
00127 put_sample(v);
00128 a += (1000 * FRAC_ONE) / FE;
00129 }
00130
00131
00132 a = 0;
00133 for(i=0;i<1 * FE;i++) {
00134 v = (int_cos(a) * 10000) >> FRAC_BITS;
00135 for(j=0;j<NB_CHANNELS;j++)
00136 put_sample(v);
00137 f = 100 + (((10000 - 100) * i) / FE);
00138 a += (f * FRAC_ONE) / FE;
00139 }
00140
00141
00142 for(i=0;i<FE / 2;i++) {
00143 v = myrnd(&seed, 20000) - 10000;
00144 for(j=0;j<NB_CHANNELS;j++)
00145 put_sample(v);
00146 }
00147
00148
00149 for(i=0;i<FE / 2;i++) {
00150 v = myrnd(&seed, 65535) - 32768;
00151 for(j=0;j<NB_CHANNELS;j++)
00152 put_sample(v);
00153 }
00154
00155
00156 for(j=0;j<NB_CHANNELS;j++) {
00157 taba[j] = 0;
00158 tabf1[j] = 100 + myrnd(&seed, 5000);
00159 tabf2[j] = 100 + myrnd(&seed, 5000);
00160 }
00161 for(i=0;i<1 * FE;i++) {
00162 for(j=0;j<NB_CHANNELS;j++) {
00163 v = (int_cos(taba[j]) * 10000) >> FRAC_BITS;
00164 put_sample(v);
00165 f = tabf1[j] + (((tabf2[j] - tabf1[j]) * i) / FE);
00166 taba[j] += (f * FRAC_ONE) / FE;
00167 }
00168 }
00169
00170
00171 a = 0;
00172 ampa = 0;
00173 for(i=0;i<2 * FE;i++) {
00174 for(j=0;j<NB_CHANNELS;j++) {
00175 amp = ((FRAC_ONE + int_cos(ampa)) * 5000) >> FRAC_BITS;
00176 if (j & 1)
00177 amp = 10000 - amp;
00178 v = (int_cos(a) * amp) >> FRAC_BITS;
00179 put_sample(v);
00180 a += (500 * FRAC_ONE) / FE;
00181 ampa += (2 * FRAC_ONE) / FE;
00182 }
00183 }
00184
00185 fclose(outfile);
00186 return 0;
00187 }