1 /*
2  *
3  * ao_example.c
4  *
5  *     Written by Stan Seibert - July 2001
6  *
7  * Legal Terms:
8  *
9  *     This source file is released into the public domain.  It is
10  *     distributed without any warranty; without even the implied
11  *     warranty * of merchantability or fitness for a particular
12  *     purpose.
13  *
14  * Function:
15  *
16  *     This program opens the default driver and plays a 440 Hz tone for
17  *     one second.
18  *
19  * Compilation command line (for Linux systems):
20  *
21  *     gcc -o ao_example ao_example.c -lao -ldl -lm
22  *
23  */
24 
25 #include <stdio.h>
26 #include <string.h>
27 #include <ao/ao.h>
28 #include <math.h>
29 
30 #define BUF_SIZE 4096
31 
main(int argc,char ** argv)32 int main(int argc, char **argv)
33 {
34 	ao_device *device;
35 	ao_sample_format format;
36 	int default_driver;
37 	char *buffer;
38 	int buf_size;
39 	int sample;
40 	float freq = 440.0;
41 	int i;
42 
43 	/* -- Initialize -- */
44 
45 	fprintf(stderr, "libao example program\n");
46 
47 	ao_initialize();
48 
49 	/* -- Setup for default driver -- */
50 
51 	default_driver = ao_default_driver_id();
52 
53         memset(&format, 0, sizeof(format));
54 	format.bits = 16;
55 	format.channels = 2;
56 	format.rate = 44100;
57 	format.byte_format = AO_FMT_LITTLE;
58 
59 	/* -- Open driver -- */
60 	device = ao_open_live(default_driver, &format, NULL /* no options */);
61 	if (device == NULL) {
62 		fprintf(stderr, "Error opening device.\n");
63 		return 1;
64 	}
65 
66 	/* -- Play some stuff -- */
67 	buf_size = format.bits/8 * format.channels * format.rate;
68 	buffer = calloc(buf_size,
69 			sizeof(char));
70 
71 	for (i = 0; i < format.rate; i++) {
72 		sample = (int)(0.75 * 32768.0 *
73 			sin(2 * M_PI * freq * ((float) i/format.rate)));
74 
75 		/* Put the same stuff in left and right channel */
76 		buffer[4*i] = buffer[4*i+2] = sample & 0xff;
77 		buffer[4*i+1] = buffer[4*i+3] = (sample >> 8) & 0xff;
78 	}
79 	ao_play(device, buffer, buf_size);
80 
81 	/* -- Close and shutdown -- */
82 	ao_close(device);
83 
84 	ao_shutdown();
85 
86   return (0);
87 }
88