static void Main(string[] args) { Console.WriteLine("Starting"); GestureRecognition _gestureRecog; AmbrSpeechRecognition _speechRecog; KodiClient k = new KodiClient(); //The gesture and speech services don't actually care if there's a sensor attached. it will just return nothing _gestureRecog = new GestureRecognition(); _speechRecog = new AmbrSpeechRecognition(); //Subscribe to the events _gestureRecog.KinectActionRecognized += KinectActionEventHandler; _speechRecog.KinectActionRecognized += KinectActionEventHandler; _gestureRecog.KinectActionRecognized += k.KinectActionEventHandler; _speechRecog.KinectActionRecognized += k.KinectActionEventHandler; //Register the gestures _gestureRecog.Init().Wait(); Console.WriteLine("Ready"); //Wait until the user hits "escape" while (!(Console.KeyAvailable && Console.ReadKey(true).Key == ConsoleKey.Escape)) { // do something } }
public void KinectActionEventHandler(object sender, KinectRecognizedActionEventArgs e) { GestureAction action = e.ActionType; KinectActionRecognizedSource source = e.ActionSource; if (source == KinectActionRecognizedSource.Gesture) { if (action == GestureAction.INPUT_UP || action == GestureAction.INPUT_DOWN) { // Ignore scroll actions while one is already in progress if (scrollTimer.Enabled == false) { kodiStreamWriter.WriteLine(action.ToString()); scrollAction = action; //Set the scroll action we want to do scrollTimer.Interval = 1000; //Set the interval scrollTimer.Start(); //Start the timer } } else if (action == GestureAction.INPUT_PREVIOUS || action == GestureAction.INPUT_NEXT) { // Ignore scroll actions while one is already in progress if (scrollTimer.Enabled == false) { kodiStreamWriter.WriteLine(action.ToString()); scrollAction = action; //Set the scroll action we want to do scrollTimer.Interval = 1000; //TODO: Tune the scroll time. scrollTimer.Start(); //Start the timer } } else if (action == GestureAction.INPUT_SCROLLDONE) { scrollTimer.Enabled = false; //Stop the scroll timer, set the action to null scrollAction = null; scrollCount = 0; } else if (action == GestureAction.VOLUME_DOWN || action == GestureAction.VOLUME_UP) { //Set the volume action volumeAction = action; // Ignore volume actions while one is already in progress if (scrollTimer.Enabled == false) { kodiStreamWriter.WriteLine(action.ToString() + " 5"); volumeTimer.Start(); //Start the timer } } else if (action == GestureAction.VOLUME_DONE) { volumeAction = null; volumeTimer.Enabled = false; } else if (action == GestureAction.PLAYER_REWIND || action == GestureAction.PLAYER_FORWARD) { // Ignore seek actions while one is already in progress if (seekInProgress == false) { kodiStreamWriter.WriteLine(action.ToString()); seekInProgress = true; } } else if (action == GestureAction.PLAYER_SEEKDONE) { if (seekInProgress) { if (videoPaused) { kodiStreamWriter.WriteLine(GestureAction.PLAYER_PAUSE.ToString()); } else { kodiStreamWriter.WriteLine(GestureAction.PLAYER_PLAY.ToString()); } } seekInProgress = false; } else if (action == GestureAction.INPUT_SELECT) { // Aliasing of select and play, there may be a better way to implement this. kodiStreamWriter.WriteLine(action.ToString()); kodiStreamWriter.WriteLine(GestureAction.PLAYER_PLAY.ToString()); videoPaused = false; } else if (action == GestureAction.PLAYER_PAUSE) { kodiStreamWriter.WriteLine(action.ToString()); videoPaused = true; } else if (action == GestureAction.INPUT_HOME) { // Stop any playing content and return to the home screen. kodiStreamWriter.WriteLine(GestureAction.PLAYER_STOP.ToString()); kodiStreamWriter.WriteLine(action.ToString()); } else { kodiStreamWriter.WriteLine(action.ToString()); } } else { //the sender should be an AmbrSpeechRecognition object... capture a reference to it for later asr = (AmbrSpeechRecognition)sender; if (action == GestureAction.ACTIVATION_PHRASE) { //Send a message to //kodiStreamWriter.WriteLine("GUI_NOTIFICATION 'AMBr' 'Say A Command' 10000"); showNotification("Say a Command", "AMBr", 10000, true); kodiStreamWriter.WriteLine("APPLICATION_MUTE"); speechTimer.Stop(); speechTimer.Interval = 10000; speechTimer.Start(); allowSpeechEvents = true; } else if (allowSpeechEvents) { //Source is a speech event //kodiStreamWriter.WriteLine("GUI_NOTIFICATION 'AMBr' 'Say A Command' 2500"); showNotification(notificationTitle, notificationSubtitle, 2500); speechTimer.Stop(); speechTimer.Interval = 2500; speechTimer.Start(); if (action == GestureAction.VOLUME_UP) { kodiStreamWriter.WriteLine("VOLUME_UP 10"); } else if (action == GestureAction.VOLUME_DOWN) { kodiStreamWriter.WriteLine("VOLUME_DOWN 10"); } // Not fully implemented yet, currently just generates the grammar else if (action == GestureAction.PLAY_MOVIE) { kodiStreamReader.DiscardBufferedData(); kodiStreamWriter.WriteLine("LS_MOVIES"); List <string> movies = new List <string>(); string currLine = kodiStreamReader.ReadLine(); while (!"DONE".Equals(currLine)) { movies.Add(currLine); currLine = kodiStreamReader.ReadLine(); } asr.RecognizeItemList(kodiListToXmlDocument(movies)); // Do something to get the user's selection... //kodiStreamWriter.WriteLine("GUI_NOTIFICATION 'Say a movie name' 'There are " + movies.Count.ToString() + " movies.' 10000"); playerIdType = "movieid"; showNotification("Say a movie title", "There are " + movies.Count.ToString() + " movies.", 10000, true); speechTimer.Stop(); speechTimer.Interval = 10000; speechTimer.Start(); } else if (action == GestureAction.PLAY_MUSIC) { kodiStreamReader.DiscardBufferedData(); kodiStreamWriter.WriteLine("LS_MUSIC"); List <string> songs = new List <string>(); string currLine = kodiStreamReader.ReadLine(); while (!"DONE".Equals(currLine)) { songs.Add(currLine); currLine = kodiStreamReader.ReadLine(); } asr.RecognizeItemList(kodiListToXmlDocument(songs)); // Do something to get the user's selection... //kodiStreamWriter.WriteLine("GUI_NOTIFICATION 'Say a movie name' 'There are " + movies.Count.ToString() + " movies.' 10000"); playerIdType = "songid"; showNotification("Say a song name", "There are " + songs.Count.ToString() + " songs.", 10000, true); speechTimer.Stop(); speechTimer.Interval = 10000; speechTimer.Start(); } else if (action == GestureAction.PLAYER_OPEN) { //Console.WriteLine(e.ActionData) kodiStreamWriter.WriteLine("PLAYER_OPEN " + playerIdType + " " + e.ActionData); asr.RecognizeItemList(null); } else if (action == GestureAction.PLAYER_OPEN_ERROR) { //TODO See if we really need this... showNotification("Error", "Media Item Not Found", 10000); asr.RecognizeItemList(null); } else { kodiStreamWriter.WriteLine(action.ToString()); } } } }