Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion Build/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ ubuntu:
-DTOOLCHAIN_OPENSSL=OFF" generic

ubuntu22:
$(MAKE) UBUNTUDIR=$@ ubuntu
$(MAKE) UBUNTUDIR=$@ CMAKE_EXTRA+="-DBUILD_TEAMTALK_CLIENT_PRISM=OFF" ubuntu

ubuntu24:
$(MAKE) UBUNTUDIR=$@ ubuntu
Expand Down Expand Up @@ -198,8 +198,10 @@ depend-ubuntu24:
g++ \
junit4 \
libasound2-dev \
libglib2.0-dev \
libpcap-dev \
libpulse-dev \
libspeechd-dev \
libssl-dev \
libtool \
libxss-dev \
Expand Down Expand Up @@ -243,8 +245,10 @@ depend-raspios12:
git \
junit4 \
libasound2-dev \
libglib2.0-dev \
libpcap-dev \
libpulse-dev \
libspeechd-dev \
libssl-dev \
libtool \
libxss-dev \
Expand Down
5 changes: 4 additions & 1 deletion ChangeLog.txt
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,10 @@

Version 5.22.1, unreleased
Default Qt Client
-
- Replaced Tolk with Prism for screen reader support
- Screen reader backend can now be selected in Preferences (e.g. NVDA, JAWS, SAPI, UIA, Orca)
- Added screen reader support on Linux via Speech Dispatcher and Orca
- First launch now asks all users whether to enable accessibility settings
Android Client
-
iOS Client
Expand Down
10 changes: 5 additions & 5 deletions Client/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
project (TeamTalkClients)

if (MSVC)
option (BUILD_TEAMTALK_CLIENT_PRISM "Build TeamTalk clients with Prism screen reader support" ON)
if (BUILD_TEAMTALK_CLIENT_PRISM)
add_subdirectory (Prism)
endif()

option (BUILD_TEAMTALK_CLIENT_TOLK "Build TeamTalk clients with Tolk" ON)
if (BUILD_TEAMTALK_CLIENT_TOLK)
add_subdirectory (Tolk)
endif()
if (MSVC)

add_subdirectory (TeamTalkClassic)
if (CMAKE_CSharp_COMPILER)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
From 22cf931fa04810b941badefbc68ca3f46e47b7dd Mon Sep 17 00:00:00 2001
From: Sihu Hwang <129564966+hwangsihu@users.noreply.github.com>
Date: Fri, 24 Apr 2026 20:19:54 +0900
Subject: [PATCH] Add PRISM_USE_STATIC_CRT option to select /MT(d) runtime

---
CMakeLists.txt | 15 +++++----------
1 file changed, 5 insertions(+), 10 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 02e4e48..7ebf131 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -39,6 +39,7 @@ if(PRISM_ENABLE_VCPKG_SPECIFIC_OPTIONS)
OFF)
endif()
option(PRISM_ENABLE_GDEXTENSION "Enable building of the Godot GDExtension" ON)
+option(PRISM_USE_STATIC_CRT "Use /MT(d) static CRT on MSVC" OFF)
option(PRISM_ENABLE_LEGACY_BACKENDS
"Enable building of legacy backends which are dead or rarely used" OFF)
if(PRISM_ENABLE_LEGACY_BACKENDS)
@@ -63,16 +64,10 @@ if(WIN32)
set(CMAKE_MSVC_RUNTIME_LIBRARY
"MultiThreadedDLL"
CACHE STRING "Match godot-cpp non-debug CRT")
- else()
- if(NOT CMAKE_BUILD_TYPE STREQUAL "Debug")
- set(CMAKE_MSVC_RUNTIME_LIBRARY
- "MultiThreaded"
- CACHE STRING "Set MSVC CRT library type")
- else()
- set(CMAKE_MSVC_RUNTIME_LIBRARY
- "MultiThreadedDebug"
- CACHE STRING "Set MSVC CRT library type")
- endif()
+ elseif(PRISM_USE_STATIC_CRT)
+ set(CMAKE_MSVC_RUNTIME_LIBRARY
+ "MultiThreaded$<$<CONFIG:Debug>:Debug>"
+ CACHE STRING "Use static CRT")
endif()
endif()
function(add_import_library target def_file dll_name)
--
2.54.0.windows.1

211 changes: 211 additions & 0 deletions Client/Prism/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,211 @@
project(Prism)

include(ExternalProject)

##################################################
# Prism
##################################################

if (MSVC)

set (PRISM_INSTALL_DIR_MD ${CMAKE_CURRENT_BINARY_DIR}/prism-md)
set (PRISM_INSTALL_DIR_MT ${CMAKE_CURRENT_BINARY_DIR}/prism-mt)

set (PRISM_STATIC_LIB_MD ${PRISM_INSTALL_DIR_MD}/lib/prism.lib)
set (PRISM_STATIC_LIB_MT ${PRISM_INSTALL_DIR_MT}/lib/prism.lib)

ExternalProject_Add(prism-md-src
GIT_REPOSITORY https://github.com/ethindp/prism.git
GIT_TAG v0.13.0
PATCH_COMMAND git apply ${CMAKE_CURRENT_LIST_DIR}/0001-Add-PRISM_USE_STATIC_CRT-option-to-select-MT-d-runti.patch
UPDATE_COMMAND ""
CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=<INSTALL_DIR>
-DBUILD_SHARED_LIBS=OFF
-DPRISM_ENABLE_GDEXTENSION=OFF
-DCMAKE_DEBUG_POSTFIX=d
BUILD_COMMAND ${CMAKE_COMMAND} --build . --config Debug
COMMAND ${CMAKE_COMMAND} --build . --config Release
INSTALL_DIR ${PRISM_INSTALL_DIR_MD}
INSTALL_COMMAND ${CMAKE_COMMAND} --build . --target install --config Debug
COMMAND ${CMAKE_COMMAND} --build . --target install --config Release
COMMAND ${CMAKE_COMMAND} -E copy_if_different <BINARY_DIR>/ZDSR.lib <BINARY_DIR>/BoyCtrl.lib <BINARY_DIR>/PCTalker.lib <BINARY_DIR>/PrismOrcaBridge.lib <BINARY_DIR>/PrismSpeechDispatcherBridge.lib <INSTALL_DIR>/lib/
BUILD_BYPRODUCTS ${PRISM_INSTALL_DIR_MD}/lib/prismd.lib
${PRISM_STATIC_LIB_MD}
)

ExternalProject_Add(prism-mt-src
GIT_REPOSITORY https://github.com/ethindp/prism.git
GIT_TAG v0.13.0
PATCH_COMMAND git apply ${CMAKE_CURRENT_LIST_DIR}/0001-Add-PRISM_USE_STATIC_CRT-option-to-select-MT-d-runti.patch
UPDATE_COMMAND ""
CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=<INSTALL_DIR>
-DBUILD_SHARED_LIBS=OFF
-DPRISM_ENABLE_GDEXTENSION=OFF
-DPRISM_USE_STATIC_CRT=ON
-DCMAKE_DEBUG_POSTFIX=d
BUILD_COMMAND ${CMAKE_COMMAND} --build . --config Debug
COMMAND ${CMAKE_COMMAND} --build . --config Release
INSTALL_DIR ${PRISM_INSTALL_DIR_MT}
INSTALL_COMMAND ${CMAKE_COMMAND} --build . --target install --config Debug
COMMAND ${CMAKE_COMMAND} --build . --target install --config Release
COMMAND ${CMAKE_COMMAND} -E copy_if_different <BINARY_DIR>/ZDSR.lib <BINARY_DIR>/BoyCtrl.lib <BINARY_DIR>/PCTalker.lib <BINARY_DIR>/PrismOrcaBridge.lib <BINARY_DIR>/PrismSpeechDispatcherBridge.lib <INSTALL_DIR>/lib/
BUILD_BYPRODUCTS ${PRISM_INSTALL_DIR_MT}/lib/prismd.lib
${PRISM_STATIC_LIB_MT}
)

file(MAKE_DIRECTORY ${PRISM_INSTALL_DIR_MD}/include)

add_library(Prism STATIC IMPORTED GLOBAL)
add_dependencies(Prism prism-md-src)
target_include_directories(Prism INTERFACE ${PRISM_INSTALL_DIR_MD}/include)
target_compile_definitions(Prism INTERFACE PRISM_STATIC)
set_target_properties(Prism PROPERTIES
IMPORTED_LOCATION_DEBUG ${PRISM_INSTALL_DIR_MD}/lib/prismd.lib
IMPORTED_LOCATION ${PRISM_STATIC_LIB_MD})

foreach (implib ZDSR BoyCtrl PCTalker PrismOrcaBridge PrismSpeechDispatcherBridge)
add_library(Prism_${implib} SHARED IMPORTED GLOBAL)
add_dependencies(Prism_${implib} prism-md-src)
set_target_properties(Prism_${implib} PROPERTIES
IMPORTED_IMPLIB ${PRISM_INSTALL_DIR_MD}/lib/${implib}.lib)
endforeach()

target_link_libraries(Prism INTERFACE
rpcrt4 delayimp onecore uiautomationcore ole32 oleaut32
Prism_ZDSR Prism_BoyCtrl Prism_PCTalker Prism_PrismOrcaBridge Prism_PrismSpeechDispatcherBridge)
target_link_options(Prism INTERFACE
"/WHOLEARCHIVE:$<TARGET_LINKER_FILE:Prism>"
/delayload:ZDSRAPI_x64.dll
/delayload:BoyCtrl-x64.dll /delayload:PCTKUSR.dll
/delayload:prism_orca_bridge.dll /delayload:prism_speech_dispatcher_bridge.dll)

file(MAKE_DIRECTORY ${PRISM_INSTALL_DIR_MT}/include)

add_library(PrismMT STATIC IMPORTED GLOBAL)
add_dependencies(PrismMT prism-mt-src)
target_include_directories(PrismMT INTERFACE ${PRISM_INSTALL_DIR_MT}/include)
target_compile_definitions(PrismMT INTERFACE PRISM_STATIC)
set_target_properties(PrismMT PROPERTIES
IMPORTED_LOCATION_DEBUG ${PRISM_INSTALL_DIR_MT}/lib/prismd.lib
IMPORTED_LOCATION ${PRISM_STATIC_LIB_MT})

foreach (implib ZDSR BoyCtrl PCTalker PrismOrcaBridge PrismSpeechDispatcherBridge)
add_library(PrismMT_${implib} SHARED IMPORTED GLOBAL)
add_dependencies(PrismMT_${implib} prism-mt-src)
set_target_properties(PrismMT_${implib} PROPERTIES
IMPORTED_IMPLIB ${PRISM_INSTALL_DIR_MT}/lib/${implib}.lib)
endforeach()

target_link_libraries(PrismMT INTERFACE
rpcrt4 delayimp onecore uiautomationcore ole32 oleaut32
PrismMT_ZDSR PrismMT_BoyCtrl PrismMT_PCTalker PrismMT_PrismOrcaBridge PrismMT_PrismSpeechDispatcherBridge)
target_link_options(PrismMT INTERFACE
"/WHOLEARCHIVE:$<TARGET_LINKER_FILE:PrismMT>"
/delayload:ZDSRAPI_x64.dll
/delayload:BoyCtrl-x64.dll /delayload:PCTKUSR.dll
/delayload:prism_orca_bridge.dll /delayload:prism_speech_dispatcher_bridge.dll)

elseif (${CMAKE_SYSTEM_NAME} MATCHES "Darwin")

set (PRISM_INSTALL_DIR_ARM64 ${CMAKE_CURRENT_BINARY_DIR}/prism-arm64)
set (PRISM_INSTALL_DIR_X86_64 ${CMAKE_CURRENT_BINARY_DIR}/prism-x86_64)
set (PRISM_INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR}/prism)
set (PRISM_STATIC_LIB ${PRISM_INSTALL_DIR}/lib/libprism.a)

set (PRISM_COMMON_CMAKE_ARGS_MAC
-DBUILD_SHARED_LIBS=OFF
-DPRISM_ENABLE_GDEXTENSION=OFF
-DCMAKE_OSX_DEPLOYMENT_TARGET=${CMAKE_OSX_DEPLOYMENT_TARGET})

ExternalProject_Add(prism-arm64-src
GIT_REPOSITORY https://github.com/ethindp/prism.git
GIT_TAG v0.13.0
UPDATE_COMMAND ""
CMAKE_GENERATOR Xcode
CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=<INSTALL_DIR>
-DCMAKE_OSX_ARCHITECTURES=arm64
${PRISM_COMMON_CMAKE_ARGS_MAC}
BUILD_COMMAND ${CMAKE_COMMAND} --build . --config Release
INSTALL_DIR ${PRISM_INSTALL_DIR_ARM64}
INSTALL_COMMAND ${CMAKE_COMMAND} --build . --target install --config Release
BUILD_BYPRODUCTS ${PRISM_INSTALL_DIR_ARM64}/lib/libprism.a
)

ExternalProject_Add(prism-x86_64-src
GIT_REPOSITORY https://github.com/ethindp/prism.git
GIT_TAG v0.13.0
UPDATE_COMMAND ""
CMAKE_GENERATOR Xcode
CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=<INSTALL_DIR>
-DCMAKE_OSX_ARCHITECTURES=x86_64
${PRISM_COMMON_CMAKE_ARGS_MAC}
BUILD_COMMAND ${CMAKE_COMMAND} --build . --config Release
INSTALL_DIR ${PRISM_INSTALL_DIR_X86_64}
INSTALL_COMMAND ${CMAKE_COMMAND} --build . --target install --config Release
BUILD_BYPRODUCTS ${PRISM_INSTALL_DIR_X86_64}/lib/libprism.a
)

file(MAKE_DIRECTORY ${PRISM_INSTALL_DIR}/lib)
file(MAKE_DIRECTORY ${PRISM_INSTALL_DIR}/include)
add_custom_command (OUTPUT ${PRISM_STATIC_LIB}
COMMAND lipo -create ${PRISM_INSTALL_DIR_ARM64}/lib/libprism.a ${PRISM_INSTALL_DIR_X86_64}/lib/libprism.a -output ${PRISM_STATIC_LIB}
COMMAND ${CMAKE_COMMAND} -E copy_directory ${PRISM_INSTALL_DIR_ARM64}/include ${PRISM_INSTALL_DIR}/include
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
COMMENT "Generating universal Prism binary"
DEPENDS prism-arm64-src prism-x86_64-src)

add_custom_target (prism-src DEPENDS ${PRISM_STATIC_LIB})

add_library(Prism STATIC IMPORTED GLOBAL)
add_dependencies(Prism prism-src)
target_include_directories(Prism INTERFACE ${PRISM_INSTALL_DIR}/include)
target_compile_definitions(Prism INTERFACE PRISM_STATIC)
set_target_properties(Prism PROPERTIES IMPORTED_LOCATION ${PRISM_STATIC_LIB})

find_library(AVFOUNDATION_FRAMEWORK AVFoundation)
find_library(FOUNDATION_FRAMEWORK Foundation)
target_link_libraries(Prism INTERFACE ${AVFOUNDATION_FRAMEWORK} ${FOUNDATION_FRAMEWORK})
target_link_options(Prism INTERFACE "LINKER:-force_load,$<TARGET_LINKER_FILE:Prism>")

elseif (${CMAKE_SYSTEM_NAME} MATCHES "Linux")

set (PRISM_INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR}/prism)
set (PRISM_STATIC_LIB ${PRISM_INSTALL_DIR}/lib/libprism.a)

ExternalProject_Add(prism-src
GIT_REPOSITORY https://github.com/ethindp/prism.git
GIT_TAG v0.13.0
UPDATE_COMMAND ""
CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=<INSTALL_DIR>
-DBUILD_SHARED_LIBS=OFF
-DPRISM_ENABLE_GDEXTENSION=OFF
-DCMAKE_POSITION_INDEPENDENT_CODE=ON
-DCMAKE_BUILD_TYPE=release
INSTALL_DIR ${PRISM_INSTALL_DIR}
BUILD_BYPRODUCTS ${PRISM_STATIC_LIB}
)

file(MAKE_DIRECTORY ${PRISM_INSTALL_DIR}/include)

add_library(Prism STATIC IMPORTED GLOBAL)
add_dependencies(Prism prism-src)
target_include_directories(Prism INTERFACE ${PRISM_INSTALL_DIR}/include)
target_compile_definitions(Prism INTERFACE PRISM_STATIC)
set_target_properties(Prism PROPERTIES IMPORTED_LOCATION ${PRISM_STATIC_LIB})

find_package(PkgConfig)
if (PkgConfig_FOUND)
pkg_check_modules(SPEECHD IMPORTED_TARGET speech-dispatcher)
pkg_check_modules(GLIB IMPORTED_TARGET glib-2.0)
pkg_check_modules(GIO IMPORTED_TARGET gio-2.0)
if (SPEECHD_FOUND)
target_link_libraries(Prism INTERFACE PkgConfig::SPEECHD)
endif()
if (GLIB_FOUND AND GIO_FOUND)
target_link_libraries(Prism INTERFACE PkgConfig::GLIB PkgConfig::GIO)
endif()
endif()
target_link_options(Prism INTERFACE
"LINKER:--whole-archive" "$<TARGET_LINKER_FILE:Prism>" "LINKER:--no-whole-archive")

endif()
27 changes: 9 additions & 18 deletions Client/TeamTalkClassic/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -84,25 +84,16 @@ if (MSVC)
if (BUILD_TEAMTALK_CLIENT_TEAMTALKCLASSIC)
set_property(TARGET TeamTalk5Classic PROPERTY VS_DEBUGGER_WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/../../Library/TeamTalk_DLL")

if (BUILD_TEAMTALK_CLIENT_TOLK)
target_compile_options (TeamTalk5Classic PUBLIC -DENABLE_TOLK ${TTCLASSIC_COMPILE_FLAGS})
install (FILES ${TOLK_DLL_FILES} DESTINATION Client/TeamTalkClassic)
if (BUILD_TEAMTALK_LIBRARY_DLL)
target_include_directories (TeamTalk5Classic PUBLIC ./)
target_link_libraries (TeamTalk5Classic TeamTalk5DLL Tolk tinyxml2-classic)
else()
target_include_directories (TeamTalk5Classic PUBLIC ./ ../../Library/TeamTalk_DLL)
target_link_libraries (TeamTalk5Classic TeamTalk5 Tolk tinyxml2-classic)
endif()
target_compile_options (TeamTalk5Classic PUBLIC ${TTCLASSIC_COMPILE_FLAGS})
if (BUILD_TEAMTALK_CLIENT_PRISM)
target_compile_definitions (TeamTalk5Classic PUBLIC ENABLE_PRISM)
endif()
if (BUILD_TEAMTALK_LIBRARY_DLL)
target_include_directories (TeamTalk5Classic PUBLIC ./)
target_link_libraries (TeamTalk5Classic TeamTalk5DLL tinyxml2-classic $<$<BOOL:${BUILD_TEAMTALK_CLIENT_PRISM}>:PrismMT>)
else()
target_compile_options (TeamTalk5Classic PUBLIC ${TTCLASSIC_COMPILE_FLAGS})
if (BUILD_TEAMTALK_LIBRARY_DLL)
target_include_directories (TeamTalk5Classic PUBLIC ./)
target_link_libraries (TeamTalk5Classic TeamTalk5DLL tinyxml2-classic)
else()
target_include_directories (TeamTalk5Classic PUBLIC ./ ../../Library/TeamTalk_DLL)
target_link_libraries (TeamTalk5Classic TeamTalk5 tinyxml2-classic)
endif()
target_include_directories (TeamTalk5Classic PUBLIC ./ ../../Library/TeamTalk_DLL)
target_link_libraries (TeamTalk5Classic TeamTalk5 tinyxml2-classic $<$<BOOL:${BUILD_TEAMTALK_CLIENT_PRISM}>:PrismMT>)
endif()
set_output_dir(TeamTalk5Classic "${CMAKE_CURRENT_SOURCE_DIR}/")
install (TARGETS TeamTalk5Classic DESTINATION Client/TeamTalkClassic)
Expand Down
10 changes: 7 additions & 3 deletions Client/TeamTalkClassic/Helper.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -644,8 +644,12 @@ extern BOOL g_bSpeech;

void AddTextToSpeechMessage(const CString& szMsg)
{
#if defined(ENABLE_TOLK)
if(g_bSpeech)
Tolk_Output(szMsg);
#if defined(ENABLE_PRISM)
extern PrismBackend* g_prismBackend;
if (g_bSpeech && g_prismBackend)
{
CStringA utf8(szMsg);
prism_backend_output(g_prismBackend, utf8, true);
}
#endif
}
4 changes: 2 additions & 2 deletions Client/TeamTalkClassic/Helper.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,8 @@

#include "settings/ClientXML.h"

#if defined(ENABLE_TOLK)
#include <Tolk.h>
#if defined(ENABLE_PRISM)
#include <prism.h>
#endif

typedef struct
Expand Down
Loading
Loading