void CheckExistanceOfDirectoriesAndFiles(void) { if(!DirectoryExists(getMediaDirectory())) { LogWarn(VB_SETTING, "FPP directory does not exist, creating it.\n"); if ( mkdir(getMediaDirectory(), 0777) != 0 ) { LogErr(VB_SETTING, "Error: Unable to create media directory.\n"); exit(EXIT_FAILURE); } } if(!DirectoryExists(getMusicDirectory())) { LogWarn(VB_SETTING, "Music directory does not exist, creating it.\n"); if ( mkdir(getMusicDirectory(), 0777) != 0 ) { LogErr(VB_SETTING, "Error: Unable to create music directory.\n"); exit(EXIT_FAILURE); } } if(!DirectoryExists(getSequenceDirectory())) { LogWarn(VB_SETTING, "Sequence directory does not exist, creating it.\n"); if ( mkdir(getSequenceDirectory(), 0777) != 0 ) { LogErr(VB_SETTING, "Error: Unable to create sequence directory.\n"); exit(EXIT_FAILURE); } } if(!DirectoryExists(getEventDirectory())) { LogWarn(VB_SETTING, "Event directory does not exist, creating it.\n"); if ( mkdir(getEventDirectory(), 0777) != 0 ) { LogErr(VB_SETTING, "Error: Unable to create event directory.\n"); exit(EXIT_FAILURE); } } if(!DirectoryExists(getVideoDirectory())) { LogWarn(VB_SETTING, "Video directory does not exist, creating it.\n"); if ( mkdir(getVideoDirectory(), 0777) != 0 ) { LogErr(VB_SETTING, "Error: Unable to create video directory.\n"); exit(EXIT_FAILURE); } } if(!DirectoryExists(getEffectDirectory())) { LogWarn(VB_SETTING, "Effect directory does not exist, creating it.\n"); if ( mkdir(getEffectDirectory(), 0777) != 0 ) { LogErr(VB_SETTING, "Error: Unable to create effect directory.\n"); exit(EXIT_FAILURE); } } if(!DirectoryExists(getScriptDirectory())) { LogWarn(VB_SETTING, "Script directory does not exist, creating it.\n"); if ( mkdir(getScriptDirectory(), 0777) != 0 ) { LogErr(VB_SETTING, "Error: Unable to create script directory.\n"); exit(EXIT_FAILURE); } } if(!DirectoryExists(getPlaylistDirectory())) { LogWarn(VB_SETTING, "Playlist directory does not exist, creating it.\n"); if ( mkdir(getPlaylistDirectory(), 0777) != 0 ) { LogErr(VB_SETTING, "Error: Unable to create playlist directory.\n"); exit(EXIT_FAILURE); } } if(!FileExists(getUniverseFile())) { LogWarn(VB_SETTING, "Universe file does not exist, creating it.\n"); char *cmd, *file = getUniverseFile(); cmd = (char *)malloc(strlen(file)+7); snprintf(cmd, strlen(file)+7, "touch %s", file); if ( system(cmd) != 0 ) { LogErr(VB_SETTING, "Error: Unable to create universe file.\n"); exit(EXIT_FAILURE); } free(cmd); } if(!FileExists(getScheduleFile())) { LogWarn(VB_SETTING, "Schedule file does not exist, creating it.\n"); char *cmd, *file = getScheduleFile(); cmd = (char *)malloc(strlen(file)+7); snprintf(cmd, strlen(file)+7, "touch %s", file); if ( system(cmd) != 0 ) { LogErr(VB_SETTING, "Error: Unable to create schedule file.\n"); exit(EXIT_FAILURE); } free(cmd); } if(!FileExists(getBytesFile())) { LogWarn(VB_SETTING, "Bytes file does not exist, creating it.\n"); char *cmd, *file = getBytesFile(); cmd = (char *)malloc(strlen(file)+7); snprintf(cmd, strlen(file)+7, "touch %s", file); if ( system(cmd) != 0 ) { LogErr(VB_SETTING, "Error: Unable to create bytes file.\n"); exit(EXIT_FAILURE); } free(cmd); } if(!FileExists(getSettingsFile())) { LogWarn(VB_SETTING, "Settings file does not exist, creating it.\n"); char *cmd, *file = getSettingsFile(); cmd = (char *)malloc(strlen(file)+7); snprintf(cmd, strlen(file)+7, "touch %s", file); if ( system(cmd) != 0 ) { LogErr(VB_SETTING, "Error: Unable to create settings file.\n"); exit(EXIT_FAILURE); } free(cmd); } }
int Sequence::OpenSequenceFile(const char *filename, int startSeconds) { LogDebug(VB_SEQUENCE, "OpenSequenceFile(%s, %d)\n", filename, startSeconds); if (!filename || !filename[0]) { LogErr(VB_SEQUENCE, "Empty Sequence Filename!\n", filename); return 0; } size_t bytesRead = 0; m_seqFileSize = 0; if (IsSequenceRunning()) CloseSequenceFile(); m_seqStarting = 1; m_seqPaused = 0; m_seqDuration = 0; m_seqSecondsElapsed = 0; m_seqSecondsRemaining = 0; strcpy(m_seqFilename, filename); char tmpFilename[2048]; unsigned char tmpData[2048]; strcpy(tmpFilename,(const char *)getSequenceDirectory()); strcat(tmpFilename,"/"); strcat(tmpFilename, filename); if (getFPPmode() == REMOTE_MODE) CheckForHostSpecificFile(getSetting("HostName"), tmpFilename); if (!FileExists(tmpFilename)) { LogErr(VB_SEQUENCE, "Sequence file %s does not exist\n", tmpFilename); m_seqStarting = 0; return 0; } m_seqFile = fopen((const char *)tmpFilename, "r"); if (m_seqFile == NULL) { LogErr(VB_SEQUENCE, "Error opening sequence file: %s. fopen returned NULL\n", tmpFilename); m_seqStarting = 0; return 0; } if (getFPPmode() == MASTER_MODE) { SendSeqSyncStartPacket(filename); // Give the remotes a head start spining up so they are ready usleep(100000); } /////////////////////////////////////////////////////////////////////// // Check 4-byte File format identifier char seqFormatID[5]; strcpy(seqFormatID, " "); bytesRead = fread(seqFormatID, 1, 4, m_seqFile); seqFormatID[4] = 0; if ((bytesRead != 4) || (strcmp(seqFormatID, "PSEQ") && strcmp(seqFormatID, "FSEQ"))) { LogErr(VB_SEQUENCE, "Error opening sequence file: %s. Incorrect File Format header: '%s', bytesRead: %d\n", filename, seqFormatID, bytesRead); fseek(m_seqFile, 0L, SEEK_SET); bytesRead = fread(tmpData, 1, DATA_DUMP_SIZE, m_seqFile); HexDump("Sequence File head:", tmpData, bytesRead); fclose(m_seqFile); m_seqFile = NULL; m_seqStarting = 0; return 0; } /////////////////////////////////////////////////////////////////////// // Get Channel Data Offset bytesRead = fread(tmpData, 1, 2, m_seqFile); if (bytesRead != 2) { LogErr(VB_SEQUENCE, "Sequence file %s too short, unable to read channel data offset value\n", filename); fseek(m_seqFile, 0L, SEEK_SET); bytesRead = fread(tmpData, 1, DATA_DUMP_SIZE, m_seqFile); HexDump("Sequence File head:", tmpData, bytesRead); fclose(m_seqFile); m_seqFile = NULL; m_seqStarting = 0; return 0; } m_seqChanDataOffset = tmpData[0] + (tmpData[1] << 8); /////////////////////////////////////////////////////////////////////// // Now that we know the header size, read the whole header in one shot fseek(m_seqFile, 0L, SEEK_SET); bytesRead = fread(tmpData, 1, m_seqChanDataOffset, m_seqFile); if (bytesRead != m_seqChanDataOffset) { LogErr(VB_SEQUENCE, "Sequence file %s too short, unable to read fixed header size value\n", filename); fseek(m_seqFile, 0L, SEEK_SET); bytesRead = fread(tmpData, 1, DATA_DUMP_SIZE, m_seqFile); HexDump("Sequence File head:", tmpData, bytesRead); fclose(m_seqFile); m_seqFile = NULL; m_seqStarting = 0; return 0; } m_seqVersionMinor = tmpData[6]; m_seqVersionMajor = tmpData[7]; m_seqVersion = (m_seqVersionMajor * 256) + m_seqVersionMinor; m_seqFixedHeaderSize = (tmpData[8]) + (tmpData[9] << 8); m_seqStepSize = (tmpData[10]) + (tmpData[11] << 8) + (tmpData[12] << 16) + (tmpData[13] << 24); m_seqNumPeriods = (tmpData[14]) + (tmpData[15] << 8) + (tmpData[16] << 16) + (tmpData[17] << 24); m_seqStepTime = (tmpData[18]) + (tmpData[19] << 8); m_seqNumUniverses = (tmpData[20]) + (tmpData[21] << 8); m_seqUniverseSize = (tmpData[22]) + (tmpData[23] << 8); m_seqGamma = tmpData[24]; m_seqColorEncoding = tmpData[25]; // End of v1.0 fields if (m_seqVersion > 0x0100) { } m_seqRefreshRate = 1000 / m_seqStepTime; fseek(m_seqFile, 0L, SEEK_END); m_seqFileSize = ftell(m_seqFile); m_seqDuration = (int)((float)(m_seqFileSize - m_seqChanDataOffset) / ((float)m_seqStepSize * (float)m_seqRefreshRate)); m_seqSecondsRemaining = m_seqDuration; fseek(m_seqFile, m_seqChanDataOffset, SEEK_SET); m_seqFilePosition = m_seqChanDataOffset; LogDebug(VB_SEQUENCE, "Sequence File Information\n"); LogDebug(VB_SEQUENCE, "seqFilename : %s\n", m_seqFilename); LogDebug(VB_SEQUENCE, "seqVersion : %d.%d\n", m_seqVersionMajor, m_seqVersionMinor); LogDebug(VB_SEQUENCE, "seqFormatID : %s\n", seqFormatID); LogDebug(VB_SEQUENCE, "seqChanDataOffset : %d\n", m_seqChanDataOffset); LogDebug(VB_SEQUENCE, "seqFixedHeaderSize : %d\n", m_seqFixedHeaderSize); LogDebug(VB_SEQUENCE, "seqStepSize : %d\n", m_seqStepSize); LogDebug(VB_SEQUENCE, "seqNumPeriods : %d\n", m_seqNumPeriods); LogDebug(VB_SEQUENCE, "seqStepTime : %dms\n", m_seqStepTime); LogDebug(VB_SEQUENCE, "seqNumUniverses : %d *\n", m_seqNumUniverses); LogDebug(VB_SEQUENCE, "seqUniverseSize : %d *\n", m_seqUniverseSize); LogDebug(VB_SEQUENCE, "seqGamma : %d *\n", m_seqGamma); LogDebug(VB_SEQUENCE, "seqColorEncoding : %d *\n", m_seqColorEncoding); LogDebug(VB_SEQUENCE, "seqRefreshRate : %d\n", m_seqRefreshRate); LogDebug(VB_SEQUENCE, "seqFileSize : %lu\n", m_seqFileSize); LogDebug(VB_SEQUENCE, "seqDuration : %d\n", m_seqDuration); LogDebug(VB_SEQUENCE, "'*' denotes field is currently ignored by FPP\n"); m_seqPaused = 0; m_seqSingleStep = 0; m_seqSingleStepBack = 0; int frameNumber = 0; if (startSeconds) { int frameNumber = startSeconds * m_seqRefreshRate; int newPos = m_seqChanDataOffset + (frameNumber * m_seqStepSize); LogDebug(VB_SEQUENCE, "Seeking to byte %d in %s\n", newPos, m_seqFilename); fseek(m_seqFile, newPos, SEEK_SET); } ReadSequenceData(); SetChannelOutputFrameNumber(frameNumber); SetChannelOutputRefreshRate(m_seqRefreshRate); StartChannelOutputThread(); m_seqStarting = 0; return m_seqFileSize; }