private void MP_OnStateChangeMediaplayer(object sender, MediaplayerState state) { switch (state) { case MediaplayerState.Disconnected: AddLogLine("===========DISCONNECTED STATE==="); break; case MediaplayerState.Connecting: AddLogLine("===========CONNECTING STATE====="); break; case MediaplayerState.Stop: AddLogLine("===========STOP STATE==========="); break; case MediaplayerState.Playing: AddLogLine("===========PLAYING STATE========"); break; case MediaplayerState.Pause: AddLogLine("===========PAUSE STATE=========="); break; default: AddLogLine("===========UNKNOWN STATE========"); break; } //switch }
/// <summary> /// Connect to RTMP server using RTMPServerLink settings /// When "Mediaplayer" is connected the "OnServerConnect" event will be fired /// /// WARNING if there are changes don't fortget to do this for eMuziek en MuziekwebLusiter /// classes also (have roughly same implementatino with added securirty calls) /// </summary> protected virtual void MPThread_Connect() { lastConnectFailed = false; MP_OnStateChangeMediaplayer onStateChangeMediaplayer = null; lock (lockVAR) { onStateChangeMediaplayer = OnStateChangeMediaplayer; mediaplayerState = MediaplayerState.Connecting; dtLastAutoReconnect = DateTime.Now; } DoEvent_MP_OnStateChangeMediaplayer(onStateChangeMediaplayer, this, mediaplayerState); // possible button state changed DoEvent_MP_OnControleButtonStateChange(OnControleButtonStateChange, this); netConnectionReady = false; netStreams.Clear(); if (netConnection != null) { netConnection.Close(); netConnection = null; } // Important to only do this here. In derived classes this function is overriden to add // securtity calls netConnection = new NetConnection(null); // force event over NetConnection thread (we will managed them in this class ourself) netConnection.OnDisconnect += new NC_OnDisconnect(NC_OnDisconnect); netConnection.Connect(rtmpServerLink, NC_OnConnect); }
private void RecalcMediaplayerState() { MP_OnStateChangeMediaplayer onStateChangeMediaplayer = null; //fixup var "mediaplayerState" lock (lockVAR) { MediaplayerState savedMediaplayerState = mediaplayerState; if (netConnection != null && netConnection.Connecting && !netConnection.IsConnected) { mediaplayerState = MediaplayerState.Connecting; } else if (netConnection == null || !netConnection.IsConnected) { mediaplayerState = MediaplayerState.Disconnected; } else if (netStreams.Count == 0) { mediaplayerState = MediaplayerState.Stop; } else if (netStreams.Count > 0) { switch (netStreams[0].PlayState) { case NetStreamState.None: mediaplayerState = MediaplayerState.Stop; break; case NetStreamState.Connecting: mediaplayerState = MediaplayerState.Connecting; break; case NetStreamState.Playing: case NetStreamState.Seek: mediaplayerState = MediaplayerState.Playing; break; case NetStreamState.Pause: mediaplayerState = MediaplayerState.Pause; break; } //switch } if (savedMediaplayerState != mediaplayerState) { onStateChangeMediaplayer = OnStateChangeMediaplayer; } }//lock // Fire state event if needed DoEvent_MP_OnStateChangeMediaplayer(onStateChangeMediaplayer, this, mediaplayerState); }
private void BassCallback_EndSync(int handle, int channel, int data, Guid newMediaItemGUID) { // WARNING we are on the BASS or Mediaplayer THREAD HERE!!!!!!! (not always!!) NetStreamHelper nsh = null; MediaItem preBufferedMediaItem = null; int netStreamsCount = 0; lock (lockVAR) { if (netStreams.Count > 0) { nsh = netStreams[0]; netStreams.RemoveAt(0); // belangrijk als je het juist mediaitem wil selecteren voor afspelen // nsh will be cleanup up by call to CloseAudioStream later in this function // renumber for (int i = 0; i < netStreams.Count; i++) { netStreams[i].IndexNumberInList = i; } //for } netStreamsCount = netStreams.Count; if (netStreamsCount > 0 && newMediaItemGUID.Equals(Guid.Empty)) { // needed to change currentMediaItem newMediaItemGUID = netStreams[0].Item.GUID; preBufferedMediaItem = (MediaItem)netStreams[0].Item.Clone(); } } //lock // is prebuffered netstream ready top be player? if (netStreamsCount > 0) { DoEvent_MP_OnPreBuffer(OnPreBuffer, this, (MediaItem)preBufferedMediaItem, PreBufferState.PrebufferingEndedAndPlaying); } MP_OnPlaylist onPlaylistEnd = null; Playlist playlist = null; MP_OnStateChangeMediaplayer onStateChangeMediaplayer = null; MP_OnMediaItem onMediaItemEndPlay = null; MediaItem item = null; if (nsh != null) { CloseAudioStream(nsh); lock (lockVAR) { if (OnMediaItemEndPlay != null) { onMediaItemEndPlay = OnMediaItemEndPlay; item = (MediaItem)nsh.Item.Clone(); } if (newMediaItemGUID.Equals(Guid.Empty) && OnPlaylistEnd != null && netStreams.Count == 0) { onPlaylistEnd = OnPlaylistEnd; playlist = (Playlist)currentPlaylist.Clone(); } if (newMediaItemGUID.Equals(Guid.Empty) && netStreams.Count == 0) { onStateChangeMediaplayer = OnStateChangeMediaplayer; mediaplayerState = MediaplayerState.Stop; } } //lock // Fire event that MediaItem ends playing audio (event will only be fired // when onMediaItemEndPlay and item are not null.) DoEvent_MP_OnMediaItem(onMediaItemEndPlay, this, item); // reset (saved) position because we're at the end lastPosition = 0.0; // Now fire MediaItem events! (must be done here to for right // order of events! if (!newMediaItemGUID.Equals(Guid.Empty)) { currentPlaylist.ChangeCurrentMediaItemGUID(newMediaItemGUID, true); } // Fire event that Playlist play has ended(event will only be fired // when onPlaylistEnd is not null.) DoEvent_MP_OnPlaylist(onPlaylistEnd, this, playlist); // Fire event we go to stop state DoEvent_MP_OnStateChangeMediaplayer(onStateChangeMediaplayer, this, mediaplayerState); // Startup any new audio channel (only audio playing, buffering has already been done) StartPlayingAudioChannel(); // Is there a next MediaItem to play? (and no netstreams queued) if (netStreamsCount <= 0 && !newMediaItemGUID.Equals(Guid.Empty)) { // Start next netstream, when event "NS_OnAssignStream_ID" is fired // it will be handled further. lock (lockVAR) { NetStreamHelper nth = NewNetStreamHelper(currentPlaylist.GetOrginalMediaItem(newMediaItemGUID)); if (nth != null) { netStreams.Add(nth); nth.NetStream.Connect(); // start request for stream_id to start streamning the music data } } //lock } } // Button are probably changed DoEvent_MP_OnControleButtonStateChange(OnControleButtonStateChange, this); }
protected void DoEvent_MP_OnStateChangeMediaplayer(MP_OnStateChangeMediaplayer doEvent, object sender, MediaplayerState state) { if (doEvent != null) { MP_Params param = new MP_Params(); param.Params = new object[] { doEvent, sender, state }; SynchronizationContext sc; lock (lockVAR) { sc = synchronizationContext; } //lock if (sc != null) { sc.Post(HandleOnEventCallUserCode, param); } else { HandleOnEventCallUserCode(param); } } }
/// <summary> /// Fired by NetConnection when Connection is lost /// </summary> protected virtual void NC_OnDisconnect(object sender) { MP_OnMediaItem onMediaItemEndPlay = null; MediaItem item = null; MP_OnPlaylist onPlaylistEnd = null; Playlist playlist = null; MP_OnStateChangeMediaplayer onStateChangeMediaplayer = null; MP_OnServer onServerDisconnect = null; lock (lockVAR) { // we're we playing? if (netStreams.Count > 0 && netStreams[0].BassHandle != 0) { // We're playing onMediaItemEndPlay = OnMediaItemEndPlay; item = (MediaItem)netStreams[0].Item.Clone(); onPlaylistEnd = OnPlaylistEnd; playlist = (Playlist)currentPlaylist.Clone(); } onStateChangeMediaplayer = OnStateChangeMediaplayer; mediaplayerState = MediaplayerState.Disconnected; if ((DateTime.MaxValue - dtLastAutoReconnect).TotalDays != 0) { dtLastAutoReconnect = DateTime.Now; // make sure we keep trying to connect } ResetStateMediaplayer(); onServerDisconnect = OnServerDisconnect; } DateTime saved_dtLastAutoReconnect = dtLastAutoReconnect; try { MPThread_Disconnect(); } finally { dtLastAutoReconnect = saved_dtLastAutoReconnect; } // Make sure we fire some event that playing has stopped DoEvent_MP_OnMediaItem(onMediaItemEndPlay, this, item); DoEvent_MP_OnPlaylist(onPlaylistEnd, this, playlist); DoEvent_MP_OnStateChangeMediaplayer(onStateChangeMediaplayer, this, mediaplayerState); // possible button state changed DoEvent_MP_OnControleButtonStateChange(OnControleButtonStateChange, this); DoEvent_MP_OnServer(onServerDisconnect, this); }
/// <summary> /// Event fired by NetConnection /// </summary> protected void NC_OnConnect(object sender, bool success) { lastConnectFailed = !success; if (success) { netStreams.Clear(); netConnectionReady = true; MP_OnServer onServerConnect = null; MP_OnStateChangeMediaplayer onStateChangeMediaplayer = null; lock (lockVAR) { onServerConnect = OnServerConnect; onStateChangeMediaplayer = OnStateChangeMediaplayer; mediaplayerState = MediaplayerState.Stop; } //lock DoEvent_MP_OnServer(onServerConnect, this); // Fire event we are in the Connect state DoEvent_MP_OnStateChangeMediaplayer(onStateChangeMediaplayer, this, mediaplayerState); } else { MPThread_Disconnect(); MP_OnServer onServerDisconnect = null; MP_OnStateChangeMediaplayer onStateChangeMediaplayer = null; lock (lockVAR) { onServerDisconnect = OnServerDisconnect; onStateChangeMediaplayer = OnStateChangeMediaplayer; mediaplayerState = MediaplayerState.Disconnected; dtLastAutoReconnect = DateTime.Now; // make sure we keep trying to connect ResetStateMediaplayer(); } //lock DoEvent_MP_OnServer(onServerDisconnect, this); // Fire event we are in the "None" state DoEvent_MP_OnStateChangeMediaplayer(onStateChangeMediaplayer, this, mediaplayerState); } // possible button state changed DoEvent_MP_OnControleButtonStateChange(OnControleButtonStateChange, this); }
private void MPThread_Stop() { MP_OnPlaylist onPlaylistEnd = null; Playlist playlist = null; MP_OnStateChangeMediaplayer onStateChangeMediaplayer = null; MP_OnMediaItem onMediaItemEndPlay = null; MediaItem item = null; bool buttonStateChanged = false; lock (lockVAR) { if (netStreams.Count > 0) { NetStreamHelper nsh = netStreams[0]; if (OnMediaItemEndPlay != null) { onMediaItemEndPlay = OnMediaItemEndPlay; item = (MediaItem)nsh.Item.Clone(); } if (OnPlaylistEnd != null) { onPlaylistEnd = OnPlaylistEnd; playlist = (Playlist)currentPlaylist.Clone(); } } if (netConnection != null && netConnection.IsConnected) { onStateChangeMediaplayer = OnStateChangeMediaplayer; mediaplayerState = MediaplayerState.Stop; } buttonStateChanged = true; foreach (NetStreamHelper nsh in netStreams) { nsh.Close(); } //foreach netStreams.Clear(); lastPosition = 0.0; commandInProgress = false; // reset it after seek command onStateChangeMediaplayer = OnStateChangeMediaplayer; mediaplayerState = MediaplayerState.Stop; } //lock // Fire event that MediaItem ends playing audio (event will only be fired // when onMediaItemEndPlay and item are not null.) DoEvent_MP_OnMediaItem(onMediaItemEndPlay, this, item); // Fire event that Playlist play has ended(event will only be fired // when onPlaylistEnd is not null.) DoEvent_MP_OnPlaylist(onPlaylistEnd, this, playlist); // Fire event we go to stop state DoEvent_MP_OnStateChangeMediaplayer(onStateChangeMediaplayer, this, mediaplayerState); if (buttonStateChanged) { // possible button state changed DoEvent_MP_OnControleButtonStateChange(OnControleButtonStateChange, this); } }
private void MPThread_Pause() { MP_OnStateChangeMediaplayer onStateChangeMediaplayer = null; bool buttonStateChanged = false; lock (lockVAR) { if (netConnection != null && netConnection.IsConnected && netStreams.Count > 0) { if (netStreams[0].PlayState == NetStreamState.Playing) { // Saved paused position lastPosition = Position; // pause audio playing using bass Bass.BASS_ChannelPause(netStreams[0].BassHandle); // Send server pause command netStreams[0].NetStream.Pause(true); // set state netStreams[0].PlayState = NetStreamState.Pause; onStateChangeMediaplayer = OnStateChangeMediaplayer; mediaplayerState = MediaplayerState.Pause; buttonStateChanged = true; } } else { commandInProgress = false; } } // Fire event we go to pause state DoEvent_MP_OnStateChangeMediaplayer(onStateChangeMediaplayer, this, mediaplayerState); if (buttonStateChanged) { // possible button state changed DoEvent_MP_OnControleButtonStateChange(OnControleButtonStateChange, this); } }
/// <summary> /// -1 = start at beginning /// </summary> /// <param name="startPositionInMS"></param> private void MPThread_Play(long startPositionInMS = -1) { NetStreamHelper nth = null; MP_OnStateChangeMediaplayer onStateChangeMediaplayer = null; MP_OnPlaylist onPlaylistStart = null; Playlist playlist = null; bool buttonStateChanged = false; lock (lockVAR) { if (netConnection != null && netConnection.IsConnected) { if (netStreams.Count > 0) { if (netStreams[0].NetStream.PauseIsActive) { // unpause audio playing using bass Bass.BASS_ChannelPlay(netStreams[0].BassHandle, false); // restart streaming again netStreams[0].NetStream.Pause(false); netStreams[0].PlayState = NetStreamState.Playing; buttonStateChanged = true; mediaplayerState = MediaplayerState.Playing; onStateChangeMediaplayer = OnStateChangeMediaplayer; } } else { // Start playing netStreams.Clear(); // Simulate MediaItem events changed (oldMediaitem is null!) TriggerMediaItemEvents(); buttonStateChanged = true; // Start new netstream, when event "NS_OnAssignStream_ID" is fired // it will be handled further. //lock (lockVAR) { nth = NewNetStreamHelper(currentPlaylist.GetOrginalMediaItem(currentPlaylist.CurrentMediaItem.GUID)); if (nth != null) { netStreams.Add(nth); onStateChangeMediaplayer = OnStateChangeMediaplayer; mediaplayerState = MediaplayerState.Playing; onPlaylistStart = OnPlaylistStart; playlist = (Playlist)currentPlaylist.Clone(); } else { onStateChangeMediaplayer = OnStateChangeMediaplayer; mediaplayerState = MediaplayerState.Stop; } } //lock } } else { commandInProgress = false; } } //lock // Fire event we go to Play state DoEvent_MP_OnStateChangeMediaplayer(onStateChangeMediaplayer, this, mediaplayerState); if (buttonStateChanged) { // possible button state changed DoEvent_MP_OnControleButtonStateChange(OnControleButtonStateChange, this); } // Fire event that Playlist play has started(event will only be fired // when onPlaylistStart is not null.) DoEvent_MP_OnPlaylist(onPlaylistStart, this, playlist); if (nth != null) { nth.NetStream.Connect(); // start request for stream_id to start streamning the music data } }
private void DoOnStateChangeMediaplayer(object sender, MediaplayerState state) { switch (state) { case MediaplayerState.Disconnected: Console.WriteLine("===========DISCONNECTED STATE==="); break; case MediaplayerState.Connecting: Console.WriteLine("===========CONNECTING STATE====="); break; case MediaplayerState.Stop: Console.WriteLine("===========STOP STATE==========="); break; case MediaplayerState.Playing: Console.WriteLine("===========PLAYING STATE========"); break; case MediaplayerState.Pause: Console.WriteLine("===========PAUSE STATE=========="); break; default: Console.WriteLine("===========UNKNOWN STATE========"); break; } //switch }