OSDN Git Service

Save inworld sound setting in config
[radegast/radegast.git] / Radegast / GUI / Consoles / MediaConsole.cs
1 using System;
2 using System.Collections.Generic;
3 using System.ComponentModel;
4 using System.Drawing;
5 using System.Data;
6 using System.Text;
7 using System.Windows.Forms;
8 using OpenMetaverse;
9 using OpenMetaverse.StructuredData;
10 using Radegast.Media;
11
12 namespace Radegast
13 {
14     public partial class MediaConsole : DettachableControl
15     {
16         private RadegastInstance instance;
17         private GridClient client { get { return instance.Client; } }
18         private Settings s;
19         private float audioVolume
20         {
21             get
22             {
23                 return volAudioStream.Value / 50f;
24             }
25             set
26             {
27                 if (value >= 0f && value < 1f)
28                 {
29                     volAudioStream.Value = (int)(50f * value);
30                 }
31             }
32         }
33         private System.Threading.Timer configTimer;
34         private const int saveConfigTimeout = 3000;
35         private bool playing;
36         private string currentURL;
37         //private MediaManager mngr;
38         private Media.Stream parcelStream;
39         private readonly object parcelMusicLock = new object();
40
41
42         public MediaConsole(RadegastInstance instance)
43         {
44             InitializeComponent();
45             DisposeOnDetachedClose = false;
46             Text = "Media";
47
48             Disposed += new EventHandler(MediaConsole_Disposed);
49
50             this.instance = instance;
51             this.parcelStream = new Media.Stream();
52
53             s = instance.GlobalSettings;
54
55             // Restore settings
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)
67             {
68                 instance.MediaManager.ObjectVolume = (float)s["parcel_audio_vol"].AsReal();
69                 ObjVolume.Value = (int)(50f * instance.MediaManager.ObjectVolume);
70             }
71
72             configTimer = new System.Threading.Timer(SaveConfig, null, System.Threading.Timeout.Infinite, System.Threading.Timeout.Infinite);
73
74             if (!instance.MediaManager.SoundSystemAvailable)
75             {
76                 foreach (Control c in pnlParcelAudio.Controls)
77                     c.Enabled = false;
78             }
79
80             // GUI Events
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);
87
88             ObjVolume.Scroll += new EventHandler(volObject_Scroll);
89             ObjSoundEnable.CheckedChanged += new EventHandler(cbObjEnableChanged);
90
91             // Network callbacks
92             client.Parcels.ParcelProperties += new EventHandler<ParcelPropertiesEventArgs>(Parcels_ParcelProperties);
93         }
94
95         private void MediaConsole_Disposed(object sender, EventArgs e)
96         {
97             Stop();
98
99             client.Parcels.ParcelProperties -= new EventHandler<ParcelPropertiesEventArgs>(Parcels_ParcelProperties);
100
101             if (configTimer != null)
102             {
103                 configTimer.Change(System.Threading.Timeout.Infinite, System.Threading.Timeout.Infinite);
104                 configTimer.Dispose();
105                 configTimer = null;
106             }
107         }
108
109         void Parcels_ParcelProperties(object sender, ParcelPropertiesEventArgs e)
110         {
111             if (cbKeep.Checked || e.Result != ParcelResult.Single) return;
112
113             if (InvokeRequired)
114             {
115                 BeginInvoke(new MethodInvoker(() => Parcels_ParcelProperties(sender, e)));
116                 return;
117             }
118             lock (parcelMusicLock)
119             {
120                 txtAudioURL.Text = e.Parcel.MusicURL;
121                 if (playing)
122                 {
123                     if (currentURL != txtAudioURL.Text)
124                     {
125                         currentURL = txtAudioURL.Text;
126                         Play();
127                     }
128                 }
129                 else if (cbPlayAudioStream.Checked)
130                 {
131                     currentURL = txtAudioURL.Text;
132                     Play();
133                 }
134             }
135         }
136
137         private void Stop()
138         {
139             lock (parcelMusicLock)
140             {
141                 playing = false;
142                 if (parcelStream != null)
143                     parcelStream.Dispose();
144                 parcelStream = null;
145                 lblStation.Tag = lblStation.Text = string.Empty;
146                 txtSongTitle.Text = string.Empty;
147             }
148         }
149
150         private void Play()
151         {
152             lock (parcelMusicLock)
153             {
154                 Stop();
155                 playing = true;
156                 parcelStream = new Media.Stream();
157                 parcelStream.Volume = audioVolume;
158                 parcelStream.PlayStream(currentURL);
159                 parcelStream.OnStreamInfo += new Media.Stream.StreamInfoCallback(ParcelMusic_OnStreamInfo);
160             }
161         }
162
163         void ParcelMusic_OnStreamInfo(object sender, StreamInfoArgs e)
164         {
165             if (InvokeRequired)
166             {
167                 BeginInvoke(new MethodInvoker(() => ParcelMusic_OnStreamInfo(sender, e)));
168                 return;
169             }
170
171             switch (e.Key)
172             {
173                 case "artist":
174                     txtSongTitle.Text = e.Value;
175                     break;
176
177                 case "title":
178                     txtSongTitle.Text += " - " + e.Value;
179                     break;
180
181                 case "icy-name":
182                     lblStation.Text = e.Value;
183                     break;
184
185                 case "icy-url":
186                     lblStation.Tag = e.Value;
187                     break;
188             }
189         }
190
191         private void SaveConfig(object state)
192         {
193             if (InvokeRequired)
194             {
195                 BeginInvoke(new MethodInvoker(() => SaveConfig(state)));
196                 return;
197             }
198
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);
205         }
206
207         #region GUI event handlers
208         void lblStation_Click(object sender, EventArgs e)
209         {
210             if (lblStation.ToString() != string.Empty)
211             {
212                 instance.MainForm.ProcessLink(lblStation.Tag.ToString());
213             }
214         }
215
216         private void volAudioStream_Scroll(object sender, EventArgs e)
217         {
218             configTimer.Change(saveConfigTimeout, System.Threading.Timeout.Infinite);
219             lock (parcelMusicLock)
220                 if (parcelStream != null)
221                     parcelStream.Volume = volAudioStream.Value/50f;
222         }
223
224         private void volObject_Scroll(object sender, EventArgs e)
225         {
226             configTimer.Change(saveConfigTimeout, System.Threading.Timeout.Infinite);
227             instance.MediaManager.ObjectVolume = ObjVolume.Value / 50f;
228             configTimer.Change(saveConfigTimeout, System.Threading.Timeout.Infinite);
229         }
230
231         void cbObjEnableChanged(object sender, EventArgs e)
232         {
233             configTimer.Change(saveConfigTimeout, System.Threading.Timeout.Infinite);
234             instance.MediaManager.ObjectEnable = ObjSoundEnable.Checked;
235             configTimer.Change(saveConfigTimeout, System.Threading.Timeout.Infinite);
236         }
237
238         private void txtAudioURL_TextChanged(object sender, EventArgs e)
239         {
240             configTimer.Change(saveConfigTimeout, System.Threading.Timeout.Infinite);
241         }
242
243         void cbPlayAudioStream_CheckedChanged(object sender, EventArgs e)
244         {
245             configTimer.Change(saveConfigTimeout, System.Threading.Timeout.Infinite);
246         }
247
248         void cbKeep_CheckedChanged(object sender, EventArgs e)
249         {
250             configTimer.Change(saveConfigTimeout, System.Threading.Timeout.Infinite);
251         }
252
253         private void btnPlay_Click(object sender, EventArgs e)
254         {
255             lock (parcelMusicLock) if (!playing)
256             {
257                 currentURL = txtAudioURL.Text;
258                 Play();
259             }
260         }
261
262         private void btnStop_Click(object sender, EventArgs e)
263         {
264             lock (parcelMusicLock) if (playing)
265             {
266                 currentURL = string.Empty;
267                 Stop();
268             }
269         }
270         #endregion GUI event handlers
271     }
272 }