diff --git a/apps/gui/skin_engine/skin_parser.c b/apps/gui/skin_engine/skin_parser.c
index 2c76616..4773c0e 100644
--- a/apps/gui/skin_engine/skin_parser.c
+++ b/apps/gui/skin_engine/skin_parser.c
@@ -1330,6 +1330,9 @@ static int skin_element_callback(struct skin_element* element, void* data)
case SKIN_TOKEN_ALIGN_LANGDIRECTION:
follow_lang_direction = 2;
break;
+ case SKIN_TOKEN_VOICE:
+ token->value.data = current_tick;
+ break;
case SKIN_TOKEN_LOGICAL_IF:
function = parse_logical_if;
break;
diff --git a/apps/gui/skin_engine/skin_render.c b/apps/gui/skin_engine/skin_render.c
index 0c18848..a602725 100644
--- a/apps/gui/skin_engine/skin_render.c
+++ b/apps/gui/skin_engine/skin_render.c
@@ -46,6 +46,8 @@
#include "playlist.h"
#include "root_menu.h"
#include "misc.h"
+#include "talk.h"
+#include "lang.h"
#define MAX_LINE 1024
@@ -78,6 +80,44 @@ static void skin_render_playlistviewer(struct playlistviewer* viewer,
unsigned long refresh_type);
#endif
+static void skin_do_talking_tags(struct gui_wps *gwps, struct skin_draw_info *info,
+ struct skin_element *element)
+{
+ int i, val;
+ char buf[128];
+ const char* out;
+ struct wps_token *token;
+ for (i=0; i<element->params_count; i++)
+ {
+ struct skin_tag_parameter *param = &element->params[i];
+ switch (param->type)
+ {
+ case DEFAULT:
+ if (i==0)
+ talk_shutup();
+ else
+ talk_id(VOICE_PAUSE, true);
+ break;
+ case STRING:
+ talk_spell(param->data.text, true);
+ break;
+ case CODE:
+ val = TOKEN_VALUE_ONLY;
+ token = param->data.code->data;
+ out = get_token_value(gwps, token, 0,
+ buf, sizeof buf, &val);
+ if (val != -1 || token->type == SKIN_TOKEN_VOLUME)
+ talk_number(val, true);
+ else
+ talk_spell(out, true);
+ break;
+ default:
+ break;
+ }
+ }
+
+}
+
static bool do_non_text_tags(struct gui_wps *gwps, struct skin_draw_info *info,
struct skin_element *element, struct viewport* vp)
{
@@ -89,6 +129,14 @@ static bool do_non_text_tags(struct gui_wps *gwps, struct skin_draw_info *info,
bool do_refresh = (element->tag->flags & info->refresh_type) > 0;
switch (token->type)
{
+ case SKIN_TOKEN_VOICE:
+ if (TIME_AFTER(current_tick, token->value.data+HZ))
+ {
+ printf("%d %d\n", current_tick, token->value.data);
+ skin_do_talking_tags(gwps, info, element);
+ }
+ token->value.data = current_tick;
+ break;
#if (LCD_DEPTH > 1) || (defined(HAVE_REMOTE_LCD) && (LCD_REMOTE_DEPTH > 1))
case SKIN_TOKEN_VIEWPORT_FGCOLOUR:
{
diff --git a/lib/skin_parser/tag_table.c b/lib/skin_parser/tag_table.c
index 9c0b51d..4418ff1 100644
--- a/lib/skin_parser/tag_table.c
+++ b/lib/skin_parser/tag_table.c
@@ -191,6 +191,9 @@ static const struct tag_info legal_tags[] =
{ SKIN_TOKEN_UIVIEWPORT_LOAD, "Vi" , "sIIiii", 0 },
{ SKIN_TOKEN_VIEWPORT_LOAD, "V" , "IIiii", 0 },
+ { SKIN_TOKEN_VOICE, "Vx", "|[sT][sT][sT][sT][sT][sT][sT][sT]",
+ SKIN_REFRESH_STATIC|NOBREAK },
+
{ SKIN_TOKEN_IMAGE_BACKDROP, "X" , "f", SKIN_REFRESH_STATIC|NOBREAK },
{ SKIN_TOKEN_SETTING, "St" , "S", SKIN_REFRESH_DYNAMIC },
diff --git a/lib/skin_parser/tag_table.h b/lib/skin_parser/tag_table.h
index f16709d..670ca98 100644
--- a/lib/skin_parser/tag_table.h
+++ b/lib/skin_parser/tag_table.h
@@ -210,6 +210,8 @@ enum skin_token_type {
SKIN_TOKEN_LOAD_FONT,
+ SKIN_TOKEN_VOICE,
+
/* buttons */
SKIN_TOKEN_BUTTON_VOLUME,
SKIN_TOKEN_LASTTOUCH,