diff --git a/src/backends/web.rs b/src/backends/web.rs index 095cbf9..4c6cee4 100644 --- a/src/backends/web.rs +++ b/src/backends/web.rs @@ -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); 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); + 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); + 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 } diff --git a/src/lib.rs b/src/lib.rs index 09143df..b771a29 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -169,6 +169,7 @@ pub struct Features { pub voice: bool, pub get_voice: bool, pub volume: bool, + pub pause_resume: bool, } impl fmt::Display for Features { @@ -244,6 +245,8 @@ struct Callbacks { utterance_begin: Option>, utterance_end: Option>, utterance_stop: Option>, + utterance_pause: Option>, + utterance_resume: Option>, } unsafe impl Send for Callbacks {} @@ -385,6 +388,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()