This patch makes sure the audio timer gets disabled when no voice is active. It adds a variable to track whenever the timer is needed or not to the global audio state. audio_timer_reset() will set that variable. audio_timer() will check that variable and only re-arm the timer when needed. One additional call to audio_timer_reset() has been added to the output voice disable code path.
Signed-off-by: Gerd Hoffmann <kra...@redhat.com> --- audio/audio.c | 6 +++++- audio/audio_int.h | 1 + 2 files changed, 6 insertions(+), 1 deletions(-) diff --git a/audio/audio.c b/audio/audio.c index ade342e..9cf91ae 100644 --- a/audio/audio.c +++ b/audio/audio.c @@ -1101,7 +1101,8 @@ 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); + if (s->need_timer) + qemu_mod_timer (s->ts, qemu_get_clock (vm_clock) + conf.period.ticks); } @@ -1124,9 +1125,11 @@ static void audio_reset_timer (void) AudioState *s = &glob_audio_state; if (audio_is_timer_needed ()) { + s->need_timer = 1; qemu_mod_timer (s->ts, qemu_get_clock (vm_clock) + 1); } else { + s->need_timer = 0; qemu_del_timer (s->ts); } } @@ -1380,6 +1383,7 @@ static void audio_run_out (AudioState *s) sc->sw.active = 0; audio_recalc_and_notify_capture (sc->cap); } + audio_reset_timer (); continue; } diff --git a/audio/audio_int.h b/audio/audio_int.h index d66f2c3..df060a9 100644 --- a/audio/audio_int.h +++ b/audio/audio_int.h @@ -190,6 +190,7 @@ struct AudioState { void *drv_opaque; QEMUTimer *ts; + int need_timer; QLIST_HEAD (card_listhead, QEMUSoundCard) card_head; QLIST_HEAD (hw_in_listhead, HWVoiceIn) hw_head_in; QLIST_HEAD (hw_out_listhead, HWVoiceOut) hw_head_out; -- 1.7.1