summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinus Nielsen Feltzing <linus@haxx.se>2002-06-28 11:48:53 +0000
committerLinus Nielsen Feltzing <linus@haxx.se>2002-06-28 11:48:53 +0000
commit667fb7c6e94060294dd1a9f95934b841f7df9f71 (patch)
treef261846271d84633598e03afe8f68c5b73b396af
parentb983d1b4a1126356462863364c9cc8d3f9471a03 (diff)
downloadrockbox-667fb7c6e94060294dd1a9f95934b841f7df9f71.zip
rockbox-667fb7c6e94060294dd1a9f95934b841f7df9f71.tar.gz
rockbox-667fb7c6e94060294dd1a9f95934b841f7df9f71.tar.bz2
rockbox-667fb7c6e94060294dd1a9f95934b841f7df9f71.tar.xz
First step towards a better sound setting API
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@1243 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--apps/settings.h6
-rw-r--r--apps/sound_menu.c66
-rw-r--r--apps/wps.c16
-rw-r--r--firmware/mpeg.c115
-rw-r--r--firmware/mpeg.h22
5 files changed, 182 insertions, 43 deletions
diff --git a/apps/settings.h b/apps/settings.h
index d3b891c..5f67b3b 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 183c343..50ba265 100644
--- a/apps/sound_menu.c
+++ b/apps/sound_menu.c
@@ -19,23 +19,83 @@
#include "config.h"
#include <stdio.h>
#include <stdbool.h>
+#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 51add88..2779af7 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 ab99fa7..a421e5d 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 908eabc..c9de7dc 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