private async Task OnZoomChanged() { ZoomChanged?.Invoke(this, new RoutedEventArgs()); await UpdateZoom(); TransportControls?.UpdateZoomButton(); }
private async void EventManager_OnTrackAdded(TrackType trackType, int trackId) { IList <TrackDescription> source; switch (trackType) { case TrackType.Audio: source = MediaPlayer.audioTrackDescription(); break; case TrackType.Subtitle: source = MediaPlayer.spuDescription(); break; default: return; } var trackName = source?.FirstOrDefault(td => td.id() == trackId)?.name(); if (!String.IsNullOrWhiteSpace(trackName)) { await DispatcherRunAsync(() => TransportControls?.OnTrackAdded(trackType, trackId, trackName)); } }
private async void EventManager_OnPositionChanged(float position) { await DispatcherRunAsync(() => { TransportControls?.OnPositionChanged(position); }); }
private void OnThumbButtonPressed(uint uniqueID) => Application.DeferredInvoke(delegate { TransportControls instance = SingletonModelItem <TransportControls> .Instance; switch (uniqueID) { case 0: if (instance.Playing) { instance.Pause.Invoke(); break; } instance.Play.Invoke(); break; case 1: instance.Back.Invoke(); break; case 2: instance.Forward.Invoke(); break; case 3: if (this.IsCurrentTrackRatable()) { PlaybackTrack currentTrack = instance.CurrentTrack; currentTrack.UserRating = currentTrack.UserRating != 0 ? (currentTrack.UserRating > 5 ? 2 : 0) : 8; } this.UpdateButtonStatus(); break; } }, null);
private void OnVolumeChanged() { if (!IsMuted) { MediaPlayer?.setVolume(Volume); } TransportControls?.UpdateVolume(); }
private void Jukebox_MediaEvent(object sender, MediaActionEventArgs e) { switch (e.MediaActionFlags) { case MediaActionFlags.Play: TransportControls.Play(); break; case MediaActionFlags.Pause: TransportControls.Pause(); break; case MediaActionFlags.SkipToNext: TransportControls.SkipToNext(); break; case MediaActionFlags.SkipToPrevious: TransportControls.SkipToPrevious(); break; case MediaActionFlags.SeekTo: TransportControls.SeekTo(e.Time); break; case MediaActionFlags.FastFoward: TransportControls.FastForward(); break; case MediaActionFlags.Rewind: TransportControls.Rewind(); break; case MediaActionFlags.Stop: TransportControls.Stop(); break; case MediaActionFlags.RetrieveMediaInformation: //Send media information. OnMediaMetadataChanged(new MediaMetadataChangedEventArgs { MediaMetadata = MediaMetadata, ActivityIntent = ActivityIntent }); //Send Playbackstate of the media. OnMediaPlaybackChanged(new MediaPlaybackStateChangedEventArgs { PlaybackState = PlaybackState.State, CurrentTime = PlaybackState.Position }); break; default: break; } }
public static void Init(TransportControls transportControls) { if (Instance != null) { throw new InvalidOperationException("Already Initilized"); } Instance = new MediaplayerViewmodel(transportControls); initilized.SetResult(null); }
public override void OnSessionDestroyed() { Jukebox.MediaEvent -= Jukebox_MediaEvent; PlaybackState?.Dispose(); TransportControls?.Dispose(); MediaMetadata?.Dispose(); instance = null; Log.Info("LiveDisplay", "MusicController dispose method"); base.OnSessionDestroyed(); }
private async Task UpdateState(MediaElementState state) { await DispatcherRunAsync(() => { if (CurrentState != state) { CurrentState = state; TransportControls?.UpdateState(state); } }); }
protected override void Dispose(bool disposing) { //release resources. base.Dispose(disposing); Jukebox.MediaEvent -= Jukebox_MediaEvent; PlaybackState?.Dispose(); TransportControls?.Dispose(); MediaMetadata?.Dispose(); instance = null; }
private async Task UpdateState(MediaElementState state) { await DispatcherRunAsync(() => { var previousState = CurrentState; if (previousState != state) { CurrentState = state; TransportControls?.UpdateState(previousState, state); } }); }
private MediaplayerViewmodel(TransportControls transportControls) { this.transportControls = transportControls; this.mediaPlaybackList = new MediaPlaybackList(); //this.singleRepeatPlaylist = new MediaPlaybackList(); //this._mediaPlaybackList.CurrentItemChanged += this._mediaPlaybackList_CurrentItemChanged; this.transportControls.PlayList = this.mediaPlaybackList; this.currentPlaylist = new ObservableCollection <PlayingSong>(); this.CurrentPlaylist = new ReadOnlyObservableCollection <PlayingSong>(this.currentPlaylist); transportControls.RegisterPropertyChangedCallback(TransportControls.IsShuffledProperty, (sender, e) => { //using (await this.semaphore.Lock()) this.ResetSorting(); }); transportControls.RegisterPropertyChangedCallback(TransportControls.CurrentMediaPlaybackItemProperty, (sender, e) => this.RefresCurrentIndex()); BindToTransportControl(SongProperty, nameof(this.transportControls.CurrentSong)); BindToTransportControl(GoToSettingsCommandProperty, nameof(this.transportControls.GoToSettingsCommand)); BindToTransportControl(GoToNowPlayingCommandProperty, nameof(this.transportControls.GoToNowPlayingCommand)); BindToTransportControl(NextCommandProperty, nameof(this.transportControls.NextCommand)); BindToTransportControl(PreviousCommandProperty, nameof(this.transportControls.PreviousCommand)); BindToTransportControl(PlayCommandProperty, nameof(this.transportControls.PlayCommand)); BindToTransportControl(PauseCommandProperty, nameof(this.transportControls.PauseCommand)); BindToTransportControl(ShuffleCommandProperty, nameof(this.transportControls.ShuffleCommand)); BindToTransportControl(RepeateCommandProperty, nameof(this.transportControls.RepeateCommand)); BindToTransportControl(IsShuffledProperty, nameof(this.transportControls.IsRepeate)); BindToTransportControl(IsRepeateProperty, nameof(this.transportControls.IsShuffled)); BindToTransportControl(IsPlayingProperty, nameof(this.transportControls.IsPlaying)); //return myBinding; void BindToTransportControl(DependencyProperty songProperty, string Path) { var myBinding = new Binding { Source = this.transportControls, Path = new PropertyPath(Path), Mode = BindingMode.OneWay, UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged }; BindingOperations.SetBinding(this, songProperty, myBinding); } }
private async void OnError(string title, string text) { await DispatcherRunAsync(() => TransportControls?.SetError($"{title}{Environment.NewLine}{text}")); await logSemaphoreSlim.WaitAsync(); try { await Logger.SaveToFileAsync(LogFilename); } catch (Exception) { } finally { logSemaphoreSlim.Release(); } }
private void OnTransportControlsPropertyChanged(object sender, PropertyChangedEventArgs args) { if (args.PropertyName == "HasPlaylist" || args.PropertyName == "Playing") { TransportControls instance = SingletonModelItem <TransportControls> .Instance; bool flag = instance.HasPlaylist && !instance.Playing; if (this._showResumeNowPlaying != flag) { this._showResumeNowPlaying = flag; this.UpdateJumpList(); } this._transportControlsHavePlaylist = instance.HasPlaylist; } else { if (!(args.PropertyName == "CurrentPlaylist")) { return; } this._currentPlaylistWillBeSaved = SingletonModelItem <TransportControls> .Instance.WillSaveCurrentPlaylistOnShutdown(); } }
private void UpdateButtonStatus() { if (!this._thumbBarInitializationComplete) { return; } TransportControls instance = SingletonModelItem <TransportControls> .Instance; UpdateThumbBarJob updateThumbBarJob = new UpdateThumbBarJob(); updateThumbBarJob.Cookie = Interlocked.Increment(ref this._lastUpdateJobCookie); updateThumbBarJob.IsPlaying = instance.Playing; updateThumbBarJob.CanPlay = instance.Play.Available; updateThumbBarJob.CanPause = instance.Pause.Available; updateThumbBarJob.CanGoBack = instance.Back.Available; updateThumbBarJob.CanGoForward = instance.Forward.Available; updateThumbBarJob.IsCurrentTrackRatable = this.IsCurrentTrackRatable(); if (instance.CurrentTrack != null) { updateThumbBarJob.CurrentTrackRating = instance.CurrentTrack.UserRating; } ThreadPool.QueueUserWorkItem(new WaitCallback(this.UpdateButtonStatusWorker), updateThumbBarJob); }
public void Phase3Init() { TransportControls instance = SingletonModelItem <TransportControls> .Instance; instance.PropertyChanged += new PropertyChangedEventHandler(this.OnTransportControlsPropertyChanged); instance.Play.PropertyChanged += new PropertyChangedEventHandler(this.OnTransportControlsCommandPropertyChanged); instance.Pause.PropertyChanged += new PropertyChangedEventHandler(this.OnTransportControlsCommandPropertyChanged); instance.Back.PropertyChanged += new PropertyChangedEventHandler(this.OnTransportControlsCommandPropertyChanged); instance.Forward.PropertyChanged += new PropertyChangedEventHandler(this.OnTransportControlsCommandPropertyChanged); string previousText = Shell.LoadString(StringId.IDS_PREVIOUS); string nextText = Shell.LoadString(StringId.IDS_NEXT); IntPtr windowHandle = Application.Window.Handle; ThreadPool.QueueUserWorkItem(delegate { Win7ShellManager.Instance.BeginThumbBarSession(windowHandle, out this._thumbBar); Win7ShellManager.Instance.OnThumbBarButtonPress += new ThumbBarButtonPressHandler(this.OnThumbButtonPressed); ThumbBarButton button; this._thumbBar.CreateButton(out button); button.UniqueID = 4U; button.IsHidden = true; this._thumbBar.CreateButton(out this._previous); this._previous.UniqueID = 1U; this._previous.Tooltip = previousText; this._thumbBar.CreateButton(out this._playPause); this._playPause.UniqueID = 0U; this._thumbBar.CreateButton(out this._next); this._next.UniqueID = 2U; this._next.Tooltip = nextText; this._thumbBar.CreateButton(out this._rating); this._rating.UniqueID = 3U; Application.DeferredInvoke(delegate { this._thumbBarInitializationComplete = true; this.UpdateButtonStatus(); }, null); }, null); }
private async void EventManager_OnPositionChanged(float position) { await UpdateState(MediaElementState.Playing); await DispatcherRunAsync(() => TransportControls?.OnPositionChanged(position)); }
private void OnSourceChanged() { if (Instance == null || DesignMode.DesignModeEnabled) { return; } Stop(); TransportControls?.Clear(); var source = Source; if (source == null) { ClearMedia(); return; } var media = new Media(Instance, source.IsAbsoluteUri ? source.AbsoluteUri : Path.Combine(Package.Current.InstalledLocation.Path, source.AbsoluteUri), source.IsFile ? FromType.FromPath : FromType.FromLocation); media.addOption($":avcodec-hw={(HardwareAcceleration ? "d3d11va" : "none")}"); media.addOption($":avcodec-threads={Convert.ToInt32(HardwareAcceleration)}"); var options = Options; if (options != null) { foreach (var option in options) { media.addOption($":{option.Key}={option.Value}"); } } Media = media; var mediaPlayer = new MediaPlayer(media); var eventManager = mediaPlayer.eventManager(); eventManager.OnBuffering += async p => await UpdateState(MediaElementState.Buffering); eventManager.OnOpening += async() => await UpdateState(MediaElementState.Opening); eventManager.OnPlaying += async() => await UpdateState(MediaElementState.Playing); eventManager.OnPaused += async() => await UpdateState(MediaElementState.Paused); eventManager.OnStopped += async() => await UpdateState(MediaElementState.Stopped); eventManager.OnEndReached += async() => { ClearMedia(); await UpdateState(MediaElementState.Closed); }; eventManager.OnPositionChanged += async m => await UpdateState(MediaElementState.Playing); eventManager.OnVoutCountChanged += async p => await DispatcherRunAsync(async() => { await UpdateZoom(); }); eventManager.OnTrackAdded += EventManager_OnTrackAdded; eventManager.OnTrackDeleted += async(trackType, trackId) => await DispatcherRunAsync(() => TransportControls?.OnTrackDeleted(trackType, trackId)); eventManager.OnLengthChanged += async length => await DispatcherRunAsync(() => TransportControls?.OnLengthChanged(length)); eventManager.OnPositionChanged += EventManager_OnPositionChanged; eventManager.OnTimeChanged += async time => await DispatcherRunAsync(() => TransportControls?.OnTimeChanged(time)); eventManager.OnSeekableChanged += async seekable => await DispatcherRunAsync(() => TransportControls?.OnSeekableChanged(seekable)); MediaPlayer = mediaPlayer; SetAudioDevice(); SetDeinterlaceMode(); if (AutoPlay) { Play(); } }
private void Jukebox_MediaEvent(object sender, MediaActionEventArgs e) { switch (e.MediaActionFlags) { case MediaActionFlags.Play: TransportControls.SendMediaKeyEvent(new KeyEvent(KeyEventActions.Down, Keycode.MediaPlay)); TransportControls.SendMediaKeyEvent(new KeyEvent(KeyEventActions.Up, Keycode.MediaPlay)); break; case MediaActionFlags.Pause: TransportControls.SendMediaKeyEvent(new KeyEvent(KeyEventActions.Down, Keycode.MediaPause)); TransportControls.SendMediaKeyEvent(new KeyEvent(KeyEventActions.Up, Keycode.MediaPause)); break; case MediaActionFlags.SkipToNext: TransportControls.SendMediaKeyEvent(new KeyEvent(KeyEventActions.Down, Keycode.MediaNext)); TransportControls.SendMediaKeyEvent(new KeyEvent(KeyEventActions.Up, Keycode.MediaNext)); break; case MediaActionFlags.SkipToPrevious: TransportControls.SendMediaKeyEvent(new KeyEvent(KeyEventActions.Down, Keycode.MediaPrevious)); TransportControls.SendMediaKeyEvent(new KeyEvent(KeyEventActions.Up, Keycode.MediaPrevious)); break; case MediaActionFlags.SeekTo: TransportControls.SeekTo(e.Time); break; case MediaActionFlags.FastFoward: TransportControls.SendMediaKeyEvent(new KeyEvent(KeyEventActions.Down, Keycode.MediaFastForward)); TransportControls.SendMediaKeyEvent(new KeyEvent(KeyEventActions.Up, Keycode.MediaFastForward)); break; case MediaActionFlags.Rewind: TransportControls.SendMediaKeyEvent(new KeyEvent(KeyEventActions.Down, Keycode.MediaRewind)); TransportControls.SendMediaKeyEvent(new KeyEvent(KeyEventActions.Up, Keycode.MediaRewind)); break; case MediaActionFlags.Stop: TransportControls.SendMediaKeyEvent(new KeyEvent(KeyEventActions.Down, Keycode.MediaStop)); TransportControls.SendMediaKeyEvent(new KeyEvent(KeyEventActions.Up, Keycode.MediaStop)); break; case MediaActionFlags.RetrieveMediaInformation: //Send media information. OnMediaMetadataChanged(new MediaMetadataChangedKitkatEventArgs { Title = MediaMetadata.GetString((MediaMetadataEditKey)MetadataKey.Title, ""), Artist = MediaMetadata.GetString((MediaMetadataEditKey)MetadataKey.Artist, ""), Album = MediaMetadata.GetString((MediaMetadataEditKey)MetadataKey.Album, ""), AlbumArt = MediaMetadata.GetBitmap(MediaMetadataEditKey.BitmapKeyArtwork, null), Duration = MediaMetadata.GetLong((MediaMetadataEditKey)MetadataKey.Duration, 0) }); //Send Playbackstate of the media. OnMediaPlaybackChanged(new MediaPlaybackStateChangedKitkatEventArgs { PlaybackState = PlaybackState, CurrentTime = CurrentMediaPosition, }); break; default: break; } }
private void OnIsMutedChanged() { MediaPlayer?.setVolume(IsMuted ? 0 : Volume); TransportControls?.UpdateMuteState(); }
private async Task OnMediaSourceChanged(bool forcePlay = false) { if (Instance == null || DesignMode.DesignModeEnabled) { return; } using (await SourceChangedMutex.LockAsync()) { Stop(); TransportControls?.Clear(); var mediaSource = MediaSource; if (mediaSource == null) { await ClearMediaAsync(); return; } var source = mediaSource.Uri; FromType type; if (!Uri.TryCreate(source, UriKind.RelativeOrAbsolute, out Uri location) || location.IsAbsoluteUri && !location.IsFile) { type = FromType.FromLocation; } else { if (!location.IsAbsoluteUri) { source = Path.Combine(Package.Current.InstalledLocation.Path, source); } type = FromType.FromPath; } var media = new Media(Instance, source, type); media.addOption($":avcodec-hw={(HardwareAcceleration ? "d3d11va" : "none")}"); var options = Options; if (options != null) { foreach (var option in options) { media.addOption($":{option.Key}={option.Value}"); } } foreach (var timedTextSource in mediaSource.ExternalTimedTextSources) { media.addSlave(SlaveType.Subtitle, 0, timedTextSource.Uri); } Media = media; var mediaPlayer = new MediaPlayer(media); var eventManager = mediaPlayer.eventManager(); eventManager.OnBuffering += async p => await UpdateState(MediaElementState.Buffering); eventManager.OnOpening += async() => await UpdateState(MediaElementState.Opening); eventManager.OnPlaying += async() => await UpdateState(MediaElementState.Playing); eventManager.OnPaused += async() => await UpdateState(MediaElementState.Paused); eventManager.OnStopped += async() => await UpdateState(MediaElementState.Stopped); eventManager.OnEndReached += async() => { await ClearMediaAsync(); await UpdateState(MediaElementState.Closed); }; eventManager.OnPositionChanged += EventManager_OnPositionChanged; eventManager.OnVoutCountChanged += async p => await DispatcherRunAsync(async() => { await UpdateZoom(); }); eventManager.OnTrackAdded += EventManager_OnTrackAdded; eventManager.OnTrackSelected += async(trackType, trackId) => await DispatcherRunAsync(() => TransportControls?.OnTrackSelected(trackType, trackId)); eventManager.OnTrackDeleted += async(trackType, trackId) => await DispatcherRunAsync(() => TransportControls?.OnTrackDeleted(trackType, trackId)); eventManager.OnLengthChanged += async length => await DispatcherRunAsync(() => TransportControls?.OnLengthChanged(length)); eventManager.OnTimeChanged += EventManager_OnTimeChanged; eventManager.OnSeekableChanged += async seekable => await DispatcherRunAsync(() => TransportControls?.OnSeekableChanged(seekable)); MediaPlayer = mediaPlayer; SetAudioDevice(); SetDeinterlaceMode(); if (forcePlay || AutoPlay) { Play(); } } }
private async void OnError(string title, string text) { await DispatcherRunAsync(() => TransportControls?.SetError($"{title}{Environment.NewLine}{text}")); try { await Logger.SaveToFileAsync(LogFilename); } catch (Exception) { } }
private void UpdateDeinterlaceMode() { SetDeinterlaceMode(); TransportControls?.UpdateDeinterlaceMode(); }
private async void EventManager_OnTimeChanged(long time) { await SetPosition(time); await DispatcherRunAsync(() => TransportControls?.OnTimeChanged(time)); }
private void Jukebox_MediaEvent(object sender, MediaActionEventArgs e) { switch (e.MediaActionFlags) { case MediaActionFlags.Play: TransportControls.SendMediaKeyEvent(new KeyEvent(KeyEventActions.Down, Keycode.MediaPlay)); TransportControls.SendMediaKeyEvent(new KeyEvent(KeyEventActions.Up, Keycode.MediaPlay)); break; case MediaActionFlags.Pause: TransportControls.SendMediaKeyEvent(new KeyEvent(KeyEventActions.Down, Keycode.MediaPause)); TransportControls.SendMediaKeyEvent(new KeyEvent(KeyEventActions.Up, Keycode.MediaPause)); OnPlaybackStateChanged(RemoteControlPlayState.Paused); //Workaround: Manually Notifying that the media has been paused. //because Android is mediocre and won't do this, so my app won't know if the media was paused. //This could lead to some fun bugs, but //It's the best approach I have found. break; case MediaActionFlags.SkipToNext: TransportControls.SendMediaKeyEvent(new KeyEvent(KeyEventActions.Down, Keycode.MediaNext)); TransportControls.SendMediaKeyEvent(new KeyEvent(KeyEventActions.Up, Keycode.MediaNext)); break; case MediaActionFlags.SkipToPrevious: TransportControls.SendMediaKeyEvent(new KeyEvent(KeyEventActions.Down, Keycode.MediaPrevious)); TransportControls.SendMediaKeyEvent(new KeyEvent(KeyEventActions.Up, Keycode.MediaPrevious)); break; case MediaActionFlags.SeekTo: TransportControls.SeekTo(e.Time); break; case MediaActionFlags.FastFoward: TransportControls.SendMediaKeyEvent(new KeyEvent(KeyEventActions.Down, Keycode.MediaFastForward)); TransportControls.SendMediaKeyEvent(new KeyEvent(KeyEventActions.Up, Keycode.MediaFastForward)); break; case MediaActionFlags.Rewind: TransportControls.SendMediaKeyEvent(new KeyEvent(KeyEventActions.Down, Keycode.MediaRewind)); TransportControls.SendMediaKeyEvent(new KeyEvent(KeyEventActions.Up, Keycode.MediaRewind)); break; case MediaActionFlags.Stop: TransportControls.SendMediaKeyEvent(new KeyEvent(KeyEventActions.Down, Keycode.MediaStop)); TransportControls.SendMediaKeyEvent(new KeyEvent(KeyEventActions.Up, Keycode.MediaStop)); break; case MediaActionFlags.Replay: TransportControls.SendMediaKeyEvent(new KeyEvent(KeyEventActions.Down, Keycode.MediaStop)); TransportControls.SendMediaKeyEvent(new KeyEvent(KeyEventActions.Up, Keycode.MediaStop)); TransportControls.SendMediaKeyEvent(new KeyEvent(KeyEventActions.Down, Keycode.MediaPlay)); TransportControls.SendMediaKeyEvent(new KeyEvent(KeyEventActions.Up, Keycode.MediaPlay)); break; case MediaActionFlags.RetrieveMediaInformation: //Send media information. OnMediaMetadataChanged(new MediaMetadataChangedKitkatEventArgs { Title = MediaMetadata.GetString((MediaMetadataEditKey)MetadataKey.Title, ""), Artist = MediaMetadata.GetString((MediaMetadataEditKey)MetadataKey.Artist, ""), Album = MediaMetadata.GetString((MediaMetadataEditKey)MetadataKey.Album, ""), AlbumArt = MediaMetadata.GetBitmap(MediaMetadataEditKey.BitmapKeyArtwork, null), Duration = MediaMetadata.GetLong((MediaMetadataEditKey)MetadataKey.Duration, 0) }); //Send Playbackstate of the media. OnMediaPlaybackChanged(new MediaPlaybackStateChangedKitkatEventArgs { PlaybackState = PlaybackState, CurrentTime = CurrentMediaPosition, }); break; default: break; } }