staging: speakup: Add pause command used on switching to graphical mode
authorSamuel Thibault <samuel.thibault@ens-lyon.org>
Wed, 2 May 2018 00:56:10 +0000 (02:56 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 7 May 2018 02:02:37 +0000 (19:02 -0700)
For software speech syntheses to be able to manage concurrent audio card
access, they need to know when speakup stops emitting text to be spoken
because the console has switched to graphical mode.  This introduces a
PAUSE command to do so.

Signed-off-by: Samuel Thibault <samuel.thibault@ens-lyon.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/speakup/buffers.c
drivers/staging/speakup/main.c
drivers/staging/speakup/speakup.h
drivers/staging/speakup/speakup_dummy.c
drivers/staging/speakup/speakup_soft.c
drivers/staging/speakup/spk_types.h
drivers/staging/speakup/varhandlers.c

index 461f131644a234a0425ea3f244e818ad31307e8c..5fa7c2f7ce5d50d7e635b29f462d9d1b93f8ec60 100644 (file)
@@ -77,6 +77,9 @@ void synth_buffer_add(u16 ch)
        *buff_in++ = ch;
        if (buff_in > buffer_end)
                buff_in = synth_buffer;
+       /* We have written something to the speech synthesis, so we are not
+        * paused any more. */
+       spk_paused = 0;
 }
 
 u16 synth_buffer_getc(void)
index af30b7099bedfaba607c188aae3064bce8d98d3a..b7fae36d41d96343e2ea4e3950653cb250b0f683 100644 (file)
@@ -67,6 +67,8 @@ short spk_punc_mask;
 int spk_punc_level, spk_reading_punc;
 char spk_str_caps_start[MAXVARLEN + 1] = "\0";
 char spk_str_caps_stop[MAXVARLEN + 1] = "\0";
+char spk_str_pause[MAXVARLEN + 1] = "\0";
+bool spk_paused = 0;
 const struct st_bits_data spk_punc_info[] = {
        {"none", "", 0},
        {"some", "/$%&@", SOME},
@@ -1782,6 +1784,11 @@ static void speakup_con_update(struct vc_data *vc)
                /* Speakup output, discard */
                return;
        speakup_date(vc);
+       if (vc->vc_mode == KD_GRAPHICS && !spk_paused && spk_str_pause[0])
+       {
+               synth_printf("%s", spk_str_pause);
+               spk_paused = 1;
+       }
        spin_unlock_irqrestore(&speakup_info.spinlock, flags);
 }
 
index 3d8bda8b96202383b813ad5a57eab798bfd759aa..e4f4f00be2dcf551a7df909db879e554f95f7e2b 100644 (file)
@@ -94,7 +94,8 @@ extern struct spk_synth *synth;
 extern char spk_pitch_buff[];
 extern u_char *spk_our_keys[];
 extern short spk_punc_masks[];
-extern char spk_str_caps_start[], spk_str_caps_stop[];
+extern char spk_str_caps_start[], spk_str_caps_stop[], spk_str_pause[];
+extern bool spk_paused;
 extern const struct st_bits_data spk_punc_info[];
 extern u_char spk_key_buf[600];
 extern char *spk_characters[];
index aa0c900f79f2618c9ac7b33af86d189e7e8ae8d5..7df1a84297f632784aaaf756c5ed63759bf9a04e 100644 (file)
@@ -21,6 +21,7 @@
 static struct var_t vars[] = {
        { CAPS_START, .u.s = {"CAPS_START\n" } },
        { CAPS_STOP, .u.s = {"CAPS_STOP\n" } },
+       { PAUSE, .u.s = {"PAUSE\n"} },
        { RATE, .u.n = {"RATE %d\n", 8, 1, 16, 0, 0, NULL } },
        { PITCH, .u.n = {"PITCH %d\n", 8, 0, 16, 0, 0, NULL } },
        { VOL, .u.n = {"VOL %d\n", 8, 0, 16, 0, 0, NULL } },
index 0a1a7c259ab0aacdbbe278ab130508a5bdbde6c7..a61bc41b82d7845f29dda7cd34669a2311833896 100644 (file)
@@ -35,6 +35,7 @@ static int misc_registered;
 static struct var_t vars[] = {
        { CAPS_START, .u.s = {"\x01+3p" } },
        { CAPS_STOP, .u.s = {"\x01-3p" } },
+       { PAUSE, .u.n = {"\x01P" } },
        { RATE, .u.n = {"\x01%ds", 2, 0, 9, 0, 0, NULL } },
        { PITCH, .u.n = {"\x01%dp", 5, 0, 9, 0, 0, NULL } },
        { VOL, .u.n = {"\x01%dv", 5, 0, 9, 0, 0, NULL } },
@@ -154,7 +155,7 @@ static char *get_initstring(void)
        var = synth_soft.vars;
        while (var->var_id != MAXVARS) {
                if (var->var_id != CAPS_START && var->var_id != CAPS_STOP &&
-                   var->var_id != DIRECT)
+                   var->var_id != PAUSE && var->var_id != DIRECT)
                        cp = cp + sprintf(cp, var->u.n.synth_fmt,
                                          var->u.n.value);
                var++;
index 4203bed90b4f4b98342d7b6d725ee041e5896e14..3e082dc3d45cec002a4fdc48753ec7b249c9e203 100644 (file)
@@ -42,7 +42,7 @@ enum var_id_t {
        SAY_CONTROL, SAY_WORD_CTL, NO_INTERRUPT, KEY_ECHO,
        SPELL_DELAY, PUNC_LEVEL, READING_PUNC,
        ATTRIB_BLEEP, BLEEPS,
-       RATE, PITCH, VOL, TONE, PUNCT, VOICE, FREQUENCY, LANG, DIRECT,
+       RATE, PITCH, VOL, TONE, PUNCT, VOICE, FREQUENCY, LANG, DIRECT, PAUSE,
        CAPS_START, CAPS_STOP, CHARTAB,
        MAXVARS
 };
index 321405532a8ea57132c4f924499b7c7509a73e1e..54a76b6752ad126b900e5edcf06640526084070a 100644 (file)
@@ -45,6 +45,7 @@ static struct st_var_header var_headers[] = {
        { "lang", LANG, VAR_NUM, NULL, NULL },
        { "chartab", CHARTAB, VAR_PROC, NULL, NULL },
        { "direct", DIRECT, VAR_NUM, NULL, NULL },
+       { "pause", PAUSE, VAR_STRING, spk_str_pause, NULL },
 };
 
 static struct st_var_header *var_ptrs[MAXVARS] = { NULL, NULL, NULL };