prism-sys 0.1.3

Raw FFI bindings to the prism speech library
Documentation
// SPDX-License-Identifier: MPL-2.0

#include "backend_catalog.h"
#include <cstdint>
#include <prism.h>
#include <utility>

#define CHECK(macro, backend_const)                                            \
  static_assert(static_cast<std::uint64_t>(macro) ==                           \
                    std::to_underlying(backend_const),                         \
                "Backend ID mismatch: " #macro)
#define CHECK_ERROR(cpp_name, c_name)                                          \
  static_assert(std::to_underlying(BackendError::cpp_name) == (c_name),        \
                "BackendError::" #cpp_name " must equal " #c_name)
#define CHECK_FEATURE(cpp_name, c_name)                                        \
  static_assert(BackendFeature::cpp_name ==                                    \
                    static_cast<std::uint64_t>(c_name),                        \
                "BackendFeature::" #cpp_name " must equal " #c_name)

static_assert(static_cast<std::uint64_t>(PRISM_BACKEND_INVALID) == 0ULL,
              "PRISM_BACKEND_INVALID must be 0");
CHECK(PRISM_BACKEND_SAPI, Backends::SAPI);
CHECK(PRISM_BACKEND_AV_SPEECH, Backends::AVSpeech);
CHECK(PRISM_BACKEND_VOICE_OVER, Backends::VoiceOver);
CHECK(PRISM_BACKEND_SPEECH_DISPATCHER, Backends::SpeechDispatcher);
CHECK(PRISM_BACKEND_NVDA, Backends::NVDA);
CHECK(PRISM_BACKEND_JAWS, Backends::JAWS);
CHECK(PRISM_BACKEND_ONE_CORE, Backends::OneCore);
CHECK(PRISM_BACKEND_ORCA, Backends::Orca);
CHECK(PRISM_BACKEND_ANDROID_SCREEN_READER, Backends::AndroidScreenReader);
CHECK(PRISM_BACKEND_ANDROID_TTS, Backends::AndroidTextToSpeech);
CHECK(PRISM_BACKEND_WEB_SPEECH, Backends::WebSpeechSynthesis);
CHECK(PRISM_BACKEND_UIA, Backends::UIA);
CHECK(PRISM_BACKEND_ZDSR, Backends::ZDSR);
CHECK(PRISM_BACKEND_ZOOM_TEXT, Backends::ZoomText);
CHECK(PRISM_BACKEND_BOY_PC_READER, Backends::BoyPCReader);
CHECK(PRISM_BACKEND_PC_TALKER, Backends::PCTalker);
CHECK(PRISM_BACKEND_SENSE_READER, Backends::SenseReader);
CHECK(PRISM_BACKEND_SYSTEM_ACCESS, Backends::SystemAccess);
CHECK(PRISM_BACKEND_WINDOW_EYES, Backends::WindowEyes);
CHECK(PRISM_BACKEND_SPIEL, Backends::Spiel);
CHECK_ERROR(Ok, PRISM_OK);
CHECK_ERROR(NotInitialized, PRISM_ERROR_NOT_INITIALIZED);
CHECK_ERROR(InvalidParam, PRISM_ERROR_INVALID_PARAM);
CHECK_ERROR(NotImplemented, PRISM_ERROR_NOT_IMPLEMENTED);
CHECK_ERROR(NoVoices, PRISM_ERROR_NO_VOICES);
CHECK_ERROR(VoiceNotFound, PRISM_ERROR_VOICE_NOT_FOUND);
CHECK_ERROR(SpeakFailure, PRISM_ERROR_SPEAK_FAILURE);
CHECK_ERROR(MemoryFailure, PRISM_ERROR_MEMORY_FAILURE);
CHECK_ERROR(RangeOutOfBounds, PRISM_ERROR_RANGE_OUT_OF_BOUNDS);
CHECK_ERROR(InternalBackendError, PRISM_ERROR_INTERNAL);
CHECK_ERROR(NotSpeaking, PRISM_ERROR_NOT_SPEAKING);
CHECK_ERROR(NotPaused, PRISM_ERROR_NOT_PAUSED);
CHECK_ERROR(AlreadyPaused, PRISM_ERROR_ALREADY_PAUSED);
CHECK_ERROR(InvalidUtf8, PRISM_ERROR_INVALID_UTF8);
CHECK_ERROR(InvalidOperation, PRISM_ERROR_INVALID_OPERATION);
CHECK_ERROR(AlreadyInitialized, PRISM_ERROR_ALREADY_INITIALIZED);
CHECK_ERROR(BackendNotAvailable, PRISM_ERROR_BACKEND_NOT_AVAILABLE);
CHECK_ERROR(Unknown, PRISM_ERROR_UNKNOWN);
CHECK_ERROR(InvalidAudioFormat, PRISM_ERROR_INVALID_AUDIO_FORMAT);
CHECK_ERROR(InternalBackendLimitExceeded,
            PRISM_ERROR_INTERNAL_BACKEND_LIMIT_EXCEEDED);
CHECK_ERROR(BackendEnteredUndefinedState,
            PRISM_ERROR_BACKEND_ENTERED_UNDEFINED_STATE);
CHECK_ERROR(LibraryLoadFailed, PRISM_ERROR_LIBRARY_LOAD_FAILED);
CHECK_ERROR(LibraryInvalid, PRISM_ERROR_LIBRARY_INVALID);
CHECK_ERROR(IncompatibleAbi, PRISM_ERROR_INCOMPATIBLE_ABI);
CHECK_FEATURE(IS_SUPPORTED_AT_RUNTIME, PRISM_BACKEND_IS_SUPPORTED_AT_RUNTIME);
CHECK_FEATURE(SUPPORTS_SPEAK, PRISM_BACKEND_SUPPORTS_SPEAK);
CHECK_FEATURE(SUPPORTS_SPEAK_TO_MEMORY, PRISM_BACKEND_SUPPORTS_SPEAK_TO_MEMORY);
CHECK_FEATURE(SUPPORTS_BRAILLE, PRISM_BACKEND_SUPPORTS_BRAILLE);
CHECK_FEATURE(SUPPORTS_OUTPUT, PRISM_BACKEND_SUPPORTS_OUTPUT);
CHECK_FEATURE(SUPPORTS_IS_SPEAKING, PRISM_BACKEND_SUPPORTS_IS_SPEAKING);
CHECK_FEATURE(SUPPORTS_STOP, PRISM_BACKEND_SUPPORTS_STOP);
CHECK_FEATURE(SUPPORTS_PAUSE, PRISM_BACKEND_SUPPORTS_PAUSE);
CHECK_FEATURE(SUPPORTS_RESUME, PRISM_BACKEND_SUPPORTS_RESUME);
CHECK_FEATURE(SUPPORTS_SET_VOLUME, PRISM_BACKEND_SUPPORTS_SET_VOLUME);
CHECK_FEATURE(SUPPORTS_GET_VOLUME, PRISM_BACKEND_SUPPORTS_GET_VOLUME);
CHECK_FEATURE(SUPPORTS_SET_RATE, PRISM_BACKEND_SUPPORTS_SET_RATE);
CHECK_FEATURE(SUPPORTS_GET_RATE, PRISM_BACKEND_SUPPORTS_GET_RATE);
CHECK_FEATURE(SUPPORTS_SET_PITCH, PRISM_BACKEND_SUPPORTS_SET_PITCH);
CHECK_FEATURE(SUPPORTS_GET_PITCH, PRISM_BACKEND_SUPPORTS_GET_PITCH);
CHECK_FEATURE(SUPPORTS_REFRESH_VOICES, PRISM_BACKEND_SUPPORTS_REFRESH_VOICES);
CHECK_FEATURE(SUPPORTS_COUNT_VOICES, PRISM_BACKEND_SUPPORTS_COUNT_VOICES);
CHECK_FEATURE(SUPPORTS_GET_VOICE_NAME, PRISM_BACKEND_SUPPORTS_GET_VOICE_NAME);
CHECK_FEATURE(SUPPORTS_GET_VOICE_LANGUAGE,
              PRISM_BACKEND_SUPPORTS_GET_VOICE_LANGUAGE);
CHECK_FEATURE(SUPPORTS_GET_VOICE, PRISM_BACKEND_SUPPORTS_GET_VOICE);
CHECK_FEATURE(SUPPORTS_SET_VOICE, PRISM_BACKEND_SUPPORTS_SET_VOICE);
CHECK_FEATURE(SUPPORTS_GET_CHANNELS, PRISM_BACKEND_SUPPORTS_GET_CHANNELS);
CHECK_FEATURE(SUPPORTS_GET_SAMPLE_RATE, PRISM_BACKEND_SUPPORTS_GET_SAMPLE_RATE);
CHECK_FEATURE(SUPPORTS_GET_BIT_DEPTH, PRISM_BACKEND_SUPPORTS_GET_BIT_DEPTH);
CHECK_FEATURE(PERFORMS_SILENCE_TRIMMING_ON_SPEAK,
              PRISM_BACKEND_PERFORMS_SILENCE_TRIMMING_ON_SPEAK);
CHECK_FEATURE(PERFORMS_SILENCE_TRIMMING_ON_SPEAK_TO_MEMORY,
              PRISM_BACKEND_PERFORMS_SILENCE_TRIMMING_ON_SPEAK_TO_MEMORY);
CHECK_FEATURE(SUPPORTS_SPEAK_SSML, PRISM_BACKEND_SUPPORTS_SPEAK_SSML);
CHECK_FEATURE(SUPPORTS_SPEAK_TO_MEMORY_SSML,
              PRISM_BACKEND_SUPPORTS_SPEAK_TO_MEMORY_SSML);

#undef CHECK
#undef U64
#undef CHECK_ERROR
#undef CHECK_FEATURE