Playing tones in sdl

Hi all,

I have a simple routine that plays tones using SDL. The problem is that there’s
a noticeable delay between each tone. The code i use is given below, does
someone here has a tip on how to make the delay disapear?

Many thanks

Guich.

/---------------------------------------------------------------toneCallback-+
| “Play a Tone” callback |
±---------------------------------------------------------------------------
/
static void toneCallback(void * udata, Uint8 * stream, int len)
{
ToneCallbackData d = *(ToneCallbackData *)udata;
if (d.isEnabled)
{
if (d.timeCurr < d.timeMax)
{
if (d.timeCurr+len > d.timeMax)
len = d.timeMax - d.timeCurr;
((ToneCallbackData *)udata)->timeCurr += len;
len /= 2;
while (len–)
{
if (d.val >= sineValsMax)
d.val = (char const *)sineVals;
*stream++ = *(d.val++);
*stream++ = *(d.val++);
}
((ToneCallbackData )udata)->val = d.val;
}
else
{
d.isEnabled = 0; /
disable self */
SDL_SemPost(d.playEnded);
}
}
}

/-------------------------------------------------------------------playTone-+
| |
±---------------------------------------------------------------------------
/
static int playTone(int freq, int duration)
{
SDL_AudioSpec waveSpec;
ToneCallbackData d;
double ratio = freq / 1000.0;
int rc = 0;

waveSpec.freq = (int)(44100 * ratio); // Samples per sec (FM Radio quality)
waveSpec.format = AUDIO_S16LSB; // Signed 16-bit little-endian samples
waveSpec.channels = 1; // Number of sound channels (stereo)
waveSpec.silence = 0;
waveSpec.samples = 4096; // Size of the Audio buffer in samples
waveSpec.padding = 0;
waveSpec.size = 8192;
waveSpec.callback = toneCallback; // “Play a Tone” callback
waveSpec.userdata = &d; // waveCallback data

d.isEnabled = 0; // disable our toneCallback
if (SDL_OpenAudio(&waveSpec, 0) >= 0)
{
d.playEnded = SDL_CreateSemaphore(0);
d.timeCurr = 0;
d.timeMax = (int)(82 * duration * ratio);
d.isEnabled = 1;
d.val = (char const *)sineVals;
SDL_PauseAudio(0); // make sure we play
SDL_SemWait(d.playEnded); // wait here until the callback finishes
SDL_DestroySemaphore(d.playEnded);
SDL_CloseAudio();
}
return rc;
}