From 6a706f36ab36b6575a0a2cedfa038590f424bd11 Mon Sep 17 00:00:00 2001 From: Nolan Darilek Date: Wed, 11 Nov 2020 10:27:03 -0600 Subject: [PATCH] Fix double-speaking bug for good, hopefully. --- examples/99bottles.rs | 2 +- examples/ramble.rs | 35 +++++++++++++++++++++++++++++++++++ src/backends/winrt.rs | 10 ++++++++-- 3 files changed, 44 insertions(+), 3 deletions(-) create mode 100644 examples/ramble.rs diff --git a/examples/99bottles.rs b/examples/99bottles.rs index 53ef9e3..960d675 100644 --- a/examples/99bottles.rs +++ b/examples/99bottles.rs @@ -15,7 +15,7 @@ fn main() -> Result<(), Error> { let mut tts = TTS::default()?; let mut bottles = 99; while bottles > 0 { - tts.speak(format!("{} bottles of beer on the wall,", bottles), true)?; + tts.speak(format!("{} bottles of beer on the wall,", bottles), false)?; tts.speak(format!("{} bottles of beer,", bottles), false)?; tts.speak("Take one down, pass it around", false)?; tts.speak("Give us a bit to drink this...", false)?; diff --git a/examples/ramble.rs b/examples/ramble.rs new file mode 100644 index 0000000..36265e7 --- /dev/null +++ b/examples/ramble.rs @@ -0,0 +1,35 @@ +use std::io; +use std::{thread, time}; + +#[cfg(target_os = "macos")] +use cocoa_foundation::base::id; +#[cfg(target_os = "macos")] +use cocoa_foundation::foundation::NSRunLoop; +#[cfg(target_os = "macos")] +use objc::{msg_send, sel, sel_impl}; + +use tts::*; + +fn main() -> Result<(), Error> { + env_logger::init(); + let mut tts = TTS::default()?; + let mut phrase = 1; + loop { + tts.speak(format!("Phrase {}", phrase), false); + let time = time::Duration::from_secs(5); + thread::sleep(time); + phrase += 1; + } + let mut _input = String::new(); + // The below is only needed to make the example run on MacOS because there is no NSRunLoop in this context. + // It shouldn't be needed in an app or game that almost certainly has one already. + #[cfg(target_os = "macos")] + { + let run_loop: id = unsafe { NSRunLoop::currentRunLoop() }; + unsafe { + let _: () = msg_send![run_loop, run]; + } + } + io::stdin().read_line(&mut _input)?; + Ok(()) +} diff --git a/src/backends/winrt.rs b/src/backends/winrt.rs index 13db143..829a56d 100644 --- a/src/backends/winrt.rs +++ b/src/backends/winrt.rs @@ -4,7 +4,7 @@ use std::sync::Mutex; use lazy_static::lazy_static; use log::{info, trace}; -use winrt::ComInterface; +use winrt::*; use tts_winrt_bindings::windows::media::playback::{ CurrentMediaPlaybackItemChangedEventArgs, MediaPlaybackItem, MediaPlaybackList, @@ -60,7 +60,10 @@ impl WinRT { *backend_id += 1; let mut backend_to_media_player = BACKEND_TO_MEDIA_PLAYER.lock().unwrap(); backend_to_media_player.insert(bid, player.clone()); - player.media_ended(TypedEventHandler::new(|sender, _args| { + player.media_ended(TypedEventHandler::new(|sender: &MediaPlayer, _args| { + let source = sender.source()?; + let source: MediaPlaybackList = source.try_into()?; + source.items()?.clear()?; let backend_to_media_player = BACKEND_TO_MEDIA_PLAYER.lock().unwrap(); let id = backend_to_media_player.iter().find(|v| v.1 == sender); if let Some(id) = id { @@ -80,6 +83,9 @@ impl WinRT { backend_to_playback_list.insert(bid, playback_list.clone()); playback_list.current_item_changed(TypedEventHandler::new( |sender: &MediaPlaybackList, args: &CurrentMediaPlaybackItemChangedEventArgs| { + println!("Changed"); + println!("{:?}, {:?}", args.old_item()?, args.new_item()?); + //sender.items()?.clear()?; let backend_to_playback_list = BACKEND_TO_PLAYBACK_LIST.lock().unwrap(); let id = backend_to_playback_list.iter().find(|v| v.1 == sender); if let Some(id) = id {