mirror of
https://github.com/ndarilek/tts-rs.git
synced 2024-11-25 14:59:36 +00:00
FFI: Don't use libc for C types like char and float
This insures the correct C standards are followed, but doesn't work on wasm32-unknown-unknown targets, because there *is* no libc. Given that the definition of `char` and `float` are very universal anyway, it makes sense to just use `i8` and `f32`.
This commit is contained in:
parent
0644f03f34
commit
b972f44bc9
|
@ -13,7 +13,7 @@ crate-type = ["lib", "cdylib", "staticlib"]
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
use_tolk = ["tolk"]
|
use_tolk = ["tolk"]
|
||||||
ffi = ["libc"]
|
ffi = []
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
dyn-clonable = "0.9"
|
dyn-clonable = "0.9"
|
||||||
|
|
35
src/ffi.rs
35
src/ffi.rs
|
@ -1,6 +1,5 @@
|
||||||
//! Bindings to this library to allow it to be called from C/C++.
|
//! Bindings to this library to allow it to be called from C/C++.
|
||||||
|
|
||||||
use libc::{c_char, c_float};
|
|
||||||
use std::{
|
use std::{
|
||||||
cell::RefCell,
|
cell::RefCell,
|
||||||
ffi::{CStr, CString, NulError},
|
ffi::{CStr, CString, NulError},
|
||||||
|
@ -25,7 +24,7 @@ fn set_last_error<E: Into<Vec<u8>>>(err: E) -> Result<(), NulError> {
|
||||||
/// This string will be valid until at least the next call to `tts_get_error`.
|
/// This string will be valid until at least the next call to `tts_get_error`.
|
||||||
/// It is never called internally by the library.
|
/// It is never called internally by the library.
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub extern "C" fn tts_get_error() -> *const c_char {
|
pub extern "C" fn tts_get_error() -> *const i8 {
|
||||||
LAST_ERROR.with(|err| match &*err.borrow() {
|
LAST_ERROR.with(|err| match &*err.borrow() {
|
||||||
Some(e) => e.as_ptr(),
|
Some(e) => e.as_ptr(),
|
||||||
None => ptr::null(),
|
None => ptr::null(),
|
||||||
|
@ -92,7 +91,7 @@ pub unsafe extern "C" fn tts_supported_features(tts: *const TTS) -> Features {
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe extern "C" fn tts_speak(
|
pub unsafe extern "C" fn tts_speak(
|
||||||
tts: *mut TTS,
|
tts: *mut TTS,
|
||||||
text: *const c_char,
|
text: *const i8,
|
||||||
interrupt: bool,
|
interrupt: bool,
|
||||||
utterance: *mut *mut UtteranceId,
|
utterance: *mut *mut UtteranceId,
|
||||||
) -> bool {
|
) -> bool {
|
||||||
|
@ -146,21 +145,21 @@ pub unsafe extern "C" fn tts_stop(tts: *mut TTS) -> bool {
|
||||||
/// Returns the minimum rate for this speech synthesizer.
|
/// Returns the minimum rate for this speech synthesizer.
|
||||||
/// `tts` must be a valid pointer to a TTS object.
|
/// `tts` must be a valid pointer to a TTS object.
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe extern "C" fn tts_min_rate(tts: *const TTS) -> c_float {
|
pub unsafe extern "C" fn tts_min_rate(tts: *const TTS) -> f32 {
|
||||||
tts.as_ref().unwrap().min_rate()
|
tts.as_ref().unwrap().min_rate()
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns the maximum rate for this speech synthesizer.
|
/// Returns the maximum rate for this speech synthesizer.
|
||||||
/// `tts` must be a valid pointer to a TTS object.
|
/// `tts` must be a valid pointer to a TTS object.
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe extern "C" fn tts_max_rate(tts: *const TTS) -> c_float {
|
pub unsafe extern "C" fn tts_max_rate(tts: *const TTS) -> f32 {
|
||||||
tts.as_ref().unwrap().max_rate()
|
tts.as_ref().unwrap().max_rate()
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns the normal rate for this speech synthesizer.
|
/// Returns the normal rate for this speech synthesizer.
|
||||||
/// `tts` must be a valid pointer to a TTS object.
|
/// `tts` must be a valid pointer to a TTS object.
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe extern "C" fn tts_normal_rate(tts: *const TTS) -> c_float {
|
pub unsafe extern "C" fn tts_normal_rate(tts: *const TTS) -> f32 {
|
||||||
tts.as_ref().unwrap().normal_rate()
|
tts.as_ref().unwrap().normal_rate()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -169,7 +168,7 @@ pub unsafe extern "C" fn tts_normal_rate(tts: *const TTS) -> c_float {
|
||||||
/// or if `tts` is NULL.
|
/// or if `tts` is NULL.
|
||||||
/// Does nothing if `rate` is NULL.
|
/// Does nothing if `rate` is NULL.
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe extern "C" fn tts_get_rate(tts: *const TTS, rate: *mut c_float) -> bool {
|
pub unsafe extern "C" fn tts_get_rate(tts: *const TTS, rate: *mut f32) -> bool {
|
||||||
if tts.is_null() {
|
if tts.is_null() {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -191,7 +190,7 @@ pub unsafe extern "C" fn tts_get_rate(tts: *const TTS, rate: *mut c_float) -> bo
|
||||||
/// Returns true on success, false on error (likely that the backend doesn't support rate changes)
|
/// Returns true on success, false on error (likely that the backend doesn't support rate changes)
|
||||||
/// or if `tts` is NULL.
|
/// or if `tts` is NULL.
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe extern "C" fn tts_set_rate(tts: *mut TTS, rate: c_float) -> bool {
|
pub unsafe extern "C" fn tts_set_rate(tts: *mut TTS, rate: f32) -> bool {
|
||||||
if tts.is_null() {
|
if tts.is_null() {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -207,21 +206,21 @@ pub unsafe extern "C" fn tts_set_rate(tts: *mut TTS, rate: c_float) -> bool {
|
||||||
/// Returns the minimum pitch for this speech synthesizer.
|
/// Returns the minimum pitch for this speech synthesizer.
|
||||||
/// `tts` must be a valid pointer to a TTS object.
|
/// `tts` must be a valid pointer to a TTS object.
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe extern "C" fn tts_min_pitch(tts: *const TTS) -> c_float {
|
pub unsafe extern "C" fn tts_min_pitch(tts: *const TTS) -> f32 {
|
||||||
tts.as_ref().unwrap().min_pitch()
|
tts.as_ref().unwrap().min_pitch()
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns the maximum pitch for this speech synthesizer.
|
/// Returns the maximum pitch for this speech synthesizer.
|
||||||
/// `tts` must be a valid pointer to a TTS object.
|
/// `tts` must be a valid pointer to a TTS object.
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe extern "C" fn tts_max_pitch(tts: *const TTS) -> c_float {
|
pub unsafe extern "C" fn tts_max_pitch(tts: *const TTS) -> f32 {
|
||||||
tts.as_ref().unwrap().max_pitch()
|
tts.as_ref().unwrap().max_pitch()
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns the normal pitch for this speech synthesizer.
|
/// Returns the normal pitch for this speech synthesizer.
|
||||||
/// `tts` must be a valid pointer to a TTS object.
|
/// `tts` must be a valid pointer to a TTS object.
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe extern "C" fn tts_normal_pitch(tts: *const TTS) -> c_float {
|
pub unsafe extern "C" fn tts_normal_pitch(tts: *const TTS) -> f32 {
|
||||||
tts.as_ref().unwrap().normal_pitch()
|
tts.as_ref().unwrap().normal_pitch()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -230,7 +229,7 @@ pub unsafe extern "C" fn tts_normal_pitch(tts: *const TTS) -> c_float {
|
||||||
/// or if `tts` is NULL.
|
/// or if `tts` is NULL.
|
||||||
/// Does nothing if `pitch` is NULL.
|
/// Does nothing if `pitch` is NULL.
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe extern "C" fn tts_get_pitch(tts: *const TTS, pitch: *mut c_float) -> bool {
|
pub unsafe extern "C" fn tts_get_pitch(tts: *const TTS, pitch: *mut f32) -> bool {
|
||||||
if tts.is_null() {
|
if tts.is_null() {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -252,7 +251,7 @@ pub unsafe extern "C" fn tts_get_pitch(tts: *const TTS, pitch: *mut c_float) ->
|
||||||
/// Returns true on success, false on error (likely that the backend doesn't support pitch changes)
|
/// Returns true on success, false on error (likely that the backend doesn't support pitch changes)
|
||||||
/// or if `tts` is NULL.
|
/// or if `tts` is NULL.
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe extern "C" fn tts_set_pitch(tts: *mut TTS, pitch: c_float) -> bool {
|
pub unsafe extern "C" fn tts_set_pitch(tts: *mut TTS, pitch: f32) -> bool {
|
||||||
if tts.is_null() {
|
if tts.is_null() {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -268,21 +267,21 @@ pub unsafe extern "C" fn tts_set_pitch(tts: *mut TTS, pitch: c_float) -> bool {
|
||||||
/// Returns the minimum volume for this speech synthesizer.
|
/// Returns the minimum volume for this speech synthesizer.
|
||||||
/// `tts` must be a valid pointer to a TTS object.
|
/// `tts` must be a valid pointer to a TTS object.
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe extern "C" fn tts_min_volume(tts: *const TTS) -> c_float {
|
pub unsafe extern "C" fn tts_min_volume(tts: *const TTS) -> f32 {
|
||||||
tts.as_ref().unwrap().min_volume()
|
tts.as_ref().unwrap().min_volume()
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns the maximum volume for this speech synthesizer.
|
/// Returns the maximum volume for this speech synthesizer.
|
||||||
/// `tts` must be a valid pointer to a TTS object.
|
/// `tts` must be a valid pointer to a TTS object.
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe extern "C" fn tts_max_volume(tts: *const TTS) -> c_float {
|
pub unsafe extern "C" fn tts_max_volume(tts: *const TTS) -> f32 {
|
||||||
tts.as_ref().unwrap().max_volume()
|
tts.as_ref().unwrap().max_volume()
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns the normal volume for this speech synthesizer.
|
/// Returns the normal volume for this speech synthesizer.
|
||||||
/// `tts` must be a valid pointer to a TTS object.
|
/// `tts` must be a valid pointer to a TTS object.
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe extern "C" fn tts_normal_volume(tts: *const TTS) -> c_float {
|
pub unsafe extern "C" fn tts_normal_volume(tts: *const TTS) -> f32 {
|
||||||
tts.as_ref().unwrap().normal_volume()
|
tts.as_ref().unwrap().normal_volume()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -291,7 +290,7 @@ pub unsafe extern "C" fn tts_normal_volume(tts: *const TTS) -> c_float {
|
||||||
/// or if `tts` is NULL.
|
/// or if `tts` is NULL.
|
||||||
/// Does nothing if `volume` is NULL.
|
/// Does nothing if `volume` is NULL.
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe extern "C" fn tts_get_volume(tts: *const TTS, volume: *mut c_float) -> bool {
|
pub unsafe extern "C" fn tts_get_volume(tts: *const TTS, volume: *mut f32) -> bool {
|
||||||
if tts.is_null() {
|
if tts.is_null() {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -313,7 +312,7 @@ pub unsafe extern "C" fn tts_get_volume(tts: *const TTS, volume: *mut c_float) -
|
||||||
/// Returns true on success, false on error (likely that the backend doesn't support volume changes)
|
/// Returns true on success, false on error (likely that the backend doesn't support volume changes)
|
||||||
/// or if `tts` is NULL.
|
/// or if `tts` is NULL.
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe extern "C" fn tts_set_volume(tts: *mut TTS, volume: c_float) -> bool {
|
pub unsafe extern "C" fn tts_set_volume(tts: *mut TTS, volume: f32) -> bool {
|
||||||
if tts.is_null() {
|
if tts.is_null() {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user