forked from len0rd/rockbox
Introduce support for passing decimal numbers in talk ids and speak them, use in the settings menu to fix FS#7622
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@17168 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
a1b3c69a0f
commit
05d2bfd5e0
3 changed files with 64 additions and 21 deletions
|
|
@ -307,6 +307,16 @@ static void db_format(char* buffer, size_t buffer_size, int value,
|
||||||
v / 10, v % 10, unit);
|
v / 10, v % 10, unit);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int32_t get_dec_talkid(int value, int unit)
|
||||||
|
{
|
||||||
|
return TALK_ID_DECIMAL(value, 1, unit);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t get_precut_talkid(int value, int unit)
|
||||||
|
{
|
||||||
|
return TALK_ID_DECIMAL(-value, 1, unit);
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
#if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F)
|
#if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F)
|
||||||
static void set_mdb_enable(bool value)
|
static void set_mdb_enable(bool value)
|
||||||
|
|
@ -905,7 +915,7 @@ const struct settings_list settings[] = {
|
||||||
OFFON_SETTING(F_SOUNDSETTING, replaygain_noclip, LANG_REPLAYGAIN_NOCLIP,
|
OFFON_SETTING(F_SOUNDSETTING, replaygain_noclip, LANG_REPLAYGAIN_NOCLIP,
|
||||||
false, "replaygain noclip", NULL),
|
false, "replaygain noclip", NULL),
|
||||||
INT_SETTING_NOWRAP(F_SOUNDSETTING, replaygain_preamp, LANG_REPLAYGAIN_PREAMP, 0, "replaygain preamp",
|
INT_SETTING_NOWRAP(F_SOUNDSETTING, replaygain_preamp, LANG_REPLAYGAIN_PREAMP, 0, "replaygain preamp",
|
||||||
UNIT_DB, -120, 120, 5, db_format, NULL, NULL),
|
UNIT_DB, -120, 120, 5, db_format, get_dec_talkid, NULL),
|
||||||
|
|
||||||
CHOICE_SETTING(0, beep, LANG_BEEP, 0,
|
CHOICE_SETTING(0, beep, LANG_BEEP, 0,
|
||||||
"beep", "off,weak,moderate,strong", NULL, 4,
|
"beep", "off,weak,moderate,strong", NULL, 4,
|
||||||
|
|
@ -933,13 +943,13 @@ const struct settings_list settings[] = {
|
||||||
"crossfeed", dsp_set_crossfeed),
|
"crossfeed", dsp_set_crossfeed),
|
||||||
INT_SETTING_NOWRAP(F_SOUNDSETTING, crossfeed_direct_gain, LANG_CROSSFEED_DIRECT_GAIN,
|
INT_SETTING_NOWRAP(F_SOUNDSETTING, crossfeed_direct_gain, LANG_CROSSFEED_DIRECT_GAIN,
|
||||||
-15, "crossfeed direct gain", UNIT_DB, -60, 0, 5,
|
-15, "crossfeed direct gain", UNIT_DB, -60, 0, 5,
|
||||||
db_format, NULL, dsp_set_crossfeed_direct_gain),
|
db_format, get_dec_talkid, dsp_set_crossfeed_direct_gain),
|
||||||
INT_SETTING_NOWRAP(F_SOUNDSETTING, crossfeed_cross_gain, LANG_CROSSFEED_CROSS_GAIN, -60,
|
INT_SETTING_NOWRAP(F_SOUNDSETTING, crossfeed_cross_gain, LANG_CROSSFEED_CROSS_GAIN, -60,
|
||||||
"crossfeed cross gain", UNIT_DB, -120, -30, 5,
|
"crossfeed cross gain", UNIT_DB, -120, -30, 5,
|
||||||
db_format, NULL, crossfeed_cross_set),
|
db_format, get_dec_talkid, crossfeed_cross_set),
|
||||||
INT_SETTING_NOWRAP(F_SOUNDSETTING, crossfeed_hf_attenuation, LANG_CROSSFEED_HF_ATTENUATION, -160,
|
INT_SETTING_NOWRAP(F_SOUNDSETTING, crossfeed_hf_attenuation, LANG_CROSSFEED_HF_ATTENUATION, -160,
|
||||||
"crossfeed hf attenuation", UNIT_DB, -240, -60, 5,
|
"crossfeed hf attenuation", UNIT_DB, -240, -60, 5,
|
||||||
db_format, NULL, crossfeed_cross_set),
|
db_format, get_dec_talkid, crossfeed_cross_set),
|
||||||
INT_SETTING_NOWRAP(F_SOUNDSETTING, crossfeed_hf_cutoff, LANG_CROSSFEED_HF_CUTOFF, 700,
|
INT_SETTING_NOWRAP(F_SOUNDSETTING, crossfeed_hf_cutoff, LANG_CROSSFEED_HF_CUTOFF, 700,
|
||||||
"crossfeed hf cutoff", UNIT_HERTZ, 500, 2000, 100,
|
"crossfeed hf cutoff", UNIT_HERTZ, 500, 2000, 100,
|
||||||
NULL, NULL, crossfeed_cross_set),
|
NULL, NULL, crossfeed_cross_set),
|
||||||
|
|
@ -948,7 +958,7 @@ const struct settings_list settings[] = {
|
||||||
OFFON_SETTING(F_EQSETTING, eq_enabled, LANG_EQUALIZER_ENABLED, false,
|
OFFON_SETTING(F_EQSETTING, eq_enabled, LANG_EQUALIZER_ENABLED, false,
|
||||||
"eq enabled", NULL),
|
"eq enabled", NULL),
|
||||||
INT_SETTING_NOWRAP(F_EQSETTING, eq_precut, LANG_EQUALIZER_PRECUT, 0,
|
INT_SETTING_NOWRAP(F_EQSETTING, eq_precut, LANG_EQUALIZER_PRECUT, 0,
|
||||||
"eq precut", UNIT_DB, 0, 240, 5, eq_precut_format, NULL,
|
"eq precut", UNIT_DB, 0, 240, 5, eq_precut_format, get_precut_talkid,
|
||||||
dsp_set_eq_precut),
|
dsp_set_eq_precut),
|
||||||
/* 0..32768 Hz */
|
/* 0..32768 Hz */
|
||||||
INT_SETTING_NOWRAP(F_EQSETTING, eq_band0_cutoff, LANG_EQUALIZER_BAND_CUTOFF,
|
INT_SETTING_NOWRAP(F_EQSETTING, eq_band0_cutoff, LANG_EQUALIZER_BAND_CUTOFF,
|
||||||
|
|
@ -969,35 +979,35 @@ const struct settings_list settings[] = {
|
||||||
/* 0..64 (or 0.0 to 6.4) */
|
/* 0..64 (or 0.0 to 6.4) */
|
||||||
INT_SETTING_NOWRAP(F_EQSETTING, eq_band0_q, LANG_EQUALIZER_BAND_Q, 7,
|
INT_SETTING_NOWRAP(F_EQSETTING, eq_band0_q, LANG_EQUALIZER_BAND_Q, 7,
|
||||||
"eq band 0 q", UNIT_INT, EQ_Q_MIN, EQ_Q_MAX, EQ_Q_STEP,
|
"eq band 0 q", UNIT_INT, EQ_Q_MIN, EQ_Q_MAX, EQ_Q_STEP,
|
||||||
eq_q_format, NULL, NULL),
|
eq_q_format, get_dec_talkid, NULL),
|
||||||
INT_SETTING_NOWRAP(F_EQSETTING, eq_band1_q, LANG_EQUALIZER_BAND_Q, 10,
|
INT_SETTING_NOWRAP(F_EQSETTING, eq_band1_q, LANG_EQUALIZER_BAND_Q, 10,
|
||||||
"eq band 1 q", UNIT_INT, EQ_Q_MIN, EQ_Q_MAX, EQ_Q_STEP,
|
"eq band 1 q", UNIT_INT, EQ_Q_MIN, EQ_Q_MAX, EQ_Q_STEP,
|
||||||
eq_q_format, NULL, NULL),
|
eq_q_format, get_dec_talkid, NULL),
|
||||||
INT_SETTING_NOWRAP(F_EQSETTING, eq_band2_q, LANG_EQUALIZER_BAND_Q, 10,
|
INT_SETTING_NOWRAP(F_EQSETTING, eq_band2_q, LANG_EQUALIZER_BAND_Q, 10,
|
||||||
"eq band 2 q", UNIT_INT, EQ_Q_MIN, EQ_Q_MAX, EQ_Q_STEP,
|
"eq band 2 q", UNIT_INT, EQ_Q_MIN, EQ_Q_MAX, EQ_Q_STEP,
|
||||||
eq_q_format, NULL, NULL),
|
eq_q_format, get_dec_talkid, NULL),
|
||||||
INT_SETTING_NOWRAP(F_EQSETTING, eq_band3_q, LANG_EQUALIZER_BAND_Q, 10,
|
INT_SETTING_NOWRAP(F_EQSETTING, eq_band3_q, LANG_EQUALIZER_BAND_Q, 10,
|
||||||
"eq band 3 q", UNIT_INT, EQ_Q_MIN, EQ_Q_MAX, EQ_Q_STEP,
|
"eq band 3 q", UNIT_INT, EQ_Q_MIN, EQ_Q_MAX, EQ_Q_STEP,
|
||||||
eq_q_format, NULL, NULL),
|
eq_q_format, get_dec_talkid, NULL),
|
||||||
INT_SETTING_NOWRAP(F_EQSETTING, eq_band4_q, LANG_EQUALIZER_BAND_Q, 7,
|
INT_SETTING_NOWRAP(F_EQSETTING, eq_band4_q, LANG_EQUALIZER_BAND_Q, 7,
|
||||||
"eq band 4 q", UNIT_INT, EQ_Q_MIN, EQ_Q_MAX, EQ_Q_STEP,
|
"eq band 4 q", UNIT_INT, EQ_Q_MIN, EQ_Q_MAX, EQ_Q_STEP,
|
||||||
eq_q_format, NULL, NULL),
|
eq_q_format, get_dec_talkid, NULL),
|
||||||
/* -240..240 (or -24db to +24db) */
|
/* -240..240 (or -24db to +24db) */
|
||||||
INT_SETTING_NOWRAP(F_EQSETTING, eq_band0_gain, LANG_GAIN, 0,
|
INT_SETTING_NOWRAP(F_EQSETTING, eq_band0_gain, LANG_GAIN, 0,
|
||||||
"eq band 0 gain", UNIT_DB, EQ_GAIN_MIN, EQ_GAIN_MAX,
|
"eq band 0 gain", UNIT_DB, EQ_GAIN_MIN, EQ_GAIN_MAX,
|
||||||
EQ_GAIN_STEP, db_format, NULL, NULL),
|
EQ_GAIN_STEP, db_format, get_dec_talkid, NULL),
|
||||||
INT_SETTING_NOWRAP(F_EQSETTING, eq_band1_gain, LANG_GAIN, 0,
|
INT_SETTING_NOWRAP(F_EQSETTING, eq_band1_gain, LANG_GAIN, 0,
|
||||||
"eq band 1 gain", UNIT_DB, EQ_GAIN_MIN, EQ_GAIN_MAX,
|
"eq band 1 gain", UNIT_DB, EQ_GAIN_MIN, EQ_GAIN_MAX,
|
||||||
EQ_GAIN_STEP, db_format, NULL, NULL),
|
EQ_GAIN_STEP, db_format, get_dec_talkid, NULL),
|
||||||
INT_SETTING_NOWRAP(F_EQSETTING, eq_band2_gain, LANG_GAIN, 0,
|
INT_SETTING_NOWRAP(F_EQSETTING, eq_band2_gain, LANG_GAIN, 0,
|
||||||
"eq band 2 gain", UNIT_DB, EQ_GAIN_MIN, EQ_GAIN_MAX,
|
"eq band 2 gain", UNIT_DB, EQ_GAIN_MIN, EQ_GAIN_MAX,
|
||||||
EQ_GAIN_STEP, db_format, NULL, NULL),
|
EQ_GAIN_STEP, db_format, get_dec_talkid, NULL),
|
||||||
INT_SETTING_NOWRAP(F_EQSETTING, eq_band3_gain, LANG_GAIN, 0,
|
INT_SETTING_NOWRAP(F_EQSETTING, eq_band3_gain, LANG_GAIN, 0,
|
||||||
"eq band 3 gain", UNIT_DB, EQ_GAIN_MIN, EQ_GAIN_MAX,
|
"eq band 3 gain", UNIT_DB, EQ_GAIN_MIN, EQ_GAIN_MAX,
|
||||||
EQ_GAIN_STEP, db_format, NULL, NULL),
|
EQ_GAIN_STEP, db_format, get_dec_talkid, NULL),
|
||||||
INT_SETTING_NOWRAP(F_EQSETTING, eq_band4_gain, LANG_GAIN, 0,
|
INT_SETTING_NOWRAP(F_EQSETTING, eq_band4_gain, LANG_GAIN, 0,
|
||||||
"eq band 4 gain", UNIT_DB, EQ_GAIN_MIN, EQ_GAIN_MAX,
|
"eq band 4 gain", UNIT_DB, EQ_GAIN_MIN, EQ_GAIN_MAX,
|
||||||
EQ_GAIN_STEP, db_format, NULL, NULL),
|
EQ_GAIN_STEP, db_format, get_dec_talkid, NULL),
|
||||||
|
|
||||||
/* dithering */
|
/* dithering */
|
||||||
OFFON_SETTING(F_SOUNDSETTING, dithering_enabled, LANG_DITHERING,
|
OFFON_SETTING(F_SOUNDSETTING, dithering_enabled, LANG_DITHERING,
|
||||||
|
|
|
||||||
36
apps/talk.c
36
apps/talk.c
|
|
@ -558,6 +558,7 @@ int talk_id(int32_t id, bool enqueue)
|
||||||
long clipsize;
|
long clipsize;
|
||||||
unsigned char* clipbuf;
|
unsigned char* clipbuf;
|
||||||
int32_t unit;
|
int32_t unit;
|
||||||
|
int decimals;
|
||||||
|
|
||||||
if (talk_temp_disable_count > 0)
|
if (talk_temp_disable_count > 0)
|
||||||
return -1; /* talking has been disabled */
|
return -1; /* talking has been disabled */
|
||||||
|
|
@ -575,13 +576,16 @@ int talk_id(int32_t id, bool enqueue)
|
||||||
if (id == -1) /* -1 is an indication for silence */
|
if (id == -1) /* -1 is an indication for silence */
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
|
decimals = (((uint32_t)id) >> DECIMAL_SHIFT) & 0x7;
|
||||||
|
DEBUGF("decimals %d\n", decimals);
|
||||||
/* check if this is a special ID, with a value */
|
/* check if this is a special ID, with a value */
|
||||||
unit = ((uint32_t)id) >> UNIT_SHIFT;
|
unit = ((uint32_t)id) >> UNIT_SHIFT;
|
||||||
if (unit)
|
if (unit || decimals)
|
||||||
{ /* sign-extend the value */
|
{ /* sign-extend the value */
|
||||||
id = (uint32_t)id << (32-UNIT_SHIFT);
|
id = (uint32_t)id << (32-DECIMAL_SHIFT);
|
||||||
id >>= (32-UNIT_SHIFT);
|
id >>= (32-DECIMAL_SHIFT);
|
||||||
talk_value(id, unit, enqueue); /* speak it */
|
|
||||||
|
talk_value_decimal(id, unit, decimals, enqueue); /* speak it */
|
||||||
return 0; /* and stop, end of special case */
|
return 0; /* and stop, end of special case */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -593,7 +597,6 @@ int talk_id(int32_t id, bool enqueue)
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Speaks zero or more IDs (from an array). */
|
/* Speaks zero or more IDs (from an array). */
|
||||||
int talk_idarray(long *ids, bool enqueue)
|
int talk_idarray(long *ids, bool enqueue)
|
||||||
{
|
{
|
||||||
|
|
@ -760,8 +763,13 @@ static int talk_time_unit(long secs, bool exact, bool enqueue)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* singular/plural aware saying of a value */
|
|
||||||
int talk_value(long n, int unit, bool enqueue)
|
int talk_value(long n, int unit, bool enqueue)
|
||||||
|
{
|
||||||
|
return talk_value_decimal(n, unit, 0, enqueue);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* singular/plural aware saying of a value */
|
||||||
|
int talk_value_decimal(long n, int unit, int decimals, bool enqueue)
|
||||||
{
|
{
|
||||||
int unit_id;
|
int unit_id;
|
||||||
static const int unit_voiced[] =
|
static const int unit_voiced[] =
|
||||||
|
|
@ -826,6 +834,22 @@ int talk_value(long n, int unit, bool enqueue)
|
||||||
enqueue = true;
|
enqueue = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (decimals)
|
||||||
|
{
|
||||||
|
/* needed for the "-0.5" corner case */
|
||||||
|
if (n < 0)
|
||||||
|
{
|
||||||
|
talk_id(VOICE_MINUS, enqueue);
|
||||||
|
n = -n;
|
||||||
|
enqueue = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
talk_number(n / (10*decimals), enqueue);
|
||||||
|
talk_id(LANG_POINT, true);
|
||||||
|
n %= (10*decimals);
|
||||||
|
enqueue = true;
|
||||||
|
}
|
||||||
|
|
||||||
talk_number(n, enqueue); /* say the number */
|
talk_number(n, enqueue); /* say the number */
|
||||||
talk_id(unit_id, true); /* say the unit, if any */
|
talk_id(unit_id, true); /* say the unit, if any */
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -55,10 +55,18 @@ enum {
|
||||||
|
|
||||||
#define UNIT_SHIFT (32-5) /* this many bits left from UNIT_xx enum */
|
#define UNIT_SHIFT (32-5) /* this many bits left from UNIT_xx enum */
|
||||||
|
|
||||||
|
#define DECIMAL_SHIFT (32 - 8)
|
||||||
|
|
||||||
/* make a "talkable" ID from number + unit
|
/* make a "talkable" ID from number + unit
|
||||||
unit is upper 4 bits, number the remaining (in regular 2's complement) */
|
unit is upper 4 bits, number the remaining (in regular 2's complement) */
|
||||||
#define TALK_ID(n,u) (((long)(u))<<UNIT_SHIFT | ((n) & ~(-1L<<UNIT_SHIFT)))
|
#define TALK_ID(n,u) (((long)(u))<<UNIT_SHIFT | ((n) & ~(-1L<<UNIT_SHIFT)))
|
||||||
|
|
||||||
|
/* make a "talkable" ID from a decimal number + unit, the decimal number
|
||||||
|
is represented like x*10*d where d is the number of decimal digits */
|
||||||
|
#define TALK_ID_DECIMAL(n,d,u) (((long)(u))<<UNIT_SHIFT |\
|
||||||
|
((long)(d))<<DECIMAL_SHIFT |\
|
||||||
|
((n) & ~(-1L<<DECIMAL_SHIFT)))
|
||||||
|
|
||||||
/* convenience macro to have both virtual pointer and ID as arguments */
|
/* convenience macro to have both virtual pointer and ID as arguments */
|
||||||
#define STR(id) ID2P(id), id
|
#define STR(id) ID2P(id), id
|
||||||
|
|
||||||
|
|
@ -77,6 +85,7 @@ int talk_id(int32_t id, bool enqueue); /* play a voice ID from voicefont */
|
||||||
int talk_file(const char* filename, bool enqueue); /* play a thumbnail from file */
|
int talk_file(const char* filename, bool enqueue); /* play a thumbnail from file */
|
||||||
int talk_number(long n, bool enqueue); /* say a number */
|
int talk_number(long n, bool enqueue); /* say a number */
|
||||||
int talk_value(long n, int unit, bool enqueue); /* say a numeric value */
|
int talk_value(long n, int unit, bool enqueue); /* say a numeric value */
|
||||||
|
int talk_value_decimal(long n, int unit, int decimals, bool enqueue);
|
||||||
int talk_spell(const char* spell, bool enqueue); /* spell a string */
|
int talk_spell(const char* spell, bool enqueue); /* spell a string */
|
||||||
void talk_setting(const void *global_settings_variable); /* read a setting */
|
void talk_setting(const void *global_settings_variable); /* read a setting */
|
||||||
void talk_disable(bool disable); /* temporarily disable (or re-enable) talking (temporarily, not persisted) */
|
void talk_disable(bool disable); /* temporarily disable (or re-enable) talking (temporarily, not persisted) */
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue