void option_talk_value(const struct settings_list *setting, int value, bool enqueue) { if ((setting->flags & F_BOOL_SETTING) == F_BOOL_SETTING) { bool val = (value==1); talk_id(val? setting->bool_setting->lang_yes : setting->bool_setting->lang_no, enqueue); } #if 0 /* probably dont need this one */ else if ((setting->flags & F_FILENAME) == F_FILENAME) { } #endif else if (((setting->flags & F_INT_SETTING) == F_INT_SETTING) || ((setting->flags & F_TABLE_SETTING) == F_TABLE_SETTING)) { const struct int_setting *int_info = setting->int_setting; const struct table_setting *tbl_info = setting->table_setting; int unit; int32_t (*get_talk_id)(int, int); if ((setting->flags & F_INT_SETTING) == F_INT_SETTING) { unit = int_info->unit; get_talk_id = int_info->get_talk_id; } else { unit = tbl_info->unit; get_talk_id = tbl_info->get_talk_id; } if (get_talk_id) talk_id(get_talk_id(value, unit), enqueue); else talk_value(value, unit, enqueue); } else if ((setting->flags & F_T_SOUND) == F_T_SOUND) { int talkunit = UNIT_INT; const char *unit = sound_unit(setting->sound_setting->setting); if (!strcmp(unit, "dB")) talkunit = UNIT_DB; else if (!strcmp(unit, "%")) talkunit = UNIT_PERCENT; else if (!strcmp(unit, "Hz")) talkunit = UNIT_HERTZ; talk_value(value, talkunit, false); } else if ((setting->flags & F_CHOICE_SETTING) == F_CHOICE_SETTING) { if (setting->flags & F_CHOICETALKS) { talk_id(setting->choice_setting->talks[value], enqueue); } else { talk_id(P2ID(setting->choice_setting->desc[value]), enqueue); } } }
static void speak_time(int hours, int minutes, bool speak_hours, bool enqueue) { if (global_settings.talk_menu){ if(speak_hours) { talk_value(hours, UNIT_HOUR, enqueue); talk_value(minutes, UNIT_MIN, true); } else { talk_value(minutes, UNIT_MIN, enqueue); } } }
/* ------------------------------------------------------------------------*/ static void say_bookmark(const char* bookmark, int bookmark_id, bool show_playlist_name) { if (!parse_bookmark(bookmark, true)) { talk_id(LANG_BOOKMARK_INVALID, false); return; } talk_number(bookmark_id + 1, false); #if CONFIG_CODEC == SWCODEC bool is_dir = (global_temp_buffer[0] && global_temp_buffer[strlen(global_temp_buffer)-1] == '/'); /* HWCODEC cannot enqueue voice file entries and .talk thumbnails together, because there is no guarantee that the same mp3 parameters are used. */ if(show_playlist_name) { /* It's useful to know which playlist this is */ if(is_dir) talk_dir_or_spell(global_temp_buffer, TALK_IDARRAY(VOICE_DIR), true); else talk_file_or_spell(NULL, global_temp_buffer, TALK_IDARRAY(LANG_PLAYLIST), true); } #else (void)show_playlist_name; #endif if(bm.shuffle) talk_id(LANG_SHUFFLE, true); talk_id(VOICE_BOOKMARK_SELECT_INDEX_TEXT, true); talk_number(bm.resume_index + 1, true); talk_id(LANG_TIME, true); talk_value(bm.resume_time / 1000, UNIT_TIME, true); #if CONFIG_CODEC == SWCODEC /* Track filename */ if(is_dir) talk_file_or_spell(global_temp_buffer, global_filename, TALK_IDARRAY(VOICE_FILE), true); else { /* Unfortunately if this is a playlist, we do not know in which directory the file is and therefore cannot find the track's .talk file. */ talk_id(VOICE_FILE, true); talk_spell(global_filename, true); } #endif }
bool alarm_screen(void) { int h, m; bool done = false; struct tm *tm; int togo; int button; bool update = true; bool hour_wrapped = false; struct viewport vp[NB_SCREENS]; rtc_get_alarm(&h, &m); /* After a battery change the RTC values are out of range */ if (m > 60 || h > 24) { m = 0; h = 12; } else { m = m / 5 * 5; /* 5 min accuracy should be enough */ } FOR_NB_SCREENS(i) { viewport_set_defaults(&vp[i], i); } while(!done) { if(update) { FOR_NB_SCREENS(i) { screens[i].set_viewport(&vp[i]); screens[i].clear_viewport(); screens[i].puts(0, 4, str(LANG_ALARM_MOD_KEYS)); } /* Talk when entering the wakeup screen */ speak_time(h, m, true, true); update = false; } FOR_NB_SCREENS(i) { screens[i].set_viewport(&vp[i]); screens[i].putsf(0, 1, str(LANG_ALARM_MOD_TIME)); screens[i].putsf(0, 2, "%02d:%02d", h, m); screens[i].update_viewport(); screens[i].set_viewport(NULL); } button = get_action(CONTEXT_SETTINGS,HZ); switch(button) { case ACTION_STD_OK: /* prevent that an alarm occurs in the shutdown procedure */ /* accept alarms only if they are in 2 minutes or more */ tm = get_time(); togo = (m + h * 60 - tm->tm_min - tm->tm_hour * 60 + 1440) % 1440; if (togo > 1) { rtc_init(); rtc_set_alarm(h,m); rtc_enable_alarm(true); if (global_settings.talk_menu) { talk_id(LANG_ALARM_MOD_TIME_TO_GO, true); talk_value(togo / 60, UNIT_HOUR, true); talk_value(togo % 60, UNIT_MIN, true); talk_force_enqueue_next(); } splashf(HZ*2, str(LANG_ALARM_MOD_TIME_TO_GO), togo / 60, togo % 60); done = true; } else { splash(HZ, ID2P(LANG_ALARM_MOD_ERROR)); update = true; } break; /* inc(m) */ case ACTION_SETTINGS_INC: case ACTION_SETTINGS_INCREPEAT: m += 5; if (m == 60) { h += 1; m = 0; hour_wrapped = true; } if (h == 24) h = 0; speak_time(h, m, hour_wrapped, false); break; /* dec(m) */ case ACTION_SETTINGS_DEC: case ACTION_SETTINGS_DECREPEAT: m -= 5; if (m == -5) { h -= 1; m = 55; hour_wrapped = true; } if (h == -1) h = 23; speak_time(h, m, hour_wrapped, false); break; /* inc(h) */ case ACTION_STD_NEXT: case ACTION_STD_NEXTREPEAT: h = (h+1) % 24; if (global_settings.talk_menu) talk_value(h, UNIT_HOUR, false); break; /* dec(h) */ case ACTION_STD_PREV: case ACTION_STD_PREVREPEAT: h = (h+23) % 24; if (global_settings.talk_menu) talk_value(h, UNIT_HOUR, false); break; case ACTION_STD_CANCEL: rtc_enable_alarm(false); splash(HZ*2, ID2P(LANG_ALARM_MOD_DISABLE)); done = true; break; case ACTION_NONE: hour_wrapped = false; break; default: if(default_event_handler(button) == SYS_USB_CONNECTED) { rtc_enable_alarm(false); return true; } break; } } return false; }
bool set_sound(const char* string, int* variable, int setting) { bool done = false; bool changed = true; int min, max; int val; int numdec; int integer; int dec; const char* unit; char str[32]; int talkunit = UNIT_INT; int steps; int button; unit = sound_unit(setting); numdec = sound_numdecimals(setting); steps = sound_steps(setting); min = sound_min(setting); max = sound_max(setting); if (*unit == 'd') /* crude reconstruction */ talkunit = UNIT_DB; else if (*unit == '%') talkunit = UNIT_PERCENT; else if (*unit == 'H') talkunit = UNIT_HERTZ; #ifdef HAVE_LCD_BITMAP if(global_settings.statusbar) lcd_setmargins(0, STATUSBAR_HEIGHT); else lcd_setmargins(0, 0); #endif lcd_clear_display(); lcd_puts_scroll(0,0,string); while (!done) { if (changed) { val = sound_val2phys(setting, *variable); if(numdec) { integer = val / (10 * numdec); dec = val % (10 * numdec); snprintf(str,sizeof str, fmt[numdec], integer, dec, unit); } else { snprintf(str,sizeof str,"%d %s ", val, unit); } if (global_settings.talk_menu) talk_value(val, talkunit, false); /* speak it */ } lcd_puts(0,1,str); status_draw(true); lcd_update(); changed = false; button = button_get_w_tmo(HZ/2); switch( button ) { case SETTINGS_INC: case SETTINGS_INC | BUTTON_REPEAT: (*variable)+=steps; if(*variable > max ) *variable = max; changed = true; break; case SETTINGS_DEC: case SETTINGS_DEC | BUTTON_REPEAT: (*variable)-=steps; if(*variable < min ) *variable = min; changed = true; break; case SETTINGS_OK: case SETTINGS_CANCEL: #ifdef SETTINGS_OK2 case SETTINGS_OK2: #endif #ifdef SETTINGS_CANCEL2 case SETTINGS_CANCEL2: #endif done = true; break; default: if(default_event_handler(button) == SYS_USB_CONNECTED) return true; break; } if (changed) sound_set(setting, *variable); } lcd_stop_scroll(); return false; }