Fix speaking of decimal values to work when decimals != 1, spell the fractional part instead of speaking it like a number, break out a part of output_dyn_value into a separate function and use it
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@17185 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
db2d61f4ea
commit
2521bf5d26
3 changed files with 32 additions and 19 deletions
13
apps/misc.c
13
apps/misc.c
|
@ -89,7 +89,6 @@ char *output_dyn_value(char *buf, int buf_size, int value,
|
|||
int scale = bin_scale ? 1024 : 1000;
|
||||
int fraction = 0;
|
||||
int unit_no = 0;
|
||||
int i;
|
||||
char tbuf[5];
|
||||
|
||||
while (value >= scale)
|
||||
|
@ -118,17 +117,7 @@ char *output_dyn_value(char *buf, int buf_size, int value,
|
|||
}
|
||||
else
|
||||
{
|
||||
/* strip trailing zeros from the fraction */
|
||||
for (i = strlen(tbuf) - 1; (i >= 0) && (tbuf[i] == '0'); i--)
|
||||
tbuf[i] = '\0';
|
||||
|
||||
talk_number(value, true);
|
||||
if (tbuf[0] != 0)
|
||||
{
|
||||
talk_id(LANG_POINT, true);
|
||||
talk_spell(tbuf, true);
|
||||
}
|
||||
talk_id(P2ID(units[unit_no]), true);
|
||||
talk_fractional(tbuf, value, P2ID(units[unit_no]));
|
||||
}
|
||||
return buf;
|
||||
}
|
||||
|
|
33
apps/talk.c
33
apps/talk.c
|
@ -763,6 +763,22 @@ static int talk_time_unit(long secs, bool exact, bool enqueue)
|
|||
return 0;
|
||||
}
|
||||
|
||||
void talk_fractional(char *tbuf, int value, int unit)
|
||||
{
|
||||
int i;
|
||||
/* strip trailing zeros from the fraction */
|
||||
for (i = strlen(tbuf) - 1; (i >= 0) && (tbuf[i] == '0'); i--)
|
||||
tbuf[i] = '\0';
|
||||
|
||||
talk_number(value, true);
|
||||
if (tbuf[0] != 0)
|
||||
{
|
||||
talk_id(LANG_POINT, true);
|
||||
talk_spell(tbuf, true);
|
||||
}
|
||||
talk_id(unit, true);
|
||||
}
|
||||
|
||||
int talk_value(long n, int unit, bool enqueue)
|
||||
{
|
||||
return talk_value_decimal(n, unit, 0, enqueue);
|
||||
|
@ -805,6 +821,12 @@ int talk_value_decimal(long n, int unit, int decimals, bool enqueue)
|
|||
= VOICE_PM_UNITS_PER_TICK,
|
||||
};
|
||||
|
||||
static const int pow10[] = { /* 10^0 - 10^7 */
|
||||
1, 10, 100, 1000, 10000, 100000, 1000000, 10000000
|
||||
};
|
||||
|
||||
char tbuf[8];
|
||||
|
||||
if (talk_temp_disable_count > 0)
|
||||
return -1; /* talking has been disabled */
|
||||
#if CONFIG_CODEC != SWCODEC
|
||||
|
@ -841,18 +863,17 @@ int talk_value_decimal(long n, int unit, int decimals, bool enqueue)
|
|||
{
|
||||
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;
|
||||
snprintf(tbuf, sizeof(tbuf), "%0*d", decimals, n % pow10[decimals]);
|
||||
talk_fractional(tbuf, n / pow10[decimals], unit_id);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
talk_number(n, enqueue); /* say the number */
|
||||
talk_id(unit_id, true); /* say the unit, if any */
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -62,7 +62,7 @@ enum {
|
|||
#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 */
|
||||
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)))
|
||||
|
@ -92,6 +92,9 @@ void talk_disable(bool disable); /* temporarily disable (or re-enable) talking (
|
|||
void talk_force_shutup(void); /* kill voice unconditionally */
|
||||
void talk_shutup(void); /* Interrupt voice, as when enqueue is false */
|
||||
|
||||
/* helper function for speaking fractional numbers */
|
||||
void talk_fractional(char *tbuf, int value, int unit);
|
||||
|
||||
#if CONFIG_RTC
|
||||
void talk_time(struct tm *tm, bool enqueue);
|
||||
void talk_date(struct tm *tm, bool enqueue);
|
||||
|
|
Loading…
Reference in a new issue