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) : UDPSink::UDPSink(DeviceSinkAPI *deviceAPI) :
ChannelSourceAPI(m_channelIdURI), ChannelSourceAPI(m_channelIdURI),
m_deviceAPI(deviceAPI), m_deviceAPI(deviceAPI),
m_outputSampleRate(48000),
m_basebandSampleRate(48000),
m_inputFrequencyOffset(0),
m_squelch(1e-6), m_squelch(1e-6),
m_spectrum(0), m_spectrum(0),
m_spectrumEnabled(false), m_spectrumEnabled(false),
@ -313,66 +316,31 @@ bool UDPSink::handleMessage(const Message& cmd)
if (UpChannelizer::MsgChannelizerNotification::match(cmd)) if (UpChannelizer::MsgChannelizerNotification::match(cmd))
{ {
UpChannelizer::MsgChannelizerNotification& notif = (UpChannelizer::MsgChannelizerNotification&) cmd; UpChannelizer::MsgChannelizerNotification& notif = (UpChannelizer::MsgChannelizerNotification&) cmd;
qDebug() << "UDPSink::handleMessage: MsgChannelizerNotification";
UDPSinkSettings settings = m_settings; applyChannelSettings(notif.getBasebandSampleRate(), notif.getSampleRate(), notif.getFrequencyOffset());
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;
return true; return true;
} }
else if (MsgConfigureChannelizer::match(cmd)) else if (MsgConfigureChannelizer::match(cmd))
{ {
MsgConfigureChannelizer& cfg = (MsgConfigureChannelizer&) cmd; MsgConfigureChannelizer& cfg = (MsgConfigureChannelizer&) cmd;
qDebug() << "UDPSink::handleMessage: MsgConfigureChannelizer:"
<< " sampleRate: " << cfg.getSampleRate()
<< " centerFrequency: " << cfg.getCenterFrequency();
m_channelizer->configure(m_channelizer->getInputMessageQueue(), m_channelizer->configure(m_channelizer->getInputMessageQueue(),
cfg.getSampleRate(), cfg.getSampleRate(),
cfg.getCenterFrequency()); cfg.getCenterFrequency());
qDebug() << "UDPSink::handleMessage: MsgConfigureChannelizer:"
<< " sampleRate: " << cfg.getSampleRate()
<< " centerFrequency: " << cfg.getCenterFrequency();
return true; return true;
} }
else if (MsgConfigureUDPSink::match(cmd)) else if (MsgConfigureUDPSink::match(cmd))
{ {
MsgConfigureUDPSink& cfg = (MsgConfigureUDPSink&) cmd; MsgConfigureUDPSink& cfg = (MsgConfigureUDPSink&) cmd;
qDebug() << "UDPSink::handleMessage: MsgConfigureUDPSink";
UDPSinkSettings settings = cfg.getSettings(); applySettings(cfg.getSettings(), cfg.getForce());
// 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();
return true; return true;
} }
@ -421,7 +389,7 @@ bool UDPSink::handleMessage(const Message& cmd)
m_settingsMutex.lock(); m_settingsMutex.lock();
m_interpolatorDistanceRemain = 0; m_interpolatorDistanceRemain = 0;
m_interpolatorConsumed = false; 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_interpolator.create(48, m_actualInputSampleRate, m_settings.m_rfBandwidth / 2.2, 3.0); // causes clicking: leaving at standard frequency
m_settingsMutex.unlock(); m_settingsMutex.unlock();
} }
@ -471,24 +439,65 @@ void UDPSink::resetReadIndex()
getInputMessageQueue()->push(cmd); 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) || qDebug() << "UDPSink::applyChannelSettings:"
(settings.m_outputSampleRate != m_settings.m_outputSampleRate) || force) << " basebandSampleRate: " << basebandSampleRate
<< " outputSampleRate: " << outputSampleRate
<< " inputFrequencyOffset: " << inputFrequencyOffset;
if ((inputFrequencyOffset != m_inputFrequencyOffset) ||
(outputSampleRate != m_outputSampleRate))
{ {
m_settingsMutex.lock(); m_settingsMutex.lock();
m_carrierNco.setFreq(settings.m_inputFrequencyOffset, settings.m_outputSampleRate); m_carrierNco.setFreq(inputFrequencyOffset, outputSampleRate);
m_settingsMutex.unlock(); m_settingsMutex.unlock();
} }
if((settings.m_outputSampleRate != m_settings.m_outputSampleRate) || if (outputSampleRate != m_outputSampleRate)
(settings.m_rfBandwidth != m_settings.m_rfBandwidth) || {
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) (settings.m_inputSampleRate != m_settings.m_inputSampleRate) || force)
{ {
m_settingsMutex.lock(); m_settingsMutex.lock();
m_interpolatorDistanceRemain = 0; m_interpolatorDistanceRemain = 0;
m_interpolatorConsumed = false; 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_interpolator.create(48, settings.m_inputSampleRate, settings.m_rfBandwidth / 2.2, 3.0);
m_actualInputSampleRate = settings.m_inputSampleRate; m_actualInputSampleRate = settings.m_inputSampleRate;
m_udpHandler.resetReadIndex(); m_udpHandler.resetReadIndex();
@ -515,7 +524,7 @@ void UDPSink::applySettings(const UDPSinkSettings& settings, bool force)
if ((settings.m_squelchGate != m_settings.m_squelchGate) || 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); initSquelch(m_squelchOpen);
} }
@ -543,7 +552,7 @@ void UDPSink::applySettings(const UDPSinkSettings& settings, bool force)
{ {
m_interpolatorDistanceRemain = 0; m_interpolatorDistanceRemain = 0;
m_interpolatorConsumed = false; 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_interpolator.create(48, settings.m_inputSampleRate, settings.m_rfBandwidth / 2.2, 3.0);
m_actualInputSampleRate = settings.m_inputSampleRate; m_actualInputSampleRate = settings.m_inputSampleRate;
m_udpHandler.resetReadIndex(); m_udpHandler.resetReadIndex();

View File

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

View File

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

View File

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