From 71f02e4f80b2ad6cd265e68c4b2253ae5e1b3663 Mon Sep 17 00:00:00 2001 From: Klaus Schmidinger Date: Tue, 13 Mar 2012 13:22:06 +0100 Subject: [PATCH] When estimating the remaining disk space (in hours), the average data rate of all existing recordings is now taken into account --- HISTORY | 3 +++ menu.c | 7 +++++-- recording.c | 46 ++++++++++++++++++++++++++++++++++++++-------- recording.h | 10 ++++++++-- 4 files changed, 54 insertions(+), 12 deletions(-) diff --git a/HISTORY b/HISTORY index 2abefc73..9fe2f442 100644 --- a/HISTORY +++ b/HISTORY @@ -7037,3 +7037,6 @@ Video Disk Recorder Revision History the given device. - When toggling a timer between "Single" and "Repeating", the previous setting is now retained in case the user toggles back to the original value. +- When estimating the remaining disk space (in hours), the average data rate of all + existing recordings is now taken into account. If this value can't be determined, + the previous value of 25.75 MB/min is taken. diff --git a/menu.c b/menu.c index e3fd5055..ad1cac3c 100644 --- a/menu.c +++ b/menu.c @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: menu.c 2.44 2012/03/11 13:20:45 kls Exp $ + * $Id: menu.c 2.45 2012/03/13 13:14:38 kls Exp $ */ #include "menu.h" @@ -78,7 +78,10 @@ bool cFreeDiskSpace::HasChanged(bool ForceCheck) int Percent = VideoDiskSpace(&FreeMB); lastDiskSpaceCheck = time(NULL); if (ForceCheck || FreeMB != lastFreeMB) { - int Minutes = int(double(FreeMB) / MB_PER_MINUTE); + int MBperMinute = Recordings.MBperMinute(); + if (MBperMinute <= 0) + MBperMinute = MB_PER_MINUTE; + int Minutes = int(double(FreeMB) / MBperMinute); int Hours = Minutes / 60; Minutes %= 60; freeDiskSpaceString = cString::sprintf("%s %d%% - %2d:%02d %s", tr("Disk"), Percent, Hours, Minutes, tr("free")); diff --git a/recording.c b/recording.c index a4076ed4..e1f7ec96 100644 --- a/recording.c +++ b/recording.c @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: recording.c 2.52 2012/03/12 14:49:28 kls Exp $ + * $Id: recording.c 2.53 2012/03/13 13:17:57 kls Exp $ */ #include "recording.h" @@ -1063,6 +1063,17 @@ int cRecording::LengthInSeconds(void) const return -1; } +int cRecording::FileSizeMB(void) const +{ + if (fileSizeMB < 0) { + int fs = DirSizeMB(FileName()); + if (time(NULL) - LastModifiedTime(FileName()) < MININDEXAGE) + return fs; // check again later for ongoing recordings + fileSizeMB = fs; + } + return fileSizeMB; +} + // --- cRecordings ----------------------------------------------------------- cRecordings Recordings; @@ -1127,14 +1138,13 @@ void cRecordings::ScanVideoDir(const char *DirName, bool Foreground, int LinkLev cRecording *r = new cRecording(buffer); if (r->Name()) { r->NumFrames(); // initializes the numFrames member + r->FileSizeMB(); // initializes the fileSizeMB member + if (deleted) + r->deleted = time(NULL); Lock(); Add(r); ChangeState(); Unlock(); - if (deleted) { - r->fileSizeMB = DirSizeMB(buffer); - r->deleted = time(NULL); - } } else delete r; @@ -1216,7 +1226,6 @@ void cRecordings::DelByName(const char *FileName) if (ext) { strncpy(ext, DELEXT, strlen(ext)); if (access(recording->FileName(), F_OK) == 0) { - recording->fileSizeMB = DirSizeMB(recording->FileName()); recording->deleted = time(NULL); DeletedRecordings.Add(recording); recording = NULL; // to prevent it from being deleted below @@ -1241,12 +1250,33 @@ int cRecordings::TotalFileSizeMB(void) int size = 0; LOCK_THREAD; for (cRecording *recording = First(); recording; recording = Next(recording)) { - if (recording->fileSizeMB > 0 && IsOnVideoDirectoryFileSystem(recording->FileName())) - size += recording->fileSizeMB; + int FileSizeMB = recording->FileSizeMB(); + if (FileSizeMB > 0 && IsOnVideoDirectoryFileSystem(recording->FileName())) + size += FileSizeMB; } return size; } +double cRecordings::MBperMinute(void) +{ + int size = 0; + int length = 0; + LOCK_THREAD; + for (cRecording *recording = First(); recording; recording = Next(recording)) { + if (IsOnVideoDirectoryFileSystem(recording->FileName())) { + int FileSizeMB = recording->FileSizeMB(); + if (FileSizeMB > 0) { + int LengthInSeconds = recording->LengthInSeconds(); + if (LengthInSeconds > 0) { + size += FileSizeMB; + length += LengthInSeconds; + } + } + } + } + return (size && length) ? double(size) * 60 / length : -1; +} + void cRecordings::ResetResume(const char *ResumeFileName) { LOCK_THREAD; diff --git a/recording.h b/recording.h index 80c2817a..5f94ee23 100644 --- a/recording.h +++ b/recording.h @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: recording.h 2.29 2012/03/12 11:44:06 kls Exp $ + * $Id: recording.h 2.30 2012/03/13 12:41:05 kls Exp $ */ #ifndef __RECORDING_H @@ -129,6 +129,9 @@ public: ///< If the number of frames is unknown, -1 will be returned. int LengthInSeconds(void) const; ///< Returns the length (in seconds) of this recording, or -1 in case of error. + int FileSizeMB(void) const; + ///< Returns the total file size of this recording (in MB), or -1 if the file + ///< size is unknown. bool IsNew(void) const { return GetResume() <= 0; } bool IsEdited(void) const; bool IsPesRecording(void) const { return isPesRecording; } @@ -190,7 +193,10 @@ public: void AddByName(const char *FileName, bool TriggerUpdate = true); void DelByName(const char *FileName); void UpdateByName(const char *FileName); - int TotalFileSizeMB(void); ///< Only for deleted recordings! + int TotalFileSizeMB(void); + double MBperMinute(void); + ///< Returns the average data rate (in MB/min) of all recordings, or -1 if + ///< this value is unknown. }; extern cRecordings Recordings;