From ae3c33ec8cb9ad8e08f1609def6653f85e7596c0 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sat, 28 Jan 2023 13:01:21 +0530 Subject: [PATCH] Implement rate control --- src/calibre/utils/windows/winspeech.cpp | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/src/calibre/utils/windows/winspeech.cpp b/src/calibre/utils/windows/winspeech.cpp index eea73795be..4dd7a1ddb2 100644 --- a/src/calibre/utils/windows/winspeech.cpp +++ b/src/calibre/utils/windows/winspeech.cpp @@ -442,12 +442,27 @@ class Synthesizer { } } - double volume() const { return synth.Options().AudioVolume(); } + double volume() const { + return synth.Options().AudioVolume(); + } + void volume(double val) { if (val < 0 || val > 1) throw std::out_of_range("Invalid volume value must be between 0 and 1"); + std::scoped_lock sl(recursive_lock); synth.Options().AudioVolume(val); } + double rate() const { + return synth.Options().SpeakingRate(); + } + + void rate(double val) { + if (val < 0.5 || val > 6.0) throw std::out_of_range("Invalid rate value must be between 0.5 and 6"); + std::scoped_lock sl(recursive_lock); + synth.Options().SpeakingRate(val); + } + + }; static Synthesizer sx; @@ -789,6 +804,13 @@ handle_stdin_message(winrt::hstring const &&msg) { } output(cmd_id, "volume", {{"value", sx.volume()}}); } + else if (command == L"rate") { + if (parts.size()) { + auto rate = parse_double(parts[0].data()); + sx.rate(rate); + } + output(cmd_id, "rate", {{"value", sx.rate()}}); + } else if (command == L"save") { handle_save(cmd_id, parts); }