2 using System.Collections.Generic;
3 using System.ComponentModel;
7 using System.Windows.Forms;
9 using OpenMetaverse.StructuredData;
14 public partial class MediaConsole : DettachableControl
16 private RadegastInstance instance;
17 private GridClient client { get { return instance.Client; } }
19 private float audioVolume
23 return volAudioStream.Value / 50f;
27 if (value >= 0f && value < 1f)
29 volAudioStream.Value = (int)(50f * value);
33 private System.Threading.Timer configTimer;
34 private const int saveConfigTimeout = 3000;
36 private string currentURL;
37 //private MediaManager mngr;
38 private Media.Stream parcelStream;
39 private readonly object parcelMusicLock = new object();
42 public MediaConsole(RadegastInstance instance)
44 InitializeComponent();
45 DisposeOnDetachedClose = false;
48 Disposed += new EventHandler(MediaConsole_Disposed);
50 this.instance = instance;
51 this.parcelStream = new Media.Stream();
53 s = instance.GlobalSettings;
56 if (s["parcel_audio_url"].Type != OSDType.Unknown)
57 txtAudioURL.Text = s["parcel_audio_url"].AsString();
58 if (s["parcel_audio_vol"].Type != OSDType.Unknown)
59 audioVolume = (float)s["parcel_audio_vol"].AsReal();
60 if (s["parcel_audio_play"].Type != OSDType.Unknown)
61 cbPlayAudioStream.Checked = s["parcel_audio_play"].AsBoolean();
62 if (s["parcel_audio_keep_url"].Type != OSDType.Unknown)
63 cbKeep.Checked = s["parcel_audio_keep_url"].AsBoolean();
64 if (s["object_audio_enable"].Type != OSDType.Unknown)
65 ObjSoundEnable.Checked = s["object_audio_enable"].AsBoolean();
66 if (s["object_audio_vol"].Type != OSDType.Unknown)
68 instance.MediaManager.ObjectVolume = (float)s["parcel_audio_vol"].AsReal();
69 ObjVolume.Value = (int)(50f * instance.MediaManager.ObjectVolume);
72 configTimer = new System.Threading.Timer(SaveConfig, null, System.Threading.Timeout.Infinite, System.Threading.Timeout.Infinite);
74 if (!instance.MediaManager.SoundSystemAvailable)
76 foreach (Control c in pnlParcelAudio.Controls)
81 volAudioStream.Scroll += new EventHandler(volAudioStream_Scroll);
82 txtAudioURL.TextChanged += new EventHandler(txtAudioURL_TextChanged);
83 cbKeep.CheckedChanged += new EventHandler(cbKeep_CheckedChanged);
84 cbPlayAudioStream.CheckedChanged += new EventHandler(cbPlayAudioStream_CheckedChanged);
85 lblStation.Tag = lblStation.Text = string.Empty;
86 lblStation.Click += new EventHandler(lblStation_Click);
88 ObjVolume.Scroll += new EventHandler(volObject_Scroll);
89 ObjSoundEnable.CheckedChanged += new EventHandler(cbObjEnableChanged);
92 client.Parcels.ParcelProperties += new EventHandler<ParcelPropertiesEventArgs>(Parcels_ParcelProperties);
95 private void MediaConsole_Disposed(object sender, EventArgs e)
99 client.Parcels.ParcelProperties -= new EventHandler<ParcelPropertiesEventArgs>(Parcels_ParcelProperties);
101 if (configTimer != null)
103 configTimer.Change(System.Threading.Timeout.Infinite, System.Threading.Timeout.Infinite);
104 configTimer.Dispose();
109 void Parcels_ParcelProperties(object sender, ParcelPropertiesEventArgs e)
111 if (cbKeep.Checked || e.Result != ParcelResult.Single) return;
115 BeginInvoke(new MethodInvoker(() => Parcels_ParcelProperties(sender, e)));
118 lock (parcelMusicLock)
120 txtAudioURL.Text = e.Parcel.MusicURL;
123 if (currentURL != txtAudioURL.Text)
125 currentURL = txtAudioURL.Text;
129 else if (cbPlayAudioStream.Checked)
131 currentURL = txtAudioURL.Text;
139 lock (parcelMusicLock)
142 if (parcelStream != null)
143 parcelStream.Dispose();
145 lblStation.Tag = lblStation.Text = string.Empty;
146 txtSongTitle.Text = string.Empty;
152 lock (parcelMusicLock)
156 parcelStream = new Media.Stream();
157 parcelStream.Volume = audioVolume;
158 parcelStream.PlayStream(currentURL);
159 parcelStream.OnStreamInfo += new Media.Stream.StreamInfoCallback(ParcelMusic_OnStreamInfo);
163 void ParcelMusic_OnStreamInfo(object sender, StreamInfoArgs e)
167 BeginInvoke(new MethodInvoker(() => ParcelMusic_OnStreamInfo(sender, e)));
174 txtSongTitle.Text = e.Value;
178 txtSongTitle.Text += " - " + e.Value;
182 lblStation.Text = e.Value;
186 lblStation.Tag = e.Value;
191 private void SaveConfig(object state)
195 BeginInvoke(new MethodInvoker(() => SaveConfig(state)));
199 s["parcel_audio_url"] = OSD.FromString(txtAudioURL.Text);
200 s["parcel_audio_vol"] = OSD.FromReal(audioVolume);
201 s["parcel_audio_play"] = OSD.FromBoolean(cbPlayAudioStream.Checked);
202 s["parcel_audio_keep_url"] = OSD.FromBoolean(cbKeep.Checked);
203 s["object_audio_vol"] = OSD.FromReal(this.instance.MediaManager.ObjectVolume);
204 s["object_audio_enable"] = OSD.FromBoolean(ObjSoundEnable.Checked);
207 #region GUI event handlers
208 void lblStation_Click(object sender, EventArgs e)
210 if (lblStation.ToString() != string.Empty)
212 instance.MainForm.ProcessLink(lblStation.Tag.ToString());
216 private void volAudioStream_Scroll(object sender, EventArgs e)
218 configTimer.Change(saveConfigTimeout, System.Threading.Timeout.Infinite);
219 lock (parcelMusicLock)
220 if (parcelStream != null)
221 parcelStream.Volume = volAudioStream.Value/50f;
224 private void volObject_Scroll(object sender, EventArgs e)
226 configTimer.Change(saveConfigTimeout, System.Threading.Timeout.Infinite);
227 instance.MediaManager.ObjectVolume = ObjVolume.Value / 50f;
228 configTimer.Change(saveConfigTimeout, System.Threading.Timeout.Infinite);
231 void cbObjEnableChanged(object sender, EventArgs e)
233 configTimer.Change(saveConfigTimeout, System.Threading.Timeout.Infinite);
234 instance.MediaManager.ObjectEnable = ObjSoundEnable.Checked;
235 configTimer.Change(saveConfigTimeout, System.Threading.Timeout.Infinite);
238 private void txtAudioURL_TextChanged(object sender, EventArgs e)
240 configTimer.Change(saveConfigTimeout, System.Threading.Timeout.Infinite);
243 void cbPlayAudioStream_CheckedChanged(object sender, EventArgs e)
245 configTimer.Change(saveConfigTimeout, System.Threading.Timeout.Infinite);
248 void cbKeep_CheckedChanged(object sender, EventArgs e)
250 configTimer.Change(saveConfigTimeout, System.Threading.Timeout.Infinite);
253 private void btnPlay_Click(object sender, EventArgs e)
255 lock (parcelMusicLock) if (!playing)
257 currentURL = txtAudioURL.Text;
262 private void btnStop_Click(object sender, EventArgs e)
264 lock (parcelMusicLock) if (playing)
266 currentURL = string.Empty;
270 #endregion GUI event handlers