From ef68c3f469a60e63b4ddc85a057783d9bb69d6bc Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Fri, 13 Nov 2020 14:04:25 +0530 Subject: [PATCH] Getting and setting of parameters --- src/calibre/utils/tts/espeak.cpp | 35 +++++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/src/calibre/utils/tts/espeak.cpp b/src/calibre/utils/tts/espeak.cpp index 1dfac65617..ff4b657121 100644 --- a/src/calibre/utils/tts/espeak.cpp +++ b/src/calibre/utils/tts/espeak.cpp @@ -135,6 +135,30 @@ synchronize(PyObject *self, PyObject *args) { Py_RETURN_NONE; } +static PyObject* +set_parameter(PyObject *self, PyObject *args) { + espeak_PARAMETER param; + int value, relative = 0; + if (!PyArg_ParseTuple(args, "ii|i", ¶m, &value, &relative)) return NULL; + espeak_ERROR err; + Py_BEGIN_ALLOW_THREADS; + err = espeak_SetParameter(param, value, relative); + Py_END_ALLOW_THREADS; + if (err != EE_OK) return espeak_error("Failed to set set parameter", err); + Py_RETURN_NONE; +} + +static PyObject* +get_parameter(PyObject *self, PyObject *args) { + espeak_PARAMETER param; + int current = 1; + if (!PyArg_ParseTuple(args, "i|i", ¶m, ¤t)) return NULL; + long ans; + Py_BEGIN_ALLOW_THREADS; + ans = espeak_GetParameter(param, current); + Py_END_ALLOW_THREADS; + return PyLong_FromLong(ans); +} // Boilerplate {{{ #define M(name, args, doc) { #name, (PyCFunction)name, args, ""} @@ -143,6 +167,8 @@ static PyMethodDef methods[] = { M(cancel, METH_NOARGS, "cancel all ongoing speech activity"), M(synchronize, METH_NOARGS, "synchronize all ongoing speech activity"), M(is_playing, METH_NOARGS, "True iff speech is happening"), + M(set_parameter, METH_VARARGS, "set speech parameter"), + M(get_parameter, METH_VARARGS, "get speech parameter"), M(list_voices, METH_VARARGS | METH_KEYWORDS, "list available voices"), M(set_voice_by_properties, METH_VARARGS | METH_KEYWORDS, "set voice by properties"), {NULL, NULL, 0, NULL} @@ -151,7 +177,14 @@ static PyMethodDef methods[] = { static int exec_module(PyObject *m) { -#define AI(name) if (PyModule_AddIntMacro(m, name) != 0) { return -1; } +#define AI(name) if (PyModule_AddIntConstant(m, #name, espeak##name) != 0) { return -1; } + AI(RATE); + AI(VOLUME); + AI(PITCH); + AI(RANGE); + AI(PUNCTUATION); + AI(CAPITALS); + AI(WORDGAP); #undef AI EspeakError = PyErr_NewException("espeak.EspeakError", NULL, NULL); if (EspeakError == NULL) return -1;