Signed-off-by: Gerd Hoffmann <address@hidden>
---
hw/audio/hda-codec.c | 22 ++++++++++++++++++++++
hw/audio/trace-events | 2 ++
2 files changed, 24 insertions(+)
diff --git a/hw/audio/hda-codec.c b/hw/audio/hda-codec.c
index f6fb1d0fa0..623021b7c7 100644
--- a/hw/audio/hda-codec.c
+++ b/hw/audio/hda-codec.c
@@ -261,6 +261,13 @@ static void hda_audio_input_cb(void *opaque, int avail)
int64_t to_transfer = audio_MIN(B_SIZE - (wpos - rpos), avail);
+ if (to_transfer == 0) {
+ /* reset timer adjust */
+ st->buft_start = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL);
+ trace_hda_audio_underrun(st->node->name);
+ return;
+ }
+
hda_timer_sync_adjust(st, -((wpos - rpos) + to_transfer - (B_SIZE >> 1)));
while (to_transfer) {
@@ -325,6 +332,21 @@ static void hda_audio_output_cb(void *opaque, int avail)
int64_t to_transfer = audio_MIN(wpos - rpos, avail);
+ if (to_transfer == 0) {
+ /* reset timer adjust */
+ st->buft_start = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL);
+ trace_hda_audio_underrun(st->node->name);
+ return;
+ }