From: Carl Worth Date: Sun, 29 Mar 2009 23:23:15 +0000 (-0700) Subject: Add support for audio challenges as well. X-Git-Url: https://git.cworth.org/git?p=mnemon;a=commitdiff_plain;h=4afda67e5f06fd1a8e77459355a325a42cd2d594 Add support for audio challenges as well. This will work with anything supported by the play command. It's still cheesy in that it uses system like the image support, but at least the audio support doesn't use killall. --- diff --git a/mnemon.c b/mnemon.c index 74eb2c0..87e1fd0 100644 --- a/mnemon.c +++ b/mnemon.c @@ -35,6 +35,12 @@ #include #include +#define ASSERT_NOT_REACHED \ +do { \ + static const int NOT_REACHED = 0; \ + assert (NOT_REACHED); \ +} while (0) + typedef int bool_t; typedef struct _item { @@ -57,7 +63,8 @@ typedef enum { typedef enum { CHALLENGE_TYPE_TEXT, - CHALLENGE_TYPE_IMAGE + CHALLENGE_TYPE_IMAGE, + CHALLENGE_TYPE_AUDIO } challenge_type_t; typedef struct _category { @@ -278,6 +285,9 @@ category_print (category_t *category, case CHALLENGE_TYPE_IMAGE: fprintf (file, "image"); break; + case CHALLENGE_TYPE_AUDIO: + fprintf (file, "audio"); + break; } fprintf (file, "\n\n"); @@ -642,6 +652,8 @@ mnemon_load_category (mnemon_t *mnemon, category->challenge_type = CHALLENGE_TYPE_TEXT; } else if (strcmp (value, "image") == 0) { category->challenge_type = CHALLENGE_TYPE_IMAGE; + } else if (strcmp (value, "audio") == 0) { + category->challenge_type = CHALLENGE_TYPE_AUDIO; } else { fprintf (stderr, "Unknown value for \"challenge\" option \"%s\" at %s:%d\n", value, path, line_count); @@ -1143,26 +1155,51 @@ mnemon_handle_response (mnemon_t *mnemon, } static void -mnemon_show_image (mnemon_t *mnemon, const char *filename) +mnemon_show_challenge (mnemon_t *mnemon, + challenge_type_t challenge_type, + const char *challenge) { + const char *program; char *command; + if (challenge_type == CHALLENGE_TYPE_TEXT) { + printf ("%s\n", challenge); + return; + } + /* XXX: Yes, shelling out to system is total cheese. The planned * fix here is to bring graphical display in process, (or at least * have a custom external program that accepts image filenames on * stdin. */ - xasprintf (&command, "xli -gamma 2.2 %s >/dev/null 2>&1 &", - filename); + switch (challenge_type) { + case CHALLENGE_TYPE_TEXT: + ASSERT_NOT_REACHED; + break; + case CHALLENGE_TYPE_IMAGE: + program = "xli -gamma 2.2"; + break; + case CHALLENGE_TYPE_AUDIO: + program = "play"; + break; + } + + xasprintf (&command, "%s %s/%s >/dev/null 2>&1 &", + program, + mnemon->dir_name, + challenge); system (command); free (command); } static void -mnemon_hide_image (mnemon_t *mnemon) +mnemon_hide_challenge (mnemon_t *mnemon, challenge_type_t challenge_type) { char * command; + if (challenge_type != CHALLENGE_TYPE_IMAGE) + return; + /* XXX: And this is just embarrassing (obviously wrong in several * ways). Hopefully I'll amend away any commit that includes this. */ @@ -1223,28 +1260,14 @@ mnemon_do_challenges (mnemon_t *mnemon) free (response); } - switch (category->challenge_type) { - case CHALLENGE_TYPE_TEXT: - printf ("%s\n", item->challenge); - break; - case CHALLENGE_TYPE_IMAGE: - { - char *absolute_filename; - - xasprintf (&absolute_filename, "%s/%s", - mnemon->dir_name, item->challenge); - mnemon_show_image (mnemon, absolute_filename); - free (absolute_filename); - } - break; - } + mnemon_show_challenge (mnemon, category->challenge_type, + item->challenge); gettimeofday (&start, NULL); response = readline ("> "); gettimeofday (&end, NULL); - if (category->challenge_type == CHALLENGE_TYPE_IMAGE) - mnemon_hide_image (mnemon); + mnemon_hide_challenge (mnemon, category->challenge_type); /* Terminate on EOF */ if (response == NULL) {