mirror of
				https://github.com/f4exb/sdrangel.git
				synced 2025-10-31 13:00:26 -04:00 
			
		
		
		
	Fix Sigmf Record: overwriting sigmf-data or sigmf-meta
This commit is contained in:
		
							parent
							
								
									bace0951bb
								
							
						
					
					
						commit
						10aae9cfd4
					
				| @ -83,11 +83,11 @@ SigMFFileRecord::~SigMFFileRecord() | |||||||
| 
 | 
 | ||||||
|     stopRecording(); |     stopRecording(); | ||||||
| 
 | 
 | ||||||
|     if (m_metaFile.is_open()) { |     if (m_metaFile.isOpen()) { | ||||||
|         m_metaFile.close(); |         m_metaFile.close(); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     if (m_sampleFile.is_open()) { |     if (m_sampleFile.isOpen()) { | ||||||
|         m_sampleFile.close(); |         m_sampleFile.close(); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| @ -100,37 +100,33 @@ void SigMFFileRecord::setFileName(const QString& fileName) | |||||||
|     { |     { | ||||||
|         qDebug("SigMFFileRecord::setFileName: %s", qPrintable(fileName)); |         qDebug("SigMFFileRecord::setFileName: %s", qPrintable(fileName)); | ||||||
| 
 | 
 | ||||||
|         if (m_metaFile.is_open()) { |         if (m_metaFile.isOpen()) { | ||||||
|             m_metaFile.close(); |             m_metaFile.close(); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         if (m_sampleFile.is_open()) { |         if (m_sampleFile.isOpen()) { | ||||||
|             m_sampleFile.close(); |             m_sampleFile.close(); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         m_fileName = fileName; |         m_fileName = fileName; | ||||||
|  |         QString metaFileName = m_fileName + ".sigmf-meta"; | ||||||
|  |         m_metaFile.setFileName(metaFileName); | ||||||
|  |         QString sampleFileName = m_fileName + ".sigmf-data"; | ||||||
|  |         m_sampleFile.setFileName(sampleFileName); | ||||||
| 
 | 
 | ||||||
|         if (QFile::exists(fileName + ".sigmf-data") && QFile::exists(fileName + ".sigmf-meta")) |         if (QFile::exists(metaFileName) && QFile::exists(sampleFileName)) | ||||||
|         { |         { | ||||||
|             m_metaFileName = m_fileName + ".sigmf-meta"; |             QFile metaStream(metaFileName); | ||||||
|             std::ifstream metaStream; |             metaStream.open(QIODevice::ReadOnly); | ||||||
| #ifdef Q_OS_WIN |  | ||||||
|         	metaStream.open(m_metaFileName.toStdWString().c_str()); |  | ||||||
| #else |  | ||||||
|         	metaStream.open(m_metaFileName.toStdString().c_str()); |  | ||||||
| #endif |  | ||||||
|             std::ostringstream meta_buffer; |  | ||||||
|             meta_buffer << metaStream.rdbuf(); |  | ||||||
|             try |             try | ||||||
|             { |             { | ||||||
|                 from_json(json::parse(meta_buffer.str()), *m_metaRecord); |                 from_json(json::parse(metaStream.readAll().toStdString()), *m_metaRecord); | ||||||
|                 metaStream.close(); |                 metaStream.close(); | ||||||
|                 std::string sdrAngelVersion = m_metaRecord->global.access<sdrangel::GlobalT>().version; |                 std::string sdrAngelVersion = m_metaRecord->global.access<sdrangel::GlobalT>().version; | ||||||
| 
 | 
 | ||||||
|                 if (sdrAngelVersion.size() != 0) |                 if (sdrAngelVersion.size() != 0) | ||||||
|                 { |                 { | ||||||
|                     qDebug("SigMFFileRecord::setFileName: appending mode"); |                     qDebug("SigMFFileRecord::setFileName: appending mode"); | ||||||
|                     m_metaFile.open(m_metaFileName.toStdString().c_str(), std::ofstream::out); |  | ||||||
|                     m_initialMsCount = 0; |                     m_initialMsCount = 0; | ||||||
| 
 | 
 | ||||||
|                     for (auto capture : m_metaRecord->captures) |                     for (auto capture : m_metaRecord->captures) | ||||||
| @ -140,11 +136,19 @@ void SigMFFileRecord::setFileName(const QString& fileName) | |||||||
|                         m_initialMsCount += (length * 1000) / sampleRate; |                         m_initialMsCount += (length * 1000) / sampleRate; | ||||||
|                     } |                     } | ||||||
| 
 | 
 | ||||||
|                     m_sampleFileName = m_fileName + ".sigmf-data"; |                     m_sampleFile.setFileName(m_fileName + ".sigmf-data"); | ||||||
|                     m_sampleFile.open(m_sampleFileName.toStdString().c_str(), std::ios::binary & std::ios::app); |                     if (!m_sampleFile.open(QIODevice::WriteOnly | QIODevice::Append)) | ||||||
|                     m_initialBytesCount = (uint64_t) m_sampleFile.tellp(); |                     { | ||||||
|  |                         qWarning() << "SigMFFileRecord::setFileName: failed to open file: " << m_sampleFile.fileName(); | ||||||
|  |                     } | ||||||
|  |                     m_initialBytesCount = (uint64_t) m_sampleFile.size(); | ||||||
|                     m_sampleStart =  m_initialBytesCount / ((1<<m_log2RecordSampleSize)/4); // sizeof(Sample);
 |                     m_sampleStart =  m_initialBytesCount / ((1<<m_log2RecordSampleSize)/4); // sizeof(Sample);
 | ||||||
|                      |                      | ||||||
|  |                     if (!m_metaFile.open(QIODevice::WriteOnly | QIODevice::Append)) | ||||||
|  |                     { | ||||||
|  |                         qWarning() << "SigMFFileRecord::setFileName: failed to open file: " << m_metaFile.fileName(); | ||||||
|  |                     } | ||||||
|  | 
 | ||||||
|                     m_recordStart = false; |                     m_recordStart = false; | ||||||
|                 } |                 } | ||||||
|                 else |                 else | ||||||
| @ -186,18 +190,14 @@ bool SigMFFileRecord::startRecording() | |||||||
|       	qDebug("SigMFFileRecord::startRecording: new record %s", qPrintable(m_fileName)); |       	qDebug("SigMFFileRecord::startRecording: new record %s", qPrintable(m_fileName)); | ||||||
|         clearMeta(); |         clearMeta(); | ||||||
|         m_sampleStart = 0; |         m_sampleStart = 0; | ||||||
|         m_sampleFileName = m_fileName + ".sigmf-data"; |         if (!m_sampleFile.open(QIODevice::WriteOnly)) | ||||||
|         m_metaFileName = m_fileName + ".sigmf-meta"; |  | ||||||
|         m_sampleFile.open(m_sampleFileName.toStdString().c_str(), std::ios::binary); |  | ||||||
|         if (!m_sampleFile.is_open()) |  | ||||||
|         { |         { | ||||||
|             qWarning() << "SigMFFileRecord::startRecording: failed to open file: " << m_sampleFileName; |             qWarning() << "SigMFFileRecord::startRecording: failed to open file: " << m_sampleFile.fileName(); | ||||||
|             success = false; |             success = false; | ||||||
|         } |         } | ||||||
|         m_metaFile.open(m_metaFileName.toStdString().c_str(), std::ofstream::out); |         if (!m_metaFile.open(QIODevice::WriteOnly | QIODevice::Append)) | ||||||
|         if (!m_metaFile.is_open()) |  | ||||||
|         { |         { | ||||||
|             qWarning() << "SigMFFileRecord::startRecording: failed to open file: " << m_metaFileName; |             qWarning() << "SigMFFileRecord::startRecording: failed to open file: " << m_metaFile.fileName(); | ||||||
|             success = false; |             success = false; | ||||||
|         } |         } | ||||||
|         makeHeader(); |         makeHeader(); | ||||||
| @ -221,14 +221,14 @@ bool SigMFFileRecord::stopRecording() | |||||||
|       	qDebug("SigMFFileRecord::stopRecording: file previous capture"); |       	qDebug("SigMFFileRecord::stopRecording: file previous capture"); | ||||||
|         makeCapture(); |         makeCapture(); | ||||||
|         m_recordOn = false; |         m_recordOn = false; | ||||||
|         if (m_sampleFile.bad()) |         if (m_sampleFile.error()) | ||||||
|         { |         { | ||||||
|             qWarning() << "SigMFFileRecord::stopRecording: an error occurred while writing to " << m_sampleFileName; |             qWarning() << "SigMFFileRecord::stopRecording: an error occurred while writing to " << m_sampleFile.fileName(); | ||||||
|             return false; |             return false; | ||||||
|         } |         } | ||||||
|         if (m_metaFile.bad()) |         if (m_metaFile.error()) | ||||||
|         { |         { | ||||||
|             qWarning() << "SigMFFileRecord::stopRecording: an error occurred while writing to " << m_metaFileName; |             qWarning() << "SigMFFileRecord::stopRecording: an error occurred while writing to " << m_metaFile.fileName(); | ||||||
|             return false; |             return false; | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| @ -274,10 +274,11 @@ void SigMFFileRecord::makeCapture() | |||||||
|         m_metaRecord->captures.emplace_back(recording_capture); |         m_metaRecord->captures.emplace_back(recording_capture); | ||||||
|         m_sampleStart += m_sampleCount; |         m_sampleStart += m_sampleCount; | ||||||
|         // Flush meta to disk
 |         // Flush meta to disk
 | ||||||
|         m_metaFile.seekp(0); |         m_metaFile.seek(0); | ||||||
|         std::string jsonRecord = json(*m_metaRecord).dump(2); |         std::string jsonRecord = json(*m_metaRecord).dump(2); | ||||||
|         m_metaFile << jsonRecord; |         m_metaFile.write(jsonRecord.c_str(), jsonRecord.size()); | ||||||
|         m_metaFile.flush(); |         m_metaFile.flush(); | ||||||
|  |         m_metaFile.resize(m_metaFile.pos()); | ||||||
|     } |     } | ||||||
|     else |     else | ||||||
|     { |     { | ||||||
|  | |||||||
| @ -22,12 +22,10 @@ | |||||||
| #ifndef INCLUDE_SIGMF_FILERECORD_H | #ifndef INCLUDE_SIGMF_FILERECORD_H | ||||||
| #define INCLUDE_SIGMF_FILERECORD_H | #define INCLUDE_SIGMF_FILERECORD_H | ||||||
| 
 | 
 | ||||||
| #include <string> |  | ||||||
| #include <iostream> |  | ||||||
| #include <fstream> |  | ||||||
| #include <ctime> | #include <ctime> | ||||||
| 
 | 
 | ||||||
| #include <QDateTime> | #include <QDateTime> | ||||||
|  | #include <QFile> | ||||||
| 
 | 
 | ||||||
| #include "dsp/sigmf_forward.h" | #include "dsp/sigmf_forward.h" | ||||||
| #include "dsp/filerecordinterface.h" | #include "dsp/filerecordinterface.h" | ||||||
| @ -77,16 +75,14 @@ private: | |||||||
| 
 | 
 | ||||||
|     QString m_hardwareId; |     QString m_hardwareId; | ||||||
| 	QString m_fileName; | 	QString m_fileName; | ||||||
|     QString m_sampleFileName; |  | ||||||
|     QString m_metaFileName; |  | ||||||
|     quint32 m_sampleRate; |     quint32 m_sampleRate; | ||||||
|     quint64 m_centerFrequency; |     quint64 m_centerFrequency; | ||||||
|     qint64 m_msShift; |     qint64 m_msShift; | ||||||
|     bool m_recordOn; |     bool m_recordOn; | ||||||
|     bool m_recordStart; |     bool m_recordStart; | ||||||
|     QDateTime m_captureStartDT; |     QDateTime m_captureStartDT; | ||||||
|     std::ofstream m_metaFile; |     QFile m_metaFile; | ||||||
|     std::ofstream m_sampleFile; |     QFile m_sampleFile; | ||||||
|     quint64 m_sampleStart; |     quint64 m_sampleStart; | ||||||
|     quint64 m_sampleCount; |     quint64 m_sampleCount; | ||||||
|     quint64 m_initialMsCount; |     quint64 m_initialMsCount; | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user