diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 1a32adf..7f57281 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -15,3 +15,6 @@ ENDIF(SDR_WITH_QT5 AND SDR_WITH_FFTW AND SDR_WITH_PORTAUDIO) add_executable(sdr_psk31 sdr_psk31.cc) target_link_libraries(sdr_psk31 ${LIBS} ${QT_LIBRARIES} libsdr libsdr-gui) + +add_executable(sdr_fm sdr_fm.cc) +target_link_libraries(sdr_fm ${LIBS} libsdr) diff --git a/examples/sdr_fm.cc b/examples/sdr_fm.cc new file mode 100644 index 0000000..f4c639c --- /dev/null +++ b/examples/sdr_fm.cc @@ -0,0 +1,73 @@ +#include "demod.hh" +#include "rtlsource.hh" +#include "baseband.hh" +#include "autocast.hh" +#include "portaudio.hh" +#include "wavfile.hh" + +#include +#include + +using namespace sdr; + +static void __sigint_handler(int signo) { + std::cerr << "Stop Queue..." << std::endl; + // On SIGINT -> stop queue properly + Queue::get().stop(); + Queue::get().wait(); +} + + +int main(int argc, char *argv[]) { + if (2 > argc) { std::cout << "USAGE: sdr_fm FREQUENCY [OUTPUT.wav]" << std::endl; return -1; } + + // get frequency + double freq = atof(argv[1]); + // Get output file (if given) + std::string outFile; + if (3 <= argc) { outFile = argv[2]; } + + sdr::Logger::get().addHandler( + new sdr::StreamLogHandler(std::cerr, sdr::LOG_DEBUG)); + + // Register handler: + signal(SIGINT, __sigint_handler); + + PortAudio::init(); + + RTLSource src(freq-100e3, 1e6); + AutoCast< std::complex > cast; + IQBaseBand baseband(100e3, 12.5e3, 21, 1, 8000.0); + baseband.setCenterFrequency(100e3); + baseband.setFilterFrequency(100e3); + FMDemod demod; + FMDeemph deemph; + PortSink audio; + WavSink *wav_sink = 0; + + // Assemble processing chain: + src.connect(&cast, true); + cast.connect(&baseband); + baseband.connect(&demod, true); + demod.connect(&deemph, true); + deemph.connect(&audio); + + if (outFile.size()) { + wav_sink = new WavSink(outFile); + deemph.connect(wav_sink); + } + + Queue::get().addStart(&src, &RTLSource::start); + Queue::get().addStop(&src, &RTLSource::stop); + + Queue::get().start(); + Queue::get().wait(); + + if (wav_sink) { + delete wav_sink; + } + + PortAudio::terminate(); + + return 0; +}