diff --git a/CMakeLists.txt b/CMakeLists.txt index 5b5362d..659ef51 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -287,6 +287,7 @@ SET (cubicsdr_sources src/modules/modem/analog/ModemAM.cpp src/modules/modem/analog/ModemDSB.cpp src/modules/modem/analog/ModemFM.cpp + src/modules/modem/analog/ModemNBFM.cpp src/modules/modem/analog/ModemFMStereo.cpp src/modules/modem/analog/ModemIQ.cpp src/modules/modem/analog/ModemLSB.cpp @@ -384,6 +385,7 @@ SET (cubicsdr_headers src/modules/modem/analog/ModemAM.h src/modules/modem/analog/ModemDSB.h src/modules/modem/analog/ModemFM.h + src/modules/modem/analog/ModemNBFM.h src/modules/modem/analog/ModemFMStereo.h src/modules/modem/analog/ModemIQ.h src/modules/modem/analog/ModemLSB.h diff --git a/src/AppFrame.cpp b/src/AppFrame.cpp index 5382d71..82c6f0e 100644 --- a/src/AppFrame.cpp +++ b/src/AppFrame.cpp @@ -76,6 +76,7 @@ AppFrame::AppFrame() : demodModeSelector = new ModeSelectorCanvas(demodPanel, attribList); demodModeSelector->addChoice("FM"); demodModeSelector->addChoice("FMS"); + demodModeSelector->addChoice("NBFM"); demodModeSelector->addChoice("AM"); demodModeSelector->addChoice("LSB"); demodModeSelector->addChoice("USB"); @@ -1940,7 +1941,9 @@ int AppFrame::OnGlobalKeyUp(wxKeyEvent &event) { case 'F': if (demodModeSelector->getSelectionLabel() == "FM") { demodModeSelector->setSelection("FMS"); - } else { + } else if (demodModeSelector->getSelectionLabel() == "FMS") { + demodModeSelector->setSelection("NBFM"); + } else if (demodModeSelector->getSelectionLabel() == "NBFM") { demodModeSelector->setSelection("FM"); } return 1; diff --git a/src/CubicSDR.cpp b/src/CubicSDR.cpp index b2239b6..51e6014 100644 --- a/src/CubicSDR.cpp +++ b/src/CubicSDR.cpp @@ -179,6 +179,7 @@ bool CubicSDR::OnInit() { #endif Modem::addModemFactory(new ModemFM); + Modem::addModemFactory(new ModemNBFM); Modem::addModemFactory(new ModemFMStereo); Modem::addModemFactory(new ModemAM); Modem::addModemFactory(new ModemLSB); diff --git a/src/CubicSDR.h b/src/CubicSDR.h index 6cfc00a..58a057f 100644 --- a/src/CubicSDR.h +++ b/src/CubicSDR.h @@ -30,6 +30,7 @@ #include "Modem.h" #include "ModemFM.h" +#include "ModemNBFM.h" #include "ModemFMStereo.h" #include "ModemAM.h" #include "ModemUSB.h" diff --git a/src/modules/modem/analog/ModemNBFM.cpp b/src/modules/modem/analog/ModemNBFM.cpp new file mode 100644 index 0000000..8a00869 --- /dev/null +++ b/src/modules/modem/analog/ModemNBFM.cpp @@ -0,0 +1,36 @@ +#include "ModemNBFM.h" + +ModemNBFM::ModemNBFM() : ModemAnalog() { + demodFM = freqdem_create(0.5); +} + +ModemNBFM::~ModemNBFM() { + freqdem_destroy(demodFM); +} + +Modem *ModemNBFM::factory() { + return new ModemNBFM; +} + +std::string ModemNBFM::getName() { + return "NBFM"; +} + +int ModemNBFM::getDefaultSampleRate() { + return 12500; +} + +void ModemNBFM::demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *audioOut) { + ModemKitAnalog *fmkit = (ModemKitAnalog *)kit; + + initOutputBuffers(fmkit, input); + + if (!bufSize) { + input->decRefCount(); + return; + } + + freqdem_demodulate_block(demodFM, &input->data[0], bufSize, &demodOutputData[0]); + + buildAudioOutput(fmkit, audioOut, false); +} diff --git a/src/modules/modem/analog/ModemNBFM.h b/src/modules/modem/analog/ModemNBFM.h new file mode 100644 index 0000000..b9d752b --- /dev/null +++ b/src/modules/modem/analog/ModemNBFM.h @@ -0,0 +1,20 @@ +#pragma once +#include "Modem.h" +#include "ModemAnalog.h" + +class ModemNBFM : public ModemAnalog { +public: + ModemNBFM(); + ~ModemNBFM(); + + std::string getName(); + + Modem *factory(); + + int getDefaultSampleRate(); + + void demodulate(ModemKit *kit, ModemIQData *input, AudioThreadInput *audioOut); + +private: + freqdem demodFM; +}; \ No newline at end of file diff --git a/src/visual/ModeSelectorContext.cpp b/src/visual/ModeSelectorContext.cpp index dde83bd..8eb626c 100644 --- a/src/visual/ModeSelectorContext.cpp +++ b/src/visual/ModeSelectorContext.cpp @@ -33,7 +33,7 @@ void ModeSelectorContext::DrawSelector(std::string label, int c, int cMax, bool int fontHeight = 16; - if (viewWidth < 30) { + if (viewWidth < 30 || viewHeight < 200) { fontSize = GLFont::GLFONT_SIZE12; fontHeight = 12; }