/* * NAME: timer->add() * DESCRIPTION: add one timer to another */ void mad_timer_add(mad_timer_t *timer, mad_timer_t incr) { timer->seconds += incr.seconds; timer->fraction += incr.fraction; if (timer->fraction >= MAD_TIMER_RESOLUTION) reduce_timer(timer); }
/* * NAME: timer->set() * DESCRIPTION: set timer to specific (positive) value */ void mad_timer_set(mad_timer_t *timer, u32 seconds, u32 numer, u32 denom) { timer->seconds = seconds; if (numer >= denom && denom > 0) { timer->seconds += numer / denom; numer %= denom; } switch (denom) { case 0: case 1: timer->fraction = 0; break; case MAD_TIMER_RESOLUTION: timer->fraction = numer; break; case 1000: timer->fraction = numer * (MAD_TIMER_RESOLUTION / 1000); break; case 8000: timer->fraction = numer * (MAD_TIMER_RESOLUTION / 8000); break; case 11025: timer->fraction = numer * (MAD_TIMER_RESOLUTION / 11025); break; case 12000: timer->fraction = numer * (MAD_TIMER_RESOLUTION / 12000); break; case 16000: timer->fraction = numer * (MAD_TIMER_RESOLUTION / 16000); break; case 22050: timer->fraction = numer * (MAD_TIMER_RESOLUTION / 22050); break; case 24000: timer->fraction = numer * (MAD_TIMER_RESOLUTION / 24000); break; case 32000: timer->fraction = numer * (MAD_TIMER_RESOLUTION / 32000); break; case 44100: timer->fraction = numer * (MAD_TIMER_RESOLUTION / 44100); break; case 48000: timer->fraction = numer * (MAD_TIMER_RESOLUTION / 48000); break; default: timer->fraction = scale_rational(numer, denom, MAD_TIMER_RESOLUTION); break; } if (timer->fraction >= MAD_TIMER_RESOLUTION) reduce_timer(timer); }
/* * NAME: timer->set() * DESCRIPTION: set timer to specific value */ void mad_timer_set(mad_timer_t *timer, unsigned long seconds, unsigned long fraction, unsigned long fracparts) { timer->seconds = seconds; if (fraction == 0) fracparts = 0; else if (fracparts == 0) { fracparts = fraction; fraction = 1; } switch (fracparts) { case 0: timer->fraction = 0; break; case MAD_TIMER_RESOLUTION: timer->fraction = fraction; break; case 8000: timer->fraction = fraction * (MAD_TIMER_RESOLUTION / 8000); break; case 11025: timer->fraction = fraction * (MAD_TIMER_RESOLUTION / 11025); break; case 12000: timer->fraction = fraction * (MAD_TIMER_RESOLUTION / 12000); break; case 16000: timer->fraction = fraction * (MAD_TIMER_RESOLUTION / 16000); break; case 22050: timer->fraction = fraction * (MAD_TIMER_RESOLUTION / 22050); break; case 24000: timer->fraction = fraction * (MAD_TIMER_RESOLUTION / 24000); break; case 32000: timer->fraction = fraction * (MAD_TIMER_RESOLUTION / 32000); break; case 44100: timer->fraction = fraction * (MAD_TIMER_RESOLUTION / 44100); break; case 48000: timer->fraction = fraction * (MAD_TIMER_RESOLUTION / 48000); break; default: timer->fraction = scale_rational(fraction, fracparts, MAD_TIMER_RESOLUTION); break; } if (timer->fraction >= MAD_TIMER_RESOLUTION) reduce_timer(timer); }