Repository navigation
zdsr: Make the Braille export optional - #181
Merged
Merged
Conversation
qt06
force-pushed
the
zdsr-optional-braille
branch
3 times, most recently
from
November 7, 2026 06:17
cf39525 to
e9c349c
Compare
This was referenced Nov 7, 2026
ethindp
requested changes
Nov 7, 2026
qt06
force-pushed
the
zdsr-optional-braille
branch
from
November 7, 2026 06:36
e9c349c to
079e005
Compare
ethindp
pushed a commit
that referenced
this pull request
Nov 8, 2026
`open_optional_library` previously called `LoadLibrary` by bare DLL name first. Windows could resolve an unrelated same-named copy from the working directory or `%PATH%`, and Prism would not then try the product's registered install directory. A stale DLL with a different export set could therefore make a backend unavailable even though its registered installation contained a usable DLL. Search the directory containing Prism first, then the install directory from the registry when provided, and only then fall back to Windows' ambient DLL search path. App-local deployments remain supported. The helper is shared by optional-library backends, so the behavior applies to all of them; the registry path is only used by backends that provide one. Update the backend contribution guidance to document the order and distinguish required exports from optional exports. Verified with x64 and x86 Windows builds, clang-tidy, and a stale-DLL-in-`%PATH%` test: the registered ZDSR installation was selected instead of the older DLL. Related ZDSR follow-ups: #181 makes the Braille export optional, and #182 documents the ZDSR behavior introduced by #177 and #178. This loader change is independently useful and does not depend on those PRs. Signed-off-by: qt06 <qt06.com@gmail.com>
ethindp
requested changes
Nov 8, 2026
ethindp
left a comment
Owner
There was a problem hiding this comment.
This is much better. Some minor cleanup and then this is ready, I think.
| class ZdsrBackend final : public TextToSpeechBackend { | ||
| private: | ||
| std::atomic_flag initialized; | ||
| std::atomic<bool> braille_supported{false}; |
Owner
There was a problem hiding this comment.
This should be an atomic_flag unless you have a good reason to prefer atomic_bool.
Suggested change
| std::atomic<bool> braille_supported{false}; | |
| std::atomic_flag braille_supported; |
| features |= SUPPORTS_SPEAK | SUPPORTS_OUTPUT | SUPPORTS_IS_SPEAKING | | ||
| SUPPORTS_STOP | SUPPORTS_BRAILLE; | ||
| SUPPORTS_STOP; | ||
| if (braille_supported.load(std::memory_order_acquire)) |
Owner
There was a problem hiding this comment.
Suggested change
| if (braille_supported.load(std::memory_order_acquire)) | |
| if (braille_supported.test(std::memory_order_acquire)) |
| return std::unexpected(BackendError::BackendNotAvailable); | ||
| if (const auto state = query_speaking(); !state) | ||
| return std::unexpected(state.error()); | ||
| braille_supported.store(api->Braille != nullptr, std::memory_order_release); |
Owner
There was a problem hiding this comment.
Suggested change
| braille_supported.store(api->Braille != nullptr, std::memory_order_release); | |
| if (api->Braille != nullptr) | |
| braille_supported.test_and_set(std::memory_order_acq_rel); |
| BackendResult<> braille(std::string_view text) override { | ||
| if (!initialized.test(std::memory_order_acquire)) | ||
| return std::unexpected(BackendError::NotInitialized); | ||
| if (!braille_supported.load(std::memory_order_acquire)) |
Owner
There was a problem hiding this comment.
Suggested change
| if (!braille_supported.load(std::memory_order_acquire)) | |
| if (!braille_supported.test(std::memory_order_acquire)) |
| BackendResult<> output(std::string_view text, bool interrupt) override { | ||
| if (const auto res = speak(text, interrupt); !res) | ||
| return res; | ||
| if (!braille_supported.load(std::memory_order_acquire)) |
Owner
There was a problem hiding this comment.
Suggested change
| if (!braille_supported.load(std::memory_order_acquire)) | |
| if (!braille_supported.test(std::memory_order_acquire)) |
qt06
force-pushed
the
zdsr-optional-braille
branch
from
November 8, 2026 03:14
079e005 to
d9dbd5a
Compare
Some ZDSR API versions provide the four speech functions but do not export Braille. Treating Braille as required prevented those DLLs from loading even though speech was available. Bind Braille independently, advertise support only after initialization confirms the export, return not-implemented for direct Braille calls when it is absent, and let output continue with speech only. Keep get_features free of DLL loading side effects. Signed-off-by: qt06 <qt06.com@gmail.com>
Contributor
Author
|
Applied all five suggestions in d9dbd5a: braille_supported is now a std::atomic_flag using test()/test_and_set(). Rebuilt x64/x86, and re-ran the no-Braille and with-Braille API tests. |
ethindp
pushed a commit
that referenced
this pull request
Nov 9, 2026
Update the ZDSR backend notes to reflect the merged behavior: - Runtime support requires both `ZDSRMain.exe` and `ZDSRDaemon.exe`; service and per-channel processes are not used as the availability signal. - With `ZDSRAPI.ini` selecting an independent channel (`type=1`), the channel may still be starting after `InitTTS` succeeds. Status 9 is treated as not speaking, so initialization succeeds and `is_speaking` returns false. `speak` returns `PRISM_ERROR_BACKEND_NOT_AVAILABLE` until the channel is ready; callers may retry without reinitializing. - Older ZDSRAPI versions may not export `Braille`. After initialization, the backend advertises Braille support only when the loaded API provides that export; otherwise direct Braille calls return `PRISM_ERROR_NOT_IMPLEMENTED` and `output` uses speech only. Documentation-only change. The runtime-probe and channel-readiness behavior was introduced by #177 and #178; the optional Braille behavior is implemented by #181. Related PRs: #180 fixes optional DLL search precedence; #181 makes the ZDSR Braille export optional. Signed-off-by: qt06 <qt06.com@gmail.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Some ZDSR API versions export the four speech functions (
InitTTS,Speak,GetSpeakState,StopSpeak) but do not provideBraille. Requiring the Braille export prevented those versions from loading even though speech was available.Bind
Brailleindependently from the required speech functions. The backend advertisesSUPPORTS_BRAILLEonly after initialization confirms the export; without it, direct Braille calls returnPRISM_ERROR_NOT_IMPLEMENTED, whileoutputcontinues with speech only.get_featuresno longer loads the DLL and only reports Braille support after initialization.Verified with an app-local test DLL exporting the four speech functions but no
Braille: initialization succeeds, Braille is not advertised, direct Braille returns not-implemented, and speech-only output succeeds. With the installed API that exports Braille,get_featuresomits the feature before initialization and reports it after successful initialization. x64 and x86 builds pass, and clang-tidy reports no diagnostics forzdsr.cpp.Related PRs: #180 fixes optional DLL search precedence; #182 documents the ZDSR-specific Braille behavior together with the independent-channel readiness and process-probe behavior from #177 and #178.