OSDN Git Service

VoiceConsole mostly working.
authorMojito Sorbet <mojitotech@gmail.com>
Fri, 30 Oct 2009 18:10:20 +0000 (18:10 +0000)
committerMojito Sorbet <mojitotech@gmail.com>
Fri, 30 Oct 2009 18:10:20 +0000 (18:10 +0000)
VoicePlugin disabled.

git-svn-id: https://radegast.googlecode.com/svn/trunk@396 f7a694da-4d33-11de-9ad6-1127a62b9fcd

Radegast/Core/VoiceGateway.cs
Radegast/GUI/Consoles/VoiceConsole.Designer.cs
Radegast/GUI/Consoles/VoiceConsole.cs
Radegast/GUI/Consoles/VoiceConsole.resx
plugins/Radegast.Plugin.Voice/VoiceControl.cs

index 5413103..7dd0828 100644 (file)
@@ -16,6 +16,8 @@ namespace Radegast.Core
 {\r
     public class VoiceGateway : IDisposable\r
     {\r
+        // These states should be in increasing order of 'completeness'\r
+        // so that the (int) values can drive a progress bar.\r
         public enum ConnectionState\r
         {\r
             None = 0,\r
@@ -35,33 +37,47 @@ namespace Radegast.Core
         private string connectionHandle;\r
         private string accountHandle;\r
         private string sessionHandle;\r
+\r
+        // Parameters to Vivox daemon\r
         private string slvoicePath = "";\r
         private string slvoiceArgs = "-ll -1";\r
         private string daemonNode = "127.0.0.1";\r
         private int daemonPort = 44124;\r
+\r
         private string voiceUser;\r
         private string voicePassword;\r
         private string spatialUri;\r
         private string spatialCredentials;\r
+\r
+        // Session management\r
         private Dictionary<string, VoiceSession> sessions;\r
         private VoiceSession spatialSession;\r
         private Uri currentParcelCap;\r
         private Uri nextParcelCap;\r
         private string regionName;\r
+\r
+        // Position update thread\r
         private Thread posThread;\r
         private ManualResetEvent posRestart;\r
         public GridClient Client;\r
-\r
         private OpenMetaverse.Voice.VoiceGateway.VoicePosition position;\r
-\r
-        // Last places Self was located\r
         private Vector3d oldPosition;\r
         private Vector3d oldAt;\r
 \r
+        // Audio interfaces\r
         private List<string> inputDevices;\r
+        /// <summary>\r
+        /// List of audio input devices\r
+        /// </summary>\r
         public List<string> CaptureDevices { get { return inputDevices; } }\r
         private List<string> outputDevices;\r
+        /// <summary>\r
+        /// List of audio output devices\r
+        /// </summary>\r
         public List<string> PlaybackDevices { get { return outputDevices; } }\r
+        private string currentCaptureDevice;\r
+        private string currentPlaybackDevice;\r
+        private bool testing = false;\r
 \r
         public event EventHandler OnSessionCreate;\r
         public event EventHandler OnSessionRemove;\r
@@ -69,6 +85,8 @@ namespace Radegast.Core
         public event VoiceConnectionChangeCallback OnVoiceConnectionChange;\r
         public delegate void VoiceMicTestCallback(float level);\r
         public event VoiceMicTestCallback OnVoiceMicTest;\r
+        public delegate void VoiceDevicesAvailableEvent(List<string> capture, List<string> playback);\r
+        public event VoiceDevicesAvailableEvent OnVoiceDevicesAvailable;\r
 \r
         internal VoiceGateway( GridClient c )\r
         {\r
@@ -153,6 +171,15 @@ namespace Radegast.Core
                 new OpenMetaverse.Voice.VoiceGateway.AccountLoginResponseCallback(connector_OnAccountLoginResponse);\r
 \r
             Logger.Log("Voice initialized", Helpers.LogLevel.Info);\r
+\r
+            // If voice provisioning capability is already available,\r
+            // proceed with voice startup.   Otherwise the EventQueueRunning\r
+            // event will do it.\r
+            System.Uri vCap =\r
+                 Client.Network.CurrentSim.Caps.CapabilityURI("ProvisionVoiceAccountRequest");\r
+            if (vCap != null)\r
+                RequestVoiceProvision(vCap);\r
+\r
         }\r
 \r
         internal void Stop()\r
@@ -259,6 +286,20 @@ namespace Radegast.Core
 \r
             return string.Empty;\r
         }\r
+\r
+        void RequestVoiceProvision( System.Uri cap )\r
+        {\r
+            OpenMetaverse.Http.CapsClient capClient =\r
+                new OpenMetaverse.Http.CapsClient(cap);\r
+            capClient.OnComplete +=\r
+                new OpenMetaverse.Http.CapsClient.CompleteCallback(cClient_OnComplete);\r
+            OSD postData = new OSD();\r
+\r
+            // STEP 0\r
+            Logger.Log("Requesting voice capability", Helpers.LogLevel.Info);\r
+            capClient.BeginGetResponse(postData, OSDFormat.Xml, 10000);\r
+        }\r
+\r
         /// <summary>\r
         /// Request voice cap when changeing regions\r
         /// </summary>\r
@@ -287,19 +328,11 @@ namespace Radegast.Core
                 // Do we have voice capability?\r
                 if (vCap == null)\r
                 {\r
-                    Logger.Log("Null voice capability", Helpers.LogLevel.Warning);\r
+                    Logger.Log("Null voice capability after event queue running", Helpers.LogLevel.Warning);\r
                 }\r
                 else\r
                 {\r
-                    OpenMetaverse.Http.CapsClient capClient =\r
-                        new OpenMetaverse.Http.CapsClient(vCap);\r
-                    capClient.OnComplete +=\r
-                        new OpenMetaverse.Http.CapsClient.CompleteCallback(cClient_OnComplete);\r
-                    OSD postData = new OSD();\r
-\r
-                    // STEP 0\r
-                    Logger.Log("Requesting voice capability", Helpers.LogLevel.Info);\r
-                    capClient.BeginGetResponse(postData, OSDFormat.Xml, 10000);\r
+                    RequestVoiceProvision(vCap);\r
                 }\r
 \r
                 return;\r
@@ -499,6 +532,8 @@ namespace Radegast.Core
             if (!sessions.ContainsKey(sessionHandle))\r
                 return;\r
 \r
+            ReportConnectionState(ConnectionState.AccountLogin);\r
+\r
             // Clean up spatial pointers.\r
             VoiceSession s = sessions[sessionHandle];\r
             if (s.IsSpatial)\r
@@ -648,6 +683,7 @@ namespace Radegast.Core
         void connector_OnDaemonConnected()\r
         {\r
             Logger.Log("Daemon connected", Helpers.LogLevel.Info);\r
+            ReportConnectionState(ConnectionState.DaemonConnected);\r
 \r
             // The connector is what does the logging.\r
             OpenMetaverse.Voice.VoiceGateway.VoiceLoggingSettings vLog =\r
@@ -713,11 +749,11 @@ namespace Radegast.Core
         {\r
             Logger.Log("Account Login "+StatusString, Helpers.LogLevel.Info );\r
             accountHandle = AccountHandle;\r
-\r
+            ReportConnectionState(ConnectionState.AccountLogin);\r
             ParcelChanged();\r
         }\r
 \r
-        #region Tuning\r
+        #region Audio devices\r
         /// <summary>\r
         /// Handle response to audio output device query\r
         /// </summary>\r
@@ -735,6 +771,8 @@ namespace Radegast.Core
            OpenMetaverse.Voice.VoiceGateway.VoiceRequest Request)\r
         {\r
             outputDevices = RenderDevices;\r
+            if (inputDevices != null && OnVoiceDevicesAvailable != null)\r
+                OnVoiceDevicesAvailable(inputDevices, outputDevices);\r
         }\r
 \r
         /// <summary>\r
@@ -753,9 +791,88 @@ namespace Radegast.Core
             OpenMetaverse.Voice.VoiceGateway.VoiceRequest Request)\r
         {\r
             inputDevices = CaptureDevices;\r
+            if (outputDevices != null && OnVoiceDevicesAvailable != null)\r
+                OnVoiceDevicesAvailable(inputDevices, outputDevices);\r
         }\r
 \r
-        #endregion\r
+        public string CaptureDevice\r
+        {\r
+            get { return currentCaptureDevice; }\r
+            set\r
+            {\r
+                currentCaptureDevice = value;\r
+                connector.AuxSetCaptureDevice(value);\r
+            }\r
+        }\r
+        public string PlaybackDevice\r
+        {\r
+            get { return currentPlaybackDevice; }\r
+            set\r
+            {\r
+                currentPlaybackDevice = value;\r
+                connector.AuxSetRenderDevice(value);\r
+            }\r
+        }\r
+\r
+                internal int MicLevel\r
+        {\r
+            set\r
+            {\r
+                connector.ConnectorSetLocalMicVolume(connectionHandle, value);\r
+            }\r
+        }\r
+        internal int SpkrLevel\r
+        {\r
+            set\r
+            {\r
+                connector.ConnectorSetLocalSpeakerVolume(connectionHandle, value);\r
+            }\r
+        }\r
+\r
+        internal bool MicMute\r
+        {\r
+            set\r
+            {\r
+                connector.ConnectorMuteLocalMic(connectionHandle, value);\r
+            }\r
+        }\r
+\r
+        internal bool SpkrMute\r
+        {\r
+            set\r
+            {\r
+                connector.ConnectorMuteLocalSpeaker(connectionHandle, value);\r
+            }\r
+        }\r
+\r
+        /// <summary>\r
+        /// Set audio test mode\r
+        /// </summary>\r
+        /// <param name="on"></param>\r
+        public bool TestMode\r
+        {\r
+            get { return testing;  }\r
+            set\r
+            {\r
+                testing = value;\r
+                if (testing)\r
+                {\r
+                    if (spatialSession != null)\r
+                    {\r
+                        spatialSession.Close();\r
+                        spatialSession = null;\r
+                    }\r
+                    connector.AuxCaptureAudioStart(0);\r
+                }\r
+                else\r
+                {\r
+                    connector.AuxCaptureAudioStop();\r
+                    ParcelChanged();\r
+                }\r
+            }\r
+        }\r
+#endregion\r
+\r
 \r
 \r
 \r
@@ -871,79 +988,6 @@ namespace Radegast.Core
             }\r
         }\r
 \r
-        \r
-#region GUI\r
-        internal int MicLevel\r
-        {\r
-            set\r
-            {\r
-                connector.ConnectorSetLocalMicVolume(connectionHandle, value);\r
-            }\r
-        }\r
-        internal int SpkrLevel\r
-        {\r
-            set\r
-            {\r
-                connector.ConnectorSetLocalSpeakerVolume(connectionHandle, value);\r
-            }\r
-        }\r
-\r
-        /// <summary>\r
-        /// Change the audio capture device by user input\r
-        /// </summary>\r
-        /// <param name="name"></param>\r
-        internal void SetMicDevice(string name)\r
-         {\r
-             connector.AuxSetCaptureDevice(name);\r
-         }\r
-\r
-        /// <summary>\r
-        /// Change the audio render device by user input\r
-        /// </summary>\r
-        /// <param name="name"></param>\r
-        internal void SetSpkrDevice(string name)\r
-        {\r
-             connector.AuxSetRenderDevice(name);\r
-        }\r
-\r
-        internal bool MicMute\r
-        {\r
-            set\r
-            {\r
-                connector.ConnectorMuteLocalMic(connectionHandle, value);\r
-            }\r
-        }\r
-\r
-        internal bool SpkrMute\r
-        {\r
-            set\r
-            {\r
-                connector.ConnectorMuteLocalSpeaker(connectionHandle, value);\r
-            }\r
-        }\r
-\r
-        /// <summary>\r
-        /// Toggle test mode\r
-        /// </summary>\r
-        /// <param name="on"></param>\r
-        internal void TestMode(bool on)\r
-        {\r
-            if (on)\r
-            {\r
-                if (spatialSession != null)\r
-                {\r
-                    spatialSession.Close();\r
-                    spatialSession = null;\r
-                }\r
-                connector.AuxCaptureAudioStart(0);\r
-            }\r
-            else\r
-            {\r
-                connector.AuxCaptureAudioStop();\r
-                ParcelChanged();\r
-            }\r
-        }\r
-#endregion\r
 \r
         internal class SessionListItem : System.Windows.Forms.ListViewItem\r
         {\r
index a4138ca..387d2c7 100644 (file)
@@ -63,13 +63,13 @@ namespace Radegast
             this.components = new System.ComponentModel.Container();\r
             System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(VoiceConsole));\r
             this.splitContainer1 = new System.Windows.Forms.SplitContainer();\r
+            this.spkrMute = new System.Windows.Forms.CheckBox();\r
+            this.micMute = new System.Windows.Forms.CheckBox();\r
             this.pictureBox2 = new System.Windows.Forms.PictureBox();\r
-            this.pictureBox1 = new System.Windows.Forms.PictureBox();\r
             this.progressBar1 = new System.Windows.Forms.ProgressBar();\r
             this.label2 = new System.Windows.Forms.Label();\r
             this.micLevel = new System.Windows.Forms.TrackBar();\r
             this.spkrLevel = new System.Windows.Forms.TrackBar();\r
-            this.label1 = new System.Windows.Forms.Label();\r
             this.spkrDevice = new System.Windows.Forms.ComboBox();\r
             this.micDevice = new System.Windows.Forms.ComboBox();\r
             this.chkVoiceEnable = new System.Windows.Forms.CheckBox();\r
@@ -86,13 +86,11 @@ namespace Radegast
             this.ctxPoint = new System.Windows.Forms.ToolStripMenuItem();\r
             this.ctxSource = new System.Windows.Forms.ToolStripMenuItem();\r
             this.TalkStates = new System.Windows.Forms.ImageList(this.components);\r
-            this.micMute = new System.Windows.Forms.CheckBox();\r
-            this.spkrMute = new System.Windows.Forms.CheckBox();\r
+            this.label1 = new System.Windows.Forms.Label();\r
             this.splitContainer1.Panel1.SuspendLayout();\r
             this.splitContainer1.Panel2.SuspendLayout();\r
             this.splitContainer1.SuspendLayout();\r
             ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).BeginInit();\r
-            ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit();\r
             ((System.ComponentModel.ISupportInitialize)(this.micLevel)).BeginInit();\r
             ((System.ComponentModel.ISupportInitialize)(this.spkrLevel)).BeginInit();\r
             this.avatarContext.SuspendLayout();\r
@@ -106,15 +104,14 @@ namespace Radegast
             // \r
             // splitContainer1.Panel1\r
             // \r
+            this.splitContainer1.Panel1.Controls.Add(this.label1);\r
             this.splitContainer1.Panel1.Controls.Add(this.spkrMute);\r
             this.splitContainer1.Panel1.Controls.Add(this.micMute);\r
             this.splitContainer1.Panel1.Controls.Add(this.pictureBox2);\r
-            this.splitContainer1.Panel1.Controls.Add(this.pictureBox1);\r
             this.splitContainer1.Panel1.Controls.Add(this.progressBar1);\r
             this.splitContainer1.Panel1.Controls.Add(this.label2);\r
             this.splitContainer1.Panel1.Controls.Add(this.micLevel);\r
             this.splitContainer1.Panel1.Controls.Add(this.spkrLevel);\r
-            this.splitContainer1.Panel1.Controls.Add(this.label1);\r
             this.splitContainer1.Panel1.Controls.Add(this.spkrDevice);\r
             this.splitContainer1.Panel1.Controls.Add(this.micDevice);\r
             this.splitContainer1.Panel1.Controls.Add(this.chkVoiceEnable);\r
@@ -122,31 +119,44 @@ namespace Radegast
             // splitContainer1.Panel2\r
             // \r
             this.splitContainer1.Panel2.Controls.Add(this.participants);\r
-            this.splitContainer1.Size = new System.Drawing.Size(516, 334);\r
-            this.splitContainer1.SplitterDistance = 366;\r
+            this.splitContainer1.Size = new System.Drawing.Size(654, 424);\r
+            this.splitContainer1.SplitterDistance = 462;\r
             this.splitContainer1.TabIndex = 7;\r
             this.splitContainer1.TabStop = false;\r
             // \r
+            // spkrMute\r
+            // \r
+            this.spkrMute.AutoSize = true;\r
+            this.spkrMute.Location = new System.Drawing.Point(92, 114);\r
+            this.spkrMute.Name = "spkrMute";\r
+            this.spkrMute.Size = new System.Drawing.Size(50, 17);\r
+            this.spkrMute.TabIndex = 21;\r
+            this.spkrMute.Text = "Mute";\r
+            this.spkrMute.UseVisualStyleBackColor = true;\r
+            // \r
+            // micMute\r
+            // \r
+            this.micMute.AutoSize = true;\r
+            this.micMute.Checked = true;\r
+            this.micMute.CheckState = System.Windows.Forms.CheckState.Checked;\r
+            this.micMute.Location = new System.Drawing.Point(92, 69);\r
+            this.micMute.Name = "micMute";\r
+            this.micMute.Size = new System.Drawing.Size(50, 17);\r
+            this.micMute.TabIndex = 20;\r
+            this.micMute.Text = "Mute";\r
+            this.micMute.UseVisualStyleBackColor = true;\r
+            this.micMute.CheckedChanged += new System.EventHandler(this.micMute_CheckedChanged);\r
+            // \r
             // pictureBox2\r
             // \r
             this.pictureBox2.Image = ((System.Drawing.Image)(resources.GetObject("pictureBox2.Image")));\r
             this.pictureBox2.InitialImage = ((System.Drawing.Image)(resources.GetObject("pictureBox2.InitialImage")));\r
-            this.pictureBox2.Location = new System.Drawing.Point(8, 290);\r
+            this.pictureBox2.Location = new System.Drawing.Point(28, 112);\r
             this.pictureBox2.Name = "pictureBox2";\r
             this.pictureBox2.Size = new System.Drawing.Size(31, 29);\r
             this.pictureBox2.TabIndex = 19;\r
             this.pictureBox2.TabStop = false;\r
             // \r
-            // pictureBox1\r
-            // \r
-            this.pictureBox1.Image = ((System.Drawing.Image)(resources.GetObject("pictureBox1.Image")));\r
-            this.pictureBox1.InitialImage = ((System.Drawing.Image)(resources.GetObject("pictureBox1.InitialImage")));\r
-            this.pictureBox1.Location = new System.Drawing.Point(218, 205);\r
-            this.pictureBox1.Name = "pictureBox1";\r
-            this.pictureBox1.Size = new System.Drawing.Size(31, 29);\r
-            this.pictureBox1.TabIndex = 18;\r
-            this.pictureBox1.TabStop = false;\r
-            // \r
             // progressBar1\r
             // \r
             this.progressBar1.Location = new System.Drawing.Point(158, 14);\r
@@ -158,7 +168,7 @@ namespace Radegast
             // label2\r
             // \r
             this.label2.AutoSize = true;\r
-            this.label2.Location = new System.Drawing.Point(13, 205);\r
+            this.label2.Location = new System.Drawing.Point(240, 161);\r
             this.label2.Name = "label2";\r
             this.label2.Size = new System.Drawing.Size(37, 13);\r
             this.label2.TabIndex = 16;\r
@@ -168,7 +178,7 @@ namespace Radegast
             // \r
             this.micLevel.BackColor = System.Drawing.SystemColors.Control;\r
             this.micLevel.LargeChange = 20;\r
-            this.micLevel.Location = new System.Drawing.Point(108, 205);\r
+            this.micLevel.Location = new System.Drawing.Point(92, 161);\r
             this.micLevel.Maximum = 100;\r
             this.micLevel.Minimum = -100;\r
             this.micLevel.Name = "micLevel";\r
@@ -179,7 +189,7 @@ namespace Radegast
             // \r
             // spkrLevel\r
             // \r
-            this.spkrLevel.Location = new System.Drawing.Point(249, 205);\r
+            this.spkrLevel.Location = new System.Drawing.Point(330, 161);\r
             this.spkrLevel.Maximum = 100;\r
             this.spkrLevel.Minimum = -100;\r
             this.spkrLevel.Name = "spkrLevel";\r
@@ -188,30 +198,21 @@ namespace Radegast
             this.spkrLevel.TickFrequency = 20;\r
             this.spkrLevel.ValueChanged += new System.EventHandler(this.spkrLevel_ValueChanged);\r
             // \r
-            // label1\r
-            // \r
-            this.label1.AutoSize = true;\r
-            this.label1.Location = new System.Drawing.Point(10, 234);\r
-            this.label1.Name = "label1";\r
-            this.label1.Size = new System.Drawing.Size(70, 13);\r
-            this.label1.TabIndex = 13;\r
-            this.label1.Text = "Device select";\r
-            // \r
             // spkrDevice\r
             // \r
             this.spkrDevice.FormattingEnabled = true;\r
-            this.spkrDevice.Location = new System.Drawing.Point(45, 298);\r
+            this.spkrDevice.Location = new System.Drawing.Point(158, 112);\r
             this.spkrDevice.Name = "spkrDevice";\r
-            this.spkrDevice.Size = new System.Drawing.Size(308, 21);\r
+            this.spkrDevice.Size = new System.Drawing.Size(276, 21);\r
             this.spkrDevice.TabIndex = 12;\r
             this.spkrDevice.SelectedIndexChanged += new System.EventHandler(this.spkrDevice_SelectedIndexChanged);\r
             // \r
             // micDevice\r
             // \r
             this.micDevice.FormattingEnabled = true;\r
-            this.micDevice.Location = new System.Drawing.Point(45, 264);\r
+            this.micDevice.Location = new System.Drawing.Point(158, 67);\r
             this.micDevice.Name = "micDevice";\r
-            this.micDevice.Size = new System.Drawing.Size(308, 21);\r
+            this.micDevice.Size = new System.Drawing.Size(276, 21);\r
             this.micDevice.TabIndex = 11;\r
             this.micDevice.SelectedIndexChanged += new System.EventHandler(this.micDevice_SelectedIndexChanged);\r
             // \r
@@ -238,7 +239,8 @@ namespace Radegast
             this.participants.Location = new System.Drawing.Point(0, 0);\r
             this.participants.MultiSelect = false;\r
             this.participants.Name = "participants";\r
-            this.participants.Size = new System.Drawing.Size(146, 334);\r
+            this.participants.Size = new System.Drawing.Size(188, 424);\r
+            this.participants.Sorting = System.Windows.Forms.SortOrder.Ascending;\r
             this.participants.StateImageList = this.TalkStates;\r
             this.participants.TabIndex = 8;\r
             this.participants.UseCompatibleStateImageBehavior = false;\r
@@ -318,27 +320,14 @@ namespace Radegast
             this.TalkStates.Images.SetKeyName(1, "Talking.png");\r
             this.TalkStates.Images.SetKeyName(2, "TalkMute.png");\r
             // \r
-            // micMute\r
-            // \r
-            this.micMute.AutoSize = true;\r
-            this.micMute.Checked = true;\r
-            this.micMute.CheckState = System.Windows.Forms.CheckState.Checked;\r
-            this.micMute.Location = new System.Drawing.Point(119, 182);\r
-            this.micMute.Name = "micMute";\r
-            this.micMute.Size = new System.Drawing.Size(50, 17);\r
-            this.micMute.TabIndex = 20;\r
-            this.micMute.Text = "Mute";\r
-            this.micMute.UseVisualStyleBackColor = true;\r
-            // \r
-            // spkrMute\r
+            // label1\r
             // \r
-            this.spkrMute.AutoSize = true;\r
-            this.spkrMute.Location = new System.Drawing.Point(249, 182);\r
-            this.spkrMute.Name = "spkrMute";\r
-            this.spkrMute.Size = new System.Drawing.Size(50, 17);\r
-            this.spkrMute.TabIndex = 21;\r
-            this.spkrMute.Text = "Mute";\r
-            this.spkrMute.UseVisualStyleBackColor = true;\r
+            this.label1.AutoSize = true;\r
+            this.label1.Location = new System.Drawing.Point(170, 241);\r
+            this.label1.Name = "label1";\r
+            this.label1.Size = new System.Drawing.Size(134, 13);\r
+            this.label1.TabIndex = 22;\r
+            this.label1.Text = "Middle Mouse here for PTT";\r
             // \r
             // VoiceConsole\r
             // \r
@@ -347,13 +336,12 @@ namespace Radegast
             this.Controls.Add(this.splitContainer1);\r
             this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));\r
             this.Name = "VoiceConsole";\r
-            this.Size = new System.Drawing.Size(516, 334);\r
+            this.Size = new System.Drawing.Size(654, 424);\r
             this.splitContainer1.Panel1.ResumeLayout(false);\r
             this.splitContainer1.Panel1.PerformLayout();\r
             this.splitContainer1.Panel2.ResumeLayout(false);\r
             this.splitContainer1.ResumeLayout(false);\r
             ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).EndInit();\r
-            ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit();\r
             ((System.ComponentModel.ISupportInitialize)(this.micLevel)).EndInit();\r
             ((System.ComponentModel.ISupportInitialize)(this.spkrLevel)).EndInit();\r
             this.avatarContext.ResumeLayout(false);\r
@@ -379,15 +367,14 @@ namespace Radegast
         private CheckBox chkVoiceEnable;\r
         private ImageList TalkStates;\r
         private ComboBox micDevice;\r
-        private Label label1;\r
         private ComboBox spkrDevice;\r
         private TrackBar spkrLevel;\r
         private Label label2;\r
         private TrackBar micLevel;\r
         private ProgressBar progressBar1;\r
         private PictureBox pictureBox2;\r
-        private PictureBox pictureBox1;\r
         private CheckBox micMute;\r
         private CheckBox spkrMute;\r
+        private Label label1;\r
     }\r
 }\r
index ae20afc..63301fc 100644 (file)
@@ -36,6 +36,7 @@ using System.Drawing;
 using System.Text.RegularExpressions;\r
 using System.Windows.Forms;\r
 using Radegast.Netcom;\r
+using Radegast.Core;\r
 using OpenMetaverse;\r
 \r
 namespace Radegast\r
@@ -43,7 +44,7 @@ namespace Radegast
     public partial class VoiceConsole : UserControl\r
     {\r
         // These enumerated values must match the sequence of icons in TalkStates.\r
-        private enum State\r
+        private enum TalkState\r
         {\r
             Idle = 0,\r
             Talking,\r
@@ -54,68 +55,84 @@ namespace Radegast
         private RadegastNetcom netcom { get { return instance.Netcom; } }\r
         private GridClient client { get { return instance.Client; } }\r
         private TabsConsole tabConsole;\r
-        private Avatar currentAvatar;\r
-        private Dictionary<uint, Avatar> avatars = new Dictionary<uint, Avatar>();\r
-        private Dictionary<uint, bool> bots = new Dictionary<uint, bool>();\r
-        private Radegast.Core.VoiceGateway gateway;\r
-        private Radegast.Core.VoiceSession session;\r
+\r
+        private VoiceGateway gateway;\r
+        private VoiceSession session;\r
 \r
         public VoiceConsole(RadegastInstance instance)\r
         {\r
             InitializeComponent();\r
-            Disposed += new EventHandler(ChatConsole_Disposed);\r
+            Disposed += new EventHandler(VoiceConsole_Disposed);\r
 \r
             this.instance = instance;\r
-            this.instance.ClientChanged += new EventHandler<ClientChangedEventArgs>(instance_ClientChanged);\r
 \r
             // Callbacks\r
             netcom.ClientLoginStatus += new EventHandler<LoginProgressEventArgs>(netcom_ClientLoginStatus);\r
             netcom.ClientLoggedOut += new EventHandler(netcom_ClientLoggedOut);\r
 \r
-            gateway = new Radegast.Core.VoiceGateway(this.instance.Client);\r
+            gateway = new VoiceGateway(this.instance.Client);\r
+\r
+            // Initialize progress bar\r
+            progressBar1.Maximum = (int)VoiceGateway.ConnectionState.SessionRunning;\r
             SetProgress(0);\r
-            RegisterClientEvents(client);\r
+            RegisterClientEvents();\r
 \r
             this.instance.MainForm.Load += new EventHandler(MainForm_Load);\r
 \r
-            SorterClass sc = new SorterClass();\r
-            participants.ListViewItemSorter = sc;\r
-\r
-\r
             chkVoiceEnable.Checked = instance.GlobalSettings["Voice.enabled"].AsBoolean();\r
-            //            if (chkVoiceEnable.Checked)\r
-            //                gateway.Start();\r
+            if (chkVoiceEnable.Checked)\r
+                gateway.Start();\r
         }\r
 \r
-        private void RegisterClientEvents(GridClient client)\r
+        private void RegisterClientEvents()\r
         {\r
-            gateway.OnSessionCreate += new EventHandler(gateway_OnSessionCreate);\r
+            gateway.OnSessionCreate +=\r
+                new EventHandler(gateway_OnSessionCreate);\r
+            gateway.OnSessionRemove +=\r
+                new EventHandler(gateway_OnSessionRemove);\r
+            gateway.OnVoiceConnectionChange +=\r
+                new VoiceGateway.VoiceConnectionChangeCallback(gateway_OnVoiceConnectionChange);\r
+            gateway.OnVoiceDevicesAvailable +=\r
+                new VoiceGateway.VoiceDevicesAvailableEvent(gateway_OnVoiceDevicesAvailable);\r
+\r
+            KeyDown += new KeyEventHandler(VoiceConsole_KeyDown);\r
+            KeyUp += new KeyEventHandler(VoiceConsole_KeyUp);\r
+            MouseDown += new MouseEventHandler(OnMouseDown);\r
+            MouseUp += new MouseEventHandler(OnMouseUp);\r
         }\r
 \r
-        void gateway_OnSessionCreate(object sender, EventArgs e)\r
+       void MainForm_MouseDown(object sender, MouseEventArgs e)\r
         {\r
-            session = sender as Radegast.Core.VoiceSession;\r
-            participants.Items.Clear();\r
-\r
-            // Default Mic off and Spkr on\r
-            gateway.MicMute = true;\r
-            gateway.SpkrMute = false;\r
-            gateway.SpkrLevel = 64;\r
-            gateway.MicLevel = 64;\r
+            gateway.OnSessionCreate -=\r
+                new EventHandler(gateway_OnSessionCreate);\r
+            gateway.OnSessionRemove -=\r
+                new EventHandler(gateway_OnSessionRemove);\r
+            gateway.OnVoiceConnectionChange -=\r
+                new VoiceGateway.VoiceConnectionChangeCallback(gateway_OnVoiceConnectionChange);\r
+            gateway.OnVoiceDevicesAvailable -=\r
+                new VoiceGateway.VoiceDevicesAvailableEvent(gateway_OnVoiceDevicesAvailable);\r
+\r
+            MouseDown -= new MouseEventHandler(OnMouseDown);\r
+            MouseUp -= new MouseEventHandler(OnMouseUp);\r
+            \r
         }\r
 \r
-        private void UnregisterClientEvents(GridClient client)\r
+        private void UnregisterClientEvents()\r
         {\r
         }\r
 \r
         #region Connection Status\r
-        void gateway_OnDaemonRunning()\r
+        void gateway_OnVoiceConnectionChange(VoiceGateway.ConnectionState state)\r
         {\r
-            SetProgress(1);\r
+            BeginInvoke(new MethodInvoker(delegate()\r
+            {\r
+                SetProgress(state);\r
+            }));\r
         }\r
 \r
-        void SetProgress(int value)\r
+        void SetProgress(VoiceGateway.ConnectionState s)\r
         {\r
+            int value = (int)s;\r
             if (value == progressBar1.Maximum)\r
                 progressBar1.ForeColor = Color.Green;\r
             else if (value > (progressBar1.Maximum / 2))\r
@@ -127,19 +144,127 @@ namespace Radegast
         }\r
         #endregion\r
         #region Sessions\r
+        void gateway_OnSessionCreate(object sender, EventArgs e)\r
+        {\r
+            VoiceSession s = sender as VoiceSession;\r
+\r
+            BeginInvoke(new MethodInvoker(delegate()\r
+             {\r
+                 // There could theoretically be more than one session active\r
+                 // at a time, but the current implementation in SL seems to be limited to one.\r
+                 session = s;\r
+                 session.OnParticipantAdded += new EventHandler(session_OnParticipantAdded);\r
+                 session.OnParticipantRemoved += new EventHandler(session_OnParticipantRemoved);\r
+                 session.OnParticipantUpdate += new EventHandler(session_OnParticipantUpdate);\r
+                 participants.Items.Clear();\r
+\r
+                 // Default Mic off and Spkr on\r
+                 gateway.MicMute = true;\r
+                 gateway.SpkrMute = false;\r
+                 gateway.SpkrLevel = 64;\r
+                 gateway.MicLevel = 64;\r
+\r
+                 SetProgress(VoiceGateway.ConnectionState.SessionRunning);\r
+             }));\r
+        }\r
+\r
+        void gateway_OnSessionRemove(object sender, EventArgs e)\r
+        {\r
+            VoiceSession s = sender as VoiceSession;\r
+            if (session != s)\r
+                return;\r
+\r
+            BeginInvoke(new MethodInvoker(delegate()\r
+             {\r
+                 participants.Items.Clear();\r
+                 session.OnParticipantAdded -= new EventHandler(session_OnParticipantAdded);\r
+                 session.OnParticipantRemoved -= new EventHandler(session_OnParticipantRemoved);\r
+                 session.OnParticipantUpdate -= new EventHandler(session_OnParticipantUpdate);\r
+\r
+                 gateway.MicMute = true;\r
+                 micMute.Checked = true;\r
+\r
+                 session = null;\r
+                 SetProgress(VoiceGateway.ConnectionState.AccountLogin);\r
+             }));\r
+        }\r
+\r
+\r
         #endregion\r
+        #region Participants\r
+        void session_OnParticipantAdded(object sender, EventArgs e)\r
+        {\r
+            VoiceParticipant p = sender as VoiceParticipant;\r
+            BeginInvoke(new MethodInvoker(delegate()\r
+            {\r
+                // Supply the name based on the UUID.\r
+                p.Name = instance.getAvatarName(p.ID);\r
 \r
-        void instance_ClientChanged(object sender, ClientChangedEventArgs e)\r
+                ListViewItem item = new ListViewItem(p.Name);\r
+                item.Tag = p;\r
+                item.StateImageIndex = (int)TalkState.Idle;\r
+\r
+                lock (participants)\r
+                    participants.Items.Add(item);\r
+            }));\r
+        }\r
+\r
+        void session_OnParticipantRemoved(object sender, EventArgs e)\r
+        {\r
+            VoiceParticipant p = sender as VoiceParticipant;\r
+            if (p.Name == null) return;\r
+            BeginInvoke(new MethodInvoker(delegate()\r
+            {\r
+                lock (participants)\r
+                {\r
+                    ListViewItem item = FindParticipantItem(p);\r
+                    if (item != null)\r
+                        participants.Items.Remove(item);\r
+                }\r
+            }));\r
+        }\r
+\r
+        void session_OnParticipantUpdate(object sender, EventArgs e)\r
+        {\r
+            VoiceParticipant p = sender as VoiceParticipant;\r
+            if (p.Name == null) return;\r
+            BeginInvoke(new MethodInvoker(delegate()\r
+            {\r
+                lock (participants)\r
+                {\r
+                    ListViewItem item = FindParticipantItem(p);\r
+                    if (item != null)\r
+                    {\r
+                        if (p.IsMuted)\r
+                            item.StateImageIndex = (int)TalkState.Muted;\r
+                        else if (p.IsSpeaking)\r
+                            item.StateImageIndex = (int)TalkState.Talking;\r
+                        else\r
+                            item.StateImageIndex = (int)TalkState.Idle;\r
+                    }\r
+                }\r
+            }));\r
+        }\r
+\r
+        ListViewItem FindParticipantItem(VoiceParticipant p)\r
         {\r
-            UnregisterClientEvents(e.OldClient);\r
-            RegisterClientEvents(client);\r
+            foreach (ListViewItem item in participants.Items)\r
+            {\r
+                if (item.Tag == p)\r
+                    return item;\r
+            }\r
+            return null;\r
         }\r
 \r
-        void ChatConsole_Disposed(object sender, EventArgs e)\r
+        #endregion\r
+\r
+        void VoiceConsole_Disposed(object sender, EventArgs e)\r
         {\r
+\r
             netcom.ClientLoginStatus -= new EventHandler<LoginProgressEventArgs>(netcom_ClientLoginStatus);\r
             netcom.ClientLoggedOut -= new EventHandler(netcom_ClientLoggedOut);\r
-            UnregisterClientEvents(client);\r
+            UnregisterClientEvents();\r
+            gateway.Stop();\r
         }\r
 \r
         private void MainForm_Load(object sender, EventArgs e)\r
@@ -150,78 +275,140 @@ namespace Radegast
         private void netcom_ClientLoginStatus(object sender, LoginProgressEventArgs e)\r
         {\r
             if (e.Status != LoginStatus.Success) return;\r
+\r
+            BeginInvoke(new MethodInvoker(delegate()\r
+            {\r
+                if (chkVoiceEnable.Checked)\r
+                    gateway.Start();\r
+            }));\r
+\r
         }\r
 \r
         private void netcom_ClientLoggedOut(object sender, EventArgs e)\r
         {\r
-            participants.Items.Clear();\r
-        }\r
+            BeginInvoke(new MethodInvoker(delegate()\r
+            {\r
+                participants.Items.Clear();\r
+                gateway.Stop();\r
+            }));\r
+       }\r
 \r
         #region Talk control\r
         void OnMouseUp(object sender, System.Windows.Forms.MouseEventArgs e)\r
         {\r
             if (e.Button == System.Windows.Forms.MouseButtons.Middle)\r
             {\r
-                micMute_Set(true);\r
-                gateway.MicMute = true;\r
+                micMute.Checked = false;\r
+//                gateway.MicMute = true;\r
             }\r
         }\r
+        void VoiceConsole_KeyDown(object sender, KeyEventArgs e)\r
+        {\r
+            if (e.KeyCode == Keys.RControlKey)\r
+                micMute.Checked = false;\r
+        }\r
+\r
+        void VoiceConsole_KeyUp(object sender, KeyEventArgs e)\r
+        {\r
+            if (e.KeyCode == Keys.RControlKey)\r
+                micMute.Checked = true;\r
+        }\r
+        private void splitContainer1_Panel1_MouseDown(object sender, MouseEventArgs e)\r
+        {\r
+            OnMouseDown(sender, e);\r
+        }\r
+\r
+        private void splitContainer1_Panel1_MouseUp(object sender, MouseEventArgs e)\r
+        {\r
+            OnMouseUp(sender, e);\r
+        }\r
 \r
         void OnMouseDown(object sender, System.Windows.Forms.MouseEventArgs e)\r
         {\r
             if (e.Button == System.Windows.Forms.MouseButtons.Middle)\r
             {\r
-                micMute_Set(false);\r
-                gateway.MicMute = false;\r
+                micMute.Checked = false;\r
+//                gateway.MicMute = false;\r
             }\r
         }\r
         #endregion\r
 \r
         #region Audio Settings\r
-        private void micMute_Set(bool on)\r
\r
+        void gateway_OnVoiceDevicesAvailable(List<string> capture, List<string> playback)\r
         {\r
             this.BeginInvoke(new MethodInvoker(delegate()\r
             {\r
-                micMute.Checked = on;\r
+                LoadMicDevices(capture);\r
+                LoadSpkrDevices(playback);\r
             }));\r
         }\r
 \r
-        private void spkrDevice_SelectedIndexChanged(object sender, EventArgs e)\r
+        void LoadMicDevices(List<string> available)\r
         {\r
+            foreach (string name in available)\r
+                micDevice.Items.Add(name);\r
+            micDevice.SelectedItem = instance.GlobalSettings["Voice.capture.device"].AsString();\r
+        }\r
 \r
+        void LoadSpkrDevices(List<string> available)\r
+        {\r
+            foreach (string name in available)\r
+                spkrDevice.Items.Add(name);\r
+            spkrDevice.SelectedItem = instance.GlobalSettings["Voice.playback.device"].AsString();\r
         }\r
 \r
-        private void micDevice_SelectedIndexChanged(object sender, EventArgs e)\r
+        private void spkrDevice_SelectedIndexChanged(object sender, EventArgs e)\r
         {\r
+            gateway.PlaybackDevice = (string)spkrDevice.SelectedValue;\r
+            instance.GlobalSettings["Voice.playback.device"] =\r
+                OpenMetaverse.StructuredData.OSD.FromString((string)spkrDevice.SelectedValue);\r
+        }\r
 \r
+        private void micDevice_SelectedIndexChanged(object sender, EventArgs e)\r
+        {\r
+            gateway.CaptureDevice = (string)micDevice.SelectedValue;\r
+            instance.GlobalSettings["Voice.capture.device"] =\r
+               OpenMetaverse.StructuredData.OSD.FromString((string)micDevice.SelectedValue);\r
         }\r
 \r
         private void micLevel_ValueChanged(object sender, EventArgs e)\r
         {\r
-\r
+            gateway.MicLevel = micLevel.Value;\r
         }\r
 \r
         private void spkrLevel_ValueChanged(object sender, EventArgs e)\r
         {\r
-\r
+            gateway.SpkrLevel = spkrLevel.Value;\r
         }\r
         #endregion\r
 \r
-        private void chkVoiceEnable_Click(object sender, EventArgs e)\r
+        /// <summary>\r
+        /// Start and stop the voice functions.\r
+        /// </summary>\r
+       private void chkVoiceEnable_Click(object sender, EventArgs e)\r
         {\r
-            chkVoiceEnable.Checked = !chkVoiceEnable.Checked;\r
-            instance.GlobalSettings["Voice.enabled"] =\r
-                OpenMetaverse.StructuredData.OSD.FromBoolean(chkVoiceEnable.Checked);\r
-\r
-            if (chkVoiceEnable.Checked)\r
-            {\r
-                gateway.Start();\r
-            }\r
-            else\r
+            this.BeginInvoke(new MethodInvoker(delegate()\r
             {\r
-                gateway.Stop();\r
-            }\r
+                instance.GlobalSettings["Voice.enabled"] =\r
+                    OpenMetaverse.StructuredData.OSD.FromBoolean(chkVoiceEnable.Checked);\r
+\r
+                if (chkVoiceEnable.Checked)\r
+                {\r
+                    gateway.Start();\r
+                }\r
+                else\r
+                {\r
+                    gateway.Stop();\r
+                }\r
+            }));\r
         }\r
+\r
+       private void micMute_CheckedChanged(object sender, EventArgs e)\r
+       {\r
+           gateway.MicMute = micMute.Checked;\r
+       }\r
+\r
     }\r
 }\r
 \r
index 06e23d1..1ed005a 100644 (file)
         A1YOvLYFWAG38k5CQMKBhAM/AL6PM9BSGcanAAAAAElFTkSuQmCC\r
 </value>\r
   </data>\r
-  <data name="pictureBox1.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">\r
-    <value>\r
-        iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\r
-        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAArFJREFUWEftVk9I\r
-        FFEcfmuUGe1BL9KpBaFVc9RxdJyddceFzboYURSKaFlkpBIppaB0soMdspTQjXTTQykeN6iDnUzRMMW6\r
-        RRDmqexS5J9a3a/XWDDTyxmbHYIl2IEHM783fN/3vvf9Zp6DUkriem0KiOeIK/lP9+O5+oSA/9sBoaAV\r
-        RvnhuCLDulnWbIUwNXUfCoU2UyK5VLIsImYBJDkJlcfDEPhrDEl25kHmWZKsiYhJAHEko6YqjIeDFFeb\r
-        n21ZZbFYwNQyMjL+6oRlAY4UgrraMQyHKMaff0FtddgQPD9f1upWXLAkgBA3zlW8wkBwGdOzS/j6naKp\r
-        cVojOhI4qd1nZQnavaIo9h0gJB3EsQc7dqWj6cIUQt0Ur99QROgKJiZW0XB+UgPnOZ0oL8/DkAYCgW1F\r
-        mDogFbdheIiiuzOK0dEFrNFlbGxQzExQzM8voblxjgEWCnK15yKPHkBB0B0xakVTAf131hABVYk/YwVR\r
-        RKIUL2bXMTdDMRhcV9vwFCOA4/QuKOQztTlRFO054Pe1oufGIh6EorjeMYX7oUWE7kbR20Mx0P8NHqmK\r
-        AZZlfdWFfLY253K57AkgJAUd7fO4dOYjjh2axO2bq+jto3j0mOJW7ye4DxxmgMvK9L0u8ejtWF5eblNA\r
-        EsHO3U4Qko+Wy2/RrI7g4Ad03XuHPjUbiq9aA/Yp+uqVEh9DaHsLfg8MIS7UN4zhdN0TDI1QdHZtgOeP\r
-        akRcrr7nkqh3gd/vt9+GfyaWkP1ob32PmooFjKgiFKXSEFwSvVrd7Xb/OwG/Dq/FuNL4EhfPjkOWT2wB\r
-        90qlTM3jYb8JMbWh6e+T7EVL/VM1G+kMWU5OTszktg8kTudmOImpvT4fG8Ttzp2W/gVGAGlpaYYCvF49\r
-        A1YOvLYFWAG38k5CQMKBhAM/AL6PM9BSGcanAAAAAElFTkSuQmCC\r
-</value>\r
-  </data>\r
-  <data name="pictureBox1.InitialImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">\r
-    <value>\r
-        iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8\r
-        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAArFJREFUWEftVk9I\r
-        FFEcfmuUGe1BL9KpBaFVc9RxdJyddceFzboYURSKaFlkpBIppaB0soMdspTQjXTTQykeN6iDnUzRMMW6\r
-        RRDmqexS5J9a3a/XWDDTyxmbHYIl2IEHM783fN/3vvf9Zp6DUkriem0KiOeIK/lP9+O5+oSA/9sBoaAV\r
-        RvnhuCLDulnWbIUwNXUfCoU2UyK5VLIsImYBJDkJlcfDEPhrDEl25kHmWZKsiYhJAHEko6YqjIeDFFeb\r
-        n21ZZbFYwNQyMjL+6oRlAY4UgrraMQyHKMaff0FtddgQPD9f1upWXLAkgBA3zlW8wkBwGdOzS/j6naKp\r
-        cVojOhI4qd1nZQnavaIo9h0gJB3EsQc7dqWj6cIUQt0Ur99QROgKJiZW0XB+UgPnOZ0oL8/DkAYCgW1F\r
-        mDogFbdheIiiuzOK0dEFrNFlbGxQzExQzM8voblxjgEWCnK15yKPHkBB0B0xakVTAf131hABVYk/YwVR\r
-        RKIUL2bXMTdDMRhcV9vwFCOA4/QuKOQztTlRFO054Pe1oufGIh6EorjeMYX7oUWE7kbR20Mx0P8NHqmK\r
-        AZZlfdWFfLY253K57AkgJAUd7fO4dOYjjh2axO2bq+jto3j0mOJW7ye4DxxmgMvK9L0u8ejtWF5eblNA\r
-        EsHO3U4Qko+Wy2/RrI7g4Ad03XuHPjUbiq9aA/Yp+uqVEh9DaHsLfg8MIS7UN4zhdN0TDI1QdHZtgOeP\r
-        akRcrr7nkqh3gd/vt9+GfyaWkP1ob32PmooFjKgiFKXSEFwSvVrd7Xb/OwG/Dq/FuNL4EhfPjkOWT2wB\r
-        90qlTM3jYb8JMbWh6e+T7EVL/VM1G+kMWU5OTszktg8kTudmOImpvT4fG8Ttzp2W/gVGAGlpaYYCvF49\r
-        A1YOvLYFWAG38k5CQMKBhAM/AL6PM9BSGcanAAAAAElFTkSuQmCC\r
-</value>\r
-  </data>\r
   <metadata name="avatarContext.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">\r
     <value>122, 17</value>\r
   </metadata>\r
     <value>\r
         AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w\r
         LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0\r
-        ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAADK\r
+        ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAACk\r
         CAAAAk1TRnQBSQFMAgEBAwEAAQQBAAEEAQABEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo\r
         AwABQAMAARADAAEBAQABCAYAAQQYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA\r
         AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5\r
         AQABzAH/AWYBAAL/AZkBAAL/AcwBAAJmAf8BAAFmAf8BZgEAAWYC/wEAAf8CZgEAAf8BZgH/AQAC/wFm\r
         AQABIQEAAaUBAANfAQADdwEAA4YBAAOWAQADywEAA7IBAAPXAQAD3QEAA+MBAAPqAQAD8QEAA/gBAAHw\r
         AfsB/wEAAaQCoAEAA4ADAAH/AgAB/wMAAv8BAAH/AwAB/wEAAf8BAAL/AgAD/wEAJP8BGgF1AU0CTAFN\r
-        AXUBGgT/EAAj/wF1CEwBdQP/EAAU/wEuBP8CLgf/AXUCTAGUARoB/wH2ARoBlAJMAZoC/xAAE/8BLgH/\r
-        ARsD/wEIAf8BLgHCBP8BdQFMAU0BGgb/ARoCTAF1Af8QABL/AS4J/wEuA/8BGgJMARoH/wRMARoQAAb/\r
-        BHgJ/wHCAv8ELgP/AS4C/wF1AUwBlAf/AkwBTQGUAUwBdRAABf8GeAr/Bi4C/wEuAv8BTQFMARoG/wNM\r
-        Af8BGgFMAU0QAAX/BngK/wYuAfQE/wJMAfYF/wJMAU0C/wH2AkwQAAX/BngK/wYuBf8CTAH2BP8CTAFN\r
-        A/8B9gJMEAAF/wZ4B/8BVgEIAf8GLgL/ARsC/wFNAUwBGgP/A0wBvQP/ARoBTAFNEAAG/wR4CP8BLgF4\r
-        Av8ELgP/AfQC/wF1AUwBlAL/AkwBTQX/AZQBTAF1EAAS/wH2AVYB9gj/AS4C/wEaAkwB9ANMAZQE/wEa\r
-        AkwBGhAAE/8BLgFWAS4G/wEuAfYD/wF1A0wBTQGUBP8BGgFNAUwBdQH/EAAV/wEuAVYD/wH0AS4G/wHj\r
-        AkwBlAEaAf8B9gEaAZQCTAF1Av8QACP/AXUITAF1A/8QACT/ARoBdQFNAkwBTQF1ARoE/xAAAUIBTQE+\r
-        BwABPgMAASgDAAFAAwABEAMAAQEBAAEBBQABgBcAA/+BAAs=\r
+        AXUBGgT/EAAT/wMuBf8CLgb/AXUITAF1A/8QABL/AS4K/wEuBP8BdQJMAZQBGgH/AfYBGgGUAkwBmgL/\r
+        EAAR/wEuDP8BLgL/AXUBTAFNARoG/wEaAkwBdQH/EAAR/wEuDP8BLgH/ARoCTAEaB/8ETAEaEAAH/wKf\r
+        Df8ELgb/AXUBTAGUB/8CTAFNAZQBTAF1EAAG/wSfC/8GLgX/AU0BTAEaBv8DTAH/ARoBTAFNEAAF/waf\r
+        Cv8GLgX/AkwB9gX/AkwBTQL/AfYCTBAABf8Gnwr/Bi4F/wJMAfYE/wJMAU0D/wH2AkwQAAb/BJ8L/wYu\r
+        Bf8BTQFMARoD/wNMAb0D/wEaAUwBTRAAB/8Cnwj/AS4E/wQuBP8BLgH/AXUBTAGUAv8CTAFNBf8BlAFM\r
+        AXUQABH/AS4C/wH2Cf8BLgH/ARoCTAH0A0wBlAT/ARoCTAEaEAAS/wEuCv8BLgP/AXUDTAFNAZQE/wEa\r
+        AU0BTAF1Af8QABP/Ai4G/wIuBf8B4wJMAZQBGgH/AfYBGgGUAkwBdQL/EAAj/wF1CEwBdQP/EAAk/wEa\r
+        AXUBTQJMAU0BdQEaBP8QAAFCAU0BPgcAAT4DAAEoAwABQAMAARADAAEBAQABAQUAAYAXAAP/gQAL\r
 </value>\r
   </data>\r
 </root>
\ No newline at end of file
index 07b8373..f995849 100644 (file)
@@ -90,6 +90,7 @@ namespace Radegast.Plugin.Voice
         /// </summary>\r
         private void StartControls()\r
         {\r
+#if DISABLED\r
             // If we are not logged in, do not do this.\r
             if (!instance.Netcom.IsLoggedIn) return;\r
 \r
@@ -114,6 +115,7 @@ namespace Radegast.Plugin.Voice
                 MarkDisabled();\r
                 return;\r
             }\r
+#endif\r
         }\r
 \r
         void MarkDisabled()\r