Fenrir should no longer fail to report its current speech-dispatcher module.

This commit is contained in:
Storm Dragon
2026-08-13 08:32:47 -04:00
parent a2e4a8a086
commit e7f69b2159
2 changed files with 116 additions and 2 deletions
@@ -66,6 +66,23 @@ class driver(speech_driver):
self._sd = speechd.SSIPClient("fenrir-dev")
self._punct = speechd.PunctuationMode()
self._is_initialized = True
configured_module = self.env["runtime"][
"SettingsManager"
].get_setting("speech", "module")
if not configured_module:
try:
active_module = self._sd.get_output_module()
if active_module:
self.module = active_module
self.env["runtime"]["SettingsManager"].set_setting(
"speech", "module", active_module
)
except Exception as e:
self.env["runtime"]["DebugManager"].write_debug_out(
"SpeechDriver get_output_module:" + str(e),
debug.DebugLevel.ERROR,
)
except Exception as e:
self.env["runtime"]["DebugManager"].write_debug_out(
"SpeechDriver initialize:" + str(e), debug.DebugLevel.ERROR
@@ -226,4 +243,3 @@ class driver(speech_driver):
self.env["runtime"]["DebugManager"].write_debug_out(
"SpeechDriver set_volume:" + str(e), debug.DebugLevel.ERROR
)
+99 -1
View File
@@ -1,10 +1,15 @@
import sys
from types import SimpleNamespace
from unittest.mock import Mock
from fenrirscreenreader.commands.commands import voice_browser
from fenrirscreenreader.commands.commands import voice_browser_safe
from fenrirscreenreader.core import dynamicVoiceMenu
from fenrirscreenreader.core.quickMenuManager import SpeechHelperMixin
from fenrirscreenreader.core.quickMenuManager import (
QuickMenuManager,
SpeechHelperMixin,
)
from fenrirscreenreader.speechDriver import speechdDriver
from fenrirscreenreader.utils.speechd_utils import get_synthesis_voice_name
@@ -88,3 +93,96 @@ def test_espeak_voice_selection_keeps_language_and_variant_behavior():
)
assert voice == "en-us+female3"
class RuntimeSettings:
def __init__(self, module="", voice="en-us", language=""):
self.values = {
("speech", "module"): module,
("speech", "voice"): voice,
("speech", "language"): language,
}
def get_setting(self, section, setting):
return self.values[(section, setting)]
def set_setting(self, section, setting, value):
self.values[(section, setting)] = value
def test_speechd_driver_resolves_blank_module_from_active_default(monkeypatch):
settings = RuntimeSettings()
client = Mock()
client.get_output_module.return_value = "rhvoice"
speechd = SimpleNamespace(
SSIPClient=Mock(return_value=client),
PunctuationMode=Mock(return_value=Mock()),
)
monkeypatch.setitem(sys.modules, "speechd", speechd)
environment = {
"runtime": {
"DebugManager": Mock(),
"SettingsManager": settings,
}
}
driver = speechdDriver.driver()
driver.initialize(environment)
assert settings.get_setting("speech", "module") == "rhvoice"
assert driver.module == "rhvoice"
def test_speechd_driver_keeps_running_when_default_module_query_fails(
monkeypatch,
):
settings = RuntimeSettings()
client = Mock()
client.get_output_module.side_effect = RuntimeError("query failed")
speechd = SimpleNamespace(
SSIPClient=Mock(return_value=client),
PunctuationMode=Mock(return_value=Mock()),
)
monkeypatch.setitem(sys.modules, "speechd", speechd)
environment = {
"runtime": {
"DebugManager": Mock(),
"SettingsManager": settings,
}
}
driver = speechdDriver.driver()
driver.initialize(environment)
assert driver._is_initialized is True
assert settings.get_setting("speech", "module") == ""
def test_quick_menu_espeak_voice_can_move_away_and_return():
settings = RuntimeSettings(module="rhvoice")
manager = QuickMenuManager()
manager.env = {
"runtime": {
"DebugManager": Mock(),
"OutputManager": Mock(),
"SettingsManager": settings,
"SpeechDriver": Mock(),
}
}
manager._modules_cache = ["rhvoice", "espeak-ng"]
manager._cache_timestamp = float("inf")
manager._voices_cache["espeak-ng"] = [
"en-gb",
"en-us",
"en-us+female2",
]
assert manager.cycle_speech_module("next") is True
assert settings.get_setting("speech", "module") == "espeak-ng"
assert settings.get_setting("speech", "voice") == "en-us"
assert manager.cycle_speech_voice("next") is True
assert settings.get_setting("speech", "voice") == "en-us+female2"
assert manager.cycle_speech_voice("prev") is True
assert settings.get_setting("speech", "voice") == "en-us"