private void HandleStateChange(RtspMediaSource.SourceState state) { if (!IsActive) { return; } switch (state) { case RtspMediaSource.SourceState.Playing: _eventGenerator.QueueEventParamVar(MediaEventTypes.StreamStarted, Guid.Empty, Result.Ok, new Variant { Value = 0L }); break; case RtspMediaSource.SourceState.Paused: _eventGenerator.QueueEventParamNone(MediaEventTypes.StreamPaused); break; case RtspMediaSource.SourceState.Stopped: ClearQueue(); _eventGenerator.QueueEventParamNone(MediaEventTypes.StreamStopped); break; case RtspMediaSource.SourceState.Shutdowned: ClearQueue(); _eventGenerator.Shutdown(); break; default: break; } }
public void Start(/*IMFPresentationDescriptor*/ IntPtr pPresentationDescriptor, ref Guid pguidTimeFormat, ref Variant pvarStartPosition) { CheckShutdown(); Trace.WriteLine("RtspMediaSource::Start()"); if (!IsStopped && !IsPaused) { throw new SharpDXException(ResultCode.InvalidStateTransition); } if (pguidTimeFormat != null && pguidTimeFormat != Guid.Empty) { throw new SharpDXException(ResultCode.UnsupportedTimeFormat); } if (pPresentationDescriptor == IntPtr.Zero) { throw new ArgumentNullException(); } var pd = ComObjectUtils.AttachAs <PresentationDescriptor>(pPresentationDescriptor); try { // Get stream selection var selection = new bool[_streams.Length]; for (var i = 0; i < pd.StreamDescriptorCount; i++) { RawBool isSelected; var sdesc = pd.GetStreamDescriptorByIndex(i, out isSelected); var id = sdesc.StreamIdentifier; switch (id) { case (int)RtspMediaStream.StreamType.Video: case (int)RtspMediaStream.StreamType.Audio: selection[id] = isSelected; break; default: throw new ArgumentException(); } } // Activate selected stream for (var i = 0; i < selection.Length; i++) { if (selection[i]) { using (var comStream = new ComObject(_streams[i])) { if (_streams[i].IsActive) { // stream updated _eventGenerator.QueueEventParamUnk(MediaEventTypes.UpdatedStream, Guid.Empty, Result.Ok, comStream); } else { // new stream started _streams[i].Activate(); _eventGenerator.QueueEventParamUnk(MediaEventTypes.NewStream, Guid.Empty, Result.Ok, comStream); } } } else { _streams[i].Deactivate(); } } // Ignore pvarStartPosition _bufferingStartedSent = false; ChangeState(SourceState.Playing); _eventGenerator.QueueEventParamVar(MediaEventTypes.SourceStarted, Guid.Empty, Result.Ok, new Variant { Value = 0L }); } catch (Exception ex) { if (!IsShutdown) { _eventGenerator.QueueEventParamErr(ex.HResult); } throw; } finally { pd?.Dispose(); } }