1
0
mirror of https://github.com/f4exb/sdrangel.git synced 2025-11-19 14:43:18 -05:00
sdrangel/plugins/channelrx/sigmffilesink/sigmffilesinksink.cpp

163 lines
5.6 KiB
C++
Raw Normal View History

2020-07-08 01:46:35 +02:00
///////////////////////////////////////////////////////////////////////////////////
// Copyright (C) 2020 Edouard Griffiths, F4EXB. //
// //
// 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 as version 3 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 V3 for more details. //
// //
// You should have received a copy of the GNU General Public License //
// along with this program. If not, see <http://www.gnu.org/licenses/>. //
///////////////////////////////////////////////////////////////////////////////////
2020-07-15 10:57:24 +02:00
#include <QDebug>
#include "dsp/dspcommands.h"
#include "dsp/sigmffilerecord.h"
2020-07-08 01:46:35 +02:00
#include "sigmffilesinksink.h"
SigMFFileSinkSink::SigMFFileSinkSink() :
2020-07-15 10:57:24 +02:00
m_recordEnabled(false),
m_record(false),
m_msCount(0),
m_byteCount(0)
2020-07-08 01:46:35 +02:00
{}
SigMFFileSinkSink::~SigMFFileSinkSink()
{}
void SigMFFileSinkSink::startRecording()
{
2020-07-15 10:57:24 +02:00
if (m_recordEnabled)
2020-07-08 01:46:35 +02:00
{
m_fileSink.startRecording();
m_record = true;
}
}
void SigMFFileSinkSink::stopRecording()
{
m_record = false;
m_fileSink.stopRecording();
}
void SigMFFileSinkSink::feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end)
{
2020-07-15 10:57:24 +02:00
for (SampleVector::const_iterator it = begin; it < end; ++it)
{
Complex c(it->real(), it->imag());
c *= m_nco.nextIQ();
if (m_interpolatorDistance == 1)
{
m_sampleBuffer.push_back(Sample(c.real(), c.imag()));
}
else
{
Complex ci;
if (m_interpolator.decimate(&m_interpolatorDistanceRemain, c, &ci))
{
m_sampleBuffer.push_back(Sample(ci.real(), ci.imag()));
m_interpolatorDistanceRemain += m_interpolatorDistance;
}
}
}
if (m_record)
{
2020-07-15 10:57:24 +02:00
m_fileSink.feed(m_sampleBuffer.begin(), m_sampleBuffer.end(), true);
int nbSamples = m_sampleBuffer.end() - m_sampleBuffer.begin();
m_byteCount += nbSamples * sizeof(Sample);
if (m_sinkSampleRate > 0) {
m_msCount += (nbSamples * 1000) / m_sinkSampleRate;
}
2020-07-08 01:46:35 +02:00
}
2020-07-15 10:57:24 +02:00
m_sampleBuffer.clear();
2020-07-08 01:46:35 +02:00
}
2020-07-15 10:57:24 +02:00
void SigMFFileSinkSink::applyChannelSettings(
int channelSampleRate,
int sinkSampleRate,
int channelFrequencyOffset,
int64_t centerFrequency,
bool force)
2020-07-08 01:46:35 +02:00
{
2020-07-15 10:57:24 +02:00
qDebug() << "SigMFFileSinkSink::applyChannelSettings:"
<< " channelSampleRate: " << channelSampleRate
<< " sinkSampleRate: " << sinkSampleRate
<< " channelFrequencyOffset: " << channelFrequencyOffset
<< " centerFrequency: " << centerFrequency
<< " force: " << force;
if ((m_channelFrequencyOffset != channelFrequencyOffset) ||
(m_channelSampleRate != channelSampleRate) || force)
{
m_nco.setFreq(-channelFrequencyOffset, channelSampleRate);
}
if ((m_channelSampleRate != channelSampleRate)
|| (m_sinkSampleRate != sinkSampleRate) || force)
{
m_interpolator.create(16, channelSampleRate, channelSampleRate / 2.2f);
m_interpolatorDistanceRemain = 0;
m_interpolatorDistance = (Real) channelSampleRate / (Real) sinkSampleRate;
}
if ((m_centerFrequency != centerFrequency)
|| (m_channelFrequencyOffset != channelFrequencyOffset)
|| (m_sinkSampleRate != sinkSampleRate) || force)
{
DSPSignalNotification *notif = new DSPSignalNotification(sinkSampleRate, centerFrequency + m_settings.m_inputFrequencyOffset);
m_fileSink.getInputMessageQueue()->push(notif);
}
m_channelSampleRate = channelSampleRate;
m_channelFrequencyOffset = channelFrequencyOffset;
m_sinkSampleRate = sinkSampleRate;
m_centerFrequency = centerFrequency;
}
void SigMFFileSinkSink::applySettings(const SigMFFileSinkSettings& settings, bool force)
{
qDebug() << "SigMFFileSinkSink::applySettings:"
<< "m_log2Decim:" << settings.m_log2Decim
<< "m_inputFrequencyOffset:" << settings.m_inputFrequencyOffset
<< "m_fileRecordName: " << settings.m_fileRecordName
<< "force: " << force;
if ((settings.m_fileRecordName != m_settings.m_fileRecordName) || force)
{
QString fileBase;
FileRecordInterface::RecordType recordType = FileRecordInterface::guessTypeFromFileName(settings.m_fileRecordName, fileBase);
if (recordType == FileRecordInterface::RecordTypeSigMF)
{
m_fileSink.setFileName(fileBase);
m_msCount = 0;
m_byteCount = 0;
2020-07-15 10:57:24 +02:00
m_recordEnabled = true;
}
else
{
m_recordEnabled = false;
}
}
if ((settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) || force)
{
DSPSignalNotification *notif = new DSPSignalNotification(m_sinkSampleRate, m_centerFrequency + m_settings.m_inputFrequencyOffset);
m_fileSink.getInputMessageQueue()->push(notif);
}
m_settings = settings;
}