Quellcodebibliothek Statistik Leitseite products/Sources/formale Sprachen/C/Linux/drivers/accessibility/speakup/   (Open Source Betriebssystem Version 6.17.9©)  Datei vom 24.10.2025 mit Größe 2 kB image not shown  

Quelle  buffers.c   Sprache: C

 
// SPDX-License-Identifier: GPL-2.0
#include <linux/console.h>
#include <linux/types.h>
#include <linux/wait.h>

#include "speakup.h"
#include "spk_priv.h"

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

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
 * usually not possible to do from the notifiers. TODO: it should be possible
 * starting from linux 2.6.26.
 *
 * So we only stop when we know alive == 1 (else we discard the data anyway),
 * and the alive synth will eventually call start_ttys from the thread context.
 */

void speakup_start_ttys(void)
{
 int i;

 for (i = 0; i < MAX_NR_CONSOLES; i++) {
  if (speakup_console[i] && speakup_console[i]->tty_stopped)
   continue;
  if (vc_cons[i].d && vc_cons[i].d->port.tty)
   start_tty(vc_cons[i].d->port.tty);
 }
}
EXPORT_SYMBOL_GPL(speakup_start_ttys);

static void speakup_stop_ttys(void)
{
 int i;

 for (i = 0; i < MAX_NR_CONSOLES; i++)
  if (vc_cons[i].d && vc_cons[i].d->port.tty)
   stop_tty(vc_cons[i].d->port.tty);
}

static int synth_buffer_free(void)
{
 int chars_free;

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

int synth_buffer_empty(void)
{
 return (buff_in == buff_out);
}
EXPORT_SYMBOL_GPL(synth_buffer_empty);

void synth_buffer_add(u16 ch)
{
 if (!synth->alive) {
  /* This makes sure that we won't stop TTYs if there is no synth
 * to restart them
 */

  return;
 }
 if (synth_buffer_free() <= 100) {
  synth_start();
  speakup_stop_ttys();
 }
 if (synth_buffer_free() <= 1)
  return;
 *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 = false;
}

u16 synth_buffer_getc(void)
{
 u16 ch;

 if (buff_out == buff_in)
  return 0;
 ch = *buff_out++;
 if (buff_out > buffer_end)
  buff_out = synth_buffer;
 return ch;
}
EXPORT_SYMBOL_GPL(synth_buffer_getc);

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;
 buff_out = synth_buffer;
}
EXPORT_SYMBOL_GPL(synth_buffer_clear);

Messung V0.5
C=97 H=97 G=96

¤ Dauer der Verarbeitung: 0.9 Sekunden  (vorverarbeitet)  ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

Beweissystem der NASA

Beweissystem Isabelle

NIST Cobol Testsuite

Cephes Mathematical Library

Wiener Entwicklungsmethode

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.