Exemplo n.º 1
0
        public override void FinishedLaunching(NSObject notification)
        {
            // Configure logger
            string path = Path.Combine (Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location), "log4net.config");
            XmlConfigurator.ConfigureAndWatch (new FileInfo(path));
            logger.Info ("Ventriliquest 1.0 Starting up...");

            // Get list of available audio out devices
            xamspeech ham = new xamspeech ();
            OutputDevices = ham.GetDevices ();

            // Setup UI
            statusMenu = new NSMenu ();
            statusItem = NSStatusBar.SystemStatusBar.CreateStatusItem (30);

            var outputItem = new NSMenuItem ("Output Device",
                (a, b) => {

                });

            var deviceList = new NSMenu ();
            outputItem.Submenu = deviceList;

            OutputDeviceUID = "Built-in Output";

            foreach(var entry in OutputDevices) {
                var test = new NSMenuItem (entry.Key.ToString(),
                    (a, b) => {
                        foreach(NSMenuItem item in deviceList.ItemArray()) {
                            item.State = NSCellStateValue.Off;
                        }
                        NSMenuItem theItem = (NSMenuItem)a;
                        theItem.State = NSCellStateValue.On;
                        config.OutputDevice = theItem.Title;
                        foreach(var e in OutputDevices) {
                            if(e.Key.ToString().Equals(theItem.Title)) {
                                OutputDeviceUID = e.Value.ToString();
                            }
                        }
                    });
                if(entry.Key.ToString().Equals(config.OutputDevice)) {
                    test.State = NSCellStateValue.On;
                    OutputDeviceUID = entry.Value.ToString ();
                }
                deviceList.AddItem (test);
            }

            var daItem = new NSMenuItem ("Local Connections Only",
                (a, b) => {
                    NSMenuItem theItem = (NSMenuItem)a;
                    if(theItem.State == NSCellStateValue.On) {
                        config.LocalOnly = false;
                        theItem.State = NSCellStateValue.Off;
                    } else {
                        config.LocalOnly = true;
                        theItem.State = NSCellStateValue.On;
                    }
                });

            if(config.LocalOnly) {
                daItem.State = NSCellStateValue.On;
            }

            var quitItem = new NSMenuItem("Quit",
                (a, b) => Shutdown ());

            var voiceconfigItem = new NSMenuItem("Voice Configuration",
                (a, b) => Process.Start("http://127.0.0.1:7888/config"));

            statusMenu.AddItem (outputItem);
            statusMenu.AddItem (daItem);
            statusMenu.AddItem (voiceconfigItem);
            statusMenu.AddItem (quitItem);
            statusItem.Menu = statusMenu;
            statusItem.Image = NSImage.ImageNamed("tts-1.png");
            statusItem.AlternateImage = NSImage.ImageNamed ("tts-2.png");
            statusItem.HighlightMode = true;

            speechdelegate.DidComplete += delegate {
                synthesis.Set();
            };
            sounddelegate.DidComplete += delegate {
                playback.Set ();
                IsSounding = false;
                IsSpeaking = false;
                sound.Dispose();
            };

            speech.Delegate = speechdelegate;

            queuetimer = new System.Timers.Timer (250);
            queuetimer.Elapsed += (object sender, ElapsedEventArgs e) => {
                TTSRequest r;
                if(Queue.TryDequeue(out r)) {
                    if(r.Interrupt) {
                        // stop current TTS
                        NSApplication.SharedApplication.InvokeOnMainThread( delegate {
                            if(IsSpeaking) {
                                speech.StopSpeaking();
                            }
                            if(IsSounding) {
                                sound.Stop();
                            }
                        });
                        // clear queue
                        SpeechQueue.Clear();
                    }
                    SpeechQueue.Enqueue(r);
                    RequestCount++;

                }
                var eventdata = new Hashtable();
                eventdata.Add("ProcessedRequests", RequestCount);
                eventdata.Add("QueuedRequests", SpeechQueue.Count);
                eventdata.Add("IsSpeaking", IsSpeaking);
                InstrumentationEvent ev = new InstrumentationEvent();
                ev.EventName = "status";
                ev.Data = eventdata;
                NotifyGui(ev.EventMessage());
            };

            // when this timer fires, it will pull off of the speech queue and speak it
            // the 1000ms delay also adds a little pause between tts requests.
            speechtimer = new System.Timers.Timer (1000);
            speechtimer.Elapsed += (object sender, ElapsedEventArgs e) => {
                if(IsSpeaking.Equals(false)) {
                    if(SpeechQueue.Count > 0) {
                        TTSRequest r = SpeechQueue.Dequeue();
                        IsSpeaking = true;
                        speechtimer.Enabled = false;
                        var oink = Path.Combine(audiopath, "temp.aiff");
                        NSApplication.SharedApplication.InvokeOnMainThread( delegate {
                            ConfigureSpeechEngine(r);
                            speech.StartSpeakingStringtoURL(r.Text, new NSUrl(oink, false));
                        });
                        synthesis.WaitOne();
                        NSApplication.SharedApplication.InvokeOnMainThread( delegate {
                            IsSounding = true;
                            sound = new NSSound(Path.Combine(audiopath, "temp.aiff"), false);
                            sound.Delegate = sounddelegate;
                            //if(OutputDeviceUID != "Default") {
                                sound.PlaybackDeviceID = OutputDeviceUID;
                            //}
                            sound.Play();
                        });
                        playback.WaitOne();
                        IsSounding = false;
                        speechtimer.Enabled = true;
                    }
                }
            };

            queuetimer.Enabled = true;
            queuetimer.Start ();
            speechtimer.Enabled = true;
            speechtimer.Start ();

            InitHTTPServer ();
        }
Exemplo n.º 2
0
 void HandleProgressChanged(object sender, ProgressChangedEventArgs e)
 {
     if (e.ProgressPercentage == MSG_HIDE_IMAGE) {
         Window.HideBackgroundImage ();
         if (soundPlayer.IsPlaying())
             soundPlayer.Stop ();
     }
     else {
         Window.SetBackgroundImage (NSImage.ImageNamed (images[e.ProgressPercentage]));
         if (soundPlayer != null) {
             soundPlayer.Dispose ();
         }
         var path = NSBundle.MainBundle.PathForSoundResource (sounds[r.Next(0, sounds.Length)]);
         soundPlayer = new NSSound (path, true);
         soundPlayer.Play ();
     }
 }