diff options
Diffstat (limited to 'src/modules/rtv')
-rw-r--r-- | src/modules/rtv/rtv.c | 82 |
1 files changed, 75 insertions, 7 deletions
diff --git a/src/modules/rtv/rtv.c b/src/modules/rtv/rtv.c index 6961a4f..704aca6 100644 --- a/src/modules/rtv/rtv.c +++ b/src/modules/rtv/rtv.c @@ -11,12 +11,8 @@ /* This implements an MTV-inspired random slideshow of rototiller modules. * - * Eventually it'd be nice to have it show a caption every time a new - * module starts overlaying the name, author, license, etc. - * * Some TODO items: * - optionally persist module contexts so they resume rather than restart - * - runtime-configurable duration */ #define RTV_SNOW_DURATION_SECS 1 @@ -47,6 +43,11 @@ static void * rtv_create_context(unsigned ticks, unsigned num_cpus); static void rtv_destroy_context(void *context); static void rtv_prepare_frame(void *context, unsigned ticks, unsigned n_cpus, fb_fragment_t *fragment, rototiller_fragmenter_t *res_fragmenter); static void rtv_finish_frame(void *context, unsigned ticks, fb_fragment_t *fragment); +static int rtv_setup(const settings_t *settings, setting_desc_t **next_setting); + +static unsigned rtv_duration = RTV_DURATION_SECS; +static unsigned rtv_snow_duration = RTV_SNOW_DURATION_SECS; +static unsigned rtv_caption_duration = RTV_CAPTION_DURATION_SECS; rototiller_module_t rtv_module = { @@ -58,6 +59,7 @@ rototiller_module_t rtv_module = { .description = "Rototiller TV", .author = "Vito Caputo <vcaputo@pengaru.com>", .license = "GPLv2", + .setup = rtv_setup, }; @@ -144,7 +146,7 @@ static void setup_next_module(rtv_context_t *ctxt, unsigned ticks) if (ctxt->module != ctxt->snow_module) { ctxt->last_module = ctxt->module; ctxt->module = ctxt->snow_module; - ctxt->next_switch = now + RTV_SNOW_DURATION_SECS; + ctxt->next_switch = now + rtv_snow_duration; } else { char *setup; size_t i; @@ -176,8 +178,8 @@ static void setup_next_module(rtv_context_t *ctxt, unsigned ticks) free(setup); - ctxt->next_switch = now + RTV_DURATION_SECS; - ctxt->next_hide_caption = now + RTV_CAPTION_DURATION_SECS; + ctxt->next_switch = now + rtv_duration; + ctxt->next_hide_caption = now + rtv_caption_duration; } if (ctxt->module->create_context) @@ -255,3 +257,69 @@ static void rtv_finish_frame(void *context, unsigned ticks, fb_fragment_t *fragm .vert = TXT_VALIGN_BOTTOM }); } + + +static int rtv_setup(const settings_t *settings, setting_desc_t **next_setting) +{ + const char *duration; + const char *caption_duration; + const char *snow_duration; + + duration = settings_get_value(settings, "duration"); + if (!duration) { + int r; + + r = setting_desc_clone(&(setting_desc_t){ + .name = "Channel Duration In Seconds", + .key = "duration", + .regex = "\\.[0-9]+", + .preferred = SETTINGS_STR(RTV_DURATION_SECS), + .annotations = NULL + }, next_setting); + if (r < 0) + return r; + + return 1; + } + + caption_duration = settings_get_value(settings, "caption_duration"); + if (!caption_duration) { + int r; + + r = setting_desc_clone(&(setting_desc_t){ + .name = "Caption Duration In Seconds", + .key = "caption_duration", + .regex = "\\.[0-9]+", + .preferred = SETTINGS_STR(RTV_CAPTION_DURATION_SECS), + .annotations = NULL + }, next_setting); + if (r < 0) + return r; + + return 1; + } + + snow_duration = settings_get_value(settings, "snow_duration"); + if (!snow_duration) { + int r; + + r = setting_desc_clone(&(setting_desc_t){ + .name = "Snow On Channel Switch Duration In Seconds", + .key = "snow_duration", + .regex = "\\.[0-9]+", + .preferred = SETTINGS_STR(RTV_SNOW_DURATION_SECS), + .annotations = NULL + }, next_setting); + if (r < 0) + return r; + + return 1; + } + + /* TODO FIXME: parse errors */ + sscanf(duration, "%u", &rtv_duration); + sscanf(caption_duration, "%u", &rtv_caption_duration); + sscanf(snow_duration, "%u", &rtv_snow_duration); + + return 0; +} |