Esempio n. 1
0
 /**
  * MediaOpenedイベントのハンドラ
  */
 private async void OnOpened(MediaPlayer sender, object args)
 {
     Opened = true;
     if (null != OwnerView)
     {
         CmLog.debug("WvvMediaLoader.OnOpened: MediaOpened");
         await terminate(sender);
     }
 }
Esempio n. 2
0
        /**
         * ソースをMediaPlayerにロードする(非同期版)
         */
        public Task <bool> LoadAsync(MediaSource source, DependencyObject ownerView)
        {
            CmLog.debug("WvvMediaLoader.LoadAsync: async operation started...");

            var task = new TaskCompletionSource <bool>();

            Load(source, ownerView, (loader) =>
            {
                CmLog.debug("WvvMediaLoader.LoadAsync: ... async operation finished.");
                task.TrySetResult(Opened);
            });
            return(task.Task);
        }
Esempio n. 3
0
        /**
         * トラッキング終了時のハンドラ
         */
        private void OnKnobReleased(object sender, PointerRoutedEventArgs e)
        {
            ((UIElement)sender).ReleasePointerCapture(e.Pointer);

            mTracking.Active = false;

            if (null != mTracking.Moved)
            {
                var v = getNewValue(e);
                mTracking.Moved(v, true);
                mTracking.Moved = null;
            }
            CmLog.debug("WvvTrimmingSlider.OnKnobReleased");
            e.Handled = true;
        }
Esempio n. 4
0
        /**
         * URLのキャッシュ(IWvvCache)を取得
         */
        public async Task <IWvvCache> GetCacheAsync(Uri uri)
        {
            WvvCache cache;

            using (mManagerLock.Lock())
            {
                string key = keyFromUri(uri);
                if (!mCacheList.TryGetValue(key, out cache))
                {
                    try
                    {
                        var file = await mFolder.Folder.GetFileAsync(key);
                        await TouchFileAsync(file);

                        cache           = new WvvCache(key, uri, file);
                        mCacheList[key] = cache;
                        CmLog.debug("WvvCacheManager.GetCacheAsync: Use cold cache: {0}", uri.ToString());
                    }
                    catch (FileNotFoundException)
                    {
                        // target is not found in cache
                        cache           = new WvvCache(key, uri, null);
                        mCacheList[key] = cache;
                        CmLog.debug("WvvCacheManager.GetCacheAsync: Use new cache: {0}", uri.ToString());
                    }
                    catch (Exception e2)
                    {
                        CmLog.error(e2, "WvvCacheManager.GetCacheAsync");
                        return(null);
                    }
                }
                else
                {
                    CmLog.debug("WvvCacheManager.GetCacheAsync: Use hot cache: {0}", uri.ToString());
                    var file = cache.CacheFile;
                    if (null != file && cache.RefCount == 0)
                    {
                        await TouchFileAsync(file);
                    }
                }
            }
            cache.AddRef();

            Sweep();
            return(cache);
        }
Esempio n. 5
0
        /**
         * MediaFailedイベントのハンドラ
         *
         * --> Errorプロパティのコメント参照
         */
        private async void OnFailed(MediaPlayer sender, MediaPlayerFailedEventArgs args)
        {
            CmLog.debug("WvvMediaLoader.OnFailed: MediaFailed");
            if (null != args.ErrorMessage && args.ErrorMessage.Length > 0)
            {
                CmLog.debug(args.ErrorMessage);
                Error.SetError(args.ErrorMessage);
            }
            if (null != args.ExtendedErrorCode)
            {
                CmLog.error(args.ExtendedErrorCode.Message);
                Error.SetError(args.ExtendedErrorCode);
            }

            Opened = false;
            await terminate(sender);
        }
Esempio n. 6
0
 /**
  * MediaPlayerでエラーが発生したときの処理
  */
 private async void MP_Failed(MediaPlayer sender, MediaPlayerFailedEventArgs args)
 {
     await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
     {
         CmLog.debug("WvvTrimmingView.MP_Failed: MediaFailed");
         if (null != args.ErrorMessage && args.ErrorMessage.Length > 0)
         {
             CmLog.debug(args.ErrorMessage);
             Error.SetError(args.ErrorMessage);
         }
         if (null != args.ExtendedErrorCode)
         {
             CmLog.error(args.ExtendedErrorCode.Message);
             Error.SetError(args.ExtendedErrorCode);
         }
     });
 }
Esempio n. 7
0
        //private void OnUnloaded(object sender, RoutedEventArgs e)
        //{
        //    Debug.WriteLine("MediaPage Unloaded.");
        //    Dispose();
        //}

        /**
         * リソース解放
         */
        private void Dispose()
        {
            var player = mPlayer.MediaPlayer;

            if (null != player)
            {
                mPlayer.UnregisterPropertyChangedCallback(MediaPlayerElement.IsFullWindowProperty, mFullWindowListenerToken);
                mPlayer.SetMediaPlayer(null);
                player.Dispose();
                //この方法は、Restricted Capabilities の指定が必要なので、できれば避けたい。
                //SystemNavigationManagerPreview.GetForCurrentView().CloseRequested -= OnCloseRequested;
            }
            Closed = null;
            mInfo  = null;


            CmLog.debug("WvvPinPPage.Dispose: PinP Player Disposed.)");
        }
Esempio n. 8
0
        /**
         * 終了処理 (成功時/エラー発生時の共通処理)
         */
        private async Task terminate(MediaPlayer mediaPlayer)
        {
            CmLog.debug("WvvMediaLoader.terminate: (Loading={0})", Loading);

            await OwnerView.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
            {
                CmLog.debug("WvvMediaLoader.terminate (inner): Loading={0}, hasCallback={0}", Loading, Loaded != null);
                if (Loading)
                {
                    Loading = false;
                    mediaPlayer.MediaOpened -= OnOpened;
                    mediaPlayer.MediaFailed -= OnFailed;
                    if (Opened)
                    {
                        try
                        {
                            TotalRange = Player.PlaybackSession.NaturalDuration.TotalMilliseconds;
                            VideoSize  = new Size(Player.PlaybackSession.NaturalVideoWidth, Player.PlaybackSession.NaturalVideoHeight);
                            CmLog.debug("WvvMediaLoader.terminate (inner): Loaded");
                        }
                        catch (Exception e)
                        {
                            // MediaOpenedが返ってきても、その後、プロパティを参照しようとすると Shutdown済み、みたいな例外が出ることがあって、
                            // このような場合は、ステータスも Closedになっているので、オープン失敗として扱う。
                            CmLog.error(e, "WvvMediaLoader.terminate (inner): Error");
                            Opened             = false;
                            mediaPlayer.Source = null;
                            Error.SetError(e);
                        }
                    }
                    else
                    {
                        mediaPlayer.Source = null;
                        if (!Error.HasError)
                        {
                            Error.SetError("MediaLoader error");
                        }
                    }
                    Loaded?.Invoke(this);
                    Loaded    = null;
                    OwnerView = null;
                }
            });
        }
Esempio n. 9
0
        /**
         * CurrentPosition調整用Thumbがクリックされた
         */
        private void OnThumbPressed(object sender, PointerRoutedEventArgs e)
        {
            ((UIElement)sender).CapturePointer(e.Pointer);

            beginTracking(e, 1, MWidth, AbsoluteCurrentPosition, TotalRange - TrimEnd - TrimStart);

            mTracking.Moved = (v, last) =>
            {
                CurrentPosition = v;
                if (mTracking.Ext != AbsoluteCurrentPosition)
                {
                    mTracking.Ext = AbsoluteCurrentPosition;
                    CurrentPositionChanged?.Invoke(this, CurrentPosition, false);
                }
            };

            CmLog.debug("WvvTrimmingSlider.OnThumbPressed");
            e.Handled = true;
        }
Esempio n. 10
0
        /**
         * TrimEnd位置調整用Knobがクリックされた
         */
        private void OnRKnobPressed(object sender, PointerRoutedEventArgs e)
        {
            ((UIElement)sender).CapturePointer(e.Pointer);

            beginTracking(e, -1, RWidth, TrimEnd, TotalRange - TrimStart - MinimumRange);

            mTracking.Moved = (v, last) =>
            {
                TrimEnd = v;
                if (mTracking.Ext != v)
                {
                    mTracking.Ext = v;
                    TrimEndChanged?.Invoke(this, v, last);
                }
            };

            CmLog.debug("WvvTrimmingSlider.OnRKnobPressed");
            e.Handled = true;
        }
Esempio n. 11
0
 /**
  * キャッシュファイルを取得する。
  * @param callback  結果を返すコールバック
  */
 public void GetFile(WvvDownloadedHandler callback)
 {
     lock (mLock)
     {
         if (null == mFile)
         {
             if (null == mDownloadTask)
             {
                 Download();
             }
             CmLog.debug("WvvCache.GetFile: Downloading ...");
             Downloaded += callback;
             return;
         }
     }
     // ファイルはキャッシュされている
     CmLog.debug("WvvCache.GetFile: Cache File Available");
     callback(this, mFile);
 }
Esempio n. 12
0
        private async void PBS_StateChanged(MediaPlaybackSession session, object args)
        {
            await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
            {
                CmLog.debug("WvvTrimmingView:PlaybackState = {0}", session.PlaybackState.ToString());
                switch (session.PlaybackState)
                {
                case MediaPlaybackState.None:
                case MediaPlaybackState.Buffering:
                case MediaPlaybackState.Opening:
                case MediaPlaybackState.Paused:
                default:
                    IsPlaying = false;
                    break;

                case MediaPlaybackState.Playing:
                    IsPlaying = true;
                    break;
                }
            });
        }
Esempio n. 13
0
 /**
  * SubWindowの×ボタンがクリックされたときに呼び出される。
  */
 private void OnConsolidated(ApplicationView sender, ApplicationViewConsolidatedEventArgs args)
 {
     CmLog.debug("WvvPinPPage.OnConsolidated: PinP Player Closed.)");
     ApplicationView.GetForCurrentView().Consolidated -= OnConsolidated;
     Close();
 }