summaryrefslogtreecommitdiffstats
path: root/apps
diff options
context:
space:
mode:
authorMichael Sevakis <jethead71@rockbox.org>2012-04-30 16:27:01 -0400
committerMichael Sevakis <jethead71@rockbox.org>2012-04-30 22:47:37 +0200
commit57a20d2d638895fffe88a23cbd2960f1102b292f (patch)
treedf1943429ec040a18d854fa0a0091051e4200304 /apps
parenta32cbf33465367cd6fe36d636da8d03485e9d15d (diff)
downloadrockbox-57a20d2d638895fffe88a23cbd2960f1102b292f.tar.gz
rockbox-57a20d2d638895fffe88a23cbd2960f1102b292f.tar.bz2
rockbox-57a20d2d638895fffe88a23cbd2960f1102b292f.zip
Make DSP's replaygain independent of global_settings.
Moves replaygain definitions to lib/rbcodec/dsp/dsp_misc.h. Intermediate functions in misc.c handle any adjustment and calling the rbcodec APIs. Change-Id: I9f03561bca9aedd13760cf19c4e19aa3c68e7024 Reviewed-on: http://gerrit.rockbox.org/140 Reviewed-by: Michael Sevakis <jethead71@rockbox.org>
Diffstat (limited to 'apps')
-rw-r--r--apps/gui/quickscreen.c4
-rw-r--r--apps/gui/skin_engine/skin_tokens.c13
-rw-r--r--apps/gui/skin_engine/skin_touchsupport.c4
-rw-r--r--apps/menus/playback_menu.c20
-rw-r--r--apps/misc.c39
-rw-r--r--apps/misc.h10
-rw-r--r--apps/settings.c2
-rw-r--r--apps/settings.h8
-rw-r--r--apps/settings_list.c10
9 files changed, 76 insertions, 34 deletions
diff --git a/apps/gui/quickscreen.c b/apps/gui/quickscreen.c
index 6e50d61511..df295a8a95 100644
--- a/apps/gui/quickscreen.c
+++ b/apps/gui/quickscreen.c
@@ -419,9 +419,7 @@ bool quick_screen_quick(int button_enter)
if (oldshuffle != global_settings.playlist_shuffle
&& audio_status() & AUDIO_STATUS_PLAY)
{
-#if CONFIG_CODEC == SWCODEC
- dsp_set_replaygain();
-#endif
+ replaygain_update();
if (global_settings.playlist_shuffle)
playlist_randomise(NULL, current_tick, true);
else
diff --git a/apps/gui/skin_engine/skin_tokens.c b/apps/gui/skin_engine/skin_tokens.c
index 0f5deedcf9..578a729bb3 100644
--- a/apps/gui/skin_engine/skin_tokens.c
+++ b/apps/gui/skin_engine/skin_tokens.c
@@ -1420,25 +1420,22 @@ const char *get_token_value(struct gui_wps *gwps,
case SKIN_TOKEN_REPLAYGAIN:
{
+ int globtype = global_settings.replaygain_settings.type;
int val;
- if (global_settings.replaygain_type == REPLAYGAIN_OFF)
+
+ if (globtype == REPLAYGAIN_OFF)
val = 1; /* off */
else
{
- int type;
- if (LIKELY(id3))
- type = get_replaygain_mode(id3->track_gain != 0,
- id3->album_gain != 0);
- else
- type = -1;
+ int type = id3_get_replaygain_mode(id3);
if (type < 0)
val = 6; /* no tag */
else
val = type + 2;
- if (global_settings.replaygain_type == REPLAYGAIN_SHUFFLE)
+ if (globtype == REPLAYGAIN_SHUFFLE)
val += 2;
}
diff --git a/apps/gui/skin_engine/skin_touchsupport.c b/apps/gui/skin_engine/skin_touchsupport.c
index a52a88439e..34f616b9a3 100644
--- a/apps/gui/skin_engine/skin_touchsupport.c
+++ b/apps/gui/skin_engine/skin_touchsupport.c
@@ -266,9 +266,7 @@ int skin_get_touchaction(struct wps_data *data, int* edge_offset,
{
global_settings.playlist_shuffle =
!global_settings.playlist_shuffle;
-#if CONFIG_CODEC == SWCODEC
- dsp_set_replaygain();
-#endif
+ replaygain_update();
if (global_settings.playlist_shuffle)
playlist_randomise(NULL, current_tick, true);
else
diff --git a/apps/menus/playback_menu.c b/apps/menus/playback_menu.c
index d1d999587b..6beda93991 100644
--- a/apps/menus/playback_menu.c
+++ b/apps/menus/playback_menu.c
@@ -34,6 +34,7 @@
#include "scrobbler.h"
#include "audio.h"
#include "cuesheet.h"
+#include "misc.h"
#if CONFIG_CODEC == SWCODEC
#include "playback.h"
#endif
@@ -116,14 +117,20 @@ static int replaygain_callback(int action,const struct menu_item_ex *this_item)
switch (action)
{
case ACTION_EXIT_MENUITEM: /* on exit */
- dsp_set_replaygain();
+ replaygain_update();
break;
}
return action;
}
-MENUITEM_SETTING(replaygain_noclip, &global_settings.replaygain_noclip ,replaygain_callback);
-MENUITEM_SETTING(replaygain_type, &global_settings.replaygain_type ,replaygain_callback);
-MENUITEM_SETTING(replaygain_preamp, &global_settings.replaygain_preamp ,replaygain_callback);
+MENUITEM_SETTING(replaygain_noclip,
+ &global_settings.replaygain_settings.noclip,
+ replaygain_callback);
+MENUITEM_SETTING(replaygain_type,
+ &global_settings.replaygain_settings.type,
+ replaygain_callback);
+MENUITEM_SETTING(replaygain_preamp,
+ &global_settings.replaygain_settings.preamp,
+ replaygain_callback);
MAKE_MENU(replaygain_settings_menu,ID2P(LANG_REPLAYGAIN),0, Icon_NOICON,
&replaygain_type, &replaygain_noclip, &replaygain_preamp);
@@ -244,9 +251,8 @@ static int playback_callback(int action,const struct menu_item_ex *this_item)
if (old_shuffle == global_settings.playlist_shuffle)
break;
-#if CONFIG_CODEC == SWCODEC
- dsp_set_replaygain();
-#endif
+ replaygain_update();
+
if (global_settings.playlist_shuffle)
{
playlist_randomise(NULL, current_tick, true);
diff --git a/apps/misc.c b/apps/misc.c
index 3cb314fc51..3bee0772a6 100644
--- a/apps/misc.c
+++ b/apps/misc.c
@@ -953,6 +953,45 @@ void keyclick_click(bool rawbutton, int action)
#endif
}
}
+
+/* Return the ReplayGain mode adjusted by other relevant settings */
+static int replaygain_setting_mode(int type)
+{
+ switch (type)
+ {
+ case REPLAYGAIN_SHUFFLE:
+ type = global_settings.playlist_shuffle ?
+ REPLAYGAIN_TRACK : REPLAYGAIN_ALBUM;
+ case REPLAYGAIN_ALBUM:
+ case REPLAYGAIN_TRACK:
+ case REPLAYGAIN_OFF:
+ default:
+ break;
+ }
+
+ return type;
+}
+
+/* Return the ReplayGain mode adjusted for display purposes */
+int id3_get_replaygain_mode(const struct mp3entry *id3)
+{
+ if (!id3)
+ return -1;
+
+ int type = global_settings.replaygain_settings.type;
+ type = replaygain_setting_mode(type);
+
+ return (type != REPLAYGAIN_TRACK && id3->album_gain != 0) ?
+ REPLAYGAIN_ALBUM : (id3->track_gain != 0 ? REPLAYGAIN_TRACK : -1);
+}
+
+/* Update DSP's replaygain from global settings */
+void replaygain_update(void)
+{
+ struct replaygain_settings settings = global_settings.replaygain_settings;
+ settings.type = replaygain_setting_mode(settings.type);
+ dsp_replaygain_set_settings(&settings);
+}
#endif /* CONFIG_CODEC == SWCODEC */
#endif /* !defined(__PCTOOL__) */
diff --git a/apps/misc.h b/apps/misc.h
index 8d0953985d..7ca8d75930 100644
--- a/apps/misc.h
+++ b/apps/misc.h
@@ -149,6 +149,16 @@ typedef bool (*keyclick_callback)(int action, void* data);
void keyclick_set_callback(keyclick_callback cb, void* data);
/* Produce keyclick based upon button and global settings */
void keyclick_click(bool rawbutton, int action);
+
+/* Return current ReplayGain mode a file should have (REPLAYGAIN_TRACK or
+ * REPLAYGAIN_ALBUM) if ReplayGain processing is enabled, or -1 if no
+ * information present.
+ */
+struct mp3entry;
+int id3_get_replaygain_mode(const struct mp3entry *id3);
+void replaygain_update(void);
+#else
+static inline void replaygain_update(void) {}
#endif /* CONFIG_CODEC == SWCODEC */
void push_current_activity(enum current_activity screen);
diff --git a/apps/settings.c b/apps/settings.c
index d481bc5124..e885beb302 100644
--- a/apps/settings.c
+++ b/apps/settings.c
@@ -978,7 +978,7 @@ void settings_apply(bool read_disk)
#ifdef HAVE_CROSSFADE
audio_set_crossfade(global_settings.crossfade);
#endif
- dsp_set_replaygain();
+ replaygain_update();
dsp_crossfeed_enable(global_settings.crossfeed);
dsp_set_crossfeed_direct_gain(global_settings.crossfeed_direct_gain);
dsp_set_crossfeed_cross_params(global_settings.crossfeed_cross_gain,
diff --git a/apps/settings.h b/apps/settings.h
index 071346864c..34cc75b116 100644
--- a/apps/settings.h
+++ b/apps/settings.h
@@ -117,9 +117,6 @@ enum { SORT_INTERPRET_AS_DIGIT, SORT_INTERPRET_AS_NUMBER };
/* recursive dir insert options */
enum { RECURSE_OFF, RECURSE_ON, RECURSE_ASK };
-/* replaygain types */
-enum { REPLAYGAIN_TRACK = 0, REPLAYGAIN_ALBUM, REPLAYGAIN_SHUFFLE, REPLAYGAIN_OFF };
-
/* show path types */
enum { SHOW_PATH_OFF = 0, SHOW_PATH_CURRENT, SHOW_PATH_FULL };
@@ -325,10 +322,7 @@ struct user_settings
#endif
/* Replaygain */
- bool replaygain_noclip; /* scale to prevent clips */
- int replaygain_type; /* 0=track gain, 1=album gain, 2=track gain if
- shuffle is on, album gain otherwise, 4=off */
- int replaygain_preamp; /* scale replaygained tracks by this */
+ struct replaygain_settings replaygain_settings;
/* Crossfeed */
bool crossfeed; /* enable crossfeed */
diff --git a/apps/settings_list.c b/apps/settings_list.c
index 5f4addea2f..c332b47655 100644
--- a/apps/settings_list.c
+++ b/apps/settings_list.c
@@ -1353,13 +1353,13 @@ const struct settings_list settings[] = {
#if CONFIG_CODEC == SWCODEC
/* replay gain */
- CHOICE_SETTING(F_SOUNDSETTING, replaygain_type, LANG_REPLAYGAIN_MODE,
- REPLAYGAIN_SHUFFLE, "replaygain type",
+ CHOICE_SETTING(F_SOUNDSETTING, replaygain_settings.type,
+ LANG_REPLAYGAIN_MODE, REPLAYGAIN_SHUFFLE, "replaygain type",
"track,album,track shuffle,off", NULL, 4, ID2P(LANG_TRACK_GAIN),
ID2P(LANG_ALBUM_GAIN), ID2P(LANG_SHUFFLE_GAIN), ID2P(LANG_OFF)),
- OFFON_SETTING(F_SOUNDSETTING, replaygain_noclip, LANG_REPLAYGAIN_NOCLIP,
- false, "replaygain noclip", NULL),
- INT_SETTING_NOWRAP(F_SOUNDSETTING, replaygain_preamp,
+ OFFON_SETTING(F_SOUNDSETTING, replaygain_settings.noclip,
+ LANG_REPLAYGAIN_NOCLIP, false, "replaygain noclip", NULL),
+ INT_SETTING_NOWRAP(F_SOUNDSETTING, replaygain_settings.preamp,
LANG_REPLAYGAIN_PREAMP, 0, "replaygain preamp",
UNIT_DB, -120, 120, 5, db_format, get_dec_talkid, NULL),