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