SDRAngel  4.11.5
Developer docs for <a href="https://github.com/f4exb/sdrangel">SDRangel<\a>, an Open Source Qt5 / OpenGL 3.0+ SDR and signal analyzer frontend to various hardware.
nfmmodgui.cpp
Go to the documentation of this file.
1 // Copyright (C) 2016 Edouard Griffiths, F4EXB //
3 // //
4 // This program is free software; you can redistribute it and/or modify //
5 // it under the terms of the GNU General Public License as published by //
6 // the Free Software Foundation as version 3 of the License, or //
7 // (at your option) any later version. //
8 // //
9 // This program is distributed in the hope that it will be useful, //
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of //
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
12 // GNU General Public License V3 for more details. //
13 // //
14 // You should have received a copy of the GNU General Public License //
15 // along with this program. If not, see <http://www.gnu.org/licenses/>. //
17 
18 #include <QDockWidget>
19 #include <QMainWindow>
20 #include <QFileDialog>
21 #include <QTime>
22 #include <QDebug>
23 
24 #include "device/deviceuiset.h"
25 #include "plugin/pluginapi.h"
26 #include "util/simpleserializer.h"
27 #include "util/db.h"
28 #include "dsp/dspengine.h"
29 #include "gui/crightclickenabler.h"
30 #include "gui/audioselectdialog.h"
32 #include "mainwindow.h"
33 
34 #include "ui_nfmmodgui.h"
35 #include "nfmmodgui.h"
36 
37 
39 {
40  NFMModGUI* gui = new NFMModGUI(pluginAPI, deviceUISet, channelTx);
41  return gui;
42 }
43 
45 {
46  delete this;
47 }
48 
49 void NFMModGUI::setName(const QString& name)
50 {
51  setObjectName(name);
52 }
53 
54 QString NFMModGUI::getName() const
55 {
56  return objectName();
57 }
58 
61 }
62 
63 void NFMModGUI::setCenterFrequency(qint64 centerFrequency)
64 {
65  m_channelMarker.setCenterFrequency(centerFrequency);
66  applySettings();
67 }
68 
70 {
73  applySettings(true);
74 }
75 
76 QByteArray NFMModGUI::serialize() const
77 {
78  return m_settings.serialize();
79 }
80 
81 bool NFMModGUI::deserialize(const QByteArray& data)
82 {
83  if(m_settings.deserialize(data)) {
85  applySettings(true);
86  return true;
87  } else {
89  return false;
90  }
91 }
92 
93 bool NFMModGUI::handleMessage(const Message& message)
94 {
96  {
97  m_recordSampleRate = ((NFMMod::MsgReportFileSourceStreamData&)message).getSampleRate();
98  m_recordLength = ((NFMMod::MsgReportFileSourceStreamData&)message).getRecordLength();
99  m_samplesCount = 0;
101  return true;
102  }
104  {
105  m_samplesCount = ((NFMMod::MsgReportFileSourceStreamTiming&)message).getSamplesCount();
107  return true;
108  }
109  else if (NFMMod::MsgConfigureNFMMod::match(message))
110  {
112  m_settings = cfg.getSettings();
113  blockApplySettings(true);
114  displaySettings();
115  blockApplySettings(false);
116  return true;
117  }
118  else if (CWKeyer::MsgConfigureCWKeyer::match(message))
119  {
121  ui->cwKeyerGUI->setSettings(cfg.getSettings());
122  ui->cwKeyerGUI->displaySettings();
123  return true;
124  }
125  else
126  {
127  return false;
128  }
129 }
130 
132 {
133  ui->deltaFrequency->setValue(m_channelMarker.getCenterFrequency());
135  applySettings();
136 }
137 
139 {
140  Message* message;
141 
142  while ((message = getInputMessageQueue()->pop()) != 0)
143  {
144  if (handleMessage(*message))
145  {
146  delete message;
147  }
148  }
149 }
150 
152 {
155  applySettings();
156 }
157 
159 {
162  applySettings();
163 }
164 
166 {
167  ui->afBWText->setText(QString("%1k").arg(value));
168  m_settings.m_afBandwidth = value * 1000.0;
169  applySettings();
170 }
171 
173 {
174  ui->fmDevText->setText(QString("%1k").arg(value / 10.0, 0, 'f', 1));
175  m_settings.m_fmDeviation = value * 100.0;
176  applySettings();
177 }
178 
180 {
181  ui->volumeText->setText(QString("%1").arg(value / 10.0, 0, 'f', 1));
182  m_settings.m_volumeFactor = value / 10.0;
183  applySettings();
184 }
185 
187 {
188  ui->toneFrequencyText->setText(QString("%1k").arg(value / 100.0, 0, 'f', 2));
189  m_settings.m_toneFrequency = value * 10.0;
190  applySettings();
191 }
192 
194 {
195  m_settings.m_channelMute = checked;
196  applySettings();
197 }
198 
200 {
201  m_settings.m_playLoop = checked;
202  applySettings();
203 }
204 
205 void NFMModGUI::on_play_toggled(bool checked)
206 {
207  ui->tone->setEnabled(!checked); // release other source inputs
208  ui->mic->setEnabled(!checked);
209  ui->morseKeyer->setEnabled(!checked);
211  applySettings();
212  ui->navTimeSlider->setEnabled(!checked);
213  m_enableNavTime = !checked;
214 }
215 
216 void NFMModGUI::on_tone_toggled(bool checked)
217 {
218  ui->play->setEnabled(!checked); // release other source inputs
219  ui->mic->setEnabled(!checked);
220  ui->morseKeyer->setEnabled(!checked);
222  applySettings();
223 }
224 
226 {
227  ui->tone->setEnabled(!checked); // release other source inputs
228  ui->mic->setEnabled(!checked);
229  ui->play->setEnabled(!checked);
231  applySettings();
232 }
233 
234 void NFMModGUI::on_mic_toggled(bool checked)
235 {
236  ui->play->setEnabled(!checked); // release other source inputs
237  ui->tone->setEnabled(!checked); // release other source inputs
238  ui->morseKeyer->setEnabled(!checked);
240  applySettings();
241 }
242 
244 {
246  applySettings();
247 }
248 
250 {
251  ui->feedbackVolumeText->setText(QString("%1").arg(value / 100.0, 0, 'f', 2));
252  m_settings.m_feedbackVolumeFactor = value / 100.0;
253  applySettings();
254 }
255 
257 {
258  if (m_enableNavTime && ((value >= 0) && (value <= 100)))
259  {
260  int t_sec = (m_recordLength * value) / 100;
261  QTime t(0, 0, 0, 0);
262  t = t.addSecs(t_sec);
263 
265  m_nfmMod->getInputMessageQueue()->push(message);
266  }
267 }
268 
270 {
271  (void) checked;
272  QString fileName = QFileDialog::getOpenFileName(this,
273  tr("Open raw audio file"), ".", tr("Raw audio Files (*.raw)"), 0, QFileDialog::DontUseNativeDialog);
274 
275  if (fileName != "")
276  {
277  m_fileName = fileName;
278  ui->recordFileText->setText(m_fileName);
279  ui->play->setEnabled(true);
281  }
282 }
283 
285 {
286  m_settings.m_ctcssIndex = index;
287  applySettings();
288 }
289 
291 {
292  m_settings.m_ctcssOn = checked;
293  applySettings();
294 }
295 
296 
298 {
299  qDebug() << "FileSourceGui::configureFileName: " << m_fileName.toStdString().c_str();
301  m_nfmMod->getInputMessageQueue()->push(message);
302 }
303 
304 void NFMModGUI::onWidgetRolled(QWidget* widget, bool rollDown)
305 {
306  (void) widget;
307  (void) rollDown;
308 }
309 
310 void NFMModGUI::onMenuDialogCalled(const QPoint &p)
311 {
313  {
320  dialog.move(p);
321  dialog.exec();
322 
331 
332  setWindowTitle(m_settings.m_title);
334 
335  applySettings();
336  }
337 
339 }
340 
341 NFMModGUI::NFMModGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, BasebandSampleSource *channelTx, QWidget* parent) :
342  RollupWidget(parent),
343  ui(new Ui::NFMModGUI),
344  m_pluginAPI(pluginAPI),
345  m_deviceUISet(deviceUISet),
346  m_channelMarker(this),
347  m_doApplySettings(true),
348  m_recordLength(0),
349  m_recordSampleRate(48000),
350  m_samplesCount(0),
351  m_tickCount(0),
352  m_enableNavTime(false)
353 {
354  ui->setupUi(this);
355  setAttribute(Qt::WA_DeleteOnClose, true);
356 
357  blockApplySettings(true);
358 
359  ui->rfBW->clear();
360  for (int i = 0; i < NFMModSettings::m_nbRfBW; i++) {
361  ui->rfBW->addItem(QString("%1").arg(NFMModSettings::getRFBW(i) / 1000.0, 0, 'f', 2));
362  }
363  ui->rfBW->setCurrentIndex(6);
364 
365  blockApplySettings(false);
366 
367  connect(this, SIGNAL(widgetRolled(QWidget*,bool)), this, SLOT(onWidgetRolled(QWidget*,bool)));
368  connect(this, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(onMenuDialogCalled(const QPoint &)));
369 
370  m_nfmMod = (NFMMod*) channelTx; //new NFMMod(m_deviceUISet->m_deviceSinkAPI);
372 
373  connect(&MainWindow::getInstance()->getMasterTimer(), SIGNAL(timeout()), this, SLOT(tick()));
374 
375  CRightClickEnabler *audioMuteRightClickEnabler = new CRightClickEnabler(ui->mic);
376  connect(audioMuteRightClickEnabler, SIGNAL(rightClick(const QPoint &)), this, SLOT(audioSelect()));
377 
378  CRightClickEnabler *feedbackRightClickEnabler = new CRightClickEnabler(ui->feedbackEnable);
379  connect(feedbackRightClickEnabler, SIGNAL(rightClick(const QPoint &)), this, SLOT(audioFeedbackSelect()));
380 
381  ui->deltaFrequencyLabel->setText(QString("%1f").arg(QChar(0x94, 0x03)));
382  ui->deltaFrequency->setColorMapper(ColorMapper(ColorMapper::GrayGold));
383  ui->deltaFrequency->setValueRange(false, 7, -9999999, 9999999);
384 
385  m_channelMarker.blockSignals(true);
386  m_channelMarker.setColor(Qt::red);
389  m_channelMarker.setTitle("NFM Modulator");
391  m_channelMarker.blockSignals(false);
392  m_channelMarker.setVisible(true); // activate signal on the last setting only
393 
397 
398  connect(&m_channelMarker, SIGNAL(changedByCursor()), this, SLOT(channelMarkerChangedByCursor()));
399 
400  ui->play->setEnabled(false);
401  ui->play->setChecked(false);
402  ui->tone->setChecked(false);
403  ui->mic->setChecked(false);
404 
405  for (int i=0; i< NFMModSettings::m_nbCTCSSFreqs; i++)
406  {
407  ui->ctcss->addItem(QString("%1").arg((double) NFMModSettings::getCTCSSFreq(i), 0, 'f', 1));
408  }
409 
410  ui->cwKeyerGUI->setCWKeyer(m_nfmMod->getCWKeyer());
411 
412  connect(getInputMessageQueue(), SIGNAL(messageEnqueued()), this, SLOT(handleSourceMessages()));
413  connect(m_nfmMod, SIGNAL(levelChanged(qreal, qreal, int)), ui->volumeMeter, SLOT(levelChanged(qreal, qreal, int)));
414 
416  m_settings.setCWKeyerGUI(ui->cwKeyerGUI);
417 
418  displaySettings();
419  applySettings();
420 }
421 
423 {
425  delete m_nfmMod; // TODO: check this: when the GUI closes it has to delete the modulator
426  delete ui;
427 }
428 
430 {
431  m_doApplySettings = !block;
432 }
433 
434 void NFMModGUI::applySettings(bool force)
435 {
436  if (m_doApplySettings)
437  {
440  m_nfmMod->getInputMessageQueue()->push(msgChan);
441 
444  }
445 }
446 
448 {
449  m_channelMarker.blockSignals(true);
453  m_channelMarker.blockSignals(false);
454  m_channelMarker.setColor(m_settings.m_rgbColor); // activate signal on the last setting only
455 
457  setWindowTitle(m_channelMarker.getTitle());
458 
459  blockApplySettings(true);
460 
461  ui->deltaFrequency->setValue(m_channelMarker.getCenterFrequency());
462 
463  ui->rfBW->setCurrentIndex(NFMModSettings::getRFBWIndex(m_settings.m_rfBandwidth));
464 
465  ui->afBWText->setText(QString("%1k").arg(m_settings.m_afBandwidth / 1000.0));
466  ui->afBW->setValue(m_settings.m_afBandwidth / 1000.0);
467 
468  ui->fmDevText->setText(QString("%1k").arg(m_settings.m_fmDeviation / 1000.0, 0, 'f', 1));
469  ui->fmDev->setValue(m_settings.m_fmDeviation / 100.0);
470 
471  ui->volumeText->setText(QString("%1").arg(m_settings.m_volumeFactor, 0, 'f', 1));
472  ui->volume->setValue(m_settings.m_volumeFactor * 10.0);
473 
474  ui->toneFrequencyText->setText(QString("%1k").arg(m_settings.m_toneFrequency / 1000.0, 0, 'f', 2));
475  ui->toneFrequency->setValue(m_settings.m_toneFrequency / 10.0);
476 
477  ui->ctcssOn->setChecked(m_settings.m_ctcssOn);
478  ui->ctcss->setCurrentIndex(m_settings.m_ctcssIndex);
479 
480  ui->channelMute->setChecked(m_settings.m_channelMute);
481  ui->playLoop->setChecked(m_settings.m_playLoop);
482 
483  ui->tone->setEnabled((m_settings.m_modAFInput == NFMModSettings::NFMModInputAF::NFMModInputTone) || (m_settings.m_modAFInput == NFMModSettings::NFMModInputAF::NFMModInputNone));
484  ui->mic->setEnabled((m_settings.m_modAFInput == NFMModSettings::NFMModInputAF::NFMModInputAudio) || (m_settings.m_modAFInput == NFMModSettings::NFMModInputAF::NFMModInputNone));
485  ui->play->setEnabled((m_settings.m_modAFInput == NFMModSettings::NFMModInputAF::NFMModInputFile) || (m_settings.m_modAFInput == NFMModSettings::NFMModInputAF::NFMModInputNone));
486  ui->morseKeyer->setEnabled((m_settings.m_modAFInput == NFMModSettings::NFMModInputAF::NFMModInputCWTone) || (m_settings.m_modAFInput == NFMModSettings::NFMModInputAF::NFMModInputNone));
487 
488  ui->tone->setChecked(m_settings.m_modAFInput == NFMModSettings::NFMModInputAF::NFMModInputTone);
489  ui->mic->setChecked(m_settings.m_modAFInput == NFMModSettings::NFMModInputAF::NFMModInputAudio);
490  ui->play->setChecked(m_settings.m_modAFInput == NFMModSettings::NFMModInputAF::NFMModInputFile);
491  ui->morseKeyer->setChecked(m_settings.m_modAFInput == NFMModSettings::NFMModInputAF::NFMModInputCWTone);
492 
493  ui->feedbackEnable->setChecked(m_settings.m_feedbackAudioEnable);
494  ui->feedbackVolume->setValue(roundf(m_settings.m_feedbackVolumeFactor * 100.0));
495  ui->feedbackVolumeText->setText(QString("%1").arg(m_settings.m_feedbackVolumeFactor, 0, 'f', 2));
496 
497  blockApplySettings(false);
498 }
499 
500 
502 {
504 }
505 
507 {
509 }
510 
512 {
513  qDebug("NFMModGUI::audioSelect");
514  AudioSelectDialog audioSelect(DSPEngine::instance()->getAudioDeviceManager(), m_settings.m_audioDeviceName, true); // true for input
515  audioSelect.exec();
516 
517  if (audioSelect.m_selected)
518  {
520  applySettings();
521  }
522 }
523 
525 {
526  qDebug("NFMModGUI::audioFeedbackSelect");
527  AudioSelectDialog audioSelect(DSPEngine::instance()->getAudioDeviceManager(), m_settings.m_audioDeviceName, false); // false for output
528  audioSelect.exec();
529 
530  if (audioSelect.m_selected)
531  {
533  applySettings();
534  }
535 }
536 
538 {
539  double powDb = CalcDb::dbPower(m_nfmMod->getMagSq());
540  m_channelPowerDbAvg(powDb);
541  ui->channelPower->setText(tr("%1 dB").arg(m_channelPowerDbAvg.asDouble(), 0, 'f', 1));
542 
544  {
546  m_nfmMod->getInputMessageQueue()->push(message);
547  }
548 }
549 
551 {
552  QTime recordLength(0, 0, 0, 0);
553  recordLength = recordLength.addSecs(m_recordLength);
554  QString s_time = recordLength.toString("HH:mm:ss");
555  ui->recordLengthText->setText(s_time);
557 }
558 
560 {
561  int t_sec = 0;
562  int t_msec = 0;
563 
564  if (m_recordSampleRate > 0)
565  {
566  t_msec = ((m_samplesCount * 1000) / m_recordSampleRate) % 1000;
568  }
569 
570  QTime t(0, 0, 0, 0);
571  t = t.addSecs(t_sec);
572  t = t.addMSecs(t_msec);
573  QString s_timems = t.toString("HH:mm:ss.zzz");
574  QString s_time = t.toString("HH:mm:ss");
575  ui->relTimeText->setText(s_timems);
576 
577  if (!m_enableNavTime)
578  {
579  float posRatio = (float) t_sec / (float) m_recordLength;
580  ui->navTimeSlider->setValue((int) (posRatio * 100.0));
581  }
582 }
void configureFileName()
Definition: nfmmodgui.cpp:297
void removeTxChannelInstance(PluginInstanceGUI *pluginGUI)
NFMModGUI(PluginAPI *pluginAPI, DeviceUISet *deviceUISet, BasebandSampleSource *channelTx, QWidget *parent=0)
Definition: nfmmodgui.cpp:341
static MainWindow * getInstance()
Definition: mainwindow.h:73
const QString & getReverseAPIAddress() const
void on_toneFrequency_valueChanged(int value)
Definition: nfmmodgui.cpp:186
static const QString m_channelIdURI
Definition: nfmmod.h:251
bool deserialize(const QByteArray &data)
MovingAverageUtil< double, double, 20 > m_channelPowerDbAvg
Definition: nfmmodgui.h:68
int m_recordSampleRate
Definition: nfmmodgui.h:72
int getCenterFrequency() const
Definition: channelmarker.h:42
void registerTxChannelInstance(const QString &channelName, PluginInstanceGUI *pluginGUI)
Definition: deviceuiset.cpp:88
void push(Message *message, bool emitSignal=true)
Push message onto queue.
void leaveEvent(QEvent *)
Definition: nfmmodgui.cpp:501
static double dbPower(double magsq, double floor=1e-12)
Definition: db.cpp:22
void setName(const QString &name)
Definition: nfmmodgui.cpp:49
void updateWithStreamTime()
Definition: nfmmodgui.cpp:559
void on_ctcss_currentIndexChanged(int index)
Definition: nfmmodgui.cpp:284
static const int m_nbRfBW
bool m_feedbackAudioEnable
void handleSourceMessages()
Definition: nfmmodgui.cpp:138
int m_samplesCount
Definition: nfmmodgui.h:73
static const int m_nbCTCSSFreqs
MessageQueue * getInputMessageQueue()
Get the queue for asynchronous inbound communication.
ChannelMarker m_channelMarker
Definition: nfmmodgui.h:63
void audioFeedbackSelect()
Definition: nfmmodgui.cpp:524
void setReverseAPIChannelIndex(uint16_t channelIndex)
static float getCTCSSFreq(int index)
void setChannelMarker(Serializable *channelMarker)
void resetContextMenuType()
Definition: rollupwidget.h:50
void addChannelMarker(ChannelMarker *channelMarker)
Add channel marker to spectrum.
Definition: deviceuiset.cpp:72
void on_play_toggled(bool checked)
Definition: nfmmodgui.cpp:205
NFMMod * m_nfmMod
Definition: nfmmodgui.h:67
void displaySettings()
Definition: nfmmodgui.cpp:447
void on_feedbackVolume_valueChanged(int value)
Definition: nfmmodgui.cpp:249
void tick()
Definition: nfmmodgui.cpp:537
static MsgConfigureChannelizer * create(int sampleRate, int centerFrequency)
Definition: nfmmod.h:83
static MsgConfigureFileSourceSeek * create(int seekPercentage)
Definition: nfmmod.h:127
quint32 m_rgbColor
ContextMenuType m_contextMenuType
Definition: rollupwidget.h:33
Fixed< IntType, IntBits > arg(const std::complex< Fixed< IntType, IntBits > > &val)
Definition: fixed.h:2401
void setReverseAPIDeviceIndex(uint16_t deviceIndex)
std::size_t m_tickCount
Definition: nfmmodgui.h:74
void enterEvent(QEvent *)
Definition: nfmmodgui.cpp:506
void on_mic_toggled(bool checked)
Definition: nfmmodgui.cpp:234
void on_ctcssOn_toggled(bool checked)
Definition: nfmmodgui.cpp:290
bool deserialize(const QByteArray &data)
Definition: nfmmodgui.cpp:81
qint64 m_inputFrequencyOffset
void updateWithStreamData()
Definition: nfmmodgui.cpp:550
void setSourceOrSinkStream(bool sourceOrSinkStream)
Definition: channelmarker.h:75
static DSPEngine * instance()
Definition: dspengine.cpp:51
Definition: nfmmod.h:49
QString m_fileName
Definition: nfmmodgui.h:70
void setTitleColor(const QColor &c)
void setHighlighted(bool highlighted)
void applySettings(bool force=false)
Definition: nfmmodgui.cpp:434
void channelMarkerChangedByCursor()
Definition: nfmmodgui.cpp:131
void on_channelMute_toggled(bool checked)
Definition: nfmmodgui.cpp:193
int32_t i
Definition: decimators.h:244
void addRollupWidget(QWidget *widget)
Add rollup widget to channel window.
Definition: deviceuiset.cpp:77
virtual void setMessageQueueToGUI(MessageQueue *queue)
const QString & getTitle() const
Definition: channelmarker.h:38
Ui::NFMModGUI * ui
Definition: nfmmodgui.h:60
void on_rfBW_currentIndexChanged(int index)
Definition: nfmmodgui.cpp:158
static bool match(const Message *message)
Definition: message.cpp:45
void setCWKeyerGUI(Serializable *cwKeyerGUI)
void resetToDefaults()
Definition: nfmmodgui.cpp:69
void on_feedbackEnable_toggled(bool checked)
Definition: nfmmodgui.cpp:243
PluginAPI * m_pluginAPI
Definition: nfmmodgui.h:61
virtual bool handleMessage(const Message &message)
Definition: nfmmodgui.cpp:93
void on_morseKeyer_toggled(bool checked)
Definition: nfmmodgui.cpp:225
static MsgConfigureNFMMod * create(const NFMModSettings &settings, bool force)
Definition: nfmmod.h:60
uint16_t m_reverseAPIDeviceIndex
void on_tone_toggled(bool checked)
Definition: nfmmodgui.cpp:216
void on_playLoop_toggled(bool checked)
Definition: nfmmodgui.cpp:199
float m_feedbackVolumeFactor
bool m_doApplySettings
Definition: nfmmodgui.h:65
void setReverseAPIAddress(const QString &address)
virtual void destroy()
Definition: nfmmodgui.cpp:44
bool m_enableNavTime
Definition: nfmmodgui.h:75
static MsgConfigureFileSourceStreamTiming * create()
Definition: nfmmod.h:146
void setColor(const QColor &color)
void on_fmDev_valueChanged(int value)
Definition: nfmmodgui.cpp:172
void onMenuDialogCalled(const QPoint &p)
Definition: nfmmodgui.cpp:310
QByteArray serialize() const
NFMModSettings m_settings
Definition: nfmmodgui.h:64
virtual MessageQueue * getInputMessageQueue()
Definition: nfmmodgui.h:53
quint32 m_recordLength
Definition: nfmmodgui.h:71
virtual qint64 getCenterFrequency() const
Definition: nfmmodgui.cpp:59
void setVisible(bool visible)
NFMModInputAF m_modAFInput
virtual void setCenterFrequency(qint64 centerFrequency)
Definition: nfmmodgui.cpp:63
void blockApplySettings(bool block)
Definition: nfmmodgui.cpp:429
void audioSelect()
Definition: nfmmodgui.cpp:511
QString m_audioDeviceName
This is the audio device you get the audio samples from.
void setBandwidth(int bandwidth)
void on_showFileDialog_clicked(bool checked)
Definition: nfmmodgui.cpp:269
static int getRFBW(int index)
static NFMModGUI * create(PluginAPI *pluginAPI, DeviceUISet *deviceUISet, BasebandSampleSource *channelTx)
Definition: nfmmodgui.cpp:38
const QColor & getColor() const
Definition: channelmarker.h:64
void setTitle(const QString &title)
void on_volume_valueChanged(int value)
Definition: nfmmodgui.cpp:179
const NFMModSettings & getSettings() const
Definition: nfmmod.h:57
double getMagSq() const
Definition: nfmmod.h:247
static MsgConfigureFileSourceName * create(const QString &fileName)
Definition: nfmmod.h:106
void setCenterFrequency(int centerFrequency)
QString m_reverseAPIAddress
QByteArray serialize() const
Definition: nfmmodgui.cpp:76
QString getName() const
Definition: nfmmodgui.cpp:54
static int getRFBWIndex(int rfbw)
void on_afBW_valueChanged(int value)
Definition: nfmmodgui.cpp:165
uint16_t m_reverseAPIPort
QString m_feedbackAudioDeviceName
This is the audio device you send the audio samples to for audio feedback.
void widgetRolled(QWidget *widget, bool rollDown)
CWKeyer * getCWKeyer()
Definition: nfmmod.h:249
void setUseReverseAPI(bool useReverseAPI)
void on_deltaFrequency_changed(qint64 value)
Definition: nfmmodgui.cpp:151
const CWKeyerSettings & getSettings() const
Definition: cwkeyer.h:60
DeviceUISet * m_deviceUISet
Definition: nfmmodgui.h:62
void onWidgetRolled(QWidget *widget, bool rollDown)
Definition: nfmmodgui.cpp:304
uint16_t m_reverseAPIChannelIndex
void on_navTimeSlider_valueChanged(int value)
Definition: nfmmodgui.cpp:256
virtual ~NFMModGUI()
Definition: nfmmodgui.cpp:422