Ejemplo n.º 1
0
        private async Task OnZoomChanged()
        {
            ZoomChanged?.Invoke(this, new RoutedEventArgs());
            await UpdateZoom();

            TransportControls?.UpdateZoomButton();
        }
Ejemplo n.º 2
0
        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));
            }
        }
Ejemplo n.º 3
0
 private async void EventManager_OnPositionChanged(float position)
 {
     await DispatcherRunAsync(() =>
     {
         TransportControls?.OnPositionChanged(position);
     });
 }
Ejemplo n.º 4
0
        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);
Ejemplo n.º 5
0
 private void OnVolumeChanged()
 {
     if (!IsMuted)
     {
         MediaPlayer?.setVolume(Volume);
     }
     TransportControls?.UpdateVolume();
 }
Ejemplo n.º 6
0
        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;
            }
        }
Ejemplo n.º 7
0
        public static void Init(TransportControls transportControls)
        {
            if (Instance != null)
            {
                throw new InvalidOperationException("Already Initilized");
            }

            Instance = new MediaplayerViewmodel(transportControls);
            initilized.SetResult(null);
        }
Ejemplo n.º 8
0
 public override void OnSessionDestroyed()
 {
     Jukebox.MediaEvent -= Jukebox_MediaEvent;
     PlaybackState?.Dispose();
     TransportControls?.Dispose();
     MediaMetadata?.Dispose();
     instance = null;
     Log.Info("LiveDisplay", "MusicController dispose method");
     base.OnSessionDestroyed();
 }
Ejemplo n.º 9
0
 private async Task UpdateState(MediaElementState state)
 {
     await DispatcherRunAsync(() =>
     {
         if (CurrentState != state)
         {
             CurrentState = state;
             TransportControls?.UpdateState(state);
         }
     });
 }
Ejemplo n.º 10
0
        protected override void Dispose(bool disposing)
        {
            //release resources.

            base.Dispose(disposing);
            Jukebox.MediaEvent -= Jukebox_MediaEvent;
            PlaybackState?.Dispose();
            TransportControls?.Dispose();
            MediaMetadata?.Dispose();
            instance = null;
        }
Ejemplo n.º 11
0
 private async Task UpdateState(MediaElementState state)
 {
     await DispatcherRunAsync(() =>
     {
         var previousState = CurrentState;
         if (previousState != state)
         {
             CurrentState = state;
             TransportControls?.UpdateState(previousState, state);
         }
     });
 }
Ejemplo n.º 12
0
        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);
            }
        }
Ejemplo n.º 13
0
        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();
            }
        }
Ejemplo n.º 14
0
 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();
     }
 }
Ejemplo n.º 15
0
        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);
        }
Ejemplo n.º 16
0
        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);
        }
Ejemplo n.º 17
0
 private async void EventManager_OnPositionChanged(float position)
 {
     await UpdateState(MediaElementState.Playing);
     await DispatcherRunAsync(() => TransportControls?.OnPositionChanged(position));
 }
Ejemplo n.º 18
0
        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();
            }
        }
Ejemplo n.º 19
0
        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;
            }
        }
Ejemplo n.º 20
0
 private void OnIsMutedChanged()
 {
     MediaPlayer?.setVolume(IsMuted ? 0 : Volume);
     TransportControls?.UpdateMuteState();
 }
Ejemplo n.º 21
0
        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();
                }
            }
        }
Ejemplo n.º 22
0
        private async void OnError(string title, string text)
        {
            await DispatcherRunAsync(() => TransportControls?.SetError($"{title}{Environment.NewLine}{text}"));

            try { await Logger.SaveToFileAsync(LogFilename); } catch (Exception) { }
        }
Ejemplo n.º 23
0
 private void UpdateDeinterlaceMode()
 {
     SetDeinterlaceMode();
     TransportControls?.UpdateDeinterlaceMode();
 }
Ejemplo n.º 24
0
 private async void EventManager_OnTimeChanged(long time)
 {
     await SetPosition(time);
     await DispatcherRunAsync(() => TransportControls?.OnTimeChanged(time));
 }
Ejemplo n.º 25
0
        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;
            }
        }