summaryrefslogtreecommitdiff
path: root/firmware
diff options
context:
space:
mode:
authorPeter D'Hoye <peter.dhoye@gmail.com>2006-06-02 19:32:36 +0000
committerPeter D'Hoye <peter.dhoye@gmail.com>2006-06-02 19:32:36 +0000
commiteca4a49a082374a5762428ecf09b54c96858f8f4 (patch)
tree1a2ca097c9e74f28b80ab41eab2370c28c12debb /firmware
parent8e6dd90bd5fb819576d989479b741ae10075089a (diff)
downloadrockbox-eca4a49a082374a5762428ecf09b54c96858f8f4.tar.gz
rockbox-eca4a49a082374a5762428ecf09b54c96858f8f4.zip
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
Diffstat (limited to 'firmware')
-rw-r--r--firmware/drivers/uda1380.c7
1 files changed, 7 insertions, 0 deletions
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)
265void uda1380_set_recvol(int left, int right, int type) 265void uda1380_set_recvol(int left, int right, int type)
266{ 266{
267 int left_ag, right_ag; 267 int left_ag, right_ag;
268 int old_irq_level;
268 269
269 switch (type) 270 switch (type)
270 { 271 {
271 case AUDIO_GAIN_MIC: 272 case AUDIO_GAIN_MIC:
272 left_ag = MIN(MAX(0, left / 4), 15); 273 left_ag = MIN(MAX(0, left / 4), 15);
273 left -= left_ag * 4; 274 left -= left_ag * 4;
275 /* allow nothing in between the two calls */
276 old_irq_level = set_irq_level(HIGHEST_IRQ_LEVEL);
274 uda1380_write_reg(REG_ADC, (uda1380_regs[REG_ADC] & ~VGA_GAIN_MASK) 277 uda1380_write_reg(REG_ADC, (uda1380_regs[REG_ADC] & ~VGA_GAIN_MASK)
275 | VGA_GAIN(left_ag)); 278 | VGA_GAIN(left_ag));
276 uda1380_write_reg(REG_DEC_VOL, DEC_VOLL(left) | DEC_VOLR(left)); 279 uda1380_write_reg(REG_DEC_VOL, DEC_VOLL(left) | DEC_VOLR(left));
280 set_irq_level(old_irq_level);
277 logf("Mic: %dA/%dD", left_ag, left); 281 logf("Mic: %dA/%dD", left_ag, left);
278 break; 282 break;
279 283
@@ -282,9 +286,12 @@ void uda1380_set_recvol(int left, int right, int type)
282 left -= left_ag * 6; 286 left -= left_ag * 6;
283 right_ag = MIN(MAX(0, right / 6), 8); 287 right_ag = MIN(MAX(0, right / 6), 8);
284 right -= right_ag * 6; 288 right -= right_ag * 6;
289 /* allow nothing in between the two calls */
290 old_irq_level = set_irq_level(HIGHEST_IRQ_LEVEL);
285 uda1380_write_reg(REG_PGA, (uda1380_regs[REG_PGA] & ~PGA_GAIN_MASK) 291 uda1380_write_reg(REG_PGA, (uda1380_regs[REG_PGA] & ~PGA_GAIN_MASK)
286 | PGA_GAINL(left_ag) | PGA_GAINR(right_ag)); 292 | PGA_GAINL(left_ag) | PGA_GAINR(right_ag));
287 uda1380_write_reg(REG_DEC_VOL, DEC_VOLL(left) | DEC_VOLR(right)); 293 uda1380_write_reg(REG_DEC_VOL, DEC_VOLL(left) | DEC_VOLR(right));
294 set_irq_level(old_irq_level);
288 logf("Line L: %dA/%dD", left_ag, left); 295 logf("Line L: %dA/%dD", left_ag, left);
289 logf("Line R: %dA/%dD", right_ag, right); 296 logf("Line R: %dA/%dD", right_ag, right);
290 break; 297 break;