From eca4a49a082374a5762428ecf09b54c96858f8f4 Mon Sep 17 00:00:00 2001 From: Peter D'Hoye Date: Fri, 2 Jun 2006 19:32:36 +0000 Subject: Do not allow interrupts between the two calls that set the recording gain. Fixes volume glitches when changing recording gain. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@10031 a1c6a512-1295-4272-9138-f99709370657 --- firmware/drivers/uda1380.c | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'firmware') diff --git a/firmware/drivers/uda1380.c b/firmware/drivers/uda1380.c index 5a0ecf08ca..322078a5f5 100644 --- a/firmware/drivers/uda1380.c +++ b/firmware/drivers/uda1380.c @@ -265,15 +265,19 @@ void uda1380_disable_recording(void) void uda1380_set_recvol(int left, int right, int type) { int left_ag, right_ag; + int old_irq_level; switch (type) { case AUDIO_GAIN_MIC: left_ag = MIN(MAX(0, left / 4), 15); left -= left_ag * 4; + /* allow nothing in between the two calls */ + old_irq_level = set_irq_level(HIGHEST_IRQ_LEVEL); uda1380_write_reg(REG_ADC, (uda1380_regs[REG_ADC] & ~VGA_GAIN_MASK) | VGA_GAIN(left_ag)); uda1380_write_reg(REG_DEC_VOL, DEC_VOLL(left) | DEC_VOLR(left)); + set_irq_level(old_irq_level); logf("Mic: %dA/%dD", left_ag, left); break; @@ -282,9 +286,12 @@ void uda1380_set_recvol(int left, int right, int type) left -= left_ag * 6; right_ag = MIN(MAX(0, right / 6), 8); right -= right_ag * 6; + /* allow nothing in between the two calls */ + old_irq_level = set_irq_level(HIGHEST_IRQ_LEVEL); uda1380_write_reg(REG_PGA, (uda1380_regs[REG_PGA] & ~PGA_GAIN_MASK) | PGA_GAINL(left_ag) | PGA_GAINR(right_ag)); uda1380_write_reg(REG_DEC_VOL, DEC_VOLL(left) | DEC_VOLR(right)); + set_irq_level(old_irq_level); logf("Line L: %dA/%dD", left_ag, left); logf("Line R: %dA/%dD", right_ag, right); break; -- cgit