10 int msleep(long millisecs
) {
11 struct timespec req
, rem
;
12 req
.tv_sec
= millisecs
/ 1000;
13 req
.tv_nsec
= (millisecs
% 1000) * 1000 * 1000;
15 while((ret
= nanosleep(&req
, &rem
)) == -1 && errno
== EINTR
) req
= rem
;
25 int numsamples
= 1000;
26 int samplerate
= 11025;
27 unsigned char samples
[numsamples
];
29 for(i
= 0; i
< numsamples
; i
++) {
30 samples
[i
] = round(120*sin(i
*(2*M_PI
)/30.0)+128);
32 device
= alcOpenDevice(NULL
);
33 context
= alcCreateContext(device
, NULL
);
34 alcMakeContextCurrent(context
);
36 alGenBuffers(1, &buffer
);
37 alBufferData(buffer
, AL_FORMAT_MONO8
, samples
, numsamples
, samplerate
);
38 if (alGetError()) return 1;
40 alGenSources(1, &source
);
42 alSourcef(source
, AL_PITCH
, 1.0);
43 alSourcef(source
, AL_GAIN
, 1.0);
44 alSourcei(source
, AL_BUFFER
, buffer
);
45 alSourcei(source
, AL_LOOPING
, AL_FALSE
);
46 alSourcei(source
, AL_BUFFER
, buffer
);
47 if (alGetError()) return 1;
50 if (alGetError()) return 1;
52 float delay
= ((float)numsamples
/(float)samplerate
) * 1000.f
;
54 msleep(((long)(delay
))*2);
58 alGetSourcei(source
, AL_SOURCE_STATE
, &state
);
59 } while(alGetError()==AL_NO_ERROR
&& state
==AL_PLAYING
);
63 alDeleteSources(1, &source
);
64 alDeleteBuffers(1, &buffer
);
66 alcMakeContextCurrent(NULL
);
68 alcDestroyContext(context
);
69 alcCloseDevice(device
);