summaryrefslogtreecommitdiffstats
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)
}
/**
- * Sets the master volume
- *
- * \param vol Range [0..255] 0=max, 255=mute
- *
+ * Sets left and right master volume (0(max) to 252(muted))
*/
-int uda1380_setvol(int vol)
+int uda1380_setvol(int vol_l, int vol_r)
{
- int vol_l, vol_r;
-
- uda1380_volume = vol;
- /* Simple linear volume crossfade curves */
- vol_l = MAX(uda1380_balance*(255 - vol)/100 + vol, vol);
- vol_r = MAX(-uda1380_balance*(255 - vol)/100 + vol, vol);
return uda1380_write_reg(REG_MASTER_VOL,
MASTER_VOL_LEFT(vol_l) | MASTER_VOL_RIGHT(vol_r));
}
/**
- * Sets stereo balance
- */
-void uda1380_set_balance(int bal)
-{
- uda1380_balance = bal;
- uda1380_setvol(uda1380_volume);
-}
-
-/**
* Sets the bass value (0-15)
*/
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,
void pcm_play_stop(void);
void pcm_play_pause(bool play);
bool pcm_is_playing(void);
-void pcm_set_volume(int volume);
/* These functions are for playing chained buffers of PCM data */
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 @@
extern int uda1380_init(void);
extern void uda1380_enable_output(bool enable);
-extern int uda1380_setvol(int vol);
-extern void uda1380_set_balance(int bal);
+extern int uda1380_setvol(int vol_l, int vol_r);
extern void uda1380_set_bass(int value);
extern void uda1380_set_treble(int value);
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)
IIS2CONFIG = 0x800;
}
-/* set volume of the main channel */
-void pcm_set_volume(int volume)
-{
- if(volume > 0)
- {
- uda1380_mute(0);
- uda1380_setvol(0xff - volume);
- }
- else
- {
- uda1380_mute(1);
- }
-}
-
/* sets frequency of input to DAC */
void pcm_set_frequency(unsigned int frequency)
{
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) {
return (db + 660) / 15;
}
-void set_prescaled_volume(void)
+static void set_prescaled_volume(void)
{
int prescale;
int l, r;
@@ -367,7 +367,47 @@ void set_prescaled_volume(void)
dac_volume(tenthdb2reg(l), tenthdb2reg(r), false);
}
-#endif /* MAS3507D */
+#elif CONFIG_HWCODEC == MASNONE
+#ifdef HAVE_UDA1380 /* iriver H1x0 + H3x0 */
+/* all values in tenth of dB */
+int current_volume = 0; /* -840..0 */
+int current_balance = 0; /* -840..+840 */
+
+/* convert tenth of dB volume to register value */
+static int tenthdb2reg(int db) {
+ if (db < -720) /* 1.5 dB steps */
+ return (2940 - db) / 15;
+ else if (db < -660) /* 0.75 dB steps */
+ return (1110 - db) * 2 / 15;
+ else if (db < -520) /* 0.5 dB steps */
+ return (520 - db) / 5;
+ else /* 0.25 dB steps */
+ return -db * 2 / 5;
+}
+
+static void set_volume(void)
+{
+ int l, r;
+
+ l = r = current_volume;
+
+ if (current_balance > 0)
+ {
+ l -= current_balance;
+ if (l < -840)
+ l = -840;
+ }
+ if (current_balance < 0)
+ {
+ r += current_balance;
+ if (r < -840)
+ r = -840;
+ }
+
+ uda1380_setvol(tenthdb2reg(l), tenthdb2reg(r));
+}
+#endif
+#endif /* MASNONE */
#endif /* !SIMULATOR */
int channel_configuration = SOUND_CHAN_STEREO;
@@ -480,7 +520,8 @@ void sound_set(int setting, int value)
current_volume = -780 + (value * 960 / 100); /* tenth of dB */
set_prescaled_volume();
#elif CONFIG_HWCODEC == MASNONE
- pcm_set_volume((value*167117) >> 16);
+ current_volume = -840 + (value * 840 / 100); /* tenth of dB */
+ set_volume();
#endif
break;
@@ -492,7 +533,8 @@ void sound_set(int setting, int value)
current_balance = value * 960 / 100; /* tenth of dB */
set_prescaled_volume();
#elif defined(HAVE_UDA1380)
- uda1380_set_balance(value);
+ current_balance = value * 840 / 100; /* tenth of dB */
+ set_volume();
#endif
break;
@@ -500,12 +542,12 @@ void sound_set(int setting, int value)
#if (CONFIG_HWCODEC == MAS3587F) || (CONFIG_HWCODEC == MAS3539F)
tmp = ((value * 8) & 0xff) << 8;
mas_codec_writereg(0x14, tmp & 0xff00);
-#elif defined(HAVE_UDA1380)
- uda1380_set_bass(value >> 1);
#elif CONFIG_HWCODEC == MAS3507D
mas_writereg(MAS_REG_KBASS, bass_table[value+15]);
current_bass = value * 10;
set_prescaled_volume();
+#elif defined(HAVE_UDA1380)
+ uda1380_set_bass(value >> 1);
#endif
break;
@@ -513,12 +555,12 @@ void sound_set(int setting, int value)
#if (CONFIG_HWCODEC == MAS3587F) || (CONFIG_HWCODEC == MAS3539F)
tmp = ((value * 8) & 0xff) << 8;
mas_codec_writereg(0x15, tmp & 0xff00);
-#elif defined(HAVE_UDA1380)
- uda1380_set_treble(value >> 1);
#elif CONFIG_HWCODEC == MAS3507D
mas_writereg(MAS_REG_KTREBLE, treble_table[value+15]);
current_treble = value * 10;
set_prescaled_volume();
+#elif defined(HAVE_UDA1380)
+ uda1380_set_treble(value >> 1);
#endif
break;