]> git.cworth.org Git - mnemon/commitdiff
Add support for audio challenges as well.
authorCarl Worth <cworth@cworth.org>
Sun, 29 Mar 2009 23:23:15 +0000 (16:23 -0700)
committerCarl Worth <cworth@cworth.org>
Sun, 29 Mar 2009 23:23:15 +0000 (16:23 -0700)
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.

mnemon.c

index 74eb2c0a036034f44cba334861845afc863d1e6b..87e1fd08b6530089cca9d12270405d0b1569d1c7 100644 (file)
--- a/mnemon.c
+++ b/mnemon.c
 #include <readline/readline.h>
 #include <readline/history.h>
 
+#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) {