patch "staging: speakup_soft: Fix alternate speech with other synths" added to staging-linus
Subsystems (2)
This is a note to let you know that I've just added the patch titled
staging: speakup_soft: Fix alternate speech with other synths
to my staging git tree which can be found at
git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging.git
in the staging-linus branch.
The patch will show up in the next release of the linux-next tree (usually sometime within the next 24 hours during the week.)
The patch will hopefully also be merged in Linus's tree for the next -rc kernel release.
If you have any questions about this process, please let me know.
From 45ac7b31bc6c4af885cc5b5d6c534c15bcbe7643 Mon Sep 17 00:00:00 2001
From: Samuel Thibault <[email protected]>
Date: Thu, 7 Mar 2019 23:06:57 +0100
Subject: staging: speakup_soft: Fix alternate speech with other synths
When switching from speakup_soft to another synth, speakup_soft would keep calling synth_buffer_getc() from softsynthx_read.
Let's thus make synth.c export the knowledge of the current synth, so that speakup_soft can determine whether it should be running.
speakup_soft also needs to set itself alive, otherwise the switch would let it remain silent.
--- drivers/staging/speakup/speakup_soft.c | 16 +++++++++++----- drivers/staging/speakup/spk_priv.h | 1 + drivers/staging/speakup/synth.c | 6 ++++++ 3 files changed, 18 insertions(+), 5 deletions(-)
drivers/staging/speakup/speakup_soft.c +11 -5
@@ -210,12 +210,15 @@ static ssize_t softsynthx_read(struct file *fp, char __user *buf, size_t count,return -EINVAL ;spin_lock_irqsave (&speakup_info.spinlock, flags); + synth_soft.alive =1 ;while (1 ) {prepare_to_wait (&speakup_event, &wait,TASK_INTERRUPTIBLE ); -if (!unicode) -synth_buffer_skip_nonlatin1 (); -if (!synth_buffer_empty () || speakup_info.flushing) -break ; +if (synth_current () == &synth_soft) { +if (!unicode) +synth_buffer_skip_nonlatin1 (); +if (!synth_buffer_empty () || speakup_info.flushing) +break ; + }spin_unlock_irqrestore (&speakup_info.spinlock, flags);if (fp->f_flags &O_NONBLOCK ) {finish_wait (&speakup_event, &wait);
@@ -235,6 +238,8 @@ static ssize_t softsynthx_read(struct file *fp, char __user *buf, size_t count,/* Keep 3 bytes available for a 16bit UTF-8-encoded character */ while (chars_sent <= count - bytes_per_ch) { +if (synth_current () != &synth_soft) +break ;if (speakup_info.flushing) { speakup_info.flushing =0 ; ch ='\x18' ;
@@ -331,7 +336,8 @@ static __poll_t softsynth_poll(struct file *fp, struct poll_table_struct *wait)poll_wait (fp, &speakup_event, wait);spin_lock_irqsave (&speakup_info.spinlock, flags); -if (!synth_buffer_empty () || speakup_info.flushing) +if (synth_current () == &synth_soft && + (!synth_buffer_empty () || speakup_info.flushing)) ret =EPOLLIN |EPOLLRDNORM ;spin_unlock_irqrestore (&speakup_info.spinlock, flags);return ret;
drivers/staging/speakup/spk_priv.h +1 -0
@@ -74,6 +74,7 @@ int synth_request_region(unsigned long start, unsigned long n);int synth_release_region (unsigned long start,unsigned long n);int synth_add (struct spk_synth *in_synth);void synth_remove (struct spk_synth *in_synth); +struct spk_synth *synth_current (void );extern struct speakup_info_t speakup_info;
drivers/staging/speakup/synth.c +6 -0
@@ -481,4 +481,10 @@ void synth_remove(struct spk_synth *in_synth) }EXPORT_SYMBOL_GPL (synth_remove); +struct spk_synth *synth_current (void ) +{ +return synth; +} +EXPORT_SYMBOL_GPL (synth_current); +short spk_punc_masks[] = {0 ,SOME ,MOST ,PUNC ,PUNC |B_SYM };
Signature · 1 line
2.21.0