コード例 #1
0
        /// <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);
        }
コード例 #2
0
            /// <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);
            }
コード例 #3
0
        /// <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);
            }
        }
コード例 #4
0
        /// <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);
        }
コード例 #5
0
        /// <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;
        }
コード例 #6
0
            /// <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);
            }
コード例 #7
0
            /// <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 );
            }