avutil: add audio fifo buffer
[libav.git] / tests / audiogen.c
CommitLineData
51133a7d 1/*
58c42af7
DB
2 * Generate a synthetic stereo sound.
3 * NOTE: No floats are used to guarantee bitexact output.
eebfba2e
DB
4 *
5 * Copyright (c) 2002 Fabrice Bellard
6 *
2912e87a 7 * This file is part of Libav.
eebfba2e 8 *
2912e87a 9 * Libav is free software; you can redistribute it and/or
eebfba2e
DB
10 * modify it under the terms of the GNU Lesser General Public
11 * License as published by the Free Software Foundation; either
12 * version 2.1 of the License, or (at your option) any later version.
13 *
2912e87a 14 * Libav is distributed in the hope that it will be useful,
eebfba2e
DB
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 * Lesser General Public License for more details.
18 *
19 * You should have received a copy of the GNU Lesser General Public
2912e87a 20 * License along with Libav; if not, write to the Free Software
eebfba2e 21 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
51133a7d 22 */
eebfba2e 23
51133a7d
FB
24#include <stdlib.h>
25#include <stdio.h>
26
6c834328 27#define MAX_CHANNELS 8
51133a7d
FB
28
29static unsigned int myrnd(unsigned int *seed_ptr, int n)
30{
31 unsigned int seed, val;
32
33 seed = *seed_ptr;
34 seed = (seed * 314159) + 1;
35 if (n == 256) {
36 val = seed >> 24;
37 } else {
38 val = seed % n;
39 }
40 *seed_ptr = seed;
41 return val;
42}
43
44#define FRAC_BITS 16
45#define FRAC_ONE (1 << FRAC_BITS)
46
47#define COS_TABLE_BITS 7
48
49/* integer cosinus */
50static const unsigned short cos_table[(1 << COS_TABLE_BITS) + 2] = {
b481bbc3
GN
51 0x8000, 0x7ffe, 0x7ff6, 0x7fea, 0x7fd9, 0x7fc2, 0x7fa7, 0x7f87,
52 0x7f62, 0x7f38, 0x7f0a, 0x7ed6, 0x7e9d, 0x7e60, 0x7e1e, 0x7dd6,
53 0x7d8a, 0x7d3a, 0x7ce4, 0x7c89, 0x7c2a, 0x7bc6, 0x7b5d, 0x7aef,
54 0x7a7d, 0x7a06, 0x798a, 0x790a, 0x7885, 0x77fb, 0x776c, 0x76d9,
55 0x7642, 0x75a6, 0x7505, 0x7460, 0x73b6, 0x7308, 0x7255, 0x719e,
56 0x70e3, 0x7023, 0x6f5f, 0x6e97, 0x6dca, 0x6cf9, 0x6c24, 0x6b4b,
57 0x6a6e, 0x698c, 0x68a7, 0x67bd, 0x66d0, 0x65de, 0x64e9, 0x63ef,
58 0x62f2, 0x61f1, 0x60ec, 0x5fe4, 0x5ed7, 0x5dc8, 0x5cb4, 0x5b9d,
59 0x5a82, 0x5964, 0x5843, 0x571e, 0x55f6, 0x54ca, 0x539b, 0x5269,
60 0x5134, 0x4ffb, 0x4ec0, 0x4d81, 0x4c40, 0x4afb, 0x49b4, 0x486a,
61 0x471d, 0x45cd, 0x447b, 0x4326, 0x41ce, 0x4074, 0x3f17, 0x3db8,
62 0x3c57, 0x3af3, 0x398d, 0x3825, 0x36ba, 0x354e, 0x33df, 0x326e,
63 0x30fc, 0x2f87, 0x2e11, 0x2c99, 0x2b1f, 0x29a4, 0x2827, 0x26a8,
64 0x2528, 0x23a7, 0x2224, 0x209f, 0x1f1a, 0x1d93, 0x1c0c, 0x1a83,
65 0x18f9, 0x176e, 0x15e2, 0x1455, 0x12c8, 0x113a, 0x0fab, 0x0e1c,
66 0x0c8c, 0x0afb, 0x096b, 0x07d9, 0x0648, 0x04b6, 0x0324, 0x0192,
67 0x0000, 0x0000,
51133a7d
FB
68};
69
70#define CSHIFT (FRAC_BITS - COS_TABLE_BITS - 2)
71
72static int int_cos(int a)
73{
74 int neg, v, f;
75 const unsigned short *p;
76
77 a = a & (FRAC_ONE - 1); /* modulo 2 * pi */
78 if (a >= (FRAC_ONE / 2))
79 a = FRAC_ONE - a;
80 neg = 0;
81 if (a > (FRAC_ONE / 4)) {
82 neg = -1;
b481bbc3 83 a = (FRAC_ONE / 2) - a;
51133a7d
FB
84 }
85 p = cos_table + (a >> CSHIFT);
86 /* linear interpolation */
87 f = a & ((1 << CSHIFT) - 1);
88 v = p[0] + (((p[1] - p[0]) * f + (1 << (CSHIFT - 1))) >> CSHIFT);
89 v = (v ^ neg) - neg;
90 v = v << (FRAC_BITS - 15);
91 return v;
92}
93
94FILE *outfile;
95
6f2162b4 96static void put_sample(int v)
51133a7d
FB
97{
98 fputc(v & 0xff, outfile);
99 fputc((v >> 8) & 0xff, outfile);
100}
101
102int main(int argc, char **argv)
103{
104 int i, a, v, j, f, amp, ampa;
105 unsigned int seed = 1;
6c834328
JR
106 int tabf1[MAX_CHANNELS], tabf2[MAX_CHANNELS];
107 int taba[MAX_CHANNELS];
108 int sample_rate = 44100;
109 int nb_channels = 2;
110
111 if (argc < 2 || argc > 4) {
112 printf("usage: %s file [<sample rate> [<channels>]]\n"
113 "generate a test raw 16 bit audio stream\n"
114 "default: 44100 Hz stereo\n", argv[0]);
51133a7d
FB
115 exit(1);
116 }
115329f1 117
6c834328
JR
118 if (argc > 2) {
119 sample_rate = atoi(argv[2]);
120 if (sample_rate <= 0) {
121 fprintf(stderr, "invalid sample rate: %d\n", sample_rate);
122 return 1;
123 }
124 }
125
126 if (argc > 3) {
127 nb_channels = atoi(argv[3]);
128 if (nb_channels < 1 || nb_channels > MAX_CHANNELS) {
129 fprintf(stderr, "invalid number of channels: %d\n", nb_channels);
130 return 1;
131 }
132 }
133
baf23f0c 134 outfile = fopen(argv[1], "wb");
51133a7d
FB
135 if (!outfile) {
136 perror(argv[1]);
137 return 1;
138 }
139
140 /* 1 second of single freq sinus at 1000 Hz */
141 a = 0;
b481bbc3 142 for (i = 0; i < 1 * sample_rate; i++) {
51133a7d 143 v = (int_cos(a) * 10000) >> FRAC_BITS;
b481bbc3 144 for (j = 0; j < nb_channels; j++)
51133a7d 145 put_sample(v);
6c834328 146 a += (1000 * FRAC_ONE) / sample_rate;
51133a7d
FB
147 }
148
149 /* 1 second of varing frequency between 100 and 10000 Hz */
150 a = 0;
b481bbc3 151 for (i = 0; i < 1 * sample_rate; i++) {
51133a7d 152 v = (int_cos(a) * 10000) >> FRAC_BITS;
b481bbc3 153 for (j = 0; j < nb_channels; j++)
51133a7d 154 put_sample(v);
b481bbc3 155 f = 100 + (((10000 - 100) * i) / sample_rate);
6c834328 156 a += (f * FRAC_ONE) / sample_rate;
51133a7d 157 }
115329f1 158
51133a7d 159 /* 0.5 second of low amplitude white noise */
b481bbc3 160 for (i = 0; i < sample_rate / 2; i++) {
51133a7d 161 v = myrnd(&seed, 20000) - 10000;
b481bbc3 162 for (j = 0; j < nb_channels; j++)
51133a7d
FB
163 put_sample(v);
164 }
165
166 /* 0.5 second of high amplitude white noise */
b481bbc3 167 for (i = 0; i < sample_rate / 2; i++) {
51133a7d 168 v = myrnd(&seed, 65535) - 32768;
b481bbc3 169 for (j = 0; j < nb_channels; j++)
51133a7d
FB
170 put_sample(v);
171 }
172
6c834328 173 /* 1 second of unrelated ramps for each channel */
b481bbc3
GN
174 for (j = 0; j < nb_channels; j++) {
175 taba[j] = 0;
51133a7d
FB
176 tabf1[j] = 100 + myrnd(&seed, 5000);
177 tabf2[j] = 100 + myrnd(&seed, 5000);
178 }
b481bbc3
GN
179 for (i = 0; i < 1 * sample_rate; i++) {
180 for (j = 0; j < nb_channels; j++) {
51133a7d
FB
181 v = (int_cos(taba[j]) * 10000) >> FRAC_BITS;
182 put_sample(v);
b481bbc3 183 f = tabf1[j] + (((tabf2[j] - tabf1[j]) * i) / sample_rate);
6c834328 184 taba[j] += (f * FRAC_ONE) / sample_rate;
51133a7d
FB
185 }
186 }
115329f1 187
6c834328 188 /* 2 seconds of 500 Hz with varying volume */
b481bbc3 189 a = 0;
51133a7d 190 ampa = 0;
b481bbc3
GN
191 for (i = 0; i < 2 * sample_rate; i++) {
192 for (j = 0; j < nb_channels; j++) {
51133a7d
FB
193 amp = ((FRAC_ONE + int_cos(ampa)) * 5000) >> FRAC_BITS;
194 if (j & 1)
195 amp = 10000 - amp;
196 v = (int_cos(a) * amp) >> FRAC_BITS;
197 put_sample(v);
b481bbc3 198 a += (500 * FRAC_ONE) / sample_rate;
6c834328 199 ampa += (2 * FRAC_ONE) / sample_rate;
51133a7d
FB
200 }
201 }
202
203 fclose(outfile);
204 return 0;
205}