Common subdirectories: vdr-1.3.22/PLUGINS and vdr-1.3.22.patch/PLUGINS
diff -ubw vdr-1.3.22/channels.c vdr-1.3.22.patch/channels.c
--- vdr-1.3.22/channels.c	2005-02-06 10:44:53.000000000 +0100
+++ vdr-1.3.22.patch/channels.c	2005-03-18 13:06:40.000000000 +0100
@@ -455,6 +455,25 @@
      }
 }
 
+void cChannel::SeparateFreePayTV(char *buffer)
+{
+  cChannel *groupSep=Channels.GetByName(buffer);
+  if (!groupSep)
+  {
+     groupSep = new cChannel();
+     groupSep->SetName(buffer,"","");
+     groupSep->SetGroupSep(true);
+     Channels.Add(groupSep);
+  }
+  if (Channels.GetNextGroup(groupSep->Index())>=0)
+     groupSep=Channels.Get(Channels.GetNextGroup(groupSep->Index())-1);
+  else
+    groupSep=Channels.Last();
+  Channels.Move(this,groupSep);
+  Channels.ReNumber();
+}
+
+
 void cChannel::SetCaIds(const int *CaIds)
 {
   if (caids[0] && caids[0] <= 0x00FF)
@@ -470,6 +489,38 @@
          if (!CaIds[i])
             break;
          }
+     cChannel *groupSep=Channels.Get(Channels.GetPrevGroup(Index())); 
+     if (groupSep) {
+        char buffer[64];
+        if (caids[0]==0) {
+           snprintf(buffer, sizeof(buffer), "New PayRadio-Channels @ %s", *cSource::ToString(Source()));
+           if (groupSep != Channels.GetByName(buffer)) {
+              snprintf(buffer, sizeof(buffer),  "New PayTV-Channels @ %s", *cSource::ToString(Source()));
+              if (groupSep == Channels.GetByName(buffer)) {
+                 snprintf(buffer, sizeof(buffer),  "New FreeTV-Channels @ %s",*cSource::ToString(Source()));
+                 SeparateFreePayTV(buffer);
+              }
+           }
+           else {
+              snprintf(buffer, sizeof(buffer), "New Free Radio-Channels @ %s",*cSource::ToString(Source()));
+              SeparateFreePayTV(buffer);
+           }
+        }
+        else {
+           snprintf(buffer, sizeof(buffer), "New Free Radio-Channels @ %s", *cSource::ToString(Source()));
+           if (groupSep != Channels.GetByName(buffer)) {
+              snprintf(buffer, sizeof(buffer),  "New FreeTV-Channels @ %s", *cSource::ToString(Source()));
+              if (groupSep == Channels.GetByName(buffer)) {
+                 snprintf(buffer, sizeof(buffer),  "New PayTV-Channels @ %s",*cSource::ToString(Source()));
+                 SeparateFreePayTV(buffer);
+              }
+           }
+           else {
+              snprintf(buffer, sizeof(buffer), "New PayRadio-Channels @ %s",*cSource::ToString(Source()));
+              SeparateFreePayTV(buffer); 
+           } 
+        } 
+     }
      modification |= CHANNELMOD_CA;
      Channels.SetModified();
      }
@@ -536,6 +587,11 @@
   refChannel = RefChannel;
 }
 
+void cChannel::SetGroupSep(bool Sep)
+{
+   groupSep = Sep;
+}
+
 static int PrintParameter(char *p, char Name, int Value)
 {
   return Value >= 0 && Value != 999 ? sprintf(p, "%c%d", Name, Value) : 0;
@@ -909,6 +965,16 @@
   return NULL;
 }
 
+cChannel *cChannels::GetByName(char *Name)
+{
+  for (cChannel *channel = First(); channel; channel = Next(channel))
+  {
+      if (strcmp(channel->Name(), Name)==0)
+         return channel;
+  }
+  return NULL;
+}
+
 bool cChannels::HasUniqueChannelID(cChannel *NewChannel, cChannel *OldChannel)
 {
   tChannelID NewChannelID = NewChannel->GetChannelID();
@@ -937,14 +1003,34 @@
   return Result;
 }
 
-cChannel *cChannels::NewChannel(const cChannel *Transponder, const char *Name, const char *ShortName, const char *Provider, int Nid, int Tid, int Sid, int Rid)
+cChannel *cChannels::NewChannel(const cChannel *Transponder, const char *Name, const char *ShortName, const char *Provider, int Nid, int Tid, int Sid, int Rid, int Type)
 {
   if (Transponder) {
      dsyslog("creating new channel '%s,%s;%s' on %s transponder %d with id %d-%d-%d-%d", Name, ShortName, Provider, *cSource::ToString(Transponder->Source()), Transponder->Transponder(), Nid, Tid, Sid, Rid);
      cChannel *NewChannel = new cChannel(*Transponder);
      NewChannel->SetId(Nid, Tid, Sid, Rid);
      NewChannel->SetName(Name, ShortName, Provider);
-     Add(NewChannel);
+      /* find group seperator for the source of this channel */
+      {
+        char buffer[64];
+        if (Type==2)
+            snprintf(buffer, sizeof(buffer), "New Free Radio-Channels @ %s", *cSource::ToString(NewChannel->Source()));
+          else
+              snprintf(buffer, sizeof(buffer), "New FreeTV-Channels @ %s", *cSource::ToString(NewChannel->Source()) );
+          cChannel *groupSep = GetByName(buffer);
+         if(!groupSep) // group sepeator for this source doesn't exist, so lets
+          {
+              groupSep = new cChannel();
+             groupSep->SetName(buffer,"","");
+              groupSep->SetGroupSep(true);
+              Add(groupSep);
+          }
+          if (GetNextGroup(groupSep->Index())>=0)
+             groupSep=Get(GetNextGroup(groupSep->Index())-1);
+          else
+             groupSep=Last();
+          Add(NewChannel, groupSep);
+      }
      ReNumber();
      return NewChannel;
      }
Only in vdr-1.3.22.patch/: channels.c.orig
Only in vdr-1.3.22.patch/: channels.c.rej
diff -ubw vdr-1.3.22/channels.h vdr-1.3.22.patch/channels.h
--- vdr-1.3.22/channels.h	2005-02-20 15:05:24.000000000 +0100
+++ vdr-1.3.22.patch/channels.h	2005-03-18 12:52:28.000000000 +0100
@@ -129,6 +129,7 @@
   cChannel *refChannel;
   cString ParametersToString(void) const;
   bool StringToParameters(const char *s);
+  void SeparateFreePayTV(char *buffer);
 public:
   cChannel(void);
   cChannel(const cChannel &Channel);
@@ -191,6 +192,7 @@
   void SetCaDescriptors(int Level);
   void SetLinkChannels(cLinkChannels *LinkChannels);
   void SetRefChannel(cChannel *RefChannel);
+  void SetGroupSep(bool Sep = true);
   };
 
 class cChannels : public cRwLock, public cConfig<cChannel> {
@@ -208,6 +210,7 @@
   cChannel *GetByNumber(int Number, int SkipGap = 0);
   cChannel *GetByServiceID(int Source, int Transponder, unsigned short ServiceID);
   cChannel *GetByChannelID(tChannelID ChannelID, bool TryWithoutRid = false, bool TryWithoutPolarization = false);
+  cChannel *GetByName(char *Name);
   int BeingEdited(void) { return beingEdited; }
   void IncBeingEdited(void) { beingEdited++; }
   void DecBeingEdited(void) { beingEdited--; }
@@ -219,7 +222,7 @@
       ///< Returns 0 if no channels have been modified, 1 if an automatic
       ///< modification has been made, and 2 if the user has made a modification.
       ///< Calling this function resets the 'modified' flag to 0.
-  cChannel *NewChannel(const cChannel *Transponder, const char *Name, const char *ShortName, const char *Provider, int Nid, int Tid, int Sid, int Rid = 0);
+  cChannel *NewChannel(const cChannel *Transponder, const char *Name, const char *ShortName, const char *Provider, int Nid, int Tid, int Sid, int Rid = 0,int Type = 0);
   };
 
 extern cChannels Channels;
Only in vdr-1.3.22.patch/: channels.h.orig
Common subdirectories: vdr-1.3.22/libsi and vdr-1.3.22.patch/libsi
diff -ubw vdr-1.3.22/sdt.c vdr-1.3.22.patch/sdt.c
--- vdr-1.3.22/sdt.c	2004-10-31 13:10:20.000000000 +0100
+++ vdr-1.3.22.patch/sdt.c	2005-03-18 12:52:28.000000000 +0100
@@ -75,7 +75,7 @@
                            // channel->SetCa(SiSdtService.getFreeCaMode() ? 0xFFFF : 0);
                            }
                         else if (*pn && Setup.UpdateChannels >= 3) {
-                           channel = Channels.NewChannel(Channel(), pn, ps, pp, sdt.getOriginalNetworkId(), sdt.getTransportStreamId(), SiSdtService.getServiceId());
+                           channel = Channels.NewChannel(Channel(), pn, ps, pp, sdt.getOriginalNetworkId(), sdt.getTransportStreamId(), SiSdtService.getServiceId(),0,sd->getServiceType());
                            patFilter->Trigger();
                            }
                         }
Common subdirectories: vdr-1.3.22/symbols and vdr-1.3.22.patch/symbols
