From patchwork Sun Jun 17 12:16:53 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Klaus Schmidinger X-Patchwork-Id: 12959 Received: from mail.tu-berlin.de ([130.149.7.33]) by www.linuxtv.org with esmtp (Exim 4.72) (envelope-from ) id 1SgEPd-0003JP-1P for vdr@linuxtv.org; Sun, 17 Jun 2012 14:17:26 +0200 X-tubIT-Incoming-IP: 188.40.50.18 Received: from racoon.tvdr.de ([188.40.50.18]) by mail.tu-berlin.de (exim-4.75/mailfrontend-3) with esmtps [TLSv1:AES256-SHA:256] for id 1SgEPc-0005oX-FN; Sun, 17 Jun 2012 14:17:00 +0200 Received: from dolphin.tvdr.de (dolphin.tvdr.de [192.168.100.2]) by racoon.tvdr.de (8.14.3/8.14.3) with ESMTP id q5HCHesM022166 for ; Sun, 17 Jun 2012 14:17:40 +0200 Received: from [192.168.100.10] (hawk.tvdr.de [192.168.100.10]) by dolphin.tvdr.de (8.14.4/8.14.4) with ESMTP id q5HCGrJE031750 for ; Sun, 17 Jun 2012 14:16:54 +0200 Message-ID: <4FDDCAB5.2030006@tvdr.de> Date: Sun, 17 Jun 2012 14:16:53 +0200 From: Klaus Schmidinger User-Agent: Mozilla/5.0 (X11; Linux i686; rv:12.0) Gecko/20120421 Thunderbird/12.0 MIME-Version: 1.0 To: vdr@linuxtv.org References: <4FDC8ADB.3000604@tvdr.de> In-Reply-To: X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.0.1 (racoon.tvdr.de [188.40.50.18]); Sun, 17 Jun 2012 14:17:40 +0200 (CEST) X-PMX-Version: 5.6.1.2065439, Antispam-Engine: 2.7.2.376379, Antispam-Data: 2012.6.17.120320 X-PMX-Spam: Gauge=IIIIIIII, Probability=8%, Report=' HTML_00_01 0.05, HTML_00_10 0.05, MIME_TEXT_ONLY_MP_MIXED 0.05, BODY_SIZE_10000_PLUS 0, URI_ENDS_IN_HTML 0, __ANY_URI 0, __BAT_BOUNDARY 0, __BOUNCE_CHALLENGE_SUBJ 0, __BOUNCE_NDR_SUBJ_EXEMPT 0, __CP_MEDIA_BODY 0, __CP_URI_IN_BODY 0, __CT 0, __CTYPE_HAS_BOUNDARY 0, __CTYPE_MULTIPART 0, __CTYPE_MULTIPART_MIXED 0, __HAS_FROM 0, __HAS_MSGID 0, __MIME_TEXT_ONLY 0, __MIME_VERSION 0, __MOZILLA_MSGID 0, __SANE_MSGID 0, __TO_MALFORMED_2 0, __TO_NO_NAME 0, __URI_NS , __USER_AGENT 0' X-LSpam-Score: -1.1 (-) X-LSpam-Report: No, score=-1.1 required=5.0 tests=BAYES_00=-1.9, RDNS_NONE=0.793 autolearn=no Subject: Re: [vdr] RFE: Make VDR more friendly when using combinations of DVB-S, DVB-T and DVB-C X-BeenThere: vdr@linuxtv.org X-Mailman-Version: 2.1.13 Precedence: list Reply-To: VDR Mailing List List-Id: VDR Mailing List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 17 Jun 2012 12:17:27 -0000 Status: O X-Status: X-Keywords: X-UID: 26394 On 16.06.2012 16:53, Ludi wrote: > Hi Klaus, > > First of all, thanks for your reply and for taking the problem into > account. > > On Sat, 16 Jun 2012 15:32:11 +0200 > Klaus Schmidinger wrote: > >> On 15.06.2012 17:17, Ludi wrote: >>> Hello, >>> >>> Some time ago, I started a discussion in german on the VDR forum >>> about making the VDR more friendly for users that are >>> simultaneously using different sources to receive channels: >>> http://www.vdr-portal.de/board16-video-disk-recorder/board8-vdr-grundlagen/110156-%C3%BCberlegungen-zur-channels-conf-f%C3%BCr-dvb-c-s-t-mischbetrieb/index3.html >>> >>> I am going to explain the problem, when receiving channels from two >>> different sources by using the second german public channel named >>> ZDF: >>> >>> Suppose a user is receiving the channel ZDF by dvb-s and dvb-t. For >>> the VDR, these are two different channels, and it probably is not a >>> bad thing that the VDR differentiates between them because these >>> channels might be of different quality (different data rates, >>> etc.). However, as both sources name these channels often the same >>> way, it is not easily possible to differentiate between the two >>> channels in the VDR OSD, which is particularly annoying for the >>> timers, one of the main VDR features. >>> >>> Currently, I work around this problem, by setting the VDR to not >>> update channelnames and manually adding a suffix to the >>> channelnames in the channels.conf. So, to use the example above and >>> differentiate between the two channels, they could be renamed to >>> ZDF-s and ZDF-t (or ZDF.s and ZDF.t, or...). In practice, I only >>> only rename the channelnames of the source with the smallest number >>> of channels; I know that the channelnames without suffix are those >>> from the other source. >>> >>> @ Klaus >>> >>> Do you think that you could add an additional option to one of your >>> next VDR releases, like "Add suffix about source to channelnames"; I >>> could imagine such an option next to the "Update channels" option in >>> the DVB section of the Setup in the OSD of the VDR. >>> >>> Since the information is already in the channels.conf for every >>> channel, I assume, that it will not require huge changes to the VDR >>> code to use channelnames-source (or something similar) instead of >>> only the channelname in the channelname field of the channels.conf, >>> when the corresponding option is active. >> >> I'd rather have the channels.conf entries keep the names that are >> broadcast in the SI data. I wouldn't want to add a "source" suffix >> there. > > I understand your concerns. > > I assumed that changing the names in the channels.conf would be the > best in order to make also the plugins and other software use the > names+source for free. Moreover, since the channels.conf can be > constantly updated, I thought that it would not really matter, because > the names without source could be restored in the channels.conf by > simply disabling the new option and configure the update setting to > also modify the channelnames. I was not aware that there was a > standard for the broadcasting of the channelnames; but it does not > surprise me either now. > >> However, I could imagine adding a function like >> >> cString cChannel::NameWithSource(void) >> >> which would return things like >> >> ZDF (DVB-T) >> ZDF (DVB-S) >> >> or, shorter, >> >> ZDF (T) >> ZDF (S) >> >> and using that function instead of the Name() function at the >> appropriate places. > > If I get you right, that means that if the user activates the new option > (I assume that you will make it optional, since most people > probably use only one source and do not have the problem), the VDR uses > the NameWithSource() method instead of the Name() method. > > But what does this mean for the plugins? I am particularly thinking at > the plugins related to the timers, like the epgsearch and the live > plugin. Will they have to be adapted or will they also show the > name+source if the new option is enabled? > > Concerning whether to use the longer or the shorter version of the > name+source, I would choose the shorter version to not increase chances > of the new name not fitting in the OSD. Thus: > > ZDF (S) > ZDF (T) > ZDF (C) After sleeping over this for a night I tend to follow your idea of using modifed names directly, thus having them appear everywhere. I won't change these names in channels.conf, though (this file shall always store what comes from the broadcaster - provided it is enabled in the setup). I'll rather - Make a setup option to "Show channel names with source" (default is "no"). - Modify cChannel::Name() and cChannel::ShortName() to optionally append the source character (A, C, S, T, I, ...) to the channel name in the (short) form mentioned above. The attached patch implements this (i18n stuff left out for brevity). Please give it a try. @Ludi: BTW: in order to give you credit in VDR's HISTORY/CONTRIBUTORS file I'll need your full name. Klaus --- ./channels.c 2012/04/01 09:27:08 2.22 +++ ./channels.c 2012/06/17 11:53:10 @@ -112,10 +112,34 @@ provider = strcpyrealloc(provider, Channel.provider); portalName = strcpyrealloc(portalName, Channel.portalName); memcpy(&__BeginData__, &Channel.__BeginData__, (char *)&Channel.__EndData__ - (char *)&Channel.__BeginData__); + nameSource = NULL; // these will be recalculated automatically + shortNameSource = NULL; parameters = Channel.parameters; return *this; } +const char *cChannel::Name(void) const +{ + if (Setup.ShowChannelNamesWithSource) { + if (isempty(nameSource)) + nameSource = cString::sprintf("%s (%c)", name, cSource::ToChar(source)); + return nameSource; + } + return name; +} + +const char *cChannel::ShortName(bool OrName) const +{ + if (OrName && isempty(shortName)) + return Name(); + if (Setup.ShowChannelNamesWithSource) { + if (isempty(shortNameSource)) + shortNameSource = cString::sprintf("%s (%c)", shortName, cSource::ToChar(source)); + return shortNameSource; + } + return shortName; +} + int cChannel::Transponder(int Frequency, char Polarization) { // some satellites have transponders at the same frequency, just with different polarization: @@ -233,10 +257,14 @@ modification |= CHANNELMOD_NAME; Channels.SetModified(); } - if (nn) + if (nn) { name = strcpyrealloc(name, Name); - if (ns) + nameSource = NULL; + } + if (ns) { shortName = strcpyrealloc(shortName, ShortName); + shortNameSource = NULL; + } if (np) provider = strcpyrealloc(provider, Provider); } @@ -721,6 +749,8 @@ free(tpidbuf); free(caidbuf); free(namebuf); + nameSource = NULL; + shortNameSource = NULL; if (!GetChannelID().Valid()) { esyslog("ERROR: channel data results in invalid ID!"); return false; --- ./channels.h 2012/03/11 11:46:39 2.15 +++ ./channels.h 2012/06/17 11:21:33 @@ -123,6 +123,8 @@ int number; // Sequence number assigned on load bool groupSep; int __EndData__; + mutable cString nameSource; + mutable cString shortNameSource; cString parameters; int modification; mutable const cSchedule *schedule; @@ -137,8 +139,8 @@ cString ToText(void) const; bool Parse(const char *s); bool Save(FILE *f); - const char *Name(void) const { return name; } - const char *ShortName(bool OrName = false) const { return (OrName && isempty(shortName)) ? name : shortName; } + const char *Name(void) const; + const char *ShortName(bool OrName = false) const; const char *Provider(void) const { return provider; } const char *PortalName(void) const { return portalName; } int Frequency(void) const { return frequency; } ///< Returns the actual frequency, as given in 'channels.conf' --- ./config.c 2012/06/13 09:12:53 2.25 +++ ./config.c 2012/06/17 11:15:03 @@ -462,6 +462,7 @@ DeviceBondings = ""; InitialVolume = -1; ChannelsWrap = 0; + ShowChannelNamesWithSource = 0; EmergencyExit = 1; } --- ./config.h 2012/06/03 13:04:49 2.48 +++ ./config.h 2012/06/17 11:14:50 @@ -323,6 +323,7 @@ int CurrentDolby; int InitialVolume; int ChannelsWrap; + int ShowChannelNamesWithSource; int EmergencyExit; int __EndData__; cString InitialChannel; --- ./menu.c 2012/06/13 13:03:26 2.57 +++ ./menu.c 2012/06/17 11:12:25 @@ -3158,6 +3158,7 @@ Add(new cMenuEditChanItem(tr("Setup.Miscellaneous$Initial channel"), &data.InitialChannel, tr("Setup.Miscellaneous$as before"))); Add(new cMenuEditIntItem( tr("Setup.Miscellaneous$Initial volume"), &data.InitialVolume, -1, 255, tr("Setup.Miscellaneous$as before"))); Add(new cMenuEditBoolItem(tr("Setup.Miscellaneous$Channels wrap"), &data.ChannelsWrap)); + Add(new cMenuEditBoolItem(tr("Setup.Miscellaneous$Show channel names with source"), &data.ShowChannelNamesWithSource)); Add(new cMenuEditBoolItem(tr("Setup.Miscellaneous$Emergency exit"), &data.EmergencyExit)); } --- ./sources.h 2010/03/07 13:53:11 2.3 +++ ./sources.h 2012/06/17 11:19:23 @@ -33,6 +33,7 @@ int Code(void) const { return code; } const char *Description(void) const { return description; } bool Parse(const char *s); + static char ToChar(int Code) { return (Code & st_Mask) >> 24; } static cString ToString(int Code); static int FromString(const char *s); static int FromData(eSourceType SourceType, int Position = 0, bool East = false);