diff --git a/src/xpdev/xpbeep.c b/src/xpdev/xpbeep.c index 75eee0417968ce4ae529f836e0f5792d68fdda3e..12173fb11076cc0dc27129e5c852870b1b1c630a 100644 --- a/src/xpdev/xpbeep.c +++ b/src/xpdev/xpbeep.c @@ -190,60 +190,65 @@ void makewave(double freq, unsigned char *wave, int samples, enum WAVE_SHAPE sha double pos; BOOL endhigh; - midpoint=samples/2; - inc=8.0*atan(1.0); - inc *= ((double)freq / (double)S_RATE); - - for(i=0;i<samples;i++) { - pos=(inc*(double)i); - pos -= (int)(pos/WAVE_TPI)*WAVE_TPI; - switch(shape) { - case WAVE_SHAPE_SINE: - wave[i]=(sin (pos))*127+128; - break; - case WAVE_SHAPE_SINE_HARM: - wave[i]=(sin (pos))*64+128; - wave[i]=(sin ((inc*2)*(double)i))*24; - wave[i]=(sin ((inc*3)*(double)i))*16; - break; - case WAVE_SHAPE_SAWTOOTH: - wave[i]=(WAVE_TPI-pos)*40.5; - break; - case WAVE_SHAPE_SQUARE: - wave[i]=(pos<WAVE_PI)?255:0; - break; - case WAVE_SHAPE_SINE_SAW: - wave[i]=(((sin (pos))*127+128)+((WAVE_TPI-pos)*40.5))/2; - break; - case WAVE_SHAPE_SINE_SAW_CHORD: - wave[i]=(((sin (pos))*64+128)+((WAVE_TPI-pos)*6.2))/2; - wave[i]+=(sin ((inc/2)*(double)i))*24; - wave[i]+=(sin ((inc/3)*(double)i))*16; - break; - case WAVE_SHAPE_SINE_SAW_HARM: - wave[i]=(((sin (pos))*64+128)+((WAVE_TPI-pos)*6.2))/2; - wave[i]+=(sin ((inc*2)*(double)i))*24; - wave[i]+=(sin ((inc*3)*(double)i))*16; - break; - } + if(freq==0) { + memset(wave, 128, samples); } + else { + midpoint=samples/2; + inc=8.0*atan(1.0); + inc *= ((double)freq / (double)S_RATE); + + for(i=0;i<samples;i++) { + pos=(inc*(double)i); + pos -= (int)(pos/WAVE_TPI)*WAVE_TPI; + switch(shape) { + case WAVE_SHAPE_SINE: + wave[i]=(sin (pos))*127+128; + break; + case WAVE_SHAPE_SINE_HARM: + wave[i]=(sin (pos))*64+128; + wave[i]=(sin ((inc*2)*(double)i))*24; + wave[i]=(sin ((inc*3)*(double)i))*16; + break; + case WAVE_SHAPE_SAWTOOTH: + wave[i]=(WAVE_TPI-pos)*40.5; + break; + case WAVE_SHAPE_SQUARE: + wave[i]=(pos<WAVE_PI)?255:0; + break; + case WAVE_SHAPE_SINE_SAW: + wave[i]=(((sin (pos))*127+128)+((WAVE_TPI-pos)*40.5))/2; + break; + case WAVE_SHAPE_SINE_SAW_CHORD: + wave[i]=(((sin (pos))*64+128)+((WAVE_TPI-pos)*6.2))/2; + wave[i]+=(sin ((inc/2)*(double)i))*24; + wave[i]+=(sin ((inc/3)*(double)i))*16; + break; + case WAVE_SHAPE_SINE_SAW_HARM: + wave[i]=(((sin (pos))*64+128)+((WAVE_TPI-pos)*6.2))/2; + wave[i]+=(sin ((inc*2)*(double)i))*24; + wave[i]+=(sin ((inc*3)*(double)i))*16; + break; + } + } - /* Now we have a "perfect" wave... - * we must clean it up now to avoid click/pop - */ - if(wave[samples-1]>128) - endhigh=TRUE; - else - endhigh=FALSE; - /* Completely remove the last wave fragment */ - i=samples-1; - if(wave[i]!=128) { - for(;i>midpoint;i--) { - if(endhigh && wave[i]<128) - break; - if(!endhigh && wave[i]>128) - break; - wave[i]=128; + /* Now we have a "perfect" wave... + * we must clean it up now to avoid click/pop + */ + if(wave[samples-1]>128) + endhigh=TRUE; + else + endhigh=FALSE; + /* Completely remove the last wave fragment */ + i=samples-1; + if(wave[i]!=128) { + for(;i>midpoint;i--) { + if(endhigh && wave[i]<128) + break; + if(!endhigh && wave[i]>128) + break; + wave[i]=128; + } } } } @@ -842,12 +847,14 @@ BOOL DLLCALL xptone(double freq, DWORD duration, enum WAVE_SHAPE shape) unsigned char wave[S_RATE*15/2+1]; int samples; - if(freq<17) + if(freq<17 && freq != 0) freq=17; samples=S_RATE*duration/1000; - if(samples<=S_RATE/freq*2) - samples=S_RATE/freq*2; - if(samples > S_RATE/freq*2) { + if(freq) { + if(samples<=S_RATE/freq*2) + samples=S_RATE/freq*2; + } + if(freq==0 || samples > S_RATE/freq*2) { int sample_len; makewave(freq,wave,S_RATE*15/2,shape);