/* * Copyright (C) 2009,2013 by Jonathan Naylor G4KLX * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef DVTOOLFileWriter_H #define DVTOOLFileWriter_H #include "HeaderData.h" #include "StdCompat.h" #include #include /* * Sequential writer for .dvtool recording files (see DVTOOLFileReader.h for * the file format description). * * Usage: * open() — writes the "DVTOOL" signature and a placeholder record count, * then writes the header record. * write() — appends each DV data frame as a DSVT data record. * close() — writes the trailer record, then seeks back to the placeholder * and fills in the final record count (big-endian uint32). * * Two open() overloads are provided: * open(filename, header) — uses a caller-supplied base filename. * open(header) — auto-generates a filename from a timestamp and * the callsigns embedded in the header. * * setDirectory() is a class-level (static) setting that prepends a directory * to all generated filenames. */ class CDVTOOLFileWriter { public: CDVTOOLFileWriter(); ~CDVTOOLFileWriter(); // Sets the output directory used by all CDVTOOLFileWriter instances. static void setDirectory(const std::string& dirName); std::string getFileName() const; bool open(const CHeaderData& header); bool open(const std::string& filename, const CHeaderData& header); bool write(const unsigned char* buffer, unsigned int length); void close(); private: static std::string m_dirName; std::string m_fileName; FILE* m_file; uint32_t m_count; // Number of DSVT records written (header + data + trailer). unsigned int m_sequence; // Per-frame sequence counter (0–20, mirrors DSRP wire format). long m_offset; // File offset of the record-count field, for back-patching in close(). bool writeHeader(const CHeaderData& header); bool writeTrailer(); }; #endif