mirror of
https://github.com/linux-speakup/espeakup.git
synced 2026-08-21 23:34:18 +02:00
initialization update
The main function now initializes espeak and opens the softsynth before starting the threads. This insures that the resources we need are active.
This commit is contained in:
parent
6a15f2cccf
commit
dd00775695
4 changed files with 65 additions and 37 deletions
11
espeakup.c
11
espeakup.c
|
|
@ -104,6 +104,16 @@ int main(int argc, char **argv)
|
|||
}
|
||||
}
|
||||
|
||||
/* Initialize espeak */
|
||||
if (initialize_espeak(&s) < 0) {
|
||||
return 2;
|
||||
}
|
||||
|
||||
/* open the softsynth */
|
||||
if (open_softsynth() < 0) {
|
||||
return 2;
|
||||
}
|
||||
|
||||
/* set up the pipe used to wake the espeak thread */
|
||||
if (pipe(self_pipe_fds) < 0) {
|
||||
perror("Unable to create pipe");
|
||||
|
|
@ -142,6 +152,7 @@ int main(int argc, char **argv)
|
|||
pthread_join(softsynth_thread_id, NULL);
|
||||
pthread_join(espeak_thread_id, NULL);
|
||||
|
||||
espeak_Terminate();
|
||||
if ( ! debug)
|
||||
unlink(pidPath);
|
||||
return 0;
|
||||
|
|
|
|||
|
|
@ -70,8 +70,11 @@ extern void queue_add(void *entry);
|
|||
extern void queue_remove(void);
|
||||
extern void *queue_peek(void);
|
||||
extern void *signal_thread(void *arg);
|
||||
extern void *softsynth_thread(void *arg);
|
||||
extern int initialize_espeak(struct synth_t *s);
|
||||
extern void *espeak_thread(void *arg);
|
||||
extern int open_softsynth(void);
|
||||
extern void close_softsynth(void);
|
||||
extern void *softsynth_thread(void *arg);
|
||||
extern void select_audio_mode(void);
|
||||
extern int init_audio(unsigned int rate);
|
||||
extern void lock_audio_mutex(void);
|
||||
|
|
|
|||
34
softsynth.c
34
softsynth.c
|
|
@ -28,10 +28,12 @@
|
|||
#include "espeakup.h"
|
||||
|
||||
/* max buffer size */
|
||||
const size_t maxBufferSize = 1025;
|
||||
static const size_t maxBufferSize = 1025;
|
||||
|
||||
/* synth flush character */
|
||||
const int synthFlushChar = 0x18;
|
||||
static const int synthFlushChar = 0x18;
|
||||
|
||||
static int softFD = 0;
|
||||
|
||||
static void queue_add_cmd(enum command_t cmd, enum adjust_t adj, int value)
|
||||
{
|
||||
|
|
@ -175,6 +177,24 @@ static void request_espeak_stop(void)
|
|||
pthread_mutex_unlock(&queue_guard);
|
||||
}
|
||||
|
||||
int open_softsynth(void)
|
||||
{
|
||||
int rc = 0;
|
||||
/* open the softsynth. */
|
||||
softFD = open("/dev/softsynth", O_RDWR | O_NONBLOCK);
|
||||
if (softFD < 0) {
|
||||
perror("Unable to open the softsynth device");
|
||||
rc = -1;
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
|
||||
void close_softsynth(void)
|
||||
{
|
||||
if (softFD)
|
||||
close(softFD);
|
||||
}
|
||||
|
||||
void *softsynth_thread(void *arg)
|
||||
{
|
||||
struct synth_t *s = (struct synth_t *) arg;
|
||||
|
|
@ -183,16 +203,8 @@ void *softsynth_thread(void *arg)
|
|||
char buf[maxBufferSize];
|
||||
char *cp;
|
||||
int terminalFD = PIPE_READ_FD;
|
||||
int softFD;
|
||||
int greatestFD;
|
||||
|
||||
/* open the softsynth. */
|
||||
softFD = open("/dev/softsynth", O_RDWR | O_NONBLOCK);
|
||||
if (softFD < 0) {
|
||||
perror("Unable to open the softsynth device");
|
||||
should_run = 0;
|
||||
}
|
||||
|
||||
if (terminalFD > softFD)
|
||||
greatestFD = terminalFD;
|
||||
else
|
||||
|
|
@ -231,7 +243,5 @@ void *softsynth_thread(void *arg)
|
|||
}
|
||||
process_buffer(s, buf, length);
|
||||
}
|
||||
if (softFD)
|
||||
close(softFD);
|
||||
return NULL;
|
||||
}
|
||||
|
|
|
|||
56
synth.c
56
synth.c
|
|
@ -206,6 +206,36 @@ static void queue_clear()
|
|||
}
|
||||
}
|
||||
|
||||
int initialize_espeak(struct synth_t *s)
|
||||
{
|
||||
int rate;
|
||||
|
||||
/* initialize espeak */
|
||||
select_audio_mode();
|
||||
rate = espeak_Initialize(audio_mode, 0, NULL, 0);
|
||||
if (rate < 0) {
|
||||
fprintf(stderr, "Unable to initialize espeak.\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (init_audio((unsigned int) rate) < 0) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Setup initial voice parameters */
|
||||
if (defaultVoice) {
|
||||
set_voice(s, defaultVoice);
|
||||
free(defaultVoice);
|
||||
defaultVoice = NULL;
|
||||
}
|
||||
set_frequency(s, defaultFrequency, ADJ_SET);
|
||||
set_pitch(s, defaultPitch, ADJ_SET);
|
||||
set_rate(s, defaultRate, ADJ_SET);
|
||||
set_volume(s, defaultVolume, ADJ_SET);
|
||||
espeak_SetParameter(espeakCAPITALS, 0, 0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* espeak_thread is the "main" function of our secondary (queue-processing)
|
||||
* thread.
|
||||
* First, lock queue_guard, because it needs to be locked when we call
|
||||
|
|
@ -225,35 +255,9 @@ static void queue_clear()
|
|||
* 1. We are waiting on runner_awake, or
|
||||
* 2. We are processing an entry that has just been removed from the queue.
|
||||
*/
|
||||
|
||||
void *espeak_thread(void *arg)
|
||||
{
|
||||
struct synth_t *s = (struct synth_t *) arg;
|
||||
int rate;
|
||||
|
||||
/* initialize espeak */
|
||||
select_audio_mode();
|
||||
rate = espeak_Initialize(audio_mode, 0, NULL, 0);
|
||||
if (rate < 0) {
|
||||
fprintf(stderr, "Unable to initialize espeak.\n");
|
||||
should_run = 0;
|
||||
}
|
||||
|
||||
if (init_audio((unsigned int) rate) < 0) {
|
||||
should_run = 0;
|
||||
}
|
||||
|
||||
/* Setup initial voice parameters */
|
||||
if (defaultVoice) {
|
||||
set_voice(s, defaultVoice);
|
||||
free(defaultVoice);
|
||||
defaultVoice = NULL;
|
||||
}
|
||||
set_frequency(s, defaultFrequency, ADJ_SET);
|
||||
set_pitch(s, defaultPitch, ADJ_SET);
|
||||
set_rate(s, defaultRate, ADJ_SET);
|
||||
set_volume(s, defaultVolume, ADJ_SET);
|
||||
espeak_SetParameter(espeakCAPITALS, 0, 0);
|
||||
|
||||
pthread_mutex_lock(&queue_guard);
|
||||
while (should_run) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue