From 842c4eda7f6b7244414f425504281e797ac877ef Mon Sep 17 00:00:00 2001 From: Arne Welzel Date: Thu, 15 Nov 2012 12:05:51 +0100 Subject: [PATCH] libaudiodriver: handle interrupt only once Apparently, qemu's sb16 doesn't reset the interrupt register of the mixer and the driver ends up in an endless loop when playing a "multi-fragment" sample. Change-Id: I47633b99a0d79ba201aec785da69fb3950e026bf --- lib/libaudiodriver/audio_fw.c | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/lib/libaudiodriver/audio_fw.c b/lib/libaudiodriver/audio_fw.c index 58ce03a4f..34ae2f5e8 100644 --- a/lib/libaudiodriver/audio_fw.c +++ b/lib/libaudiodriver/audio_fw.c @@ -607,16 +607,13 @@ static void msg_hardware(void) { u32_t i; - /* while we have an interrupt */ - while ( drv_int_sum()) { - /* loop over all sub devices */ - for ( i = 0; i < drv.NrOfSubDevices; i++) { - /* if interrupt from sub device and Dma transfer - was actually busy, take care of business */ - if( drv_int(i) && sub_dev[i].DmaBusy ) { - if (sub_dev[i].DmaMode == DEV_WRITE_S) handle_int_write(i); - if (sub_dev[i].DmaMode == DEV_READ_S) handle_int_read(i); - } + /* loop over all sub devices */ + for ( i = 0; i < drv.NrOfSubDevices; i++) { + /* if interrupt from sub device and Dma transfer + was actually busy, take care of business */ + if( drv_int(i) && sub_dev[i].DmaBusy ) { + if (sub_dev[i].DmaMode == DEV_WRITE_S) handle_int_write(i); + if (sub_dev[i].DmaMode == DEV_READ_S) handle_int_read(i); } }