From 667fb7c6e94060294dd1a9f95934b841f7df9f71 Mon Sep 17 00:00:00 2001 From: Linus Nielsen Feltzing Date: Fri, 28 Jun 2002 11:48:53 +0000 Subject: First step towards a better sound setting API git-svn-id: svn://svn.rockbox.org/rockbox/trunk@1243 a1c6a512-1295-4272-9138-f99709370657 --- apps/settings.h | 6 +-- apps/sound_menu.c | 66 +++++++++++++++++++++++++++++-- apps/wps.c | 16 ++++---- firmware/mpeg.c | 115 ++++++++++++++++++++++++++++++++++++++++++------------ firmware/mpeg.h | 22 +++++++++-- 5 files changed, 182 insertions(+), 43 deletions(-) diff --git a/apps/settings.h b/apps/settings.h index d3b891c790..5f67b3b1bc 100644 --- a/apps/settings.h +++ b/apps/settings.h @@ -84,10 +84,10 @@ extern struct user_settings global_settings; /* system defines */ -#define DEFAULT_VOLUME_SETTING 70 +#define DEFAULT_VOLUME_SETTING 70/2 #define DEFAULT_BALANCE_SETTING 50 -#define DEFAULT_BASS_SETTING 50 -#define DEFAULT_TREBLE_SETTING 50 +#define DEFAULT_BASS_SETTING 50/2 +#define DEFAULT_TREBLE_SETTING 50/2 #define DEFAULT_LOUDNESS_SETTING 0 #define DEFAULT_BASS_BOOST_SETTING 0 #define DEFAULT_CONTRAST_SETTING 0 diff --git a/apps/sound_menu.c b/apps/sound_menu.c index 183c3439a3..50ba26582d 100644 --- a/apps/sound_menu.c +++ b/apps/sound_menu.c @@ -19,23 +19,83 @@ #include "config.h" #include #include +#include "lcd.h" #include "menu.h" +#include "button.h" #include "mpeg.h" #include "settings.h" +void set_sound(char* string, + int* variable, + int setting) +{ + bool done = false; + int min, max; + int val; + char* unit; + char str[32]; + + unit = mpeg_sound_unit(setting); + min = mpeg_sound_min(setting); + max = mpeg_sound_max(setting); + + lcd_clear_display(); + lcd_puts_scroll(0,0,string); + + while (!done) { + val = mpeg_val2phys(setting, *variable); + snprintf(str,sizeof str,"%d %s ", val, unit); + lcd_puts(0,1,str); + lcd_update(); + + switch( button_get(true) ) { +#ifdef HAVE_RECORDER_KEYPAD + case BUTTON_UP: +#else + case BUTTON_RIGHT: +#endif + (*variable)++; + if(*variable > max ) + *variable = max; + break; + +#ifdef HAVE_RECORDER_KEYPAD + case BUTTON_DOWN: +#else + case BUTTON_LEFT: +#endif + (*variable)--; + if(*variable < min ) + *variable = min; + break; + +#ifdef HAVE_RECORDER_KEYPAD + case BUTTON_LEFT: +#else + case BUTTON_STOP: + case BUTTON_MENU: +#endif + done = true; + break; + } + mpeg_sound_set(setting, *variable); + } + lcd_stop_scroll(); +} + static void volume(void) { - set_int("Volume","%", &global_settings.volume, mpeg_volume, 2, 0, 100); + set_sound("Volume", &global_settings.volume, SOUND_VOLUME); } static void bass(void) { - set_int("Bass","%", &global_settings.bass, mpeg_bass, 2, 0, 100); + set_sound("Bass", &global_settings.bass, SOUND_BASS); }; static void treble(void) { - set_int("Treble","%", &global_settings.treble, mpeg_treble, 2, 0, 100); + set_sound("Treble", &global_settings.treble, SOUND_TREBLE); } void sound_menu(void) diff --git a/apps/wps.c b/apps/wps.c index 51add88872..2779af7a5d 100644 --- a/apps/wps.c +++ b/apps/wps.c @@ -176,17 +176,17 @@ void wps_show(void) #ifdef HAVE_RECORDER_KEYPAD case BUTTON_UP: - global_settings.volume += 2; - if(global_settings.volume > 100) - global_settings.volume = 100; - mpeg_volume(global_settings.volume); + global_settings.volume++; + if(global_settings.volume > mpeg_sound_max(SOUND_VOLUME)) + global_settings.volume = mpeg_sound_max(SOUND_VOLUME); + mpeg_sound_set(SOUND_VOLUME, global_settings.volume); break; case BUTTON_DOWN: - global_settings.volume -= 2; - if(global_settings.volume < 0) - global_settings.volume = 0; - mpeg_volume(global_settings.volume); + global_settings.volume--; + if(global_settings.volume < mpeg_sound_min(SOUND_VOLUME)) + global_settings.volume = mpeg_sound_min(SOUND_VOLUME); + mpeg_sound_set(SOUND_VOLUME, global_settings.volume); break; #endif diff --git a/firmware/mpeg.c b/firmware/mpeg.c index ab99fa744c..a421e5da82 100644 --- a/firmware/mpeg.c +++ b/firmware/mpeg.c @@ -27,6 +27,7 @@ #include "thread.h" #include "panic.h" #include "file.h" +#include "mpeg.h" #include "id3.h" #define MPEG_STACK_SIZE 0x2000 @@ -44,6 +45,42 @@ extern char* peek_next_track(int type); extern char* peek_prev_track(int type); +static char *units[] = +{ + "%", /* Volume */ + "%", /* Bass */ + "%" /* Treble */ +}; + +static int minval[] = +{ + 0, /* Volume */ + 0, /* Bass */ + 0 /* Treble */ +}; + +static int maxval[] = +{ + 50, /* Volume */ + 50, /* Bass */ + 50 /* Treble */ +}; + +char *mpeg_sound_unit(int setting) +{ + return units[setting]; +} + +int mpeg_sound_min(int setting) +{ + return minval[setting]; +} + +int mpeg_sound_max(int setting) +{ + return maxval[setting]; +} + #ifndef ARCHOS_RECORDER static unsigned int bass_table[] = { @@ -638,43 +675,69 @@ void mpeg_prev(void) queue_post(&mpeg_queue, MPEG_PREV, NULL); } -void mpeg_volume(int percent) +void mpeg_sound_set(int setting, int value) { - int volume; + int tmp; + switch(setting) + { + case SOUND_VOLUME: + value *= 2; /* Convert to percent */ + #ifdef ARCHOS_RECORDER - volume = 0x7f00 * percent / 100; - mas_codec_writereg(0x10, volume & 0xff00); + tmp = 0x7f00 * value / 100; + mas_codec_writereg(0x10, tmp & 0xff00); #else - volume = 0x38 * percent / 100; - dac_volume(volume, volume, false); + tmp = 0x38 * value / 100; + dac_volume(tmp, tmp, false); #endif -} + break; -void mpeg_bass(int percent) -{ - int bass; - + case SOUND_BASS: + value *= 2; /* Convert to percent */ + #ifdef ARCHOS_RECORDER - bass = 0x6000 * percent / 100; - mas_codec_writereg(0x14, bass & 0xff00); + tmp = 0x6000 * value / 100; + mas_codec_writereg(0x14, tmp & 0xff00); #else - bass = 15 * percent / 100; - mas_writereg(MAS_REG_KBASS, bass_table[bass]); + tmp = 15 * value / 100; + mas_writereg(MAS_REG_KBASS, bass_table[tmp]); #endif -} + break; -void mpeg_treble(int percent) -{ - int treble; + case SOUND_TREBLE: + value *= 2; /* Convert to percent */ #ifdef ARCHOS_RECORDER - treble = 0x6000 * percent / 100; - mas_codec_writereg(0x15, treble & 0xff00); + tmp = 0x6000 * value / 100; + mas_codec_writereg(0x15, tmp & 0xff00); #else - treble = 15 * percent / 100; - mas_writereg(MAS_REG_KTREBLE, treble_table[treble]); + tmp = 15 * value / 100; + mas_writereg(MAS_REG_KTREBLE, treble_table[tmp]); #endif + break; + } +} + +int mpeg_val2phys(int setting, int value) +{ + int result = 0; + + switch(setting) + { + case SOUND_VOLUME: + result = value * 2; + break; + + case SOUND_BASS: + result = value * 2; + break; + + case SOUND_TREBLE: + result = value * 2; + break; + } + return result; } void mpeg_init(int volume, int bass, int treble) @@ -742,7 +805,7 @@ void mpeg_init(int volume, int bass, int treble) dac_config(0x04); /* DAC on, all else off */ #endif - mpeg_bass(bass); - mpeg_treble(treble); - mpeg_volume(volume); + mpeg_sound_set(SOUND_BASS, bass); + mpeg_sound_set(SOUND_TREBLE, treble); + mpeg_sound_set(SOUND_VOLUME, volume); } diff --git a/firmware/mpeg.h b/firmware/mpeg.h index 908eabcda7..c9de7dc12c 100644 --- a/firmware/mpeg.h +++ b/firmware/mpeg.h @@ -26,9 +26,25 @@ void mpeg_pause(void); void mpeg_resume(void); void mpeg_next(void); void mpeg_prev(void); -void mpeg_volume(int percent); -void mpeg_bass(int percent); -void mpeg_treble(int percent); +void mpeg_sound_set(int setting, int value); +int mpeg_sound_min(int setting); +int mpeg_sound_max(int setting); +int mpeg_val2phys(int setting, int value); +char *mpeg_sound_unit(int setting); struct mp3entry* mpeg_current_track(void); +#define SOUND_VOLUME 0 +#define SOUND_BASS 1 +#define SOUND_TREBLE 2 +#define SOUND_BALANCE 3 + +#ifdef ARCHOS_RECORDER +#define SOUND_LOUDNESS 4 +#define SOUND_SUPERBASS 5 +#define SOUND_NUMSETTINGS 6 +#else +#define SOUND_DEEMPH 4 +#define SOUND_NUMSETTINGS 5 +#endif + #endif -- cgit v1.2.3