diff --git a/synth.c b/synth.c new file mode 100644 index 0000000..d2e6dd4 --- /dev/null +++ b/synth.c @@ -0,0 +1,141 @@ +/* + * espeakup - interface which allows speakup to use espeak + * + * Copyright (C) 2008 William Hubbs + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include + +#include "espeakup.h" + +/* multipliers and offsets */ +const int frequencyMultiplier = 11; +const int pitchMultiplier = 11; +int rateMultiplier = 34; +int rateOffset = 84; +const int volumeMultiplier = 22; + +espeak_ERROR set_frequency(struct synth_t *s, int freq, enum adjust_t adj) +{ + espeak_ERROR rc; + + if (adj == ADJ_DEC) + freq = -freq; + if (adj != ADJ_SET) + freq += s->frequency; + rc = espeak_SetParameter(espeakRANGE, freq * frequencyMultiplier, 0); + if (rc == EE_OK) + s->frequency = freq; + return rc; +} + +espeak_ERROR set_pitch(struct synth_t * s, int pitch, enum adjust_t adj) +{ + espeak_ERROR rc; + + if (adj == ADJ_DEC) + pitch = -pitch; + if (adj != ADJ_SET) + pitch += s->pitch; + rc = espeak_SetParameter(espeakPITCH, pitch * pitchMultiplier, 0); + if (rc == EE_OK) + s->pitch = pitch; + return rc; +} + +espeak_ERROR set_range(struct synth_t * s, int range, enum adjust_t adj) +{ + espeak_ERROR rc; + + if (adj == ADJ_DEC) + range = -range; + if (adj != ADJ_SET) + range += s->range; + rc = espeak_SetParameter(espeakRANGE, range, 0); + if (rc == EE_OK) + s->range = range; + return rc; +} + +espeak_ERROR set_punctuation(struct synth_t * s, int punct, + enum adjust_t adj) +{ + espeak_ERROR rc; + + if (adj == ADJ_DEC) + punct = -punct; + if (adj != ADJ_SET) + punct += s->punct; + rc = espeak_SetParameter(espeakPUNCTUATION, punct, 0); + if (rc == EE_OK) + s->punct = punct; + return rc; +} + +espeak_ERROR set_rate(struct synth_t * s, int rate, enum adjust_t adj) +{ + espeak_ERROR rc; + + if (adj == ADJ_DEC) + rate = -rate; + if (adj != ADJ_SET) + rate += s->rate; + rc = espeak_SetParameter(espeakRATE, + rate * rateMultiplier + rateOffset, 0); + if (rc == EE_OK) + s->rate = rate; + return rc; +} + +espeak_ERROR set_voice(struct synth_t * s, char *voice) +{ + espeak_ERROR rc; + + rc = espeak_SetVoiceByName(voice); + if (rc == EE_OK) + strcpy(s->voice, voice); + return rc; +} + +espeak_ERROR set_volume(struct synth_t * s, int vol, enum adjust_t adj) +{ + espeak_ERROR rc; + + if (adj == ADJ_DEC) + vol = -vol; + if (adj != ADJ_SET) + vol += s->volume; + rc = espeak_SetParameter(espeakVOLUME, (vol + 1) * volumeMultiplier, + 0); + if (rc == EE_OK) + s->volume = vol; + + return rc; +} + +espeak_ERROR stop_speech(void) +{ + return (espeak_Cancel()); +} + +espeak_ERROR speak_text(struct synth_t * s) +{ + espeak_ERROR rc; + + rc = espeak_Synth(s->buf, s->len + 1, 0, POS_CHARACTER, 0, 0, NULL, + NULL); + return rc; +}