public async Task SetMediaFile(IVLCMedia media) { var mrl_fromType = media.GetMrlAndFromType(); LogHelper.Log("SetMRL: " + mrl_fromType.Item2); await PlayerInstanceReady.Task; if (Instance == null) { return; } var mediaVLC = new Media(Instance, mrl_fromType.Item2, mrl_fromType.Item1); MediaPlayer = new MediaPlayer(mediaVLC); LogHelper.Log("PLAYWITHVLC: MediaPlayer instance created"); var em = MediaPlayer.eventManager(); em.OnBuffering += EmOnOnBuffering; em.OnStopped += EmOnOnStopped; em.OnPlaying += OnPlaying; em.OnPaused += OnPaused; if (TimeChanged != null) { em.OnTimeChanged += TimeChanged; } em.OnEndReached += EmOnOnEndReached; em.OnEncounteredError += em_OnEncounteredError; em.OnLengthChanged += em_OnLengthChanged; // todo: is there another way? sure there is. _isAudioMedia = media is TrackItem; }
public async Task SetMediaFile(IVLCMedia media) { var tcs = new TaskCompletionSource <bool>(); await App.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => { tcs.SetResult(Instance != null); }); var instanceExists = await tcs.Task; if (!instanceExists) { return; } RandomAccessStreamReference randomAccessStreamReference = null; if (media is StreamMedia) { randomAccessStreamReference = RandomAccessStreamReference.CreateFromUri(new Uri(media.Path)); } else { if (media.File != null) { randomAccessStreamReference = RandomAccessStreamReference.CreateFromFile(media.File); } else { var file = await StorageFile.GetFileFromPathAsync(media.Path); if (file != null) { randomAccessStreamReference = RandomAccessStreamReference.CreateFromFile(file); } } } if (randomAccessStreamReference != null) { var randomAccessStream = await randomAccessStreamReference.OpenReadAsync(); if (randomAccessStream != null) { await App.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => { try { Instance.AutoPlay = false; Instance.SetSource(randomAccessStream, randomAccessStream.ContentType); } catch { } }); } } }
public async Task SetMediaFile(IVLCMedia media) { var mrl_fromType = media.GetMrlAndFromType(); LogHelper.Log("SetMRL: " + mrl_fromType.Item2); await PlayerInstanceReady.Task; if (Instance == null) return; var mediaVLC = new Media(Instance, mrl_fromType.Item2, mrl_fromType.Item1); MediaPlayer = new MediaPlayer(mediaVLC); LogHelper.Log("PLAYWITHVLC: MediaPlayer instance created"); var em = MediaPlayer.eventManager(); em.OnBuffering += EmOnOnBuffering; em.OnStopped += EmOnOnStopped; em.OnPlaying += OnPlaying; em.OnPaused += OnPaused; if (TimeChanged != null) em.OnTimeChanged += TimeChanged; em.OnEndReached += EmOnOnEndReached; em.OnEncounteredError += em_OnEncounteredError; em.OnLengthChanged += em_OnLengthChanged; // todo: is there another way? sure there is. _isAudioMedia = media is TrackItem; }
public async Task InitializePlayback(IVLCMedia media, bool autoPlay) { // First set the player engine // For videos AND music, we have to try first with Microsoft own player // Then we register to Failed callback. If it doesn't work, we set ForceVlcLib to true if (UseVlcLib) { _playerEngine = PlayerEngine.VLC; } else { var path = ""; if (!string.IsNullOrEmpty(media.Path)) { path = Path.GetExtension(media.Path); } else if (media.File != null) { path = media.File.FileType; } if (media is TrackItem) { if (VLCFileExtensions.MFSupported.Contains(path.ToLower())) { #if WINDOWS_PHONE_APP _playerEngine = PlayerEngine.BackgroundMFPlayer; #else _playerEngine = PlayerEngine.MediaFoundation; #endif } else { ToastHelper.Basic("This file might not play in background", false, "background"); _playerEngine = PlayerEngine.VLC; _mediaService.Stop(); } } else { // if it's a Video (Streams are always played with UseVlcLib flag). on WP we need smooth playback so using MediaFoundation as much as we can. #if WINDOWS_PHONE_APP _playerEngine = VLCFileExtensions.MFSupported.Contains(path.ToLower()) ? PlayerEngine.MediaFoundation : PlayerEngine.VLC; #else _playerEngine = PlayerEngine.VLC; #endif } } // Now, ensure the chosen Player is ready to play something await Locator.MediaPlaybackViewModel._mediaService.PlayerInstanceReady.Task; _mediaService.MediaFailed += _mediaService_MediaFailed; _mediaService.StatusChanged += PlayerStateChanged; _mediaService.TimeChanged += UpdateTime; // Send the media we want to play await _mediaService.SetMediaFile(media); _mediaService.OnLengthChanged += OnLengthChanged; _mediaService.OnStopped += OnStopped; _mediaService.OnEndReached += OnEndReached; _mediaService.OnBuffering += MediaServiceOnOnBuffering; switch (_playerEngine) { case PlayerEngine.VLC: var vlcService = (VLCService)_mediaService; if (vlcService.MediaPlayer == null) { return; } var em = vlcService.MediaPlayer.eventManager(); em.OnTrackAdded += Locator.MediaPlaybackViewModel.OnTrackAdded; em.OnTrackDeleted += Locator.MediaPlaybackViewModel.OnTrackDeleted; if (!autoPlay) { return; } vlcService.Play(); break; case PlayerEngine.MediaFoundation: var mfService = (MFService)_mediaService; if (mfService == null) { return; } if (!autoPlay) { return; } _mediaService.Play(); break; case PlayerEngine.BackgroundMFPlayer: if (!autoPlay) { return; } _mediaService.Play(CurrentMedia.Id); break; default: throw new ArgumentOutOfRangeException(); } await App.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => SpeedRate = 100); }
public async Task SetMedia(IVLCMedia media, bool forceVlcLib = false, bool autoPlay = true) { if (media == null) { throw new ArgumentNullException("media", "Media parameter is missing. Can't play anything"); } Stop(); UseVlcLib = true; // forceVlcLib; if (media is VideoItem) { await App.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => { PlayingType = PlayingType.Video; IsStream = false; Locator.NavigationService.Go(VLCPage.VideoPlayerPage); }); var video = (VideoItem)media; await Locator.MediaPlaybackViewModel.InitializePlayback(video, autoPlay); if (video.TimeWatched != TimeSpan.FromSeconds(0)) { await App.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => Locator.MediaPlaybackViewModel.Time = (Int64)video.TimeWatched.TotalMilliseconds); } await SetMediaTransportControlsInfo(string.IsNullOrEmpty(video.Name)? "Video" : video.Name); UpdateTileHelper.UpdateMediumTileWithVideoInfo(); } else if (media is TrackItem) { await App.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => { IsStream = false; PlayingType = PlayingType.Music; }); var track = (TrackItem)media; StorageFile currentTrackFile; try { currentTrackFile = track.File ?? await StorageFile.GetFileFromPathAsync(track.Path); } catch (Exception exception) { await MusicLibraryManagement.RemoveTrackFromCollectionAndDatabase(track); await Task.Delay(500); if (TrackCollection.CanGoNext) { await PlayNext(); } else { await App.Dispatcher.RunAsync(CoreDispatcherPriority.Low, () => Locator.NavigationService.GoBack_Specific()); } return; } await Locator.MediaPlaybackViewModel.InitializePlayback(track, autoPlay); if (_playerEngine != PlayerEngine.BackgroundMFPlayer) { await App.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, async() => { await Locator.MusicPlayerVM.SetCurrentArtist(); await Locator.MusicPlayerVM.SetCurrentAlbum(); await Locator.MusicPlayerVM.UpdatePlayingUI(); Locator.Slideshow.AddImg(Locator.MusicPlayerVM.CurrentArtist.Picture); #if WINDOWS_APP await Locator.MusicPlayerVM.UpdateWindows8UI(); await Locator.MusicPlayerVM.Scrobble(); #endif }); } ApplicationSettingsHelper.SaveSettingsValue(BackgroundAudioConstants.CurrentTrack, TrackCollection.CurrentTrack); } else if (media is StreamMedia) { UseVlcLib = true; await App.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => { Locator.VideoVm.CurrentVideo = null; Locator.MediaPlaybackViewModel.PlayingType = PlayingType.Video; IsStream = true; }); await Locator.MediaPlaybackViewModel.InitializePlayback(media, autoPlay); } }
public async Task SetMediaFile(IVLCMedia media) { }
public async Task SetMediaFile(IVLCMedia media) { var tcs = new TaskCompletionSource<bool>(); await App.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => { tcs.SetResult(Instance != null); }); var instanceExists = await tcs.Task; if (!instanceExists) return; RandomAccessStreamReference randomAccessStreamReference = null; if (media is StreamMedia) { randomAccessStreamReference = RandomAccessStreamReference.CreateFromUri(new Uri(media.Path)); } else { if (media.File != null) { randomAccessStreamReference = RandomAccessStreamReference.CreateFromFile(media.File); } else { var file = await StorageFile.GetFileFromPathAsync(media.Path); if (file != null) randomAccessStreamReference = RandomAccessStreamReference.CreateFromFile(file); } } if (randomAccessStreamReference != null) { var randomAccessStream = await randomAccessStreamReference.OpenReadAsync(); if (randomAccessStream != null) { await App.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => { try { Instance.AutoPlay = false; Instance.SetSource(randomAccessStream, randomAccessStream.ContentType); } catch { } }); } } }
public async Task InitializePlayback(IVLCMedia media, bool autoPlay) { // First set the player engine // For videos AND music, we have to try first with Microsoft own player // Then we register to Failed callback. If it doesn't work, we set ForceVlcLib to true if (UseVlcLib) _playerEngine = PlayerEngine.VLC; else { var path = ""; if (!string.IsNullOrEmpty(media.Path)) path = Path.GetExtension(media.Path); else if (media.File != null) path = media.File.FileType; if (media is TrackItem) { if (VLCFileExtensions.MFSupported.Contains(path.ToLower())) { #if WINDOWS_PHONE_APP _playerEngine = PlayerEngine.BackgroundMFPlayer; #else _playerEngine = PlayerEngine.VLC; #endif } else { ToastHelper.Basic("This file might not play in background", false, "background"); _playerEngine = PlayerEngine.VLC; _mediaService.Stop(); } } else { _playerEngine = PlayerEngine.VLC; } } // Now, ensure the chosen Player is ready to play something await Locator.MediaPlaybackViewModel._mediaService.PlayerInstanceReady.Task; _mediaService.MediaFailed += _mediaService_MediaFailed; _mediaService.StatusChanged += PlayerStateChanged; _mediaService.TimeChanged += UpdateTime; // Send the media we want to play await _mediaService.SetMediaFile(media); _mediaService.OnLengthChanged += OnLengthChanged; _mediaService.OnStopped += OnStopped; _mediaService.OnEndReached += OnEndReached; _mediaService.OnBuffering += MediaServiceOnOnBuffering; switch (_playerEngine) { case PlayerEngine.VLC: var vlcService = (VLCService)_mediaService; if (vlcService.MediaPlayer == null) return; var em = vlcService.MediaPlayer.eventManager(); em.OnTrackAdded += Locator.MediaPlaybackViewModel.OnTrackAdded; em.OnTrackDeleted += Locator.MediaPlaybackViewModel.OnTrackDeleted; if (!autoPlay) return; vlcService.Play(); break; case PlayerEngine.MediaFoundation: var mfService = (MFService)_mediaService; if (mfService == null) return; if (!autoPlay) return; _mediaService.Play(); break; case PlayerEngine.BackgroundMFPlayer: if (!autoPlay) return; _mediaService.Play(CurrentMedia.Id); break; default: throw new ArgumentOutOfRangeException(); } await App.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => SpeedRate = 100); }
public async Task SetMedia(IVLCMedia media, bool forceVlcLib = false, bool autoPlay = true) { if (media == null) throw new ArgumentNullException("media", "Media parameter is missing. Can't play anything"); Stop(); UseVlcLib = forceVlcLib; if (media is VideoItem) { // First things first: we need to pause the slideshow here before any action is done by VLC Locator.Slideshow.IsPaused = true; await App.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => { PlayingType = PlayingType.Video; IsStream = false; if (Locator.NavigationService.CurrentPage == VLCPage.VideoPlayerPage) { Locator.NavigationService.GoBack_Default(); } Locator.NavigationService.Go(VLCPage.VideoPlayerPage); }); var video = (VideoItem)media; await Locator.MediaPlaybackViewModel.InitializePlayback(video, autoPlay); await Locator.VideoVm.TryUseSubtitleFromFolder(); if (video.TimeWatched != TimeSpan.FromSeconds(0)) await App.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => Locator.MediaPlaybackViewModel.Time = (Int64)video.TimeWatched.TotalMilliseconds); await SetMediaTransportControlsInfo(string.IsNullOrEmpty(video.Name) ? "Video" : video.Name); UpdateTileHelper.UpdateMediumTileWithVideoInfo(); } else if (media is TrackItem) { await App.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => { IsStream = false; PlayingType = PlayingType.Music; }); var track = (TrackItem)media; StorageFile currentTrackFile; try { currentTrackFile = track.File ?? await StorageFile.GetFileFromPathAsync(track.Path); } catch (Exception exception) { await MusicLibraryManagement.RemoveTrackFromCollectionAndDatabase(track); await Task.Delay(500); if (TrackCollection.CanGoNext) { await PlayNext(); } else { await App.Dispatcher.RunAsync(CoreDispatcherPriority.Low, () => Locator.NavigationService.GoBack_Specific()); } return; } await Locator.MediaPlaybackViewModel.InitializePlayback(track, autoPlay); if (_playerEngine != PlayerEngine.BackgroundMFPlayer) { await App.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, async () => { await Locator.MusicPlayerVM.SetCurrentArtist(); await Locator.MusicPlayerVM.SetCurrentAlbum(); await Locator.MusicPlayerVM.UpdatePlayingUI(); await Locator.MusicPlayerVM.Scrobble(); #if WINDOWS_APP await Locator.MusicPlayerVM.UpdateWindows8UI(); #endif if (Locator.MusicPlayerVM.CurrentArtist != null) { Locator.MusicPlayerVM.CurrentArtist.PlayCount++; await Locator.MusicLibraryVM._artistDatabase.Update(Locator.MusicPlayerVM.CurrentArtist); } }); } ApplicationSettingsHelper.SaveSettingsValue(BackgroundAudioConstants.CurrentTrack, TrackCollection.CurrentTrack); } else if (media is StreamMedia) { UseVlcLib = true; await App.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => { Locator.VideoVm.CurrentVideo = null; Locator.MediaPlaybackViewModel.PlayingType = PlayingType.Video; IsStream = true; }); await Locator.MediaPlaybackViewModel.InitializePlayback(media, autoPlay); } }
public void Remove(IVLCMedia media) { Playlist.Remove(media); }