mirror of
https://github.com/f4exb/sdrangel.git
synced 2025-07-12 13:55:22 -04:00
FileSource: calculate file record length down to the microsecond. Implements #614
This commit is contained in:
parent
47a1eeaedc
commit
096dd0d2b0
@ -464,7 +464,7 @@ void FileSource::webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& respon
|
|||||||
quint64 samplesCount = m_basebandSource->getSamplesCount();
|
quint64 samplesCount = m_basebandSource->getSamplesCount();
|
||||||
uint32_t fileSampleRate = m_basebandSource->getFileSampleRate();
|
uint32_t fileSampleRate = m_basebandSource->getFileSampleRate();
|
||||||
quint64 startingTimeStamp = m_basebandSource->getStartingTimeStamp();
|
quint64 startingTimeStamp = m_basebandSource->getStartingTimeStamp();
|
||||||
quint64 fileRecordLength = m_basebandSource->getRecordLength();
|
quint64 fileRecordLength = m_basebandSource->getRecordLengthMuSec() / 1000000UL;
|
||||||
quint32 fileSampleSize = m_basebandSource->getFileSampleSize();
|
quint32 fileSampleSize = m_basebandSource->getFileSampleSize();
|
||||||
|
|
||||||
if (fileSampleRate > 0)
|
if (fileSampleRate > 0)
|
||||||
|
@ -128,7 +128,7 @@ public:
|
|||||||
|
|
||||||
uint32_t getFileSampleRate() const { return m_source.getFileSampleRate(); }
|
uint32_t getFileSampleRate() const { return m_source.getFileSampleRate(); }
|
||||||
quint64 getStartingTimeStamp() const { return m_source.getStartingTimeStamp(); }
|
quint64 getStartingTimeStamp() const { return m_source.getStartingTimeStamp(); }
|
||||||
quint64 getRecordLength() const { return m_source.getRecordLength(); }
|
quint64 getRecordLengthMuSec() const { return m_source.getRecordLengthMuSec(); }
|
||||||
quint32 getFileSampleSize() const { return m_source.getFileSampleSize(); }
|
quint32 getFileSampleSize() const { return m_source.getFileSampleSize(); }
|
||||||
|
|
||||||
void getMagSqLevels(double& avg, double& peak, int& nbSamples) const
|
void getMagSqLevels(double& avg, double& peak, int& nbSamples) const
|
||||||
|
@ -117,7 +117,7 @@ bool FileSourceGUI::handleMessage(const Message& message)
|
|||||||
m_fileSampleRate = ((FileSourceReport::MsgReportFileSourceStreamData&)message).getSampleRate();
|
m_fileSampleRate = ((FileSourceReport::MsgReportFileSourceStreamData&)message).getSampleRate();
|
||||||
m_fileSampleSize = ((FileSourceReport::MsgReportFileSourceStreamData&)message).getSampleSize();
|
m_fileSampleSize = ((FileSourceReport::MsgReportFileSourceStreamData&)message).getSampleSize();
|
||||||
m_startingTimeStamp = ((FileSourceReport::MsgReportFileSourceStreamData&)message).getStartingTimeStamp();
|
m_startingTimeStamp = ((FileSourceReport::MsgReportFileSourceStreamData&)message).getStartingTimeStamp();
|
||||||
m_recordLength = ((FileSourceReport::MsgReportFileSourceStreamData&)message).getRecordLength();
|
m_recordLengthMuSec = ((FileSourceReport::MsgReportFileSourceStreamData&)message).getRecordLengthMuSec();
|
||||||
updateWithStreamData();
|
updateWithStreamData();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -188,7 +188,7 @@ FileSourceGUI::FileSourceGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, Bas
|
|||||||
m_shiftFrequencyFactor(0.0),
|
m_shiftFrequencyFactor(0.0),
|
||||||
m_fileSampleRate(0),
|
m_fileSampleRate(0),
|
||||||
m_fileSampleSize(0),
|
m_fileSampleSize(0),
|
||||||
m_recordLength(0),
|
m_recordLengthMuSec(0),
|
||||||
m_startingTimeStamp(0),
|
m_startingTimeStamp(0),
|
||||||
m_samplesCount(0),
|
m_samplesCount(0),
|
||||||
m_acquisition(false),
|
m_acquisition(false),
|
||||||
@ -277,8 +277,8 @@ void FileSourceGUI::updateWithStreamData()
|
|||||||
ui->sampleRateText->setText(tr("%1k").arg((float) m_fileSampleRate / 1000));
|
ui->sampleRateText->setText(tr("%1k").arg((float) m_fileSampleRate / 1000));
|
||||||
ui->sampleSizeText->setText(tr("%1b").arg(m_fileSampleSize));
|
ui->sampleSizeText->setText(tr("%1b").arg(m_fileSampleSize));
|
||||||
QTime recordLength(0, 0, 0, 0);
|
QTime recordLength(0, 0, 0, 0);
|
||||||
recordLength = recordLength.addSecs(m_recordLength);
|
recordLength = recordLength.addMSecs(m_recordLengthMuSec/1000UL);
|
||||||
QString s_time = recordLength.toString("HH:mm:ss");
|
QString s_time = recordLength.toString("HH:mm:ss.zzz");
|
||||||
ui->recordLengthText->setText(s_time);
|
ui->recordLengthText->setText(s_time);
|
||||||
updateWithStreamTime();
|
updateWithStreamTime();
|
||||||
}
|
}
|
||||||
@ -309,7 +309,7 @@ void FileSourceGUI::updateWithStreamTime()
|
|||||||
|
|
||||||
if (!m_enableNavTime)
|
if (!m_enableNavTime)
|
||||||
{
|
{
|
||||||
float posRatio = (float) t_sec / (float) m_recordLength;
|
float posRatio = (float) (t_sec*1000000L + t_msec*1000L) / (float) m_recordLengthMuSec;
|
||||||
ui->navTime->setValue((int) (posRatio * 1000.0));
|
ui->navTime->setValue((int) (posRatio * 1000.0));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -66,7 +66,7 @@ private:
|
|||||||
QString m_fileName;
|
QString m_fileName;
|
||||||
int m_fileSampleRate;
|
int m_fileSampleRate;
|
||||||
quint32 m_fileSampleSize;
|
quint32 m_fileSampleSize;
|
||||||
quint64 m_recordLength;
|
quint64 m_recordLengthMuSec;
|
||||||
quint64 m_startingTimeStamp;
|
quint64 m_startingTimeStamp;
|
||||||
quint64 m_samplesCount;
|
quint64 m_samplesCount;
|
||||||
bool m_acquisition;
|
bool m_acquisition;
|
||||||
|
@ -641,7 +641,7 @@
|
|||||||
</property>
|
</property>
|
||||||
<property name="minimumSize">
|
<property name="minimumSize">
|
||||||
<size>
|
<size>
|
||||||
<width>60</width>
|
<width>90</width>
|
||||||
<height>0</height>
|
<height>0</height>
|
||||||
</size>
|
</size>
|
||||||
</property>
|
</property>
|
||||||
@ -649,7 +649,7 @@
|
|||||||
<string>Total record time</string>
|
<string>Total record time</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>00:00:00</string>
|
<string>00:00:00.000</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="alignment">
|
<property name="alignment">
|
||||||
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||||
|
@ -52,15 +52,15 @@ public:
|
|||||||
quint32 getSampleSize() const { return m_sampleSize; }
|
quint32 getSampleSize() const { return m_sampleSize; }
|
||||||
quint64 getCenterFrequency() const { return m_centerFrequency; }
|
quint64 getCenterFrequency() const { return m_centerFrequency; }
|
||||||
quint64 getStartingTimeStamp() const { return m_startingTimeStamp; }
|
quint64 getStartingTimeStamp() const { return m_startingTimeStamp; }
|
||||||
quint64 getRecordLength() const { return m_recordLength; }
|
quint64 getRecordLengthMuSec() const { return m_recordLengthMuSec; }
|
||||||
|
|
||||||
static MsgReportFileSourceStreamData* create(int sampleRate,
|
static MsgReportFileSourceStreamData* create(int sampleRate,
|
||||||
quint32 sampleSize,
|
quint32 sampleSize,
|
||||||
quint64 centerFrequency,
|
quint64 centerFrequency,
|
||||||
quint64 startingTimeStamp,
|
quint64 startingTimeStamp,
|
||||||
quint64 recordLength)
|
quint64 recordLengthMuSec)
|
||||||
{
|
{
|
||||||
return new MsgReportFileSourceStreamData(sampleRate, sampleSize, centerFrequency, startingTimeStamp, recordLength);
|
return new MsgReportFileSourceStreamData(sampleRate, sampleSize, centerFrequency, startingTimeStamp, recordLengthMuSec);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
@ -68,19 +68,19 @@ public:
|
|||||||
quint32 m_sampleSize;
|
quint32 m_sampleSize;
|
||||||
quint64 m_centerFrequency;
|
quint64 m_centerFrequency;
|
||||||
quint64 m_startingTimeStamp;
|
quint64 m_startingTimeStamp;
|
||||||
quint64 m_recordLength;
|
quint64 m_recordLengthMuSec;
|
||||||
|
|
||||||
MsgReportFileSourceStreamData(int sampleRate,
|
MsgReportFileSourceStreamData(int sampleRate,
|
||||||
quint32 sampleSize,
|
quint32 sampleSize,
|
||||||
quint64 centerFrequency,
|
quint64 centerFrequency,
|
||||||
quint64 startingTimeStamp,
|
quint64 startingTimeStamp,
|
||||||
quint64 recordLength) :
|
quint64 recordLengthMuSec) :
|
||||||
Message(),
|
Message(),
|
||||||
m_sampleRate(sampleRate),
|
m_sampleRate(sampleRate),
|
||||||
m_sampleSize(sampleSize),
|
m_sampleSize(sampleSize),
|
||||||
m_centerFrequency(centerFrequency),
|
m_centerFrequency(centerFrequency),
|
||||||
m_startingTimeStamp(startingTimeStamp),
|
m_startingTimeStamp(startingTimeStamp),
|
||||||
m_recordLength(recordLength)
|
m_recordLengthMuSec(recordLengthMuSec)
|
||||||
{ }
|
{ }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -43,7 +43,7 @@ FileSourceSource::FileSourceSource() :
|
|||||||
m_samplesCount(0),
|
m_samplesCount(0),
|
||||||
m_sampleRate(0),
|
m_sampleRate(0),
|
||||||
m_deviceSampleRate(0),
|
m_deviceSampleRate(0),
|
||||||
m_recordLength(0),
|
m_recordLengthMuSec(0),
|
||||||
m_startingTimeStamp(0),
|
m_startingTimeStamp(0),
|
||||||
m_running(false),
|
m_running(false),
|
||||||
m_guiMessageQueue(nullptr)
|
m_guiMessageQueue(nullptr)
|
||||||
@ -187,12 +187,12 @@ void FileSourceSource::openFileStream(const QString& fileName)
|
|||||||
if (crcOK)
|
if (crcOK)
|
||||||
{
|
{
|
||||||
qDebug("FileSourceSource::openFileStream: CRC32 OK for header: %s", qPrintable(crcHex));
|
qDebug("FileSourceSource::openFileStream: CRC32 OK for header: %s", qPrintable(crcHex));
|
||||||
m_recordLength = (fileSize - sizeof(FileRecord::Header)) / ((m_sampleSize == 24 ? 8 : 4) * m_fileSampleRate);
|
m_recordLengthMuSec = ((fileSize - sizeof(FileRecord::Header)) * 1000000UL) / ((m_sampleSize == 24 ? 8 : 4) * m_fileSampleRate);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
qCritical("FileSourceSource::openFileStream: bad CRC32 for header: %s", qPrintable(crcHex));
|
qCritical("FileSourceSource::openFileStream: bad CRC32 for header: %s", qPrintable(crcHex));
|
||||||
m_recordLength = 0;
|
m_recordLengthMuSec = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (getMessageQueueToGUI())
|
if (getMessageQueueToGUI())
|
||||||
@ -203,12 +203,12 @@ void FileSourceSource::openFileStream(const QString& fileName)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
m_recordLength = 0;
|
m_recordLengthMuSec = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
qDebug() << "FileSourceSource::openFileStream: " << m_fileName.toStdString().c_str()
|
qDebug() << "FileSourceSource::openFileStream: " << m_fileName.toStdString().c_str()
|
||||||
<< " fileSize: " << fileSize << " bytes"
|
<< " fileSize: " << fileSize << " bytes"
|
||||||
<< " length: " << m_recordLength << " seconds"
|
<< " length: " << m_recordLengthMuSec << " microseconds"
|
||||||
<< " sample rate: " << m_fileSampleRate << " S/s"
|
<< " sample rate: " << m_fileSampleRate << " S/s"
|
||||||
<< " center frequency: " << m_centerFrequency << " Hz"
|
<< " center frequency: " << m_centerFrequency << " Hz"
|
||||||
<< " sample size: " << m_sampleSize << " bits"
|
<< " sample size: " << m_sampleSize << " bits"
|
||||||
@ -220,11 +220,11 @@ void FileSourceSource::openFileStream(const QString& fileName)
|
|||||||
m_sampleSize,
|
m_sampleSize,
|
||||||
m_centerFrequency,
|
m_centerFrequency,
|
||||||
m_startingTimeStamp,
|
m_startingTimeStamp,
|
||||||
m_recordLength); // file stream data
|
m_recordLengthMuSec); // file stream data
|
||||||
getMessageQueueToGUI()->push(report);
|
getMessageQueueToGUI()->push(report);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m_recordLength == 0) {
|
if (m_recordLengthMuSec == 0) {
|
||||||
m_ifstream.close();
|
m_ifstream.close();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -233,7 +233,8 @@ void FileSourceSource::seekFileStream(int seekMillis)
|
|||||||
{
|
{
|
||||||
if ((m_ifstream.is_open()) && !m_running)
|
if ((m_ifstream.is_open()) && !m_running)
|
||||||
{
|
{
|
||||||
quint64 seekPoint = ((m_recordLength * seekMillis) / 1000) * m_fileSampleRate;
|
quint64 seekPoint = ((m_recordLengthMuSec * seekMillis) / 1000) * m_fileSampleRate;
|
||||||
|
seekPoint /= 1000000UL;
|
||||||
m_samplesCount = seekPoint;
|
m_samplesCount = seekPoint;
|
||||||
seekPoint *= (m_sampleSize == 24 ? 8 : 4); // + sizeof(FileRecord::Header)
|
seekPoint *= (m_sampleSize == 24 ? 8 : 4); // + sizeof(FileRecord::Header)
|
||||||
m_ifstream.clear();
|
m_ifstream.clear();
|
||||||
|
@ -78,7 +78,7 @@ public:
|
|||||||
|
|
||||||
uint32_t getFileSampleRate() const { return m_fileSampleRate; }
|
uint32_t getFileSampleRate() const { return m_fileSampleRate; }
|
||||||
quint64 getStartingTimeStamp() const { return m_startingTimeStamp; }
|
quint64 getStartingTimeStamp() const { return m_startingTimeStamp; }
|
||||||
quint64 getRecordLength() const { return m_recordLength; }
|
quint64 getRecordLengthMuSec() const { return m_recordLengthMuSec; }
|
||||||
quint32 getFileSampleSize() const { return m_sampleSize; }
|
quint32 getFileSampleSize() const { return m_sampleSize; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@ -105,7 +105,7 @@ private:
|
|||||||
quint64 m_samplesCount;
|
quint64 m_samplesCount;
|
||||||
uint32_t m_sampleRate;
|
uint32_t m_sampleRate;
|
||||||
uint32_t m_deviceSampleRate;
|
uint32_t m_deviceSampleRate;
|
||||||
quint64 m_recordLength; //!< record length in seconds computed from file size
|
quint64 m_recordLengthMuSec; //!< record length in microseconds computed from file size
|
||||||
quint64 m_startingTimeStamp;
|
quint64 m_startingTimeStamp;
|
||||||
QTimer m_masterTimer;
|
QTimer m_masterTimer;
|
||||||
bool m_running;
|
bool m_running;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user