/// <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); }