mirror of
https://github.com/ndarilek/tts-rs.git
synced 2024-11-14 06:39:38 +00:00
Merge 2211818bc5
into 3c8ae0ae42
This commit is contained in:
commit
c4fae2cd31
|
@ -59,6 +59,7 @@ impl Backend for Web {
|
|||
voice: true,
|
||||
get_voice: true,
|
||||
utterance_callbacks: true,
|
||||
pause_resume: true,
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -109,6 +110,22 @@ impl Backend for Web {
|
|||
mappings.retain(|v| v.1 != utterance_id);
|
||||
}) as Box<dyn Fn(_)>);
|
||||
utterance.set_onerror(Some(callback.as_ref().unchecked_ref()));
|
||||
let callback = Closure::wrap(Box::new(move |evt: SpeechSynthesisErrorEvent| {
|
||||
let mut callbacks = CALLBACKS.lock().unwrap();
|
||||
let callback = callbacks.get_mut(&id).unwrap();
|
||||
if let Some(f) = callback.utterance_pause.as_mut() {
|
||||
f(utterance_id);
|
||||
}
|
||||
}) as Box<dyn Fn(_)>);
|
||||
utterance.set_onpause(Some(callback.as_ref().unchecked_ref()));
|
||||
let callback = Closure::wrap(Box::new(move |evt: SpeechSynthesisErrorEvent| {
|
||||
let mut callbacks = CALLBACKS.lock().unwrap();
|
||||
let callback = callbacks.get_mut(&id).unwrap();
|
||||
if let Some(f) = callback.utterance_resume.as_mut() {
|
||||
f(utterance_id);
|
||||
}
|
||||
}) as Box<dyn Fn(_)>);
|
||||
utterance.set_onresume(Some(callback.as_ref().unchecked_ref()));
|
||||
if interrupt {
|
||||
self.stop()?;
|
||||
}
|
||||
|
@ -130,6 +147,24 @@ impl Backend for Web {
|
|||
Ok(())
|
||||
}
|
||||
|
||||
fn pause(&mut self) -> Result<(), Error> {
|
||||
trace!("pause()");
|
||||
if let Some(window) = web_sys::window() {
|
||||
let speech_synthesis = window.speech_synthesis().unwrap();
|
||||
speech_synthesis.pause();
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn resume(&mut self) -> Result<(), Error> {
|
||||
trace!("resume()");
|
||||
if let Some(window) = web_sys::window() {
|
||||
let speech_synthesis = window.speech_synthesis().unwrap();
|
||||
speech_synthesis.resume();
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn min_rate(&self) -> f32 {
|
||||
0.1
|
||||
}
|
||||
|
|
25
src/lib.rs
25
src/lib.rs
|
@ -170,6 +170,7 @@ pub struct Features {
|
|||
pub voice: bool,
|
||||
pub get_voice: bool,
|
||||
pub volume: bool,
|
||||
pub pause_resume: bool,
|
||||
}
|
||||
|
||||
impl fmt::Display for Features {
|
||||
|
@ -245,6 +246,8 @@ struct Callbacks {
|
|||
utterance_begin: Option<Box<dyn FnMut(UtteranceId)>>,
|
||||
utterance_end: Option<Box<dyn FnMut(UtteranceId)>>,
|
||||
utterance_stop: Option<Box<dyn FnMut(UtteranceId)>>,
|
||||
utterance_pause: Option<Box<dyn FnMut(UtteranceId)>>,
|
||||
utterance_resume: Option<Box<dyn FnMut(UtteranceId)>>,
|
||||
}
|
||||
|
||||
unsafe impl Send for Callbacks {}
|
||||
|
@ -386,6 +389,28 @@ impl Tts {
|
|||
}
|
||||
}
|
||||
|
||||
/// Pauses current speech.
|
||||
pub fn pause(&mut self) -> Result<&Self, Error> {
|
||||
let Features { pause, .. } = self.supported_features();
|
||||
if pause {
|
||||
self.0.write().unwrap().pause()?;
|
||||
Ok(self)
|
||||
} else {
|
||||
Err(Error::UnsupportedFeature)
|
||||
}
|
||||
}
|
||||
|
||||
/// Resumes current speech.
|
||||
pub fn resume(&mut self) -> Result<&Self, Error> {
|
||||
let Features { resume, .. } = self.supported_features();
|
||||
if resume {
|
||||
self.0.write().unwrap().resume()?;
|
||||
Ok(self)
|
||||
} else {
|
||||
Err(Error::UnsupportedFeature)
|
||||
}
|
||||
}
|
||||
|
||||
/// Returns the minimum rate for this speech synthesizer.
|
||||
pub fn min_rate(&self) -> f32 {
|
||||
self.0.read().unwrap().min_rate()
|
||||
|
|
Loading…
Reference in New Issue
Block a user