summaryrefslogtreecommitdiff
path: root/firmware
diff options
context:
space:
mode:
authorJens Arnold <amiconn@rockbox.org>2005-06-18 01:25:47 +0000
committerJens Arnold <amiconn@rockbox.org>2005-06-18 01:25:47 +0000
commit4c7da8861891fca35dab5be3c2a21252d09574e9 (patch)
treed0b480e414e1cac9be36309734b07f8beca4b269 /firmware
parent22c15b78c834e1c4bff373a39d02c15bb6664c7c (diff)
downloadrockbox-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.c22
-rw-r--r--firmware/export/pcm_playback.h1
-rw-r--r--firmware/export/uda1380.h3
-rw-r--r--firmware/pcm_playback.c14
-rw-r--r--firmware/sound.c58
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 */
93int uda1380_setvol(int vol) 90int 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 */
108void 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 */
117void uda1380_set_bass(int value) 99void 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,
31void pcm_play_stop(void); 31void pcm_play_stop(void);
32void pcm_play_pause(bool play); 32void pcm_play_pause(bool play);
33bool pcm_is_playing(void); 33bool pcm_is_playing(void);
34void 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 */
37void pcm_play_init(void); 36void 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
23extern int uda1380_init(void); 23extern int uda1380_init(void);
24extern void uda1380_enable_output(bool enable); 24extern void uda1380_enable_output(bool enable);
25extern int uda1380_setvol(int vol); 25extern int uda1380_setvol(int vol_l, int vol_r);
26extern void uda1380_set_balance(int bal);
27extern void uda1380_set_bass(int value); 26extern void uda1380_set_bass(int value);
28extern void uda1380_set_treble(int value); 27extern void uda1380_set_treble(int value);
29extern int uda1380_mute(int mute); 28extern 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 */
127void 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 */
141void pcm_set_frequency(unsigned int frequency) 127void 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
337void set_prescaled_volume(void) 337static 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 */
373int current_volume = 0; /* -840..0 */
374int current_balance = 0; /* -840..+840 */
375
376/* convert tenth of dB volume to register value */
377static 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
388static 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
373int channel_configuration = SOUND_CHAN_STEREO; 413int 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