annotate johndyer-mediaelement-13fa20a/src/silverlight/MainPage.xaml.cs @ 25:4a4bd554b4c1 tip

Closing this sub branch.
author Daniele Barchiesi <daniele.barchiesi@eecs.qmul.ac.uk>
date Mon, 25 Mar 2013 14:02:54 +0000
parents 032bc65ebafc
children
rev   line source
gyorgy@0 1 using System;
gyorgy@0 2 using System.Collections.Generic;
gyorgy@0 3 using System.Linq;
gyorgy@0 4 using System.Net;
gyorgy@0 5 using System.Windows;
gyorgy@0 6 using System.Windows.Controls;
gyorgy@0 7 using System.Windows.Documents;
gyorgy@0 8 using System.Windows.Input;
gyorgy@0 9 using System.Windows.Media;
gyorgy@0 10 using System.Windows.Media.Animation;
gyorgy@0 11 using System.Windows.Shapes;
gyorgy@0 12 using System.Windows.Browser;
gyorgy@0 13 using System.Globalization;
gyorgy@0 14
gyorgy@0 15
gyorgy@0 16 namespace SilverlightMediaElement
gyorgy@0 17 {
gyorgy@0 18 [ScriptableType]
gyorgy@0 19 public partial class MainPage : UserControl
gyorgy@0 20 {
gyorgy@0 21 System.Windows.Threading.DispatcherTimer _timer;
gyorgy@0 22
gyorgy@0 23 // work arounds for src, load(), play() compatibility
gyorgy@0 24 bool _isLoading = false;
gyorgy@0 25 bool _isAttemptingToPlay = false;
gyorgy@0 26
gyorgy@0 27 // variables
gyorgy@0 28 string _mediaUrl;
gyorgy@0 29 string _preload;
gyorgy@0 30 string _htmlid;
gyorgy@0 31 bool _autoplay = false;
gyorgy@0 32 bool _debug = false;
gyorgy@0 33 int _width = 0;
gyorgy@0 34 int _height = 0;
gyorgy@0 35 int _timerRate = 0;
gyorgy@0 36 double _bufferedBytes = 0;
gyorgy@0 37 double _bufferedTime = 0;
gyorgy@0 38 double _volume = 1;
gyorgy@0 39 int _videoWidth = 0;
gyorgy@0 40 int _videoHeight = 0;
gyorgy@0 41
gyorgy@0 42 // state
gyorgy@0 43 bool _isPaused = true;
gyorgy@0 44 bool _isEnded = false;
gyorgy@0 45
gyorgy@0 46 // dummy
gyorgy@0 47 bool _firedCanPlay = false;
gyorgy@0 48
gyorgy@0 49 public MainPage(IDictionary<string, string> initParams)
gyorgy@0 50 {
gyorgy@0 51 InitializeComponent();
gyorgy@0 52
gyorgy@0 53 HtmlPage.RegisterScriptableObject("MediaElementJS", this);
gyorgy@0 54
gyorgy@0 55
gyorgy@0 56 // add events
gyorgy@0 57 media.BufferingProgressChanged += new RoutedEventHandler(media_BufferingProgressChanged);
gyorgy@0 58 media.DownloadProgressChanged += new RoutedEventHandler(media_DownloadProgressChanged);
gyorgy@0 59 media.CurrentStateChanged += new RoutedEventHandler(media_CurrentStateChanged);
gyorgy@0 60 media.MediaEnded += new RoutedEventHandler(media_MediaEnded);
gyorgy@0 61 media.MediaFailed += new EventHandler<ExceptionRoutedEventArgs>(media_MediaFailed);
gyorgy@0 62 media.MediaOpened += new RoutedEventHandler(media_MediaOpened);
gyorgy@0 63
gyorgy@0 64 // get parameters
gyorgy@0 65 if (initParams.ContainsKey("id"))
gyorgy@0 66 _htmlid = initParams["id"];
gyorgy@0 67 if (initParams.ContainsKey("file"))
gyorgy@0 68 _mediaUrl = initParams["file"];
gyorgy@0 69 if (initParams.ContainsKey("autoplay") && initParams["autoplay"] == "true")
gyorgy@0 70 _autoplay = true;
gyorgy@0 71 if (initParams.ContainsKey("debug") && initParams["debug"] == "true")
gyorgy@0 72 _debug = true;
gyorgy@0 73 if (initParams.ContainsKey("preload"))
gyorgy@0 74 _preload = initParams["preload"].ToLower();
gyorgy@0 75 else
gyorgy@0 76 _preload = "";
gyorgy@0 77
gyorgy@0 78 if (!(new string[] { "none", "metadata", "auto" }).Contains(_preload)){
gyorgy@0 79 _preload = "none";
gyorgy@0 80 }
gyorgy@0 81
gyorgy@0 82 if (initParams.ContainsKey("width"))
gyorgy@0 83 Int32.TryParse(initParams["width"], out _width);
gyorgy@0 84 if (initParams.ContainsKey("height"))
gyorgy@0 85 Int32.TryParse(initParams["height"], out _height);
gyorgy@0 86 if (initParams.ContainsKey("timerate"))
gyorgy@0 87 Int32.TryParse(initParams["timerrate"], out _timerRate);
gyorgy@0 88 if (initParams.ContainsKey("startvolume"))
gyorgy@0 89 Double.TryParse(initParams["startvolume"], out _volume);
gyorgy@0 90
gyorgy@0 91 if (_timerRate == 0)
gyorgy@0 92 _timerRate = 250;
gyorgy@0 93
gyorgy@0 94 // timer
gyorgy@0 95 _timer = new System.Windows.Threading.DispatcherTimer();
gyorgy@0 96 _timer.Interval = new TimeSpan(0, 0, 0, 0, _timerRate); // 200 Milliseconds
gyorgy@0 97 _timer.Tick += new EventHandler(timer_Tick);
gyorgy@0 98 _timer.Stop();
gyorgy@0 99
gyorgy@0 100 //_mediaUrl = "http://local.mediaelement.com/media/jsaddington.mp4";
gyorgy@0 101 //_autoplay = true;
gyorgy@0 102
gyorgy@0 103 // set stage and media sizes
gyorgy@0 104 if (_width > 0)
gyorgy@0 105 LayoutRoot.Width = media.Width = this.Width = _width;
gyorgy@0 106 if (_height > 0)
gyorgy@0 107 LayoutRoot.Height = media.Height = this.Height = _height;
gyorgy@0 108
gyorgy@0 109 // debug
gyorgy@0 110 textBox1.Visibility = (_debug) ? System.Windows.Visibility.Visible : System.Windows.Visibility.Collapsed;
gyorgy@0 111 textBox1.IsEnabled = false;
gyorgy@0 112 textBox1.Text = "id: " + _htmlid + "\n" +
gyorgy@0 113 "file: " + _mediaUrl + "\n";
gyorgy@0 114
gyorgy@0 115
gyorgy@0 116 media.AutoPlay = _autoplay;
gyorgy@0 117 media.Volume = _volume;
gyorgy@0 118 if (!String.IsNullOrEmpty(_mediaUrl)) {
gyorgy@0 119 setSrc(_mediaUrl);
gyorgy@0 120 if (_autoplay || _preload != "none")
gyorgy@0 121 loadMedia();
gyorgy@0 122 }
gyorgy@0 123
gyorgy@0 124 media.MouseLeftButtonUp += new MouseButtonEventHandler(media_MouseLeftButtonUp);
gyorgy@0 125
gyorgy@0 126 // full screen settings
gyorgy@0 127 Application.Current.Host.Content.FullScreenChanged += new EventHandler(DisplaySizeInformation);
gyorgy@0 128 Application.Current.Host.Content.Resized += new EventHandler(DisplaySizeInformation);
gyorgy@0 129 FullscreenButton.Visibility = System.Windows.Visibility.Collapsed;
gyorgy@0 130
gyorgy@0 131 // send out init call
gyorgy@0 132 //HtmlPage.Window.Invoke("html5_MediaPluginBridge_initPlugin", new object[] {_htmlid});
gyorgy@0 133 try
gyorgy@0 134 {
gyorgy@0 135 HtmlPage.Window.Eval("mejs.MediaPluginBridge.initPlugin('" + _htmlid + "');");
gyorgy@0 136 }
gyorgy@0 137 catch { }
gyorgy@0 138 }
gyorgy@0 139
gyorgy@0 140 void media_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) {
gyorgy@0 141 SendEvent("click");
gyorgy@0 142 }
gyorgy@0 143
gyorgy@0 144 void media_MediaOpened(object sender, RoutedEventArgs e) {
gyorgy@0 145
gyorgy@0 146 _videoWidth = Convert.ToInt32(media.NaturalVideoWidth);
gyorgy@0 147 _videoHeight = Convert.ToInt32(media.NaturalVideoHeight);
gyorgy@0 148
gyorgy@0 149 SendEvent("loadedmetadata");
gyorgy@0 150 }
gyorgy@0 151
gyorgy@0 152 void timer_Tick(object sender, EventArgs e) {
gyorgy@0 153 SendEvent("timeupdate");
gyorgy@0 154 }
gyorgy@0 155
gyorgy@0 156 void StartTimer() {
gyorgy@0 157 _timer.Start();
gyorgy@0 158 }
gyorgy@0 159
gyorgy@0 160 void StopTimer() {
gyorgy@0 161 _timer.Stop();
gyorgy@0 162 }
gyorgy@0 163
gyorgy@0 164 void WriteDebug(string text) {
gyorgy@0 165 textBox1.Text += text + "\n";
gyorgy@0 166 }
gyorgy@0 167
gyorgy@0 168 void media_MediaFailed(object sender, ExceptionRoutedEventArgs e) {
gyorgy@0 169 SendEvent(e.ToString());
gyorgy@0 170 }
gyorgy@0 171
gyorgy@0 172 void media_MediaEnded(object sender, RoutedEventArgs e) {
gyorgy@0 173 _isEnded = true;
gyorgy@0 174 _isPaused = false;
gyorgy@0 175 SendEvent("ended");
gyorgy@0 176 StopTimer();
gyorgy@0 177 }
gyorgy@0 178
gyorgy@0 179 void media_CurrentStateChanged(object sender, RoutedEventArgs e) {
gyorgy@0 180
gyorgy@0 181 WriteDebug("state:" + media.CurrentState.ToString());
gyorgy@0 182
gyorgy@0 183 switch (media.CurrentState)
gyorgy@0 184 {
gyorgy@0 185 case MediaElementState.Opening:
gyorgy@0 186 SendEvent("loadstart");
gyorgy@0 187 break;
gyorgy@0 188 case MediaElementState.Playing:
gyorgy@0 189 _isEnded = false;
gyorgy@0 190 _isPaused = false;
gyorgy@0 191 _isAttemptingToPlay = false;
gyorgy@0 192 StartTimer();
gyorgy@0 193
gyorgy@0 194
gyorgy@0 195 SendEvent("play");
gyorgy@0 196 SendEvent("playing");
gyorgy@0 197 break;
gyorgy@0 198
gyorgy@0 199 case MediaElementState.Paused:
gyorgy@0 200 _isEnded = false;
gyorgy@0 201 _isPaused = true;
gyorgy@0 202
gyorgy@0 203 // special settings to allow play() to work
gyorgy@0 204 _isLoading = false;
gyorgy@0 205 WriteDebug("paused event, " + _isAttemptingToPlay);
gyorgy@0 206 if (_isAttemptingToPlay) {
gyorgy@0 207 this.playMedia();
gyorgy@0 208 }
gyorgy@0 209
gyorgy@0 210 StopTimer();
gyorgy@0 211 SendEvent("paused");
gyorgy@0 212 break;
gyorgy@0 213 case MediaElementState.Stopped:
gyorgy@0 214 _isEnded = false;
gyorgy@0 215 _isPaused = true;
gyorgy@0 216 StopTimer();
gyorgy@0 217 SendEvent("paused");
gyorgy@0 218 break;
gyorgy@0 219 case MediaElementState.Buffering:
gyorgy@0 220 SendEvent("progress");
gyorgy@0 221 break;
gyorgy@0 222 }
gyorgy@0 223
gyorgy@0 224 }
gyorgy@0 225
gyorgy@0 226 void media_BufferingProgressChanged(object sender, RoutedEventArgs e) {
gyorgy@0 227 _bufferedTime = media.DownloadProgress * media.NaturalDuration.TimeSpan.TotalSeconds;
gyorgy@0 228 _bufferedBytes = media.BufferingProgress;
gyorgy@0 229
gyorgy@0 230
gyorgy@0 231 SendEvent("progress");
gyorgy@0 232 }
gyorgy@0 233
gyorgy@0 234 void media_DownloadProgressChanged(object sender, RoutedEventArgs e) {
gyorgy@0 235 _bufferedTime = media.DownloadProgress * media.NaturalDuration.TimeSpan.TotalSeconds;
gyorgy@0 236 _bufferedBytes = media.BufferingProgress;
gyorgy@0 237
gyorgy@0 238 if (!_firedCanPlay) {
gyorgy@0 239 SendEvent("loadeddata");
gyorgy@0 240 SendEvent("canplay");
gyorgy@0 241 _firedCanPlay = true;
gyorgy@0 242 }
gyorgy@0 243
gyorgy@0 244 SendEvent("progress");
gyorgy@0 245 }
gyorgy@0 246
gyorgy@0 247
gyorgy@0 248 void SendEvent(string name) {
gyorgy@0 249 /*
gyorgy@0 250 * INVOKE
gyorgy@0 251 HtmlPage.Window.Invoke("html5_MediaPluginBridge_fireEvent",
gyorgy@0 252 _htmlid,
gyorgy@0 253 name,
gyorgy@0 254 @"'{" +
gyorgy@0 255 @"""name"": """ + name + @"""" +
gyorgy@0 256 @", ""currentTime"":" + (media.Position.TotalSeconds).ToString() + @"" +
gyorgy@0 257 @", ""duration"":" + (media.NaturalDuration.TimeSpan.TotalSeconds).ToString() + @"" +
gyorgy@0 258 @", ""paused"":" + (_isEnded).ToString().ToLower() + @"" +
gyorgy@0 259 @", ""muted"":" + (media.IsMuted).ToString().ToLower() + @"" +
gyorgy@0 260 @", ""ended"":" + (_isPaused).ToString().ToLower() + @"" +
gyorgy@0 261 @", ""volume"":" + (media.Volume).ToString() + @"" +
gyorgy@0 262 @", ""bufferedBytes"":" + (_bufferedBytes).ToString() + @"" +
gyorgy@0 263 @", ""bufferedTime"":" + (_bufferedTime).ToString() + @"" +
gyorgy@0 264 @"}'");
gyorgy@0 265 */
gyorgy@0 266
gyorgy@0 267 /*
gyorgy@0 268 * EVAL
gyorgy@0 269 HtmlPage.Window.Eval("mejs.MediaPluginBridge.fireEvent('" + _htmlid + "','" + name + "'," +
gyorgy@0 270 @"{" +
gyorgy@0 271 @"""name"": """ + name + @"""" +
gyorgy@0 272 @", ""currentTime"":" + (media.Position.TotalSeconds).ToString() + @"" +
gyorgy@0 273 @", ""duration"":" + (media.NaturalDuration.TimeSpan.TotalSeconds).ToString() + @"" +
gyorgy@0 274 @", ""paused"":" + (_isEnded).ToString().ToLower() + @"" +
gyorgy@0 275 @", ""muted"":" + (media.IsMuted).ToString().ToLower() + @"" +
gyorgy@0 276 @", ""ended"":" + (_isPaused).ToString().ToLower() + @"" +
gyorgy@0 277 @", ""volume"":" + (media.Volume).ToString() + @"" +
gyorgy@0 278 @", ""bufferedBytes"":" + (_bufferedBytes).ToString() + @"" +
gyorgy@0 279 @", ""bufferedTime"":" + (_bufferedTime).ToString() + @"" +
gyorgy@0 280 @"});");
gyorgy@0 281 * */
gyorgy@0 282
gyorgy@0 283 // setTimeout
gyorgy@0 284 try {
gyorgy@0 285 CultureInfo invCulture = CultureInfo.InvariantCulture;
gyorgy@0 286
gyorgy@0 287 HtmlPage.Window.Invoke("setTimeout", "mejs.MediaPluginBridge.fireEvent('" + _htmlid + "','" + name + "'," +
gyorgy@0 288 @"{" +
gyorgy@0 289 @"""name"": """ + name + @"""" +
gyorgy@0 290 @", ""currentTime"":" + (media.Position.TotalSeconds).ToString(invCulture) + @"" +
gyorgy@0 291 @", ""duration"":" + (media.NaturalDuration.TimeSpan.TotalSeconds).ToString(invCulture) + @"" +
gyorgy@0 292 @", ""paused"":" + (_isPaused).ToString().ToLower() + @"" +
gyorgy@0 293 @", ""muted"":" + (media.IsMuted).ToString().ToLower() + @"" +
gyorgy@0 294 @", ""ended"":" + (_isEnded).ToString().ToLower() + @"" +
gyorgy@0 295 @", ""volume"":" + (media.Volume).ToString(invCulture) + @"" +
gyorgy@0 296 @", ""bufferedBytes"":" + (_bufferedBytes).ToString(invCulture) + @"" +
gyorgy@0 297 @", ""bufferedTime"":" + (_bufferedTime).ToString(invCulture) + @"" +
gyorgy@0 298 @", ""videoWidth"":" + (_videoWidth).ToString() + @"" +
gyorgy@0 299 @", ""videoHeight"":" + (_videoHeight).ToString() + @"" +
gyorgy@0 300 @"});", 0);
gyorgy@0 301 } catch { }
gyorgy@0 302
gyorgy@0 303 }
gyorgy@0 304
gyorgy@0 305 /* HTML5 wrapper methods */
gyorgy@0 306 [ScriptableMember]
gyorgy@0 307 public void playMedia() {
gyorgy@0 308 WriteDebug("method:play " + media.CurrentState);
gyorgy@0 309
gyorgy@0 310 // sometimes people forget to call load() first
gyorgy@0 311 if (_mediaUrl != "" && media.Source == null) {
gyorgy@0 312 _isAttemptingToPlay = true;
gyorgy@0 313 loadMedia();
gyorgy@0 314 }
gyorgy@0 315
gyorgy@0 316 // store and trigger with the state change above
gyorgy@0 317 if (media.CurrentState == MediaElementState.Closed && _isLoading) {
gyorgy@0 318 WriteDebug("storing _isAttemptingToPlay ");
gyorgy@0 319 _isAttemptingToPlay = true;
gyorgy@0 320 }
gyorgy@0 321
gyorgy@0 322 media.Play();
gyorgy@0 323 _isEnded = false;
gyorgy@0 324 _isPaused = false;
gyorgy@0 325
gyorgy@0 326 //StartTimer();
gyorgy@0 327 }
gyorgy@0 328
gyorgy@0 329 [ScriptableMember]
gyorgy@0 330 public void pauseMedia() {
gyorgy@0 331 WriteDebug("method:pause " + media.CurrentState);
gyorgy@0 332
gyorgy@0 333 _isEnded = false;
gyorgy@0 334 _isPaused = true;
gyorgy@0 335
gyorgy@0 336 media.Pause();
gyorgy@0 337 StopTimer();
gyorgy@0 338 }
gyorgy@0 339
gyorgy@0 340 [ScriptableMember]
gyorgy@0 341 public void loadMedia() {
gyorgy@0 342 _isLoading = true;
gyorgy@0 343 _firedCanPlay = false;
gyorgy@0 344
gyorgy@0 345 WriteDebug("method:load " + media.CurrentState);
gyorgy@0 346 WriteDebug(" - " + _mediaUrl.ToString());
gyorgy@0 347
gyorgy@0 348 media.Source = new Uri(_mediaUrl, UriKind.Absolute);
gyorgy@0 349 //media.Play();
gyorgy@0 350 //media.Stop();
gyorgy@0 351 }
gyorgy@0 352
gyorgy@0 353 [ScriptableMember]
gyorgy@0 354 public void stopMedia() {
gyorgy@0 355 WriteDebug("method:stop " + media.CurrentState);
gyorgy@0 356
gyorgy@0 357 _isEnded = true;
gyorgy@0 358 _isPaused = false;
gyorgy@0 359
gyorgy@0 360 media.Stop();
gyorgy@0 361 StopTimer();
gyorgy@0 362 }
gyorgy@0 363
gyorgy@0 364 [ScriptableMember]
gyorgy@0 365 public void setVolume(Double volume) {
gyorgy@0 366 WriteDebug("method:setvolume: " + volume.ToString());
gyorgy@0 367
gyorgy@0 368 media.Volume = volume;
gyorgy@0 369
gyorgy@0 370 SendEvent("volumechange");
gyorgy@0 371 }
gyorgy@0 372
gyorgy@0 373 [ScriptableMember]
gyorgy@0 374 public void setMuted(bool isMuted) {
gyorgy@0 375 WriteDebug("method:setmuted: " + isMuted.ToString());
gyorgy@0 376
gyorgy@0 377 media.IsMuted = isMuted;
gyorgy@0 378
gyorgy@0 379 SendEvent("volumechange");
gyorgy@0 380
gyorgy@0 381 }
gyorgy@0 382
gyorgy@0 383 [ScriptableMember]
gyorgy@0 384 public void setCurrentTime(Double position) {
gyorgy@0 385 WriteDebug("method:setCurrentTime: " + position.ToString());
gyorgy@0 386
gyorgy@0 387 int milliseconds = Convert.ToInt32(position * 1000);
gyorgy@0 388
gyorgy@0 389 SendEvent("seeking");
gyorgy@0 390 media.Position = new TimeSpan(0, 0, 0, 0, milliseconds);
gyorgy@0 391 SendEvent("seeked");
gyorgy@0 392 }
gyorgy@0 393
gyorgy@0 394 [ScriptableMember]
gyorgy@0 395 public void setSrc(string url) {
gyorgy@0 396 _mediaUrl = url;
gyorgy@0 397 }
gyorgy@0 398
gyorgy@0 399 [ScriptableMember]
gyorgy@0 400 public void setFullscreen(bool goFullscreen) {
gyorgy@0 401
gyorgy@0 402 FullscreenButton.Visibility = System.Windows.Visibility.Visible;
gyorgy@0 403 }
gyorgy@0 404
gyorgy@0 405 [ScriptableMember]
gyorgy@0 406 public void setVideoSize(int width, int height) {
gyorgy@0 407 this.Width = media.Width = width;
gyorgy@0 408 this.Height = media.Height = height;
gyorgy@0 409 }
gyorgy@0 410
gyorgy@0 411 private void FullscreenButton_Click(object sender, RoutedEventArgs e) {
gyorgy@0 412 Application.Current.Host.Content.IsFullScreen = true;
gyorgy@0 413 FullscreenButton.Visibility = System.Windows.Visibility.Collapsed;
gyorgy@0 414 }
gyorgy@0 415
gyorgy@0 416 private void DisplaySizeInformation(Object sender, EventArgs e) {
gyorgy@0 417 this.Width = LayoutRoot.Width = media.Width = Application.Current.Host.Content.ActualWidth;
gyorgy@0 418 this.Height = LayoutRoot.Height = media.Height = Application.Current.Host.Content.ActualHeight;
gyorgy@0 419 }
gyorgy@0 420
gyorgy@0 421 }
gyorgy@0 422 }