From 4c7da8861891fca35dab5be3c2a21252d09574e9 Mon Sep 17 00:00:00 2001 From: Jens Arnold Date: Sat, 18 Jun 2005 01:25:47 +0000 Subject: 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 --- firmware/drivers/uda1380.c | 22 ++-------------- firmware/export/pcm_playback.h | 1 - firmware/export/uda1380.h | 3 +-- firmware/pcm_playback.c | 14 ---------- firmware/sound.c | 58 ++++++++++++++++++++++++++++++++++++------ 5 files changed, 53 insertions(+), 45 deletions(-) (limited to 'firmware') 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; -- cgit v1.2.3