private void InitializeMediaSession() { // Does not work. Need a specific permission. ////RetrieveSessions(); mediaPlayer = new MediaPlayer(); mediaSession = new MediaSession(ApplicationContext, "example player session"); mediaController = new MediaController(ApplicationContext, mediaSession.SessionToken); var callback = new MediaSessionCallback(); mediaSession.SetCallback(callback); callback.OnPlayChanged += (sender, e) => { BuildNotification(GenerateAction(Android.Resource.Drawable.IcMediaPause, "Pause", ActionPause)); mediaPlayer.Start(); }; callback.OnPauseChanged += (sender, e) => { BuildNotification(GenerateAction(Android.Resource.Drawable.IcMediaPlay, "Play", ActionPlay)); }; callback.OnStopChanged += (sender, e) => { var notificationManager = (NotificationManager)GetSystemService(NotificationService); notificationManager.Cancel(1); var intent = new Intent(ApplicationContext, typeof(MediaPlayerService)); StopService(intent); }; }
private void AfterClose() { try { _mediaSession?.Shutdown(); _mediaSession?.Dispose(); _callback?.Dispose(); } catch (SharpDXException) { } _mediaSession = null; _callback = null; }
/// <summary> /// Load a new music into the media session. That is create a new session and a new topology and set the topology of the session. /// </summary> /// <param name="music"></param> private void LoadNewMusic(SoundMusic music) { if (currentMusic != null || mediaSession != null) { throw new AudioSystemInternalException("State of the audio engine invalid at the entry of LoadNewMusic."); } music.Stream.Position = 0; mediaInputByteStream = new ByteStream(music.Stream); topology = CreateTopology(mediaInputByteStream, out mediaSource); MediaFactory.CreateMediaSession(null, out mediaSession); mediaSessionCallback = new MediaSessionCallback(mediaSession, OnMediaSessionEvent); mediaSession.SetTopology(SessionSetTopologyFlags.None, topology); currentMusic = music; }
private void ProcessPlayerClosed() { // The session finished to close, we have to dispose all related object. currentMusic = null; mediaSessionCallback.Dispose(); if (mediaSource != null) { mediaSource.Shutdown(); } if (mediaSession != null) { mediaSession.Shutdown(); } if (streamVolume != null) { streamVolume.Dispose(); } if (mediaSource != null) { mediaSource.Dispose(); } if (topology != null) { topology.Dispose(); } if (mediaSession != null) { mediaSession.Dispose(); } if (mediaInputByteStream != null) { mediaInputByteStream.Dispose(); } topology = null; streamVolume = null; mediaSession = null; mediaSource = null; mediaInputByteStream = null; mediaSessionCallback = null; isMusicPlayerReady = false; }
public override void OnCreate() { base.OnCreate(); Shared = this; NativeAudioPlayer.NativeInit(this); PlaybackManager.Shared.Init(); Session = new MediaSessionCompat(this, "MusicService"); SessionToken = Session.SessionToken; Session.SetCallback(sessionCallback = new MediaSessionCallback()); Session.SetFlags(MediaSessionCompat.FlagHandlesMediaButtons | MediaSessionCompat.FlagHandlesTransportControls); var context = ApplicationContext; var intent = new Intent(ApplicationContext, typeof(NowPlayingActivity)); var pi = PendingIntent.GetActivity(context, 99, intent, PendingIntentFlags.UpdateCurrent); Session.SetSessionActivity(pi); sessionExtras = new Bundle(); // CarHelper.setSlotReservationFlags(mSessionExtras, true, true, true); // WearHelper.setSlotReservationFlags(mSessionExtras, true, true); // WearHelper.setUseBackgroundFromTheme(mSessionExtras, true); Session.SetExtras(sessionExtras); try { MediaNotificationManager = new MediaNotificationManager(this); } catch (Exception ex) { LogManager.Shared.Report(ex); throw ex; } //VideoCastManager.getInstance().addVideoCastConsumer(mCastConsumer); mediaRouter = Android.Support.V7.Media.MediaRouter.GetInstance(ApplicationContext); //registerCarConnectionReceiver(); Managers.NotificationManager.Shared.PlaybackStateChanged += PlaybackStateChanged; }
public void Play() { List <MediaSession.QueueItem> playingQueue; var currentContext = Forms.Context; MediaSession session = new MediaSession(currentContext, "mySession"); var mediaControler = session.Controller; var meta = mediaControler.Metadata; var pbIn = mediaControler.GetPlaybackInfo(); playingQueue = new List <MediaSession.QueueItem> (); var tt = session.SessionToken; var qu = mediaControler.Queue; var mediaCallback = new MediaSessionCallback(); mediaCallback.OnPlayImpl = () => { //LogHelper.Debug (Tag, "play"); //if (playingQueue == null || playingQueue.Count != 0) { // playingQueue = new List<MediaSession.QueueItem> (QueueHelper.GetRandomQueue (musicProvider)); // session.SetQueue (playingQueue); // session.SetQueueTitle (GetString(Resource.String.random_queue_title)); // //currentIndexOnQueue = 0; //} //if (playingQueue != null && playingQueue.Count != 0) { // HandlePlayRequest(); //} }; mediaControler.SetVolumeTo(10, AudioFlags.AudibilityEnforced); }
public override void OnCreate() { base.OnCreate(); LogHelper.Debug(Tag, "onCreate"); playingQueue = new List <MediaSession.QueueItem> (); musicProvider = new MusicProvider(); packageValidator = new PackageValidator(this); session = new MediaSession(this, "MusicService"); SessionToken = session.SessionToken; var mediaCallback = new MediaSessionCallback(); mediaCallback.OnPlayImpl = () => { LogHelper.Debug(Tag, "play"); if (playingQueue == null || playingQueue.Count != 0) { playingQueue = new List <MediaSession.QueueItem> (QueueHelper.GetRandomQueue(musicProvider)); session.SetQueue(playingQueue); session.SetQueueTitle(GetString(Resource.String.random_queue_title)); currentIndexOnQueue = 0; } if (playingQueue != null && playingQueue.Count != 0) { HandlePlayRequest(); } }; mediaCallback.OnSkipToQueueItemImpl = (id) => { LogHelper.Debug(Tag, "OnSkipToQueueItem:" + id); if (playingQueue != null && playingQueue.Count != 0) { currentIndexOnQueue = QueueHelper.GetMusicIndexOnQueue(playingQueue, id); HandlePlayRequest(); } }; mediaCallback.OnSeekToImpl = (pos) => { LogHelper.Debug(Tag, "onSeekTo:", pos); playback.SeekTo((int)pos); }; mediaCallback.OnPlayFromMediaIdImpl = (mediaId, extras) => { LogHelper.Debug(Tag, "playFromMediaId mediaId:", mediaId, " extras=", extras); playingQueue = QueueHelper.GetPlayingQueue(mediaId, musicProvider); session.SetQueue(playingQueue); var queueTitle = GetString(Resource.String.browse_musics_by_genre_subtitle, MediaIDHelper.ExtractBrowseCategoryValueFromMediaID(mediaId)); session.SetQueueTitle(queueTitle); if (playingQueue != null && playingQueue.Count != 0) { currentIndexOnQueue = QueueHelper.GetMusicIndexOnQueue(playingQueue, mediaId); if (currentIndexOnQueue < 0) { LogHelper.Error(Tag, "playFromMediaId: media ID ", mediaId, " could not be found on queue. Ignoring."); } else { HandlePlayRequest(); } } }; mediaCallback.OnPauseImpl = () => { LogHelper.Debug(Tag, "pause. current state=" + playback.State); HandlePauseRequest(); }; mediaCallback.OnStopImpl = () => { LogHelper.Debug(Tag, "stop. current state=" + playback.State); HandleStopRequest(null); }; mediaCallback.OnSkipToNextImpl = () => { LogHelper.Debug(Tag, "skipToNext"); currentIndexOnQueue++; if (playingQueue != null && currentIndexOnQueue >= playingQueue.Count) { currentIndexOnQueue = 0; } if (QueueHelper.isIndexPlayable(currentIndexOnQueue, playingQueue)) { HandlePlayRequest(); } else { LogHelper.Error(Tag, "skipToNext: cannot skip to next. next Index=" + currentIndexOnQueue + " queue length=" + (playingQueue == null ? "null" : playingQueue.Count.ToString())); HandleStopRequest("Cannot skip"); } }; mediaCallback.OnSkipToPreviousImpl = () => { LogHelper.Debug(Tag, "skipToPrevious"); currentIndexOnQueue--; if (playingQueue != null && currentIndexOnQueue < 0) { currentIndexOnQueue = 0; } if (QueueHelper.isIndexPlayable(currentIndexOnQueue, playingQueue)) { HandlePlayRequest(); } else { LogHelper.Error(Tag, "skipToPrevious: cannot skip to previous. previous Index=" + currentIndexOnQueue + " queue length=" + (playingQueue == null ? "null" : playingQueue.Count.ToString())); HandleStopRequest("Cannot skip"); } }; mediaCallback.OnCustomActionImpl = (action, extras) => { if (CustomActionThumbsUp == action) { LogHelper.Info(Tag, "onCustomAction: favorite for current track"); var track = GetCurrentPlayingMusic(); if (track != null) { var musicId = track.GetString(MediaMetadata.MetadataKeyMediaId); musicProvider.SetFavorite(musicId, !musicProvider.IsFavorite(musicId)); } UpdatePlaybackState(null); } else { LogHelper.Error(Tag, "Unsupported action: ", action); } }; mediaCallback.OnPlayFromSearchImpl = (query, extras) => { LogHelper.Debug(Tag, "playFromSearch query=", query); if (string.IsNullOrEmpty(query)) { playingQueue = new List <MediaSession.QueueItem> (QueueHelper.GetRandomQueue(musicProvider)); } else { playingQueue = new List <MediaSession.QueueItem> (QueueHelper.GetPlayingQueueFromSearch(query, musicProvider)); } LogHelper.Debug(Tag, "playFromSearch playqueue.length=" + playingQueue.Count); session.SetQueue(playingQueue); if (playingQueue != null && playingQueue.Count != 0) { currentIndexOnQueue = 0; HandlePlayRequest(); } else { HandleStopRequest(GetString(Resource.String.no_search_results)); } }; session.SetCallback(mediaCallback); session.SetFlags(MediaSessionFlags.HandlesMediaButtons | MediaSessionFlags.HandlesTransportControls); playback = new Playback(this, musicProvider); playback.State = PlaybackStateCode.None; playback.Callback = this; playback.Start(); var context = ApplicationContext; var intent = new Intent(context, typeof(MusicPlayerActivity)); var pi = PendingIntent.GetActivity(context, 99 /*request code*/, intent, PendingIntentFlags.UpdateCurrent); session.SetSessionActivity(pi); var extraBundle = new Bundle(); CarHelper.SetSlotReservationFlags(extraBundle, true, true, true); session.SetExtras(extraBundle); UpdatePlaybackState(null); mediaNotificationManager = new MediaNotificationManager(this); }
public override void OnCreate () { base.OnCreate (); LogHelper.Debug (Tag, "onCreate"); playingQueue = new List<MediaSession.QueueItem> (); musicProvider = new MusicProvider (); packageValidator = new PackageValidator (this); session = new MediaSession (this, "MusicService"); SessionToken = session.SessionToken; var mediaCallback = new MediaSessionCallback (); mediaCallback.OnPlayImpl = () => { LogHelper.Debug (Tag, "play"); if (playingQueue == null || playingQueue.Count != 0) { playingQueue = new List<MediaSession.QueueItem> (QueueHelper.GetRandomQueue (musicProvider)); session.SetQueue (playingQueue); session.SetQueueTitle (GetString (Resource.String.random_queue_title)); currentIndexOnQueue = 0; } if (playingQueue != null && playingQueue.Count != 0) { HandlePlayRequest (); } }; mediaCallback.OnSkipToQueueItemImpl = (id) => { LogHelper.Debug (Tag, "OnSkipToQueueItem:" + id); if (playingQueue != null && playingQueue.Count != 0) { currentIndexOnQueue = QueueHelper.GetMusicIndexOnQueue (playingQueue, id); HandlePlayRequest (); } }; mediaCallback.OnSeekToImpl = (pos) => { LogHelper.Debug (Tag, "onSeekTo:", pos); playback.SeekTo ((int)pos); }; mediaCallback.OnPlayFromMediaIdImpl = (mediaId, extras) => { LogHelper.Debug (Tag, "playFromMediaId mediaId:", mediaId, " extras=", extras); playingQueue = QueueHelper.GetPlayingQueue (mediaId, musicProvider); session.SetQueue (playingQueue); var queueTitle = GetString (Resource.String.browse_musics_by_genre_subtitle, MediaIDHelper.ExtractBrowseCategoryValueFromMediaID (mediaId)); session.SetQueueTitle (queueTitle); if (playingQueue != null && playingQueue.Count != 0) { currentIndexOnQueue = QueueHelper.GetMusicIndexOnQueue (playingQueue, mediaId); if (currentIndexOnQueue < 0) { LogHelper.Error (Tag, "playFromMediaId: media ID ", mediaId, " could not be found on queue. Ignoring."); } else { HandlePlayRequest (); } } }; mediaCallback.OnPauseImpl = () => { LogHelper.Debug (Tag, "pause. current state=" + playback.State); HandlePauseRequest (); }; mediaCallback.OnStopImpl = () => { LogHelper.Debug (Tag, "stop. current state=" + playback.State); HandleStopRequest (null); }; mediaCallback.OnSkipToNextImpl = () => { LogHelper.Debug (Tag, "skipToNext"); currentIndexOnQueue++; if (playingQueue != null && currentIndexOnQueue >= playingQueue.Count) { currentIndexOnQueue = 0; } if (QueueHelper.isIndexPlayable (currentIndexOnQueue, playingQueue)) { HandlePlayRequest (); } else { LogHelper.Error (Tag, "skipToNext: cannot skip to next. next Index=" + currentIndexOnQueue + " queue length=" + (playingQueue == null ? "null" : playingQueue.Count.ToString ())); HandleStopRequest ("Cannot skip"); } }; mediaCallback.OnSkipToPreviousImpl = () => { LogHelper.Debug (Tag, "skipToPrevious"); currentIndexOnQueue--; if (playingQueue != null && currentIndexOnQueue < 0) { currentIndexOnQueue = 0; } if (QueueHelper.isIndexPlayable (currentIndexOnQueue, playingQueue)) { HandlePlayRequest (); } else { LogHelper.Error (Tag, "skipToPrevious: cannot skip to previous. previous Index=" + currentIndexOnQueue + " queue length=" + (playingQueue == null ? "null" : playingQueue.Count.ToString ())); HandleStopRequest ("Cannot skip"); } }; mediaCallback.OnCustomActionImpl = (action, extras) => { if (CustomActionThumbsUp == action) { LogHelper.Info (Tag, "onCustomAction: favorite for current track"); var track = GetCurrentPlayingMusic (); if (track != null) { var musicId = track.GetString (MediaMetadata.MetadataKeyMediaId); musicProvider.SetFavorite (musicId, !musicProvider.IsFavorite (musicId)); } UpdatePlaybackState (null); } else { LogHelper.Error (Tag, "Unsupported action: ", action); } }; mediaCallback.OnPlayFromSearchImpl = (query, extras) => { LogHelper.Debug (Tag, "playFromSearch query=", query); if (string.IsNullOrEmpty (query)) { playingQueue = new List<MediaSession.QueueItem> (QueueHelper.GetRandomQueue (musicProvider)); } else { playingQueue = new List<MediaSession.QueueItem> (QueueHelper.GetPlayingQueueFromSearch (query, musicProvider)); } LogHelper.Debug (Tag, "playFromSearch playqueue.length=" + playingQueue.Count); session.SetQueue (playingQueue); if (playingQueue != null && playingQueue.Count != 0) { currentIndexOnQueue = 0; HandlePlayRequest (); } else { HandleStopRequest (GetString (Resource.String.no_search_results)); } }; session.SetCallback (mediaCallback); session.SetFlags (MediaSessionFlags.HandlesMediaButtons | MediaSessionFlags.HandlesTransportControls); playback = new Playback (this, musicProvider); playback.State = PlaybackStateCode.None; playback.Callback = this; playback.Start (); Context context = ApplicationContext; var intent = new Intent (context, typeof(MusicPlayerActivity)); var pi = PendingIntent.GetActivity (context, 99 /*request code*/, intent, PendingIntentFlags.UpdateCurrent); session.SetSessionActivity (pi); var extraBundle = new Bundle (); CarHelper.SetSlotReservationFlags (extraBundle, true, true, true); session.SetExtras (extraBundle); UpdatePlaybackState (null); mediaNotificationManager = new MediaNotificationManager (this); }
public void Load(object customSource) { Close(); AfterClose(); if (Hwnd == IntPtr.Zero) { throw new InvalidOperationException(); } Trace.WriteLine("HwndRenderSession::Load()"); MediaSource source = null; Topology topo = null; PresentationDescriptor pdesc = null; try { // Create MediaSource(check argument) source = ComObject.As <MediaSource>(Marshal.GetIUnknownForObject(customSource)); // GetIUnknownForObject adds reference count // Create MediaSession MediaFactory.CreateMediaSession(null, out _mediaSession); _callback = new MediaSessionCallback(_mediaSession, OnMediaEvent); // Create Topology MediaFactory.CreateTopology(out topo); // Get PresentationDescriptor from MediaSource source.CreatePresentationDescriptor(out pdesc); // Connect each stream for (var i = 0; i < pdesc.StreamDescriptorCount; i++) { RawBool isSelected; using (var sdesc = pdesc.GetStreamDescriptorByIndex(i, out isSelected)) { if (!isSelected) { continue; } Activate renderer = null; TopologyNode srcnode = null; TopologyNode outnode = null; try { // Renderer if (sdesc.MediaTypeHandler.MajorType == MediaTypeGuids.Video) { MediaFactory.CreateVideoRendererActivate(Hwnd, out renderer); } else if (sdesc.MediaTypeHandler.MajorType == MediaTypeGuids.Audio) { MediaFactory.CreateAudioRendererActivate(out renderer); } else { // not supported continue; } // Source Node MediaFactory.CreateTopologyNode(TopologyType.SourceStreamNode, out srcnode); srcnode.Set(TopologyNodeAttributeKeys.Source, source); srcnode.Set(TopologyNodeAttributeKeys.PresentationDescriptor, pdesc); srcnode.Set(TopologyNodeAttributeKeys.StreamDescriptor, sdesc); // Output Node MediaFactory.CreateTopologyNode(TopologyType.OutputNode, out outnode); outnode.Object = renderer; // Connect topo.AddNode(srcnode); topo.AddNode(outnode); srcnode.ConnectOutput(0, outnode, 0); } finally { srcnode?.Dispose(); outnode?.Dispose(); renderer?.Dispose(); } } } // Set to session _mediaSession.SetTopology(SessionSetTopologyFlags.None, topo); } catch { Close(); AfterClose(); throw; } finally { pdesc?.Dispose(); topo?.Dispose(); source?.Dispose(); } }
/// <summary> /// OnCreate() detects some of our managers /// </summary> public override void OnCreate() { Log.Debug(TAG, "StreamingService.OnCreate()"); base.OnCreate(); audioManager = (AudioManager)GetSystemService(AudioService); wifiManager = (WifiManager)GetSystemService(WifiService); headphonesUnpluggedReceiver = new MusicBroadcastReceiver(); if (Android.OS.Build.VERSION.SdkInt >= BuildVersionCodes.Lollipop) { mediaSession = new MediaSession(this, "KVMRMediaSession"); mediaCallback = new MediaSessionCallback(); mediaCallback.OnPlayImpl = () => { if (IsPlaying) { Log.Debug(TAG, "MediaCallback stop playing"); Stop(); MessagingCenter.Send<PlayerStoppedMessage>(new PlayerStoppedMessage(), "PlayerStopped"); } else { Log.Debug(TAG, "MediaCallback start playing. source: " + source ?? "null"); Play(source); MessagingCenter.Send(new RemoteControlPlayMessage(), "RemoteControlPlay"); } }; mediaSession.SetCallback(mediaCallback); mediaSession.SetFlags(MediaSessionFlags.HandlesMediaButtons | MediaSessionFlags.HandlesTransportControls); PlaybackState state = new PlaybackState.Builder() .SetActions(PlaybackState.ActionPlay | PlaybackState.ActionPlayPause | PlaybackState.ActionPause | PlaybackState.ActionStop) .Build(); mediaSession.SetPlaybackState(state); mediaSession.Active = true; } }