diff options
author | William Hubbs <w.d.hubbs@gmail.com> | 2010-10-07 13:20:02 -0500 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2010-10-07 19:22:31 -0700 |
commit | c6e3fd22cd538365bfeb82997d5b89562e077d42 (patch) | |
tree | 5eaa170c9003abc7b24ab340ccabe889cba47992 /drivers/staging/speakup/thread.c | |
parent | e59fe083f683ca2ca56abefad290d110808a6fb5 (diff) | |
download | op-kernel-dev-c6e3fd22cd538365bfeb82997d5b89562e077d42.zip op-kernel-dev-c6e3fd22cd538365bfeb82997d5b89562e077d42.tar.gz |
Staging: add speakup to the staging directory
Speakup is a kernel based screen review package for the linux operating
system. It allows blind users to interact with applications on the
linux console by means of synthetic speech.
The authors and maintainers of this code include the following:
Kirk Reiser, Andy Berdan, John Covici, Brian and
David Borowski, Christopher Brannon, Samuel Thibault and William Hubbs.
Signed-off-by: William Hubbs <w.d.hubbs@gmail.com>
Signed-off-by: Samuel Thibault <samuel.thibault@ens-lyon.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/staging/speakup/thread.c')
-rw-r--r-- | drivers/staging/speakup/thread.c | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/drivers/staging/speakup/thread.c b/drivers/staging/speakup/thread.c new file mode 100644 index 0000000..84531e7 --- /dev/null +++ b/drivers/staging/speakup/thread.c @@ -0,0 +1,58 @@ +#include <linux/kthread.h> +#include <linux/wait.h> + +#include "spk_types.h" +#include "speakup.h" +#include "spk_priv.h" + +DECLARE_WAIT_QUEUE_HEAD(speakup_event); +EXPORT_SYMBOL_GPL(speakup_event); + +int speakup_thread(void *data) +{ + unsigned long flags; + int should_break; + struct bleep our_sound; + + our_sound.active = 0; + our_sound.freq = 0; + our_sound.jiffies = 0; + + mutex_lock(&spk_mutex); + while (1) { + DEFINE_WAIT(wait); + while(1) { + spk_lock(flags); + our_sound = unprocessed_sound; + unprocessed_sound.active = 0; + prepare_to_wait(&speakup_event, &wait, TASK_INTERRUPTIBLE); + should_break = kthread_should_stop() || + our_sound.active || + (synth && synth->catch_up && synth->alive && + (speakup_info.flushing || + !synth_buffer_empty())); + spk_unlock(flags); + if (should_break) + break; + mutex_unlock(&spk_mutex); + schedule(); + mutex_lock(&spk_mutex); + } + finish_wait(&speakup_event, &wait); + if (kthread_should_stop()) + break; + + if (our_sound.active) { + kd_mksound(our_sound.freq, our_sound.jiffies); + } + if (synth && synth->catch_up && synth->alive) { + /* It is up to the callee to take the lock, so that it + * can sleep whenever it likes */ + synth->catch_up(synth); + } + + speakup_start_ttys(); + } + mutex_unlock(&spk_mutex); + return 0; +} |