{\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
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
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
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
\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
// 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
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
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
{\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
OpenMetaverse.Voice.VoiceGateway.VoiceRequest Request)\r
{\r
outputDevices = RenderDevices;\r
+ if (inputDevices != null && OnVoiceDevicesAvailable != null)\r
+ OnVoiceDevicesAvailable(inputDevices, outputDevices);\r
}\r
\r
/// <summary>\r
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
}\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
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
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
// \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
// 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
// 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
// \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
// \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
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
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
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
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
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
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
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
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
}\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
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
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
/// </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
MarkDisabled();\r
return;\r
}\r
+#endif\r
}\r
\r
void MarkDisabled()\r