@@ -8595,3 +8595,235 @@ Video Disk Recorder Revision History
8595
8595
- Fixed leading/trailing/multiple blanks in the translation files.
8596
8596
- Bumped all version numbers to 2.2.0.
8597
8597
- Official release.
8598
+
8599
+ 2015-09-14: Version 2.3.1
8600
+
8601
+ - The new function cOsd::MaxPixmapSize() can be called to determine the maximum size
8602
+ a cPixmap may have on the current OSD. The 'osddemo' example has been modified
8603
+ accordingly. Plugin authors may want to use this function in case they use pixmaps
8604
+ that are larger than the full OSD size. The default implementation sets this limit
8605
+ to 2048x2048 pixel.
8606
+ - The Setup/CAM menu now displays which device an individual CAM is currently
8607
+ assigned to (suggested by Frank Neumann).
8608
+ - Added detection of 24fps (thanks to Thomas Reufer).
8609
+ - Added a note about the VDR User Counter and VDR's facebook page to the README file.
8610
+ - The dvbhddevice plugin is no longer part of the VDR source archive.
8611
+ You can get the latest version of this plugin from the author's repository at
8612
+ https://bitbucket.org/powARman/dvbhddevice.
8613
+ - The dvbsddevice and rcu plugins are no longer part of the VDR source archive.
8614
+ You can get the latest versions of these plugins from ftp://ftp.tvdr.de/vdr/Plugins.
8615
+ - Added a section about Output Devices to the INSTALL file.
8616
+ - Fixed setting the source value of newly created channels, in case the NIT is
8617
+ received from a different, but very close satellite position (reported by Daniel
8618
+ Ribeiro). The code for handling different NITs has been removed from nit.c, because
8619
+ according to the DVB standard table id 0x40 carries only the NIT of the actual
8620
+ network.
8621
+ - Added some comment to cPixmap about the relation between OSD, ViewPort and DrawPort
8622
+ (suggested by Thomas Reufer).
8623
+ - Improved syncing on sections when parsing the NIT and SDT.
8624
+ - Fixed scaling subtitles (their areas could sometimes extend outside the actual OSD).
8625
+ - Reduced the priority of the "video directory scanner" thread (suggested by Thomas
8626
+ Reufer) and checking cIoThrottle::Engaged() when it is running.
8627
+ - The script that gets called for recordings is now also called right before a
8628
+ recording is edited, with the first parameter being "editing" (suggested by
8629
+ Dieter Ferdinand).
8630
+ - The new setup option "OSD/Default sort mode for recordings" can be used to define
8631
+ how recordings shall be sorted by default (either by time or by name, with "by time"
8632
+ being the default). If a particular sort mode has been selected for a folder by
8633
+ pressing '0', the default no longer applies to that folder. Repeating timers no
8634
+ longer write a ".sort" file into a recordings folder to have the recordings sorted
8635
+ by time.
8636
+ - The command line option -D now accepts the value '-' (as in -D-), which prevents
8637
+ VDR from using any DVB devices (suggested by Dietmar Spingler).
8638
+ - The -V and -h options now list the plugins in alphabetical order (suggested by
8639
+ Dietmar Spingler).
8640
+ - Fixed a compiler warning in font.c.
8641
+ - Commented out the line
8642
+ #define DEPRECATED_VIDEOSYSTEM
8643
+ in device.h. If a plugin doesn't compile with this version of VDR, you can uncomment
8644
+ this line as a quick workaround. In the long run the plugin will need to be adapted.
8645
+ - The function cOsd::GetBitmap() is now 'protected'. If a plugin doesn't compile with
8646
+ this version of VDR, you can uncomment the line
8647
+ //#define DEPRECATED_GETBITMAP
8648
+ in osd.h as a quick workaround. In the long run the plugin will need to be adapted.
8649
+ - The -u option now also accepts a numerical user id (suggested by Derek Kelly).
8650
+ - The SVDRP port now accepts multiple concurrent connections. You can now keep an
8651
+ SVDRP connection open as long as you wish, without preventing others from
8652
+ connecting. Note, though, that SVDRP connections still get closed automatically
8653
+ if there has been no activity for 300 seconds (configurable via
8654
+ "Setup/Miscellaneous/SVDRP timeout (s)").
8655
+ - The SVDRP log messages have been unified and now always contain the IP and port
8656
+ number of the remote host.
8657
+ - SVDRP connections are now handled in a separate "SVDRP server handler" thread,
8658
+ which makes them more responsive. Note that there is only one thread that handles
8659
+ all concurrent SVDRP connections. That way each SVDRP command is guaranteed to be
8660
+ processed separately, without interfering with any other SVDRP commands that might
8661
+ be issued at the same time. Plugins that implement SVDRP commands may need to take
8662
+ care of proper locking if the commands access global data.
8663
+ - VDR now sends out a broadcast to port 6419/udp, which was assigned to 'svdrp-disc'
8664
+ by the IANA. VDRs listening on that port will automatically initiate an SVDRP
8665
+ connection to the broadcasting VDR, and in turn send out a broadcast to make
8666
+ other VDRs connect to them. That way all VDRs within the local network will
8667
+ have permanent "peer-to-peer" SVDRP connections between each other. The
8668
+ configuration in the svdrphosts.conf file is taken into account when considering
8669
+ whether or not to respond to an SVDRP discover broadcast.
8670
+ - The new SVDRP command PING is used by automatically established peer-to-peer
8671
+ connections to keep them alive.
8672
+ - The new function GetSVDRPServerNames() can be used to get a list of all VDRs
8673
+ this VDR is connected to via SVDRP.
8674
+ - The new function ExecSVDRPCommand() can be used to execute an SVDRP command on
8675
+ one of the servers this VDR is connected to, and retrieve the result.
8676
+ The helper functions SVDRPCode() and SVDRPValue() can be used to easily access
8677
+ the codes and values returned by ExecSVDRPCommand().
8678
+ - The cTimer class now has a new member named 'remote', which holds the name of the
8679
+ remote server this timer will record on. If this is NULL, it is a local timer.
8680
+ - Timers from other VDRs that are connected to this VDR via SVDRP are now
8681
+ automatically fetched and stored in the global Timers list. In order for this
8682
+ to work, all of the channels used by timers on the remote VDR must also be
8683
+ defined on the local VDR (however, not necessarily in the same sequence).
8684
+ Automatic channel syncing will be implemented later.
8685
+ - The main menu of the LCARS skin now displays a small rectangle on the left side
8686
+ of a timer if this is a remote timer. The color of that rectangle changes if
8687
+ the timer is currently recording on the remote VDR.
8688
+ - Accessing the global Timers list now has to be protected by proper locking,
8689
+ because SVDRP commands are now executed in a separate thread.
8690
+ The introduction of this locking mechanism required the following changes:
8691
+ + The new classes cStateLock and cStateKey are used to implement locking
8692
+ with quick detection of state changes.
8693
+ + cConfig::cConfig() now has a parameter that indicates whether this list
8694
+ requires locking.
8695
+ + The global lists of Timers, Channels, Schedules and Recordings are no longer
8696
+ static variables. They are now pointers that need to be retrieved through
8697
+ a call to cTimers::GetTimersRead/Write(), cChannels::GetChannelsRead/Write(),
8698
+ cSchedules::GetSchedulesRead/Write() and cRecordings::GetRecordingsRead/Write(),
8699
+ respectively.
8700
+ + References from/to link channels are now removed in cChannels::Del() rather
8701
+ than cChannel::~cChannel(), to make sure the caller holds a proper lock.
8702
+ + cChannel::HasTimer() has been removed. This information is now retrieved
8703
+ via cSchedule::HasTimer().
8704
+ + Several member functions of cChannel, cTimer, cMarks and cRecording have
8705
+ been made 'const', and some of them are now available as both 'const' and
8706
+ 'non-const' versions.
8707
+ + The cChannel::Set...() functions are now 'bool' and return true if they have
8708
+ actually changed any of the channels's members.
8709
+ + cChannels::SetModified() has been renamed to cChannels::SetModifiedByUser().
8710
+ + cChannels::Modified() has been renamed to cChannels::ModifiedByUser(), and
8711
+ now has a 'State' parameter that allows the caller to see whether a channel
8712
+ has been modified since the last call to this function with the same State
8713
+ variable.
8714
+ + The macros CHANNELSMOD_NONE/_AUTO/_USER have been removed.
8715
+ + cMarks now requires locking via cStateKey.
8716
+ + cSortedTimers now requires a pointer to the list of timers.
8717
+ + cEvent::HasTimer() no longer scans the list of timers to check whether an event
8718
+ is referenced by a timer, but rather keeps score of how many timers reference
8719
+ it. This was necessary in order to avoid having to lock the list of timers from
8720
+ within a cEvent.
8721
+ + The new class cListGarbageCollector is used to temporary store any objects deleted
8722
+ from cLists that require locking. This allows pointers to such objects to be
8723
+ dereferenced even if the objects are no longer part of the list.
8724
+ + cListBase::Contains() can be used to check whether a particular object is still
8725
+ contained in that list.
8726
+ + Outdated events are no longer "phased out", but rather deleted right away and thus
8727
+ taken care of by the new "garbage collector" of the list.
8728
+ + Deleted cRecording objects are no longer kept in a list of "vanished" recordings,
8729
+ but are rather taken care of by the new "garbage collector" of the list.
8730
+ + cSchedules::ClearAll() has been removed. The functionality is now implemented
8731
+ directly in cSVDRPServer::CmdCLRE().
8732
+ + tEventID has been changed to u_int16_t in order to make room for the new member
8733
+ numTimers in cEvent.
8734
+ + cSchedule now has a member Modified(), which can be used with a State variable
8735
+ to quickly determine whether this schedule has been modified since the last call
8736
+ to this function with the same State variable.
8737
+ + cSchedulesLock has been removed. Locking the list of schedules is now done via
8738
+ the cList's new locking mechanism.
8739
+ + The 'OnlyRunningStatus' parameters in cEpgHandler::BeginSegmentTransfer() and
8740
+ cEpgHandler::EndSegmentTransfer() are now obsolete. They are still present in
8741
+ the interface for backward compatibility, but may be removed in a future version.
8742
+ Their value is always 'false'.
8743
+ + The constant tcMod is no longer used in cStatus::TimerChange(). The definition is
8744
+ still there for backward compatibility.
8745
+ Plugins that access the global lists of Timers, Channels, Recordings or Schedules
8746
+ will need to be adapted as follows:
8747
+ + Instead of directly accessing the global variables Timers, Channels or Recordings,
8748
+ they need to set up a cStateKey variable and call the proper getter function,
8749
+ as in
8750
+ cStateKey StateKey;
8751
+ if (const cTimers *Timers = cTimers::GetTimersRead(StateKey)) {
8752
+ // access the timers
8753
+ StateKey.Remove();
8754
+ }
8755
+ and
8756
+ cStateKey StateKey;
8757
+ if (cTimers *Timers = cTimers::GetTimersWrite(StateKey)) {
8758
+ // access the timers
8759
+ StateKey.Remove();
8760
+ }
8761
+ See timers.h, thread.h and tools.h for details on this new locking mechanism.
8762
+ + There are convenience macros for easily accessing these lists without having
8763
+ to explicitly set up a cStateKey and calling its Remove() function. These macros
8764
+ have the form LOCK_*_READ/WRITE (with '*' being TIMERS, CHANNELS, SCHEDULES or
8765
+ RECORDINGS). Simply put such a macro before the point where you need to access
8766
+ the respective list, and there will be a pointer named Timers, Channels, Schedules
8767
+ or Recordings, respectively, which is valid until the end of the current block.
8768
+ + If a plugin needs to access several of the global lists in parallel, locking must
8769
+ always be done in the sequence Timers, Channels, Recordings, Schedules. This is
8770
+ necessary to make sure that different threads that need to lock several lists at
8771
+ the same time don't end up in a deadlock.
8772
+ + Some pointer variables may need to be made 'const'. The compiler will tell you
8773
+ about these.
8774
+ - cSectionSyncer has been improved to better handle missed sections.
8775
+ - Added a missing initialization of 'seen' in cChannel's copy constructor.
8776
+ - Background modifications of channels, timers and events are now displayed immediately
8777
+ in the corresponding menus.
8778
+ - cEIT now checks the version of the tables before doing any processing, which saves
8779
+ a lot of locking and processing.
8780
+ - If a timer is newly created with the Red button in the Schedule menu, and the timer
8781
+ is presented to the user in the "Edit timer" menu because it will start immediately,
8782
+ it now *must* be confirmed with "Ok" to set the timer. Otherwise the timer will not
8783
+ be created.
8784
+ - Recordings and deleted recordings are now scanned in a single thread.
8785
+ - The new SVDRP command POLL is used by automatically established peer-to-peer
8786
+ connections to trigger fetching remote timers.
8787
+ - You can now set DumpSVDRPDataTransfer in svdrp.c to true to have all SVDRP
8788
+ communication printed to the console for debugging.
8789
+ - Added a missing 'const' to cReceiver::Receive(), to protect the given Data from
8790
+ being modified.
8791
+ - The SVDRP commands that deal with timers (DELT, LSTT, MODT, NEWT, NEXT and UPDT)
8792
+ as well as any log messages that refer to timers, now use a unique id for each
8793
+ timer, which remains valid as long as this instance of VDR is running. This means
8794
+ that timers are no longer continuously numbered from 1 to N in LSTT. There may be
8795
+ gaps in the sequence, in case timers have been deleted.
8796
+ - The Timers menu now displays the name of the remote VDR in front of the timer's
8797
+ file name, if this is a remote timer.
8798
+ - The new options "Setup/Miscellaneous/SVDRP peering", ".../SVDRP host name" and
8799
+ ".../SVDRP default host" can be used to configure automatic peering between VDRs
8800
+ in the same network. Peering is disabled by default and can be enabled by setting
8801
+ "SVDRP peering" to "yes".
8802
+ - The function cTimer::ToText() no longer returns a newline character at the end of
8803
+ the string. The newline is now added by the caller as necessary. This was changed
8804
+ because cTimer::ToText() is now also needed in a context where the terminating
8805
+ newline can't be used. Consequently, cChannel::ToText() and cMark::ToText() have
8806
+ been modified accordingly.
8807
+ - All timer related response strings from SVDRP commands now use the channel ID
8808
+ instead of channel numbers.
8809
+ - The "Edit timer" menu now has a new parameter "Record on", which can be used to
8810
+ select the VDR on which this timer shall record. Timers can be freely moved
8811
+ between connected VDRs by simply selecting the desired machine in this field.
8812
+ - The SVDRP command DELT no longer checks whether the timer that shall be deleted
8813
+ is currently recording.
8814
+ - The character 0x0D is now stripped from EPG texts (reported by Janne P�nk�l�).
8815
+ - The EPG scanner no longer moves the dish if there is a positioner.
8816
+ - The 'newplugin' script now creates the 'po' subdirectory for translations (thanks
8817
+ to Thomas Reufer).
8818
+ - Skins can now implement cSkinDisplayMenu::MenuOrientation() to display horizontal
8819
+ menus (thanks to Stefan Braun).
8820
+ - Fixed a possible stack overflow in cListBase::Sort() (thanks to Oliver Endriss).
8821
+ - Changed the description of the --chartab option in the INSTALL file to refer to
8822
+ "DVB SI table strings" instead of "EPG data".
8823
+ - The width and height of the OSD are now limited to the actual maximum dimensions
8824
+ of the output device, taking into account the top and left offset.
8825
+ - The new setup option "Recording/Record key handling" can be used to define
8826
+ what happens if the Record key on the remote control is pressed during
8827
+ live tv (suggested by Dietmar Spingler).
8828
+ - Empty adaptation field TS packets are now skipped when recording (thanks to
8829
+ Christopher Reimer, based on the "AFFcleaner" by Stefan P�schel).
0 commit comments