add beep-ao.c
[rofl0r-df-peek.git] / beep-ao.c
blob671a24921e86478a25098695643b58b6778ddf49
1 #include <stdio.h>
2 #include <math.h>
3 #include <errno.h>
4 #include <time.h>
5 #include <ao/ao.h>
6 //RcB: LINK "-lao"
8 struct AoWriter {
9 ao_device *device;
10 ao_sample_format format;
11 int aodriver;
14 int AoWriter_init(struct AoWriter *self) {
15 ao_initialize();
16 memset(self, 0, sizeof(*self));
17 self->format.bits = 8;
18 self->format.channels = 1;
19 self->format.rate = 11025;
20 self->format.byte_format = AO_FMT_LITTLE;
21 self->aodriver = ao_default_driver_id();
22 self->device = ao_open_live(self->aodriver, &self->format, NULL);
23 return self->device != NULL;
26 int AoWriter_write(struct AoWriter *self, void* buffer, size_t bufsize) {
27 return ao_play(self->device, buffer, bufsize);
30 int AoWriter_close(struct AoWriter *self) {
31 return ao_close(self->device);
35 int msleep(long millisecs) {
36 struct timespec req, rem;
37 req.tv_sec = millisecs / 1000;
38 req.tv_nsec = (millisecs % 1000) * 1000 * 1000;
39 int ret;
40 while((ret = nanosleep(&req, &rem)) == -1 && errno == EINTR) req = rem;
41 return ret;
44 int main() {
45 struct AoWriter ao;
46 AoWriter_init(&ao);
48 int numsamples = 1000;
49 int samplerate = 11025;
50 unsigned char samples[numsamples];
51 int i;
52 for(i = 0; i < numsamples; i++) {
53 samples[i] = round(120*sin(i*(2*M_PI)/30.0)+128);
56 float delay = ((float)numsamples/(float)samplerate) * 1000.f;
57 AoWriter_write(&ao, samples, numsamples);
58 AoWriter_close(&ao);
59 return 0;