public bool EnableStream(int Id, AMStreamSelectEnableFlags dwFlags, string Filter) { try { IBaseFilter foundfilter = DirectShowUtil.GetFilterByName(graphBuilder, Filter); if (foundfilter != null) { IAMStreamSelect pStrm = foundfilter as IAMStreamSelect; if (pStrm != null) { pStrm.Enable(Id, dwFlags); } pStrm = null; DirectShowUtil.ReleaseComObject(foundfilter); } } catch {} return true; }
public override int Enable(int lIndex, AMStreamSelectEnableFlags dwFlags) { bool changed = false; uint oldAudioStream = _streamParser.InputStream.AudioStream.StreamId; for (int index = 0; index < _streamParser.SelectableTracks.Count; index++) { var track = _streamParser.SelectableTracks[index]; bool isEnabled = ( index == lIndex && dwFlags == AMStreamSelectEnableFlags.Enable || // the current index should be enabled dwFlags == AMStreamSelectEnableFlags.EnableAll // all should be enabled ) && dwFlags != AMStreamSelectEnableFlags.DisableAll; // must not be "Disable All" changed |= _streamParser.InputStream.EnableStream((int)track.StreamId, isEnabled); } uint newAudioStream = _streamParser.InputStream.AudioStream.StreamId; if (!changed) { return(NOERROR); } // Update output pin var audioPin = Pins.OfType <SplitterOutputPin>().FirstOrDefault(p => p.Track.Type == DemuxTrack.TrackType.Audio); if (audioPin != null) { AMMediaType mt; if (MediaTypeBuilder.TryGetType(_streamParser.InputStream.AudioStream, out mt)) { _streamParser.Tracks[1].SetStreamMediaType(mt); } var res = RenameOutputPin(audioPin, oldAudioStream, newAudioStream); } if (IsActive && dwFlags != AMStreamSelectEnableFlags.DisableAll) { try { IMediaSeeking seeking = (IMediaSeeking)FilterGraph; if (seeking != null) { long current; seeking.GetCurrentPosition(out current); // Only seek during playback, not on initial selection if (current != 0) { current -= UNITS / 10; seeking.SetPositions(current, AMSeekingSeekingFlags.AbsolutePositioning, null, AMSeekingSeekingFlags.NoPositioning); current += UNITS / 10; seeking.SetPositions(current, AMSeekingSeekingFlags.AbsolutePositioning, null, AMSeekingSeekingFlags.NoPositioning); } } } catch { } } return(NOERROR); }