I wrote an example for just that. Works well with OpenAL under MacOSX and plays smooth sines. Take a look here: http://ioctl.eu/blog/2011/03/16/openal-sine-synth/
The code is quite short, I think I can add it here for completeness:
#include <cstdio> #include <cstdlib> #include <cmath> #include <iostream> #include <OpenAL/al.h> #include <OpenAL/alc.h> #define CASE_RETURN(err) case (err): return "##err" const char* al_err_str(ALenum err) { switch(err) { CASE_RETURN(AL_NO_ERROR); CASE_RETURN(AL_INVALID_NAME); CASE_RETURN(AL_INVALID_ENUM); CASE_RETURN(AL_INVALID_VALUE); CASE_RETURN(AL_INVALID_OPERATION); CASE_RETURN(AL_OUT_OF_MEMORY); } return "unknown"; } #undef CASE_RETURN #define __al_check_error(file,line) \ do { \ ALenum err = alGetError(); \ for(; err!=AL_NO_ERROR; err=alGetError()) { \ std::cerr << "AL Error " << al_err_str(err) << " at " << file << ":" << line << std::endl; \ } \ }while(0) #define al_check_error() \ __al_check_error(__FILE__, __LINE__) void init_al() { ALCdevice *dev = NULL; ALCcontext *ctx = NULL; const char *defname = alcGetString(NULL, ALC_DEFAULT_DEVICE_SPECIFIER); std::cout << "Default device: " << defname << std::endl; dev = alcOpenDevice(defname); ctx = alcCreateContext(dev, NULL); alcMakeContextCurrent(ctx); } void exit_al() { ALCdevice *dev = NULL; ALCcontext *ctx = NULL; ctx = alcGetCurrentContext(); dev = alcGetContextsDevice(ctx); alcMakeContextCurrent(NULL); alcDestroyContext(ctx); alcCloseDevice(dev); } int main(int argc, char* argv[]) { /* initialize OpenAL */ init_al(); /* Create buffer to store samples */ ALuint buf; alGenBuffers(1, &buf); al_check_error(); /* Fill buffer with Sine-Wave */ float freq = 440.f; int seconds = 4; unsigned sample_rate = 22050; size_t buf_size = seconds * sample_rate; short *samples; samples = new short[buf_size]; for(int i=0; i<buf_size; ++i) { samples[i] = 32760 * sin( (2.f*float(M_PI)*freq)/sample_rate * i ); } /* Download buffer to OpenAL */ alBufferData(buf, AL_FORMAT_MONO16, samples, buf_size, sample_rate); al_check_error(); /* Set-up sound source and play buffer */ ALuint src = 0; alGenSources(1, &src); alSourcei(src, AL_BUFFER, buf); alSourcePlay(src); /* While sound is playing, sleep */ al_check_error(); sleep(seconds); /* Dealloc OpenAL */ exit_al(); al_check_error(); return 0; }
Update . I found that OpenAL is too limiting my needs, for example, I have some problems with low-latency playback, as this does not seem to be the main OpenAL domain. Instead, I found a very compelling PortAudio: http://www.portaudio.com/ It supports all major platforms (Mac, Win, Unix / ALSA) and looks very good. There is an example for reproducing a sine, which is much more complicated, but quite simple. Just download the latest version and find a sample sine reproduction in test / patest_sine.c
source share