/** * MediaOpenedイベントのハンドラ */ private async void OnOpened(MediaPlayer sender, object args) { Opened = true; if (null != OwnerView) { CmLog.debug("WvvMediaLoader.OnOpened: MediaOpened"); await terminate(sender); } }
/** * ソースを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); }
/** * トラッキング終了時のハンドラ */ 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; }
/** * 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); }
/** * 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); }
/** * 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); } }); }
//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.)"); }
/** * 終了処理 (成功時/エラー発生時の共通処理) */ 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; } }); }
/** * 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; }
/** * 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; }
/** * キャッシュファイルを取得する。 * @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); }
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; } }); }
/** * SubWindowの×ボタンがクリックされたときに呼び出される。 */ private void OnConsolidated(ApplicationView sender, ApplicationViewConsolidatedEventArgs args) { CmLog.debug("WvvPinPPage.OnConsolidated: PinP Player Closed.)"); ApplicationView.GetForCurrentView().Consolidated -= OnConsolidated; Close(); }