Skip to content

Commit

Permalink
speakup: extend synth buffer to 16bit unicode characters
Browse files Browse the repository at this point in the history
This extends the synth buffer slots to 16bit, so as to hold 16bit
unicode characters.

synth_buffer_getc and synth_buffer_peek now return 16bit characters.
Speech synthesizers which do not support characters beyond latin1 can
use the synth_buffer_skip_nonlatin1() helper to skip the non-latin1
characters before getting or peeking. All synthesizers are made to use
it for now.

This makes synth_buffer_add take a 16bit character. For simplicity for
now, synth_printf is left to using latin1 formats and strings.
synth_putwc, synth_putwc_s, synth_putws and synth_putws_s helpers are
however added to put 16bit characters and strings.

Signed-off-by: Samuel Thibault <samuel.thibault@ens-lyon.org>
Reviewed-by: Chris Brannon <chris@the-brannons.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
  • Loading branch information
sthibaul authored and gregkh committed Mar 9, 2017
1 parent 981b7ae commit 89fc2ae
Show file tree
Hide file tree
Showing 12 changed files with 70 additions and 15 deletions.
36 changes: 24 additions & 12 deletions drivers/staging/speakup/buffers.c
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,10 @@

#define SYNTH_BUF_SIZE 8192 /* currently 8K bytes */

static u_char synth_buffer[SYNTH_BUF_SIZE]; /* guess what this is for! */
static u_char *buff_in = synth_buffer;
static u_char *buff_out = synth_buffer;
static u_char *buffer_end = synth_buffer + SYNTH_BUF_SIZE - 1;
static u16 synth_buffer[SYNTH_BUF_SIZE]; /* guess what this is for! */
static u16 *buff_in = synth_buffer;
static u16 *buff_out = synth_buffer;
static u16 *buffer_end = synth_buffer + SYNTH_BUF_SIZE - 1;

/* These try to throttle applications by stopping the TTYs
* Note: we need to make sure that we will restart them eventually, which is
Expand Down Expand Up @@ -44,13 +44,13 @@ static void speakup_stop_ttys(void)

static int synth_buffer_free(void)
{
int bytes_free;
int chars_free;

if (buff_in >= buff_out)
bytes_free = SYNTH_BUF_SIZE - (buff_in - buff_out);
chars_free = SYNTH_BUF_SIZE - (buff_in - buff_out);
else
bytes_free = buff_out - buff_in;
return bytes_free;
chars_free = buff_out - buff_in;
return chars_free;
}

int synth_buffer_empty(void)
Expand All @@ -59,7 +59,7 @@ int synth_buffer_empty(void)
}
EXPORT_SYMBOL_GPL(synth_buffer_empty);

void synth_buffer_add(char ch)
void synth_buffer_add(u16 ch)
{
if (!synth->alive) {
/* This makes sure that we won't stop TTYs if there is no synth
Expand All @@ -78,9 +78,9 @@ void synth_buffer_add(char ch)
buff_in = synth_buffer;
}

char synth_buffer_getc(void)
u16 synth_buffer_getc(void)
{
char ch;
u16 ch;

if (buff_out == buff_in)
return 0;
Expand All @@ -91,14 +91,26 @@ char synth_buffer_getc(void)
}
EXPORT_SYMBOL_GPL(synth_buffer_getc);

char synth_buffer_peek(void)
u16 synth_buffer_peek(void)
{
if (buff_out == buff_in)
return 0;
return *buff_out;
}
EXPORT_SYMBOL_GPL(synth_buffer_peek);

void synth_buffer_skip_nonlatin1(void)
{
while (buff_out != buff_in) {
if (*buff_out < 0x100)
return;
buff_out++;
if (buff_out > buffer_end)
buff_out = synth_buffer;
}
}
EXPORT_SYMBOL_GPL(synth_buffer_skip_nonlatin1);

void synth_buffer_clear(void)
{
buff_in = synth_buffer;
Expand Down
2 changes: 1 addition & 1 deletion drivers/staging/speakup/speakup.h
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ void synth_release(void);

void spk_do_flush(void);
void speakup_start_ttys(void);
void synth_buffer_add(char ch);
void synth_buffer_add(u16 ch);
void synth_buffer_clear(void);
void speakup_clear_selection(void);
int speakup_set_selection(struct tty_struct *tty);
Expand Down
1 change: 1 addition & 0 deletions drivers/staging/speakup/speakup_acntpc.c
Original file line number Diff line number Diff line change
Expand Up @@ -196,6 +196,7 @@ static void do_catch_up(struct spk_synth *synth)
synth->flush(synth);
continue;
}
synth_buffer_skip_nonlatin1();
if (synth_buffer_empty()) {
spin_unlock_irqrestore(&speakup_info.spinlock, flags);
break;
Expand Down
1 change: 1 addition & 0 deletions drivers/staging/speakup/speakup_apollo.c
Original file line number Diff line number Diff line change
Expand Up @@ -160,6 +160,7 @@ static void do_catch_up(struct spk_synth *synth)
synth->flush(synth);
continue;
}
synth_buffer_skip_nonlatin1();
if (synth_buffer_empty()) {
spin_unlock_irqrestore(&speakup_info.spinlock, flags);
break;
Expand Down
1 change: 1 addition & 0 deletions drivers/staging/speakup/speakup_decext.c
Original file line number Diff line number Diff line change
Expand Up @@ -175,6 +175,7 @@ static void do_catch_up(struct spk_synth *synth)
synth->flush(synth);
continue;
}
synth_buffer_skip_nonlatin1();
if (synth_buffer_empty()) {
spin_unlock_irqrestore(&speakup_info.spinlock, flags);
break;
Expand Down
1 change: 1 addition & 0 deletions drivers/staging/speakup/speakup_decpc.c
Original file line number Diff line number Diff line change
Expand Up @@ -390,6 +390,7 @@ static void do_catch_up(struct spk_synth *synth)
synth->flush(synth);
continue;
}
synth_buffer_skip_nonlatin1();
if (synth_buffer_empty()) {
spin_unlock_irqrestore(&speakup_info.spinlock, flags);
break;
Expand Down
1 change: 1 addition & 0 deletions drivers/staging/speakup/speakup_dectlk.c
Original file line number Diff line number Diff line change
Expand Up @@ -239,6 +239,7 @@ static void do_catch_up(struct spk_synth *synth)
synth->flush(synth);
continue;
}
synth_buffer_skip_nonlatin1();
if (synth_buffer_empty()) {
spin_unlock_irqrestore(&speakup_info.spinlock, flags);
break;
Expand Down
1 change: 1 addition & 0 deletions drivers/staging/speakup/speakup_dtlk.c
Original file line number Diff line number Diff line change
Expand Up @@ -209,6 +209,7 @@ static void do_catch_up(struct spk_synth *synth)
synth->flush(synth);
continue;
}
synth_buffer_skip_nonlatin1();
if (synth_buffer_empty()) {
spin_unlock_irqrestore(&speakup_info.spinlock, flags);
break;
Expand Down
1 change: 1 addition & 0 deletions drivers/staging/speakup/speakup_keypc.c
Original file line number Diff line number Diff line change
Expand Up @@ -198,6 +198,7 @@ spin_lock_irqsave(&speakup_info.spinlock, flags);
synth->flush(synth);
continue;
}
synth_buffer_skip_nonlatin1();
if (synth_buffer_empty()) {
spin_unlock_irqrestore(&speakup_info.spinlock, flags);
break;
Expand Down
1 change: 1 addition & 0 deletions drivers/staging/speakup/speakup_soft.c
Original file line number Diff line number Diff line change
Expand Up @@ -213,6 +213,7 @@ static ssize_t softsynth_read(struct file *fp, char __user *buf, size_t count,
spin_lock_irqsave(&speakup_info.spinlock, flags);
while (1) {
prepare_to_wait(&speakup_event, &wait, TASK_INTERRUPTIBLE);
synth_buffer_skip_nonlatin1();
if (!synth_buffer_empty() || speakup_info.flushing)
break;
spin_unlock_irqrestore(&speakup_info.spinlock, flags);
Expand Down
9 changes: 7 additions & 2 deletions drivers/staging/speakup/spk_priv.h
Original file line number Diff line number Diff line change
Expand Up @@ -48,8 +48,9 @@ unsigned char spk_serial_in_nowait(void);
int spk_serial_out(const char ch);
void spk_serial_release(void);

char synth_buffer_getc(void);
char synth_buffer_peek(void);
void synth_buffer_skip_nonlatin1(void);
u16 synth_buffer_getc(void);
u16 synth_buffer_peek(void);
int synth_buffer_empty(void);
struct var_t *spk_get_var(enum var_id_t var_id);
ssize_t spk_var_show(struct kobject *kobj, struct kobj_attribute *attr,
Expand All @@ -65,6 +66,10 @@ int spk_synth_is_alive_nop(struct spk_synth *synth);
int spk_synth_is_alive_restart(struct spk_synth *synth);
__printf(1, 2)
void synth_printf(const char *buf, ...);
void synth_putwc(u16 wc);
void synth_putwc_s(u16 wc);
void synth_putws(const u16 *buf);
void synth_putws_s(const u16 *buf);
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);
Expand Down
30 changes: 30 additions & 0 deletions drivers/staging/speakup/synth.c
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,7 @@ void spk_do_catch_up(struct spk_synth *synth)
synth->flush(synth);
continue;
}
synth_buffer_skip_nonlatin1();
if (synth_buffer_empty()) {
spin_unlock_irqrestore(&speakup_info.spinlock, flags);
break;
Expand Down Expand Up @@ -255,6 +256,35 @@ void synth_printf(const char *fmt, ...)
}
EXPORT_SYMBOL_GPL(synth_printf);

void synth_putwc(u16 wc)
{
synth_buffer_add(wc);
}
EXPORT_SYMBOL_GPL(synth_putwc);

void synth_putwc_s(u16 wc)
{
synth_buffer_add(wc);
synth_start();
}
EXPORT_SYMBOL_GPL(synth_putwc_s);

void synth_putws(const u16 *buf)
{
const u16 *p;

for (p = buf; *p; p++)
synth_buffer_add(*p);
}
EXPORT_SYMBOL_GPL(synth_putws);

void synth_putws_s(const u16 *buf)
{
synth_putws(buf);
synth_start();
}
EXPORT_SYMBOL_GPL(synth_putws_s);

static int index_count;
static int sentence_count;

Expand Down

0 comments on commit 89fc2ae

Please sign in to comment.