audio: Only use audio timer when necessary

Originally proposed by Gerd Hoffmann.

Signed-off-by: malc <av1474@comtv.ru>
Acked-by: Gerd Hoffmann <kraxel@redhat.com>
This commit is contained in:
malc 2010-11-18 14:30:12 +03:00
parent 8ca209ad90
commit 39deb1e496

View File

@ -1096,15 +1096,6 @@ static void audio_pcm_print_info (const char *cap, struct audio_pcm_info *info)
/* /*
* Timer * Timer
*/ */
static void audio_timer (void *opaque)
{
AudioState *s = opaque;
audio_run ("timer");
qemu_mod_timer (s->ts, qemu_get_clock (vm_clock) + conf.period.ticks);
}
static int audio_is_timer_needed (void) static int audio_is_timer_needed (void)
{ {
HWVoiceIn *hwi = NULL; HWVoiceIn *hwi = NULL;
@ -1119,10 +1110,8 @@ static int audio_is_timer_needed (void)
return 0; return 0;
} }
static void audio_reset_timer (void) static void audio_reset_timer (AudioState *s)
{ {
AudioState *s = &glob_audio_state;
if (audio_is_timer_needed ()) { if (audio_is_timer_needed ()) {
qemu_mod_timer (s->ts, qemu_get_clock (vm_clock) + 1); qemu_mod_timer (s->ts, qemu_get_clock (vm_clock) + 1);
} }
@ -1131,6 +1120,12 @@ static void audio_reset_timer (void)
} }
} }
static void audio_timer (void *opaque)
{
audio_run ("timer");
audio_reset_timer (opaque);
}
/* /*
* Public API * Public API
*/ */
@ -1195,7 +1190,7 @@ void AUD_set_active_out (SWVoiceOut *sw, int on)
hw->enabled = 1; hw->enabled = 1;
if (s->vm_running) { if (s->vm_running) {
hw->pcm_ops->ctl_out (hw, VOICE_ENABLE, conf.try_poll_out); hw->pcm_ops->ctl_out (hw, VOICE_ENABLE, conf.try_poll_out);
audio_reset_timer (); audio_reset_timer (s);
} }
} }
} }
@ -1240,6 +1235,7 @@ void AUD_set_active_in (SWVoiceIn *sw, int on)
hw->enabled = 1; hw->enabled = 1;
if (s->vm_running) { if (s->vm_running) {
hw->pcm_ops->ctl_in (hw, VOICE_ENABLE, conf.try_poll_in); hw->pcm_ops->ctl_in (hw, VOICE_ENABLE, conf.try_poll_in);
audio_reset_timer (s);
} }
} }
sw->total_hw_samples_acquired = hw->total_samples_captured; sw->total_hw_samples_acquired = hw->total_samples_captured;
@ -1761,7 +1757,7 @@ static void audio_vm_change_state_handler (void *opaque, int running,
while ((hwi = audio_pcm_hw_find_any_enabled_in (hwi))) { while ((hwi = audio_pcm_hw_find_any_enabled_in (hwi))) {
hwi->pcm_ops->ctl_in (hwi, op, conf.try_poll_in); hwi->pcm_ops->ctl_in (hwi, op, conf.try_poll_in);
} }
audio_reset_timer (); audio_reset_timer (s);
} }
static void audio_atexit (void) static void audio_atexit (void)