diff --git a/src/hardware/mixer.cpp b/src/hardware/mixer.cpp index 25dc0c6a..5780b4e5 100644 --- a/src/hardware/mixer.cpp +++ b/src/hardware/mixer.cpp @@ -399,6 +399,17 @@ static inline bool Mixer_irq_important(void) { return (ticksLocked || (CaptureState & (CAPTURE_WAVE|CAPTURE_VIDEO))); } +static Bit32u calc_tickadd(Bit32u freq) { +#if TICK_SHIFT >16 + Bit64u freq64 = static_cast(freq); + freq64 = (freq64<(freq64); + return r; +#else + return (freq<needed?mixer.min_needed:needed) - left; - mixer.tick_add = ((mixer.freq+(diff*3)) << TICK_SHIFT)/1000; + mixer.tick_add = calc_tickadd(mixer.freq+(diff*3)); left = 0; //No stretching as we compensate with the tick_add value } else { left = (mixer.min_needed - left); @@ -501,11 +512,11 @@ static void SDLCALL MIXER_CallBack(void * userdata, Uint8 *stream, int len) { Bitu diff = left - mixer.min_needed; if(diff > (mixer.min_needed<<1)) diff = mixer.min_needed<<1; if(diff > (mixer.min_needed>>1)) - mixer.tick_add = ((mixer.freq-(diff/5)) << TICK_SHIFT)/1000; + mixer.tick_add = calc_tickadd(mixer.freq-(diff/5)); else if (diff > (mixer.min_needed>>2)) - mixer.tick_add = ((mixer.freq-(diff>>3)) << TICK_SHIFT)/1000; + mixer.tick_add = calc_tickadd(mixer.freq-(diff>>3)); else - mixer.tick_add = (mixer.freq<< TICK_SHIFT)/1000; + mixer.tick_add = calc_tickadd(mixer.freq); } } else { /* There is way too much data in the buffer */ @@ -516,7 +527,7 @@ static void SDLCALL MIXER_CallBack(void * userdata, Uint8 *stream, int len) { index_add = mixer.done - 2*mixer.min_needed; index_add = (index_add << TICK_SHIFT) / need; reduce = mixer.done - 2* mixer.min_needed; - mixer.tick_add = ((mixer.freq-(mixer.min_needed/5)) << TICK_SHIFT)/1000; + mixer.tick_add = calc_tickadd(mixer.freq-(mixer.min_needed/5)); } /* Reduce done count in all channels */ for (MixerChannel * chan=mixer.channels;chan;chan=chan->next) { @@ -526,7 +537,7 @@ static void SDLCALL MIXER_CallBack(void * userdata, Uint8 *stream, int len) { // Reset mixer.tick_add when irqs are important if( Mixer_irq_important() ) - mixer.tick_add=(mixer.freq<< TICK_SHIFT)/1000; + mixer.tick_add = calc_tickadd(mixer.freq); mixer.done -= reduce; mixer.needed -= reduce; @@ -683,19 +694,19 @@ void MIXER_Init(Section* sec) { mixer.tick_counter=0; if (mixer.nosound) { LOG_MSG("MIXER: No Sound Mode Selected."); - mixer.tick_add=((mixer.freq) << TICK_SHIFT)/1000; + mixer.tick_add=calc_tickadd(mixer.freq); TIMER_AddTickHandler(MIXER_Mix_NoSound); } else if (SDL_OpenAudio(&spec, &obtained) <0 ) { mixer.nosound = true; LOG_MSG("MIXER: Can't open audio: %s , running in nosound mode.",SDL_GetError()); - mixer.tick_add=((mixer.freq) << TICK_SHIFT)/1000; + mixer.tick_add=calc_tickadd(mixer.freq); TIMER_AddTickHandler(MIXER_Mix_NoSound); } else { if((mixer.freq != obtained.freq) || (mixer.blocksize != obtained.samples)) LOG_MSG("MIXER: Got different values from SDL: freq %d, blocksize %d",obtained.freq,obtained.samples); mixer.freq=obtained.freq; mixer.blocksize=obtained.samples; - mixer.tick_add=(mixer.freq << TICK_SHIFT)/1000; + mixer.tick_add=calc_tickadd(mixer.freq); TIMER_AddTickHandler(MIXER_Mix); SDL_PauseAudio(0); }