1
0
mirror of https://github.com/VDR4Arch/vdr.git synced 2023-10-10 13:36:52 +02:00

Implemented SpinUpDisk()

This commit is contained in:
Klaus Schmidinger 2001-08-11 11:15:41 +02:00
parent 627916d32a
commit 8e99289b55
4 changed files with 43 additions and 3 deletions

View File

@ -640,3 +640,5 @@ Video Disk Recorder Revision History
that turns off the video disk when it is not used, and therefore needs that turns off the video disk when it is not used, and therefore needs
to write the EPG file to a ramdisk (or turn off writing it alltogether). to write the EPG file to a ramdisk (or turn off writing it alltogether).
See 'vdr --help' for details. See 'vdr --help' for details.
- Making sure the disk is up and running before starting recording (this
is important for systems that turn off the video disk when it is not used).

View File

@ -7,7 +7,7 @@
* DVD support initially written by Andreas Schultz <aschultz@warp10.net> * DVD support initially written by Andreas Schultz <aschultz@warp10.net>
* based on dvdplayer-0.5 by Matjaz Thaler <matjaz.thaler@guest.arnes.si> * based on dvdplayer-0.5 by Matjaz Thaler <matjaz.thaler@guest.arnes.si>
* *
* $Id: dvbapi.c 1.103 2001/08/10 14:54:21 kls Exp $ * $Id: dvbapi.c 1.104 2001/08/11 10:17:26 kls Exp $
*/ */
//#define DVDDEBUG 1 //#define DVDDEBUG 1
@ -3269,6 +3269,10 @@ bool cDvbApi::StartRecord(const char *FileName, int Ca, int Priority)
if (!MakeDirs(FileName, true)) if (!MakeDirs(FileName, true))
return false; return false;
// Make sure the disk is up and running:
SpinUpDisk(FileName);
// Create recording buffer: // Create recording buffer:
recordBuffer = new cRecordBuffer(this, FileName, vPid, aPid1, aPid2, dPid1, dPid2); recordBuffer = new cRecordBuffer(this, FileName, vPid, aPid1, aPid2, dPid1, dPid2);

35
tools.c
View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: tools.c 1.36 2001/08/11 08:52:27 kls Exp $ * $Id: tools.c 1.37 2001/08/11 11:14:19 kls Exp $
*/ */
#define _GNU_SOURCE #define _GNU_SOURCE
@ -15,6 +15,7 @@
#if defined(DEBUG_OSD) #if defined(DEBUG_OSD)
#include <ncurses.h> #include <ncurses.h>
#endif #endif
#include <stdlib.h>
#include <sys/time.h> #include <sys/time.h>
#include <unistd.h> #include <unistd.h>
@ -315,6 +316,38 @@ char *ReadLink(const char *FileName)
return TargetName ? strdup(TargetName) : NULL; return TargetName ? strdup(TargetName) : NULL;
} }
bool SpinUpDisk(const char *FileName)
{
static char *buf = NULL;
for (int n = 0; n < 10; n++) {
delete buf;
if (DirectoryOk(FileName))
asprintf(&buf, "%s/vdr-%06d", *FileName ? FileName : ".", n);
else
asprintf(&buf, "%s.vdr-%06d", FileName, n);
if (access(buf, F_OK) != 0) { // the file does not exist
timeval tp1, tp2;
gettimeofday(&tp1, NULL);
int f = open(buf, O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
// O_SYNC doesn't work on all file systems
if (f >= 0) {
close(f);
system("sync");
remove(buf);
gettimeofday(&tp2, NULL);
double seconds = (((long long)tp2.tv_sec * 1000000 + tp2.tv_usec) - ((long long)tp1.tv_sec * 1000000 + tp1.tv_usec)) / 1000000.0;
if (seconds > 0.5)
dsyslog(LOG_INFO, "SpinUpDisk took %.2f seconds\n", seconds);
return true;
}
else
LOG_ERROR_STR(buf);
}
}
esyslog(LOG_ERR, "ERROR: SpinUpDisk failed");
return false;
}
// --- cFile ----------------------------------------------------------------- // --- cFile -----------------------------------------------------------------
bool cFile::files[FD_SETSIZE] = { false }; bool cFile::files[FD_SETSIZE] = { false };

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: tools.h 1.26 2001/05/20 08:29:45 kls Exp $ * $Id: tools.h 1.27 2001/08/11 09:52:14 kls Exp $
*/ */
#ifndef __TOOLS_H #ifndef __TOOLS_H
@ -50,6 +50,7 @@ bool MakeDirs(const char *FileName, bool IsDirectory = false);
bool RemoveFileOrDir(const char *FileName, bool FollowSymlinks = false); bool RemoveFileOrDir(const char *FileName, bool FollowSymlinks = false);
bool RemoveEmptyDirectories(const char *DirName, bool RemoveThis = false); bool RemoveEmptyDirectories(const char *DirName, bool RemoveThis = false);
char *ReadLink(const char *FileName); char *ReadLink(const char *FileName);
bool SpinUpDisk(const char *FileName);
class cFile { class cFile {
private: private: