/// <summary> /// Meldet, ob eine Deaktivierungsoption sich auf eine Auswahl niedrigerer /// Priorität bezieht. /// </summary> /// <param name="selector">Die Option.</param> /// <returns>Gesetzt, wenn die Prüfung erfolgreich war.</returns> public static bool IsLower(this StreamDisableSelector selector) { // Check it if (StreamDisableSelector.AC3IfMP2ExistsLower == selector) { return(true); } if (StreamDisableSelector.AlternateAC3Lower == selector) { return(true); } if (StreamDisableSelector.AlternateMP2Lower == selector) { return(true); } if (StreamDisableSelector.MP2IfAC3ExistsLower == selector) { return(true); } if (StreamDisableSelector.SubTitlesLower == selector) { return(true); } if (StreamDisableSelector.VideoTextLower == selector) { return(true); } // No, other return(false); }
/// <summary> /// Wendet eine Ausschlußoption an. /// </summary> /// <param name="disable">Die gewünschte Option.</param> /// <param name="mode">Der aktuelle Bearbeitungsmodus.</param> /// <param name="needed">Die Anzahl der noch benötigten Verbraucher, bei Bedarf korrigiert.</param> /// <param name="report">Protokolliert die vorgenommenen Veränderungen.</param> public void ApplyDisable(StreamDisableSelector disable, StreamDisableMode mode, ref int needed, Action <SourceSelection, string, int> report) { // Initial value int neededStart = needed; // Process if (!CurrentStreams.ApplyDisable(disable, mode, ref needed, (m, c) => { if (null != report) { report(Source, m, c); } })) { return; } // Remember corrected settings OriginalStreams = CurrentStreams; // Correct consumer count ConsumerCount = ConsumerCount.Value - (neededStart - needed); }
/// <summary> /// Sucht eine Konfiguration der Teildatenströme, die eine Aufzeichnung aller Quellen /// eventuell mit Reduktion des Aufzeichnungsumfangs erlaubt. /// </summary> /// <param name="disableOrder">Die Liste der Aspekte, die ausgeblendet werden dürfen.</param> /// <returns>Die Anzahl der Quellen, die verwendet werden können.</returns> public int Optimize(params StreamDisableSelector[] disableOrder) { // No souces if (m_Sources.Count < 1) { return(m_Sources.Count); } // Total stream count int available; // No limit using (HardwareManager.Open()) { // Attach to the device Hardware device = m_Sources[0].Source.GetHardware(); // No limit at all if (!device.HasConsumerRestriction) { return(m_Sources.Count); } // Get all the active streams ushort[] activeStreams = device.GetActiveStreams(); // Ask for it available = device.Restrictions.ConsumerLimit.Value - activeStreams.Length; // None at all if (available < 1) { return(0); } // Stream managers in use List <SourceStreamsManager> managers = new List <SourceStreamsManager>(); try { // Create one by one for (int i = 0; i < m_Sources.Count; ++i) { // Attach SelectionInfo info = m_Sources[i]; // Create new manager SourceStreamsManager manager = info.Source.Open(info.OriginalStreams); // Remember for cleanupo managers.Add(manager); // See if source is available if (!manager.CreateStream(null)) { // Fake entry - will not be used info.CurrentStreams = info.OriginalStreams.Clone(); info.ConsumerCount = 0; } else { // Remember all we found info.CurrentStreams = manager.ActiveSelection; info.ConsumerCount = manager.ConsumerCount; } } // Whoo - can open it all as requested return(m_Sources.Count); } catch (OutOfConsumersException) { } finally { // Terminate all foreach (SourceStreamsManager manager in managers) { manager.Dispose(); } } // First try to make sure that each source can be opened in stand-alone mode foreach (SelectionInfo info in m_Sources) { info.Optimize(disableOrder, Report); } // Now simulate starting all - will try to get most out of the first one and so on for (int ixStream = 0; ixStream < m_Sources.Count; ixStream++) { // Attach to the item SelectionInfo current = m_Sources[ixStream]; // See how many additional streams will be needed int needed = current.ConsumerCount.Value - available; // Try to free some for (int ixDisable = 0; (needed > 0) && (ixDisable < disableOrder.Length);) { // Load the next option StreamDisableSelector disable = disableOrder[ixDisable++]; // Apply self current.ApplyDisable(disable, StreamDisableMode.Self, ref needed, Report); // Apply higher priorized for (int ixHigher = ixStream; (needed > 0) && (ixHigher-- > 0);) { m_Sources[ixHigher].ApplyDisable(disable, StreamDisableMode.Higher, ref needed, Report); } } // Should not be startet - we find no way to provide a proper subset of streams if (needed > 0) { return(ixStream); } // Back to what is left available = -needed; } // Not possible return(m_Sources.Count); } }
/// <summary> /// Wendet eine Deaktivierung auf eine Auswahl von Teildatenströmen (PID) an. /// </summary> /// <param name="streams">Die aktuelle Auswahl.</param> /// <param name="disable">Der gewünschte Aspekt.</param> /// <param name="mode">Der aktuelle Korrekturkontext der zugehörigen Quelle.</param> /// <param name="needed">Die Anzahl der noch benötigten Verbraucher, die geeignet korrigiert wird.</param> /// <param name="report">Protokolliert die vorgenommene Veränderung.</param> /// <returns>Gesetzt, wenn eine Veränderung stattgefunden hat.</returns> public static bool ApplyDisable(this StreamSelection streams, StreamDisableSelector disable, StreamDisableMode mode, ref int needed, Action <string, int> report) { // Check mode first switch (mode) { case StreamDisableMode.Self: { // All supported switch (disable) { case StreamDisableSelector.AC3IfMP2ExistsSelf: return(streams.RemoveAC3AudioIfMP2Present(ref needed, report)); case StreamDisableSelector.AlternateAC3Self: return(streams.RemoveAlternateAC3Audio(ref needed, report)); case StreamDisableSelector.AlternateMP2Self: return(streams.RemoveAlternateMP2Audio(ref needed, report)); case StreamDisableSelector.MP2IfAC3ExistsSelf: return(streams.RemoveMP2AudioIfAC3Present(ref needed, report)); case StreamDisableSelector.SubTitlesSelf: return(streams.RemoveSubTitles(ref needed, report)); case StreamDisableSelector.VideoTextSelf: return(streams.RemoveVideoText(ref needed, report)); } // Done break; } case StreamDisableMode.Higher: { // All supported switch (disable) { case StreamDisableSelector.AC3IfMP2ExistsHigher: return(streams.RemoveAC3AudioIfMP2Present(ref needed, report)); case StreamDisableSelector.AlternateAC3Higher: return(streams.RemoveAlternateAC3Audio(ref needed, report)); case StreamDisableSelector.AlternateMP2Higher: return(streams.RemoveAlternateMP2Audio(ref needed, report)); case StreamDisableSelector.MP2IfAC3ExistsHigher: return(streams.RemoveMP2AudioIfAC3Present(ref needed, report)); case StreamDisableSelector.SubTitlesHigher: return(streams.RemoveSubTitles(ref needed, report)); case StreamDisableSelector.VideoTextHigher: return(streams.RemoveVideoText(ref needed, report)); } // Done break; } case StreamDisableMode.Lower: { // All supported switch (disable) { case StreamDisableSelector.AC3IfMP2ExistsLower: return(streams.RemoveAC3AudioIfMP2Present(ref needed, report)); case StreamDisableSelector.AlternateAC3Lower: return(streams.RemoveAlternateAC3Audio(ref needed, report)); case StreamDisableSelector.AlternateMP2Lower: return(streams.RemoveAlternateMP2Audio(ref needed, report)); case StreamDisableSelector.MP2IfAC3ExistsLower: return(streams.RemoveMP2AudioIfAC3Present(ref needed, report)); case StreamDisableSelector.SubTitlesLower: return(streams.RemoveSubTitles(ref needed, report)); case StreamDisableSelector.VideoTextLower: return(streams.RemoveVideoText(ref needed, report)); } // Done break; } } // None found return(false); }
/// <summary> /// Wendet eine Deaktivierung auf eine Auswahl von Teildatenströmen (PID) an. /// </summary> /// <param name="streams">Die aktuelle Auswahl.</param> /// <param name="disable">Der gewünschte Aspekt.</param> /// <param name="mode">Der aktuelle Korrekturkontext der zugehörigen Quelle.</param> /// <param name="needed">Die Anzahl der noch benötigten Verbraucher, die geeignet korrigiert wird.</param> /// <param name="report">Protokolliert die vorgenommene Veränderung.</param> /// <returns>Gesetzt, wenn eine Veränderung stattgefunden hat.</returns> public static bool ApplyDisable( this StreamSelection streams, StreamDisableSelector disable, StreamDisableMode mode, ref int needed, Action<string, int> report ) { // Check mode first switch (mode) { case StreamDisableMode.Self: { // All supported switch (disable) { case StreamDisableSelector.AC3IfMP2ExistsSelf: return streams.RemoveAC3AudioIfMP2Present( ref needed, report ); case StreamDisableSelector.AlternateAC3Self: return streams.RemoveAlternateAC3Audio( ref needed, report ); case StreamDisableSelector.AlternateMP2Self: return streams.RemoveAlternateMP2Audio( ref needed, report ); case StreamDisableSelector.MP2IfAC3ExistsSelf: return streams.RemoveMP2AudioIfAC3Present( ref needed, report ); case StreamDisableSelector.SubTitlesSelf: return streams.RemoveSubTitles( ref needed, report ); case StreamDisableSelector.VideoTextSelf: return streams.RemoveVideoText( ref needed, report ); } // Done break; } case StreamDisableMode.Higher: { // All supported switch (disable) { case StreamDisableSelector.AC3IfMP2ExistsHigher: return streams.RemoveAC3AudioIfMP2Present( ref needed, report ); case StreamDisableSelector.AlternateAC3Higher: return streams.RemoveAlternateAC3Audio( ref needed, report ); case StreamDisableSelector.AlternateMP2Higher: return streams.RemoveAlternateMP2Audio( ref needed, report ); case StreamDisableSelector.MP2IfAC3ExistsHigher: return streams.RemoveMP2AudioIfAC3Present( ref needed, report ); case StreamDisableSelector.SubTitlesHigher: return streams.RemoveSubTitles( ref needed, report ); case StreamDisableSelector.VideoTextHigher: return streams.RemoveVideoText( ref needed, report ); } // Done break; } case StreamDisableMode.Lower: { // All supported switch (disable) { case StreamDisableSelector.AC3IfMP2ExistsLower: return streams.RemoveAC3AudioIfMP2Present( ref needed, report ); case StreamDisableSelector.AlternateAC3Lower: return streams.RemoveAlternateAC3Audio( ref needed, report ); case StreamDisableSelector.AlternateMP2Lower: return streams.RemoveAlternateMP2Audio( ref needed, report ); case StreamDisableSelector.MP2IfAC3ExistsLower: return streams.RemoveMP2AudioIfAC3Present( ref needed, report ); case StreamDisableSelector.SubTitlesLower: return streams.RemoveSubTitles( ref needed, report ); case StreamDisableSelector.VideoTextLower: return streams.RemoveVideoText( ref needed, report ); } // Done break; } } // None found return false; }
/// <summary> /// Wendet eine Ausschlußoption an. /// </summary> /// <param name="disable">Die gewünschte Option.</param> /// <param name="mode">Der aktuelle Bearbeitungsmodus.</param> /// <param name="needed">Die Anzahl der noch benötigten Verbraucher, bei Bedarf korrigiert.</param> /// <param name="report">Protokolliert die vorgenommenen Veränderungen.</param> public void ApplyDisable( StreamDisableSelector disable, StreamDisableMode mode, ref int needed, Action<SourceSelection, string, int> report ) { // Initial value int neededStart = needed; // Process if (!CurrentStreams.ApplyDisable( disable, mode, ref needed, ( m, c ) => { if (null != report) report( Source, m, c ); } )) return; // Remember corrected settings OriginalStreams = CurrentStreams; // Correct consumer count ConsumerCount = ConsumerCount.Value - (neededStart - needed); }
/// <summary> /// Versucht, möglichst viele der gewünschten Aspekte dieser Quelle zu aktivieren. /// </summary> /// <param name="disableOrder">Die Reihenfolge, in der Aspekte deaktiviert werden /// dürfen.</param> /// <param name="report">Protokolliert die vorgenommenen Veränderungen.</param> public void Optimize( StreamDisableSelector[] disableOrder, Action<SourceSelection, string, int> report ) { // Already did it if (ConsumerCount.HasValue) return; // Number of consumers possible at all int available = 0; // Try to open try { // Create the manager using (SourceStreamsManager manager = Source.Open( OriginalStreams )) if (!manager.CreateStream( null )) { // Fake entry CurrentStreams = OriginalStreams.Clone(); ConsumerCount = 0; } else { // Remember CurrentStreams = manager.ActiveSelection; ConsumerCount = manager.ConsumerCount; } // Possible at least in stand-alone mode return; } catch (OutOfConsumersException e) { // Remember CurrentStreams = e.RequestedSelection; ConsumerCount = e.Requested; available = e.Available; } // What we need int needed = ConsumerCount.Value - available; // Process all modes for (int i = 0; (needed > 0) && (i < disableOrder.Length); ++i) ApplyDisable( disableOrder[i], StreamDisableMode.Self, ref needed, report ); }