aboutsummaryrefslogtreecommitdiff
path: root/hw/audio
diff options
context:
space:
mode:
authorVolker Rümelin <vr_qemu@t-online.de>2023-09-17 08:58:06 +0200
committerPatchew Applier <no-reply@patchew.org>2023-10-10 12:31:05 +0000
commit00e3b29d065f3b88bb3726afbd5c73f8b2bff1b4 (patch)
tree564996ba978719bd26011ceffdea2ffa54da6a05 /hw/audio
parentcea3ea670fe265421131aad90c36fbb87bc4d206 (diff)
downloadqemu-00e3b29d065f3b88bb3726afbd5c73f8b2bff1b4.zip
qemu-00e3b29d065f3b88bb3726afbd5c73f8b2bff1b4.tar.gz
qemu-00e3b29d065f3b88bb3726afbd5c73f8b2bff1b4.tar.bz2
hw/audio/es1370: reset current sample counter
Reset the current sample counter when writing the Channel Sample Count Register. The Linux ens1370 driver and the AROS sb128 driver expect the current sample counter counts down from sample count to 0 after a write to the Channel Sample Count Register. Currently the current sample counter starts from 0 after a reset or the last count when the counter was stopped. The current sample counter is used to raise an interrupt whenever a complete buffer was transferred. When the counter starts with a value lower than the reload value, the interrupt triggeres before the buffer was completly transferred. This may lead to corrupted audio streams. Tested-by: Rene Engel <ReneEngel80@emailn.de> Signed-off-by: Volker Rümelin <vr_qemu@t-online.de> Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com> Tested-by: BALATON Zoltan <balaton@eik.bme.hu> Message-Id: <20230917065813.6692-1-vr_qemu@t-online.de>
Diffstat (limited to 'hw/audio')
-rw-r--r--hw/audio/es1370.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/hw/audio/es1370.c b/hw/audio/es1370.c
index 90f73d4..0567721 100644
--- a/hw/audio/es1370.c
+++ b/hw/audio/es1370.c
@@ -502,7 +502,7 @@ static void es1370_write(void *opaque, hwaddr addr, uint64_t val, unsigned size)
case ES1370_REG_DAC2_SCOUNT:
case ES1370_REG_ADC_SCOUNT:
d += (addr - ES1370_REG_DAC1_SCOUNT) >> 2;
- d->scount = (val & 0xffff) | (d->scount & ~0xffff);
+ d->scount = (val & 0xffff) << 16 | (val & 0xffff);
ldebug ("chan %td CURR_SAMP_CT %d, SAMP_CT %d\n",
d - &s->chan[0], val >> 16, (val & 0xffff));
break;