Ejemplo n.º 1
0
        /// <summary>
        /// Stellt den Empfang auf eine bestimmte Quellgruppe eines Ursprungs ein.
        /// </summary>
        /// <remarks>Der Aufruf dieser Methode darf niemals auf mehreren Threads
        /// gleichzeitig erfolgen.</remarks>
        /// <param name="location">Der gewünschte Ursprung.</param>
        /// <param name="group">Die gewünschte Quellgruppe.</param>
        public void SelectGroup(GroupLocation location, SourceGroup group)
        {
            // Report
            if (TunerTraceSwitch.Enabled)
            {
                Trace.WriteLine(string.Format(Properties.Resources.Trace_Tuner_Request, location, group), TunerTraceSwitch.DisplayName);
            }

            // Always use clones
            location = location.CloneLocation();
            group    = group.CloneGroup();

            // Stop all current
            if ((CurrentLocation != null) || (CurrentGroup != null))
            {
                // Report
                if (ConsumerTraceSwitch.Enabled)
                {
                    Trace.WriteLine(Properties.Resources.Trace_Consumer_StoppingAll, ConsumerTraceSwitch.DisplayName);
                }

                // See if provide has a fast way to stop all streams
                bool allStopped = OnStopAll();

                // Stop all table readers
                ResetReader(ref m_networkInformationReader);
                ResetReader(ref m_associationReader);
                ResetReader(ref m_serviceReader);
                m_groupReader = null;

                // Erase list of EPG receivers
                m_programGuideConsumers = null;

                // List of active consumers
                StreamInformation[] consumers;

                // Be safe
                lock (InstanceSynchronizer)
                {
                    // Remember
                    consumers = m_streamsByPID.Values.ToArray();

                    // Wipe out
                    m_streamsByPID.Clear();
                    m_streamsById.Clear();
                }

                // Forward to all streams
                if (!allStopped)
                {
                    foreach (var consumer in consumers)
                    {
                        if (consumer.ActiveConsumerCount > 0)
                        {
                            OnStop(consumer);
                        }
                    }
                }
            }

            // See if something changed
            if (!Equals(location, CurrentLocation) || !Equals(group, CurrentGroup))
            {
                // Report
                if (TunerTraceSwitch.Enabled)
                {
                    Trace.WriteLine(Properties.Resources.Trace_Tuner_Hardware, TunerTraceSwitch.DisplayName);
                }

                // Activate hardware
                OnSelectGroup(location, group);

                // Remember
                CurrentLocation = location;
                CurrentGroup    = group;

                // Mark time
                m_lastTuneTime = DateTime.UtcNow;
            }

            // Restart all readers
            ResetInformationReaders(true);
        }