audio: use muldiv64 where it makes sense

Signed-off-by: malc <av1474@comtv.ru>
This commit is contained in:
malc 2009-09-18 08:16:03 +04:00
parent 68f6dc7ebd
commit 4f4cc0efde
6 changed files with 12 additions and 9 deletions

View File

@ -1878,7 +1878,8 @@ static void audio_init (void)
} }
conf.period.ticks = 1; conf.period.ticks = 1;
} else { } else {
conf.period.ticks = get_ticks_per_sec() / conf.period.hertz; conf.period.ticks =
muldiv64 (1, get_ticks_per_sec (), conf.period.hertz);
} }
e = qemu_add_vm_change_state_handler (audio_vm_change_state_handler, s); e = qemu_add_vm_change_state_handler (audio_vm_change_state_handler, s);

View File

@ -556,7 +556,7 @@ uint64_t glue (AUD_get_elapsed_usec_, TYPE) (SW *sw, QEMUAudioTimeStamp *ts)
return 0; return 0;
} }
return (delta * sw->hw->info.freq) / 1000000; return muldiv64 (delta, sw->hw->info.freq, 1000000);
} }
#undef TYPE #undef TYPE

View File

@ -53,7 +53,7 @@ static int no_run_out (HWVoiceOut *hw)
now = qemu_get_clock (vm_clock); now = qemu_get_clock (vm_clock);
ticks = now - no->old_ticks; ticks = now - no->old_ticks;
bytes = (ticks * hw->info.bytes_per_second) / get_ticks_per_sec(); bytes = muldiv64 (ticks, hw->info.bytes_per_second, get_ticks_per_sec ());
bytes = audio_MIN (bytes, INT_MAX); bytes = audio_MIN (bytes, INT_MAX);
samples = bytes >> hw->info.shift; samples = bytes >> hw->info.shift;
@ -109,7 +109,8 @@ static int no_run_in (HWVoiceIn *hw)
if (dead) { if (dead) {
int64_t now = qemu_get_clock (vm_clock); int64_t now = qemu_get_clock (vm_clock);
int64_t ticks = now - no->old_ticks; int64_t ticks = now - no->old_ticks;
int64_t bytes = (ticks * hw->info.bytes_per_second) / get_ticks_per_sec(); int64_t bytes =
muldiv64 (ticks, hw->info.bytes_per_second, get_ticks_per_sec ());
no->old_ticks = now; no->old_ticks = now;
bytes = audio_MIN (bytes, INT_MAX); bytes = audio_MIN (bytes, INT_MAX);

View File

@ -54,7 +54,8 @@ static int wav_run_out (HWVoiceOut *hw)
struct st_sample *src; struct st_sample *src;
int64_t now = qemu_get_clock (vm_clock); int64_t now = qemu_get_clock (vm_clock);
int64_t ticks = now - wav->old_ticks; int64_t ticks = now - wav->old_ticks;
int64_t bytes = (ticks * hw->info.bytes_per_second) / get_ticks_per_sec(); int64_t bytes =
muldiv64 (ticks, hw->info.bytes_per_second, get_ticks_per_sec ());
if (bytes > INT_MAX) { if (bytes > INT_MAX) {
samples = INT_MAX >> hw->info.shift; samples = INT_MAX >> hw->info.shift;

View File

@ -156,8 +156,8 @@ static void GUS_callback (void *opaque, int free)
} }
s->left = samples; s->left = samples;
reset: reset:
gus_irqgen (&s->emu, (double) (net * 1000000) / s->freq); gus_irqgen (&s->emu, muldiv64 (net, 1000000, s->freq));
} }
int GUS_irqrequest (GUSEmuState *emu, int hwirq, int n) int GUS_irqrequest (GUSEmuState *emu, int hwirq, int n)

View File

@ -758,8 +758,8 @@ static void complete (SB16State *s)
freq = s->freq > 0 ? s->freq : 11025; freq = s->freq > 0 ? s->freq : 11025;
samples = dsp_get_lohi (s) + 1; samples = dsp_get_lohi (s) + 1;
bytes = samples << s->fmt_stereo << (s->fmt_bits == 16); bytes = samples << s->fmt_stereo << (s->fmt_bits == 16);
ticks = (bytes * get_ticks_per_sec()) / freq; ticks = muldiv64 (bytes, get_ticks_per_sec (), freq);
if (ticks < get_ticks_per_sec() / 1024) { if (ticks < get_ticks_per_sec () / 1024) {
qemu_irq_raise (s->pic); qemu_irq_raise (s->pic);
} }
else { else {