UDP Sink : use specific method to apply channelizer sample rate and frequency offset changes. Separate this data from settings

This commit is contained in:
f4exb 2017-12-30 00:30:41 +01:00
parent e5baca1a37
commit f27bb2d1c2
4 changed files with 66 additions and 58 deletions

View File

@ -35,6 +35,9 @@ const QString UDPSink::m_channelId = "UDPSink";
UDPSink::UDPSink(DeviceSinkAPI *deviceAPI) :
ChannelSourceAPI(m_channelIdURI),
m_deviceAPI(deviceAPI),
m_outputSampleRate(48000),
m_basebandSampleRate(48000),
m_inputFrequencyOffset(0),
m_squelch(1e-6),
m_spectrum(0),
m_spectrumEnabled(false),
@ -313,66 +316,31 @@ bool UDPSink::handleMessage(const Message& cmd)
if (UpChannelizer::MsgChannelizerNotification::match(cmd))
{
UpChannelizer::MsgChannelizerNotification& notif = (UpChannelizer::MsgChannelizerNotification&) cmd;
qDebug() << "UDPSink::handleMessage: MsgChannelizerNotification";
UDPSinkSettings settings = m_settings;
settings.m_basebandSampleRate = notif.getBasebandSampleRate();
settings.m_outputSampleRate = notif.getSampleRate();
settings.m_inputFrequencyOffset = notif.getFrequencyOffset();
applySettings(settings);
qDebug() << "UDPSink::handleMessage: MsgChannelizerNotification:"
<< " m_basebandSampleRate: " << settings.m_basebandSampleRate
<< " m_outputSampleRate: " << settings.m_outputSampleRate
<< " m_inputFrequencyOffset: " << settings.m_inputFrequencyOffset;
applyChannelSettings(notif.getBasebandSampleRate(), notif.getSampleRate(), notif.getFrequencyOffset());
return true;
}
else if (MsgConfigureChannelizer::match(cmd))
{
MsgConfigureChannelizer& cfg = (MsgConfigureChannelizer&) cmd;
qDebug() << "UDPSink::handleMessage: MsgConfigureChannelizer:"
<< " sampleRate: " << cfg.getSampleRate()
<< " centerFrequency: " << cfg.getCenterFrequency();
m_channelizer->configure(m_channelizer->getInputMessageQueue(),
cfg.getSampleRate(),
cfg.getCenterFrequency());
qDebug() << "UDPSink::handleMessage: MsgConfigureChannelizer:"
<< " sampleRate: " << cfg.getSampleRate()
<< " centerFrequency: " << cfg.getCenterFrequency();
return true;
}
else if (MsgConfigureUDPSink::match(cmd))
{
MsgConfigureUDPSink& cfg = (MsgConfigureUDPSink&) cmd;
qDebug() << "UDPSink::handleMessage: MsgConfigureUDPSink";
UDPSinkSettings settings = cfg.getSettings();
// These settings are set with DownChannelizer::MsgChannelizerNotification
m_absoluteFrequencyOffset = settings.m_inputFrequencyOffset;
settings.m_basebandSampleRate = m_settings.m_basebandSampleRate;
settings.m_outputSampleRate = m_settings.m_outputSampleRate;
settings.m_inputFrequencyOffset = m_settings.m_inputFrequencyOffset;
applySettings(settings, cfg.getForce());
qDebug() << "UDPSink::handleMessage: MsgConfigureUDPSink:"
<< " m_sampleFormat: " << settings.m_sampleFormat
<< " m_inputSampleRate: " << settings.m_inputSampleRate
<< " m_rfBandwidth: " << settings.m_rfBandwidth
<< " m_fmDeviation: " << settings.m_fmDeviation
<< " m_udpAddressStr: " << settings.m_udpAddress
<< " m_udpPort: " << settings.m_udpPort
<< " m_channelMute: " << settings.m_channelMute
<< " m_gainIn: " << settings.m_gainIn
<< " m_gainOut: " << settings.m_gainOut
<< " m_squelchGate: " << settings.m_squelchGate
<< " m_squelch: " << settings.m_squelch << "dB"
<< " m_squelchEnabled: " << settings.m_squelchEnabled
<< " m_autoRWBalance: " << settings.m_autoRWBalance
<< " m_stereoInput: " << settings.m_stereoInput
<< " force: " << cfg.getForce();
applySettings(cfg.getSettings(), cfg.getForce());
return true;
}
@ -421,7 +389,7 @@ bool UDPSink::handleMessage(const Message& cmd)
m_settingsMutex.lock();
m_interpolatorDistanceRemain = 0;
m_interpolatorConsumed = false;
m_interpolatorDistance = (Real) m_actualInputSampleRate / (Real) m_settings.m_outputSampleRate;
m_interpolatorDistance = (Real) m_actualInputSampleRate / (Real) m_outputSampleRate;
//m_interpolator.create(48, m_actualInputSampleRate, m_settings.m_rfBandwidth / 2.2, 3.0); // causes clicking: leaving at standard frequency
m_settingsMutex.unlock();
}
@ -471,24 +439,65 @@ void UDPSink::resetReadIndex()
getInputMessageQueue()->push(cmd);
}
void UDPSink::applySettings(const UDPSinkSettings& settings, bool force)
void UDPSink::applyChannelSettings(int basebandSampleRate, int outputSampleRate, int inputFrequencyOffset)
{
if ((settings.m_inputFrequencyOffset != m_settings.m_inputFrequencyOffset) ||
(settings.m_outputSampleRate != m_settings.m_outputSampleRate) || force)
qDebug() << "UDPSink::applyChannelSettings:"
<< " basebandSampleRate: " << basebandSampleRate
<< " outputSampleRate: " << outputSampleRate
<< " inputFrequencyOffset: " << inputFrequencyOffset;
if ((inputFrequencyOffset != m_inputFrequencyOffset) ||
(outputSampleRate != m_outputSampleRate))
{
m_settingsMutex.lock();
m_carrierNco.setFreq(settings.m_inputFrequencyOffset, settings.m_outputSampleRate);
m_carrierNco.setFreq(inputFrequencyOffset, outputSampleRate);
m_settingsMutex.unlock();
}
if((settings.m_outputSampleRate != m_settings.m_outputSampleRate) ||
(settings.m_rfBandwidth != m_settings.m_rfBandwidth) ||
if (outputSampleRate != m_outputSampleRate)
{
m_settingsMutex.lock();
m_interpolatorDistanceRemain = 0;
m_interpolatorConsumed = false;
m_interpolatorDistance = (Real) m_settings.m_inputSampleRate / (Real) outputSampleRate;
m_interpolator.create(48, m_settings.m_inputSampleRate, m_settings.m_rfBandwidth / 2.2, 3.0);
m_settingsMutex.unlock();
m_squelchThreshold = outputSampleRate * m_settings.m_squelchGate;
initSquelch(m_squelchOpen);
}
m_basebandSampleRate = basebandSampleRate;
m_outputSampleRate = outputSampleRate;
m_inputFrequencyOffset = inputFrequencyOffset;
}
void UDPSink::applySettings(const UDPSinkSettings& settings, bool force)
{
qDebug() << "UDPSink::applySettings:"
<< " m_inputFrequencyOffset: " << settings.m_inputFrequencyOffset
<< " m_sampleFormat: " << settings.m_sampleFormat
<< " m_inputSampleRate: " << settings.m_inputSampleRate
<< " m_rfBandwidth: " << settings.m_rfBandwidth
<< " m_fmDeviation: " << settings.m_fmDeviation
<< " m_udpAddressStr: " << settings.m_udpAddress
<< " m_udpPort: " << settings.m_udpPort
<< " m_channelMute: " << settings.m_channelMute
<< " m_gainIn: " << settings.m_gainIn
<< " m_gainOut: " << settings.m_gainOut
<< " m_squelchGate: " << settings.m_squelchGate
<< " m_squelch: " << settings.m_squelch << "dB"
<< " m_squelchEnabled: " << settings.m_squelchEnabled
<< " m_autoRWBalance: " << settings.m_autoRWBalance
<< " m_stereoInput: " << settings.m_stereoInput
<< " force: " << force;
if((settings.m_rfBandwidth != m_settings.m_rfBandwidth) ||
(settings.m_inputSampleRate != m_settings.m_inputSampleRate) || force)
{
m_settingsMutex.lock();
m_interpolatorDistanceRemain = 0;
m_interpolatorConsumed = false;
m_interpolatorDistance = (Real) settings.m_inputSampleRate / (Real) settings.m_outputSampleRate;
m_interpolatorDistance = (Real) settings.m_inputSampleRate / (Real) m_outputSampleRate;
m_interpolator.create(48, settings.m_inputSampleRate, settings.m_rfBandwidth / 2.2, 3.0);
m_actualInputSampleRate = settings.m_inputSampleRate;
m_udpHandler.resetReadIndex();
@ -515,7 +524,7 @@ void UDPSink::applySettings(const UDPSinkSettings& settings, bool force)
if ((settings.m_squelchGate != m_settings.m_squelchGate) || force)
{
m_squelchThreshold = settings.m_outputSampleRate * settings.m_squelchGate;
m_squelchThreshold = m_outputSampleRate * settings.m_squelchGate;
initSquelch(m_squelchOpen);
}
@ -543,7 +552,7 @@ void UDPSink::applySettings(const UDPSinkSettings& settings, bool force)
{
m_interpolatorDistanceRemain = 0;
m_interpolatorConsumed = false;
m_interpolatorDistance = (Real) settings.m_inputSampleRate / (Real) settings.m_outputSampleRate;
m_interpolatorDistance = (Real) settings.m_inputSampleRate / (Real) m_outputSampleRate;
m_interpolator.create(48, settings.m_inputSampleRate, settings.m_rfBandwidth / 2.2, 3.0);
m_actualInputSampleRate = settings.m_inputSampleRate;
m_udpHandler.resetReadIndex();

View File

@ -168,8 +168,10 @@ private:
ThreadedBasebandSampleSource* m_threadedChannelizer;
UpChannelizer* m_channelizer;
int m_basebandSampleRate;
Real m_outputSampleRate;
int m_inputFrequencyOffset;
UDPSinkSettings m_settings;
int m_absoluteFrequencyOffset;
Real m_squelch;
@ -217,6 +219,7 @@ private:
static const int m_sampleRateAverageItems = 17;
static const int m_ssbFftLen = 1024;
void applyChannelSettings(int basebandSampleRate, int outputSampleRate, int inputFrequencyOffset);
void applySettings(const UDPSinkSettings& settings, bool force = false);
void modulateSample();
void calculateLevel(Real sample);

View File

@ -30,10 +30,8 @@ UDPSinkSettings::UDPSinkSettings() :
void UDPSinkSettings::resetToDefaults()
{
m_outputSampleRate = 48000;
m_sampleFormat = FormatS16LE;
m_inputSampleRate = 48000;
m_basebandSampleRate = 48000;
m_inputFrequencyOffset = 0;
m_rfBandwidth = 12500;
m_fmDeviation = 2500;
@ -117,7 +115,7 @@ bool UDPSinkSettings::deserialize(const QByteArray& data)
m_sampleFormat = (SampleFormat) ((int) FormatNone - 1);
}
d.readReal(4, &m_outputSampleRate, 48000);
d.readReal(4, &m_inputSampleRate, 48000);
d.readReal(5, &m_rfBandwidth, 32000);
if (m_spectrumGUI)

View File

@ -34,8 +34,6 @@ struct UDPSinkSettings
FormatNone
};
int m_basebandSampleRate;
Real m_outputSampleRate;
SampleFormat m_sampleFormat;
Real m_inputSampleRate;
qint64 m_inputFrequencyOffset;