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.
#include <readline/readline.h>
#include <readline/history.h>
#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 {
typedef int bool_t;
typedef struct _item {
typedef enum {
CHALLENGE_TYPE_TEXT,
typedef enum {
CHALLENGE_TYPE_TEXT,
+ CHALLENGE_TYPE_IMAGE,
+ CHALLENGE_TYPE_AUDIO
} challenge_type_t;
typedef struct _category {
} challenge_type_t;
typedef struct _category {
case CHALLENGE_TYPE_IMAGE:
fprintf (file, "image");
break;
case CHALLENGE_TYPE_IMAGE:
fprintf (file, "image");
break;
+ case CHALLENGE_TYPE_AUDIO:
+ fprintf (file, "audio");
+ break;
}
fprintf (file, "\n\n");
}
fprintf (file, "\n\n");
category->challenge_type = CHALLENGE_TYPE_TEXT;
} else if (strcmp (value, "image") == 0) {
category->challenge_type = CHALLENGE_TYPE_IMAGE;
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);
} else {
fprintf (stderr, "Unknown value for \"challenge\" option \"%s\" at %s:%d\n",
value, path, line_count);
-mnemon_show_image (mnemon_t *mnemon, const char *filename)
+mnemon_show_challenge (mnemon_t *mnemon,
+ challenge_type_t challenge_type,
+ const char *challenge)
+ 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.
*/
/* 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
system (command);
free (command);
}
static void
-mnemon_hide_image (mnemon_t *mnemon)
+mnemon_hide_challenge (mnemon_t *mnemon, challenge_type_t challenge_type)
+ 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.
*/
/* XXX: And this is just embarrassing (obviously wrong in several
* ways). Hopefully I'll amend away any commit that includes this.
*/
- 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);
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) {
/* Terminate on EOF */
if (response == NULL) {