예제 #1
0
        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;
        }
예제 #2
0
        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 { }
                    });
                }
            }
        }
예제 #3
0
        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);
            }
        }
예제 #6
0
 public async Task SetMediaFile(IVLCMedia media)
 {
 }
예제 #7
0
        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);
            }
        }
예제 #10
0
 public async Task SetMediaFile(IVLCMedia media)
 {
 }
예제 #11
0
 public void Remove(IVLCMedia media)
 {
     Playlist.Remove(media);
 }
예제 #12
0
 public void Remove(IVLCMedia media)
 {
     Playlist.Remove(media);
 }