diff options
author | Jens Arnold <amiconn@rockbox.org> | 2005-06-18 01:25:47 +0000 |
---|---|---|
committer | Jens Arnold <amiconn@rockbox.org> | 2005-06-18 01:25:47 +0000 |
commit | 4c7da8861891fca35dab5be3c2a21252d09574e9 (patch) | |
tree | d0b480e414e1cac9be36309734b07f8beca4b269 /firmware | |
parent | 22c15b78c834e1c4bff373a39d02c15bb6664c7c (diff) | |
download | rockbox-4c7da8861891fca35dab5be3c2a21252d09574e9.tar.gz rockbox-4c7da8861891fca35dab5be3c2a21252d09574e9.zip |
Iriver UDA1380 volume and balance handling is now done in sound.c, similar to archos player; removed pcm_set_volume(). Implemented a dB-linear scale. Sorted & bumped plugin api. Removed audio test from the debug menu.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@6741 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware')
-rw-r--r-- | firmware/drivers/uda1380.c | 22 | ||||
-rw-r--r-- | firmware/export/pcm_playback.h | 1 | ||||
-rw-r--r-- | firmware/export/uda1380.h | 3 | ||||
-rw-r--r-- | firmware/pcm_playback.c | 14 | ||||
-rw-r--r-- | firmware/sound.c | 58 |
5 files changed, 53 insertions, 45 deletions
diff --git a/firmware/drivers/uda1380.c b/firmware/drivers/uda1380.c index 7170b707e4..23d917f8ae 100644 --- a/firmware/drivers/uda1380.c +++ b/firmware/drivers/uda1380.c | |||
@@ -85,33 +85,15 @@ int uda1380_write_reg(unsigned char reg, unsigned short value) | |||
85 | } | 85 | } |
86 | 86 | ||
87 | /** | 87 | /** |
88 | * Sets the master volume | 88 | * Sets left and right master volume (0(max) to 252(muted)) |
89 | * | ||
90 | * \param vol Range [0..255] 0=max, 255=mute | ||
91 | * | ||
92 | */ | 89 | */ |
93 | int uda1380_setvol(int vol) | 90 | int uda1380_setvol(int vol_l, int vol_r) |
94 | { | 91 | { |
95 | int vol_l, vol_r; | ||
96 | |||
97 | uda1380_volume = vol; | ||
98 | /* Simple linear volume crossfade curves */ | ||
99 | vol_l = MAX(uda1380_balance*(255 - vol)/100 + vol, vol); | ||
100 | vol_r = MAX(-uda1380_balance*(255 - vol)/100 + vol, vol); | ||
101 | return uda1380_write_reg(REG_MASTER_VOL, | 92 | return uda1380_write_reg(REG_MASTER_VOL, |
102 | MASTER_VOL_LEFT(vol_l) | MASTER_VOL_RIGHT(vol_r)); | 93 | MASTER_VOL_LEFT(vol_l) | MASTER_VOL_RIGHT(vol_r)); |
103 | } | 94 | } |
104 | 95 | ||
105 | /** | 96 | /** |
106 | * Sets stereo balance | ||
107 | */ | ||
108 | void uda1380_set_balance(int bal) | ||
109 | { | ||
110 | uda1380_balance = bal; | ||
111 | uda1380_setvol(uda1380_volume); | ||
112 | } | ||
113 | |||
114 | /** | ||
115 | * Sets the bass value (0-15) | 97 | * Sets the bass value (0-15) |
116 | */ | 98 | */ |
117 | void uda1380_set_bass(int value) | 99 | void uda1380_set_bass(int value) |
diff --git a/firmware/export/pcm_playback.h b/firmware/export/pcm_playback.h index c78936a3f2..874ed6ac6c 100644 --- a/firmware/export/pcm_playback.h +++ b/firmware/export/pcm_playback.h | |||
@@ -31,7 +31,6 @@ void pcm_play_data(const unsigned char* start, int size, | |||
31 | void pcm_play_stop(void); | 31 | void pcm_play_stop(void); |
32 | void pcm_play_pause(bool play); | 32 | void pcm_play_pause(bool play); |
33 | bool pcm_is_playing(void); | 33 | bool pcm_is_playing(void); |
34 | void pcm_set_volume(int volume); | ||
35 | 34 | ||
36 | /* These functions are for playing chained buffers of PCM data */ | 35 | /* These functions are for playing chained buffers of PCM data */ |
37 | void pcm_play_init(void); | 36 | void pcm_play_init(void); |
diff --git a/firmware/export/uda1380.h b/firmware/export/uda1380.h index b09d271808..503b59d102 100644 --- a/firmware/export/uda1380.h +++ b/firmware/export/uda1380.h | |||
@@ -22,8 +22,7 @@ | |||
22 | 22 | ||
23 | extern int uda1380_init(void); | 23 | extern int uda1380_init(void); |
24 | extern void uda1380_enable_output(bool enable); | 24 | extern void uda1380_enable_output(bool enable); |
25 | extern int uda1380_setvol(int vol); | 25 | extern int uda1380_setvol(int vol_l, int vol_r); |
26 | extern void uda1380_set_balance(int bal); | ||
27 | extern void uda1380_set_bass(int value); | 26 | extern void uda1380_set_bass(int value); |
28 | extern void uda1380_set_treble(int value); | 27 | extern void uda1380_set_treble(int value); |
29 | extern int uda1380_mute(int mute); | 28 | extern int uda1380_mute(int mute); |
diff --git a/firmware/pcm_playback.c b/firmware/pcm_playback.c index 45e91ac3be..eab6fe1f15 100644 --- a/firmware/pcm_playback.c +++ b/firmware/pcm_playback.c | |||
@@ -123,20 +123,6 @@ static void dma_stop(void) | |||
123 | IIS2CONFIG = 0x800; | 123 | IIS2CONFIG = 0x800; |
124 | } | 124 | } |
125 | 125 | ||
126 | /* set volume of the main channel */ | ||
127 | void pcm_set_volume(int volume) | ||
128 | { | ||
129 | if(volume > 0) | ||
130 | { | ||
131 | uda1380_mute(0); | ||
132 | uda1380_setvol(0xff - volume); | ||
133 | } | ||
134 | else | ||
135 | { | ||
136 | uda1380_mute(1); | ||
137 | } | ||
138 | } | ||
139 | |||
140 | /* sets frequency of input to DAC */ | 126 | /* sets frequency of input to DAC */ |
141 | void pcm_set_frequency(unsigned int frequency) | 127 | void pcm_set_frequency(unsigned int frequency) |
142 | { | 128 | { |
diff --git a/firmware/sound.c b/firmware/sound.c index 7dd1fbf98e..cd6448c754 100644 --- a/firmware/sound.c +++ b/firmware/sound.c | |||
@@ -334,7 +334,7 @@ static int tenthdb2reg(int db) { | |||
334 | return (db + 660) / 15; | 334 | return (db + 660) / 15; |
335 | } | 335 | } |
336 | 336 | ||
337 | void set_prescaled_volume(void) | 337 | static void set_prescaled_volume(void) |
338 | { | 338 | { |
339 | int prescale; | 339 | int prescale; |
340 | int l, r; | 340 | int l, r; |
@@ -367,7 +367,47 @@ void set_prescaled_volume(void) | |||
367 | 367 | ||
368 | dac_volume(tenthdb2reg(l), tenthdb2reg(r), false); | 368 | dac_volume(tenthdb2reg(l), tenthdb2reg(r), false); |
369 | } | 369 | } |
370 | #endif /* MAS3507D */ | 370 | #elif CONFIG_HWCODEC == MASNONE |
371 | #ifdef HAVE_UDA1380 /* iriver H1x0 + H3x0 */ | ||
372 | /* all values in tenth of dB */ | ||
373 | int current_volume = 0; /* -840..0 */ | ||
374 | int current_balance = 0; /* -840..+840 */ | ||
375 | |||
376 | /* convert tenth of dB volume to register value */ | ||
377 | static int tenthdb2reg(int db) { | ||
378 | if (db < -720) /* 1.5 dB steps */ | ||
379 | return (2940 - db) / 15; | ||
380 | else if (db < -660) /* 0.75 dB steps */ | ||
381 | return (1110 - db) * 2 / 15; | ||
382 | else if (db < -520) /* 0.5 dB steps */ | ||
383 | return (520 - db) / 5; | ||
384 | else /* 0.25 dB steps */ | ||
385 | return -db * 2 / 5; | ||
386 | } | ||
387 | |||
388 | static void set_volume(void) | ||
389 | { | ||
390 | int l, r; | ||
391 | |||
392 | l = r = current_volume; | ||
393 | |||
394 | if (current_balance > 0) | ||
395 | { | ||
396 | l -= current_balance; | ||
397 | if (l < -840) | ||
398 | l = -840; | ||
399 | } | ||
400 | if (current_balance < 0) | ||
401 | { | ||
402 | r += current_balance; | ||
403 | if (r < -840) | ||
404 | r = -840; | ||
405 | } | ||
406 | |||
407 | uda1380_setvol(tenthdb2reg(l), tenthdb2reg(r)); | ||
408 | } | ||
409 | #endif | ||
410 | #endif /* MASNONE */ | ||
371 | #endif /* !SIMULATOR */ | 411 | #endif /* !SIMULATOR */ |
372 | 412 | ||
373 | int channel_configuration = SOUND_CHAN_STEREO; | 413 | int channel_configuration = SOUND_CHAN_STEREO; |
@@ -480,7 +520,8 @@ void sound_set(int setting, int value) | |||
480 | current_volume = -780 + (value * 960 / 100); /* tenth of dB */ | 520 | current_volume = -780 + (value * 960 / 100); /* tenth of dB */ |
481 | set_prescaled_volume(); | 521 | set_prescaled_volume(); |
482 | #elif CONFIG_HWCODEC == MASNONE | 522 | #elif CONFIG_HWCODEC == MASNONE |
483 | pcm_set_volume((value*167117) >> 16); | 523 | current_volume = -840 + (value * 840 / 100); /* tenth of dB */ |
524 | set_volume(); | ||
484 | #endif | 525 | #endif |
485 | break; | 526 | break; |
486 | 527 | ||
@@ -492,7 +533,8 @@ void sound_set(int setting, int value) | |||
492 | current_balance = value * 960 / 100; /* tenth of dB */ | 533 | current_balance = value * 960 / 100; /* tenth of dB */ |
493 | set_prescaled_volume(); | 534 | set_prescaled_volume(); |
494 | #elif defined(HAVE_UDA1380) | 535 | #elif defined(HAVE_UDA1380) |
495 | uda1380_set_balance(value); | 536 | current_balance = value * 840 / 100; /* tenth of dB */ |
537 | set_volume(); | ||
496 | #endif | 538 | #endif |
497 | break; | 539 | break; |
498 | 540 | ||
@@ -500,12 +542,12 @@ void sound_set(int setting, int value) | |||
500 | #if (CONFIG_HWCODEC == MAS3587F) || (CONFIG_HWCODEC == MAS3539F) | 542 | #if (CONFIG_HWCODEC == MAS3587F) || (CONFIG_HWCODEC == MAS3539F) |
501 | tmp = ((value * 8) & 0xff) << 8; | 543 | tmp = ((value * 8) & 0xff) << 8; |
502 | mas_codec_writereg(0x14, tmp & 0xff00); | 544 | mas_codec_writereg(0x14, tmp & 0xff00); |
503 | #elif defined(HAVE_UDA1380) | ||
504 | uda1380_set_bass(value >> 1); | ||
505 | #elif CONFIG_HWCODEC == MAS3507D | 545 | #elif CONFIG_HWCODEC == MAS3507D |
506 | mas_writereg(MAS_REG_KBASS, bass_table[value+15]); | 546 | mas_writereg(MAS_REG_KBASS, bass_table[value+15]); |
507 | current_bass = value * 10; | 547 | current_bass = value * 10; |
508 | set_prescaled_volume(); | 548 | set_prescaled_volume(); |
549 | #elif defined(HAVE_UDA1380) | ||
550 | uda1380_set_bass(value >> 1); | ||
509 | #endif | 551 | #endif |
510 | break; | 552 | break; |
511 | 553 | ||
@@ -513,12 +555,12 @@ void sound_set(int setting, int value) | |||
513 | #if (CONFIG_HWCODEC == MAS3587F) || (CONFIG_HWCODEC == MAS3539F) | 555 | #if (CONFIG_HWCODEC == MAS3587F) || (CONFIG_HWCODEC == MAS3539F) |
514 | tmp = ((value * 8) & 0xff) << 8; | 556 | tmp = ((value * 8) & 0xff) << 8; |
515 | mas_codec_writereg(0x15, tmp & 0xff00); | 557 | mas_codec_writereg(0x15, tmp & 0xff00); |
516 | #elif defined(HAVE_UDA1380) | ||
517 | uda1380_set_treble(value >> 1); | ||
518 | #elif CONFIG_HWCODEC == MAS3507D | 558 | #elif CONFIG_HWCODEC == MAS3507D |
519 | mas_writereg(MAS_REG_KTREBLE, treble_table[value+15]); | 559 | mas_writereg(MAS_REG_KTREBLE, treble_table[value+15]); |
520 | current_treble = value * 10; | 560 | current_treble = value * 10; |
521 | set_prescaled_volume(); | 561 | set_prescaled_volume(); |
562 | #elif defined(HAVE_UDA1380) | ||
563 | uda1380_set_treble(value >> 1); | ||
522 | #endif | 564 | #endif |
523 | break; | 565 | break; |
524 | 566 | ||