1
0
mirror of https://github.com/ndarilek/tts-rs.git synced 2024-11-14 06:39:38 +00:00
This commit is contained in:
databasedav 2024-02-19 15:27:28 +08:00 committed by GitHub
commit c4fae2cd31
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 60 additions and 0 deletions

View File

@ -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
}

View File

@ -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()