diff options
author | Peter D'Hoye <peter.dhoye@gmail.com> | 2006-06-02 19:32:36 +0000 |
---|---|---|
committer | Peter D'Hoye <peter.dhoye@gmail.com> | 2006-06-02 19:32:36 +0000 |
commit | eca4a49a082374a5762428ecf09b54c96858f8f4 (patch) | |
tree | 1a2ca097c9e74f28b80ab41eab2370c28c12debb /firmware/drivers | |
parent | 8e6dd90bd5fb819576d989479b741ae10075089a (diff) | |
download | rockbox-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/drivers')
-rw-r--r-- | firmware/drivers/uda1380.c | 7 |
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) | |||
265 | void uda1380_set_recvol(int left, int right, int type) | 265 | void 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; |