From 565083e5f5023fcc1af84d5579c3bf14ad8e2b7c Mon Sep 17 00:00:00 2001 From: f4exb Date: Sun, 10 Dec 2017 01:57:50 +0100 Subject: [PATCH] Web API: implemented device run APIs for BladeRF output, HackRF, PlutoSDR and LimeSDR ourput --- .../samplesink/bladerfoutput/CMakeLists.txt | 6 + .../bladerfoutput/bladerfoutput.cpp | 34 +++++- .../samplesink/bladerfoutput/bladerfoutput.h | 9 ++ .../bladerfoutput/bladerfoutput.pro | 2 + .../bladerfoutput/bladerfoutputplugin.cpp | 2 +- .../samplesink/hackrfoutput/CMakeLists.txt | 6 + .../samplesink/hackrfoutput/hackrfoutput.cpp | 34 ++++++ .../samplesink/hackrfoutput/hackrfoutput.h | 9 ++ .../hackrfoutput/hackrfoutputplugin.cpp | 2 +- .../limesdroutput/limesdroutput.cpp | 32 ++++++ .../samplesink/limesdroutput/limesdroutput.h | 9 ++ .../samplesink/plutosdroutput/CMakeLists.txt | 6 + .../plutosdroutput/plutosdroutput.cpp | 35 ++++++ .../plutosdroutput/plutosdroutput.h | 9 ++ .../plutosdroutput/plutosdroutput.pro | 2 + .../plutosdroutput/plutosdroutputplugin.cpp | 2 +- .../bladerfinput/bladerfinput.cpp | 4 +- .../samplesource/hackrfinput/CMakeLists.txt | 6 + .../samplesource/hackrfinput/hackrfinput.cpp | 33 ++++++ .../samplesource/hackrfinput/hackrfinput.h | 10 ++ .../samplesource/hackrfinput/hackrfinput.pro | 2 + .../hackrfinput/hackrfinputplugin.cpp | 2 +- .../limesdrinput/limesdrinput.cpp | 32 ++++++ .../samplesource/limesdrinput/limesdrinput.h | 9 ++ .../samplesource/plutosdrinput/CMakeLists.txt | 6 + .../plutosdrinput/plutosdrinput.cpp | 35 ++++++ .../plutosdrinput/plutosdrinput.h | 9 ++ .../plutosdrinput/plutosdrinput.pro | 2 + .../plutosdrinput/plutosdrinputplugin.cpp | 2 +- plugins/samplesource/rtlsdr/rtlsdrinput.cpp | 3 +- .../sdrdaemonsource/sdrdaemonsourceinput.cpp | 4 +- plugins/samplesource/sdrplay/sdrplayinput.cpp | 4 +- sdrbase/audio/audioinput.cpp | 89 +++++++++++++++ sdrbase/audio/audioinput.h | 5 +- sdrbase/audio/audiooutput.cpp | 86 ++++++++++++++ sdrbase/audio/audiooutput.h | 3 + sdrbase/dsp/dspengine.cpp | 8 +- swagger/sdrangel/examples/start_stop.py | 107 ++++++++++++++++++ 38 files changed, 638 insertions(+), 22 deletions(-) create mode 100644 swagger/sdrangel/examples/start_stop.py diff --git a/plugins/samplesink/bladerfoutput/CMakeLists.txt b/plugins/samplesink/bladerfoutput/CMakeLists.txt index 41779498f..0f4d99354 100644 --- a/plugins/samplesink/bladerfoutput/CMakeLists.txt +++ b/plugins/samplesink/bladerfoutput/CMakeLists.txt @@ -1,5 +1,7 @@ project(bladerfoutput) +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") + set(bladerfoutput_SOURCES bladerfoutputgui.cpp bladerfoutput.cpp @@ -24,6 +26,7 @@ if (BUILD_DEBIAN) include_directories( . ${CMAKE_CURRENT_BINARY_DIR} + ${CMAKE_SOURCE_DIR}/swagger/sdrangel/code/qt5/client ${CMAKE_SOURCE_DIR}/devices ${LIBBLADERFLIBSRC}/include ${LIBBLADERFLIBSRC}/src @@ -32,6 +35,7 @@ else (BUILD_DEBIAN) include_directories( . ${CMAKE_CURRENT_BINARY_DIR} + ${CMAKE_SOURCE_DIR}/swagger/sdrangel/code/qt5/client ${CMAKE_SOURCE_DIR}/devices ${LIBBLADERF_INCLUDE_DIR} ) @@ -57,6 +61,7 @@ target_link_libraries(outputbladerf bladerf sdrbase sdrgui + swagger bladerfdevice ) else (BUILD_DEBIAN) @@ -65,6 +70,7 @@ target_link_libraries(outputbladerf ${LIBBLADERF_LIBRARIES} sdrbase sdrgui + swagger bladerfdevice ) endif (BUILD_DEBIAN) diff --git a/plugins/samplesink/bladerfoutput/bladerfoutput.cpp b/plugins/samplesink/bladerfoutput/bladerfoutput.cpp index 56f5ea674..fa4f5181a 100644 --- a/plugins/samplesink/bladerfoutput/bladerfoutput.cpp +++ b/plugins/samplesink/bladerfoutput/bladerfoutput.cpp @@ -18,9 +18,11 @@ #include #include +#include "SWGDeviceSettings.h" +#include "SWGDeviceState.h" + #include "util/simpleserializer.h" #include "dsp/dspcommands.h" -#include "dsp/dspengine.h" #include "device/devicesinkapi.h" #include "device/devicesourceapi.h" #include "bladerf/devicebladerfshared.h" @@ -469,3 +471,33 @@ bool BladerfOutput::applySettings(const BladeRFOutputSettings& settings, bool fo return true; } + +int BladerfOutput::webapiRunGet( + SWGSDRangel::SWGDeviceState& response, + QString& errorMessage __attribute__((unused))) +{ + m_deviceAPI->getDeviceEngineStateStr(*response.getState()); + return 200; +} + +int BladerfOutput::webapiRun( + bool run, + SWGSDRangel::SWGDeviceState& response, + QString& errorMessage __attribute__((unused))) +{ + if (run) + { + if (m_deviceAPI->initGeneration()) + { + m_deviceAPI->startGeneration(); + } + } + else + { + m_deviceAPI->stopGeneration(); + } + + m_deviceAPI->getDeviceEngineStateStr(*response.getState()); + return 200; +} + diff --git a/plugins/samplesink/bladerfoutput/bladerfoutput.h b/plugins/samplesink/bladerfoutput/bladerfoutput.h index 215973a60..88db39554 100644 --- a/plugins/samplesink/bladerfoutput/bladerfoutput.h +++ b/plugins/samplesink/bladerfoutput/bladerfoutput.h @@ -84,6 +84,15 @@ public: virtual bool handleMessage(const Message& message); + virtual int webapiRunGet( + SWGSDRangel::SWGDeviceState& response, + QString& errorMessage); + + virtual int webapiRun( + bool run, + SWGSDRangel::SWGDeviceState& response, + QString& errorMessage); + private: bool openDevice(); void closeDevice(); diff --git a/plugins/samplesink/bladerfoutput/bladerfoutput.pro b/plugins/samplesink/bladerfoutput/bladerfoutput.pro index be58c5383..ba62f7337 100644 --- a/plugins/samplesink/bladerfoutput/bladerfoutput.pro +++ b/plugins/samplesink/bladerfoutput/bladerfoutput.pro @@ -22,6 +22,7 @@ CONFIG(MINGW64):LIBBLADERFSRC = "D:\softs\bladeRF\host\libraries\libbladeRF\incl INCLUDEPATH += $$PWD INCLUDEPATH += ../../../sdrbase INCLUDEPATH += ../../../sdrgui +INCLUDEPATH += ../../../swagger/sdrangel/code/qt5/client INCLUDEPATH += ../../../devices INCLUDEPATH += $$LIBBLADERFSRC @@ -44,6 +45,7 @@ FORMS += bladerfoutputgui.ui LIBS += -L../../../sdrbase/$${build_subdir} -lsdrbase LIBS += -L../../../sdrgui/$${build_subdir} -lsdrgui +LIBS += -L../../../swagger/$${build_subdir} -lswagger LIBS += -L../../../libbladerf/$${build_subdir} -llibbladerf LIBS += -L../../../devices/$${build_subdir} -ldevices diff --git a/plugins/samplesink/bladerfoutput/bladerfoutputplugin.cpp b/plugins/samplesink/bladerfoutput/bladerfoutputplugin.cpp index 8e77d2cce..01c49605c 100644 --- a/plugins/samplesink/bladerfoutput/bladerfoutputplugin.cpp +++ b/plugins/samplesink/bladerfoutput/bladerfoutputplugin.cpp @@ -26,7 +26,7 @@ const PluginDescriptor BladerfOutputPlugin::m_pluginDescriptor = { QString("BladerRF Output"), - QString("3.8.0"), + QString("3.8.6"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, diff --git a/plugins/samplesink/hackrfoutput/CMakeLists.txt b/plugins/samplesink/hackrfoutput/CMakeLists.txt index c6fec4c68..7a0ea9af9 100644 --- a/plugins/samplesink/hackrfoutput/CMakeLists.txt +++ b/plugins/samplesink/hackrfoutput/CMakeLists.txt @@ -1,5 +1,7 @@ project(hackrfoutput) +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") + set(hackrfoutput_SOURCES hackrfoutputgui.cpp hackrfoutput.cpp @@ -24,6 +26,7 @@ if (BUILD_DEBIAN) include_directories( . ${CMAKE_CURRENT_BINARY_DIR} + ${CMAKE_SOURCE_DIR}/swagger/sdrangel/code/qt5/client ${CMAKE_SOURCE_DIR}/devices ${LIBHACKRFSRC} ${LIBHACKRFSRC}/libhackrf/src @@ -32,6 +35,7 @@ else (BUILD_DEBIAN) include_directories( . ${CMAKE_CURRENT_BINARY_DIR} + ${CMAKE_SOURCE_DIR}/swagger/sdrangel/code/qt5/client ${CMAKE_SOURCE_DIR}/devices ${LIBHACKRF_INCLUDE_DIR} ) @@ -58,6 +62,7 @@ target_link_libraries(outputhackrf hackrf sdrbase sdrgui + swagger hackrfdevice ) else (BUILD_DEBIAN) @@ -66,6 +71,7 @@ target_link_libraries(outputhackrf ${LIBHACKRF_LIBRARIES} sdrbase sdrgui + swagger hackrfdevice ) endif (BUILD_DEBIAN) diff --git a/plugins/samplesink/hackrfoutput/hackrfoutput.cpp b/plugins/samplesink/hackrfoutput/hackrfoutput.cpp index 08842acea..4f9a8dbda 100644 --- a/plugins/samplesink/hackrfoutput/hackrfoutput.cpp +++ b/plugins/samplesink/hackrfoutput/hackrfoutput.cpp @@ -20,6 +20,9 @@ #include #include +#include "SWGDeviceSettings.h" +#include "SWGDeviceState.h" + #include "util/simpleserializer.h" #include "dsp/dspcommands.h" #include "dsp/dspengine.h" @@ -396,3 +399,34 @@ bool HackRFOutput::applySettings(const HackRFOutputSettings& settings, bool forc return true; } + +int HackRFOutput::webapiRunGet( + SWGSDRangel::SWGDeviceState& response, + QString& errorMessage __attribute__((unused))) +{ + m_deviceAPI->getDeviceEngineStateStr(*response.getState()); + return 200; +} + +int HackRFOutput::webapiRun( + bool run, + SWGSDRangel::SWGDeviceState& response, + QString& errorMessage __attribute__((unused))) +{ + if (run) + { + if (m_deviceAPI->initGeneration()) + { + m_deviceAPI->startGeneration(); + DSPEngine::instance()->startAudioInputImmediate(); + } + } + else + { + m_deviceAPI->stopGeneration(); + } + + m_deviceAPI->getDeviceEngineStateStr(*response.getState()); + return 200; +} + diff --git a/plugins/samplesink/hackrfoutput/hackrfoutput.h b/plugins/samplesink/hackrfoutput/hackrfoutput.h index cc5db5c76..aa6778e1a 100644 --- a/plugins/samplesink/hackrfoutput/hackrfoutput.h +++ b/plugins/samplesink/hackrfoutput/hackrfoutput.h @@ -84,6 +84,15 @@ public: virtual bool handleMessage(const Message& message); + virtual int webapiRunGet( + SWGSDRangel::SWGDeviceState& response, + QString& errorMessage); + + virtual int webapiRun( + bool run, + SWGSDRangel::SWGDeviceState& response, + QString& errorMessage); + private: bool openDevice(); void closeDevice(); diff --git a/plugins/samplesink/hackrfoutput/hackrfoutputplugin.cpp b/plugins/samplesink/hackrfoutput/hackrfoutputplugin.cpp index 04cb1ecae..38e41cbc0 100644 --- a/plugins/samplesink/hackrfoutput/hackrfoutputplugin.cpp +++ b/plugins/samplesink/hackrfoutput/hackrfoutputplugin.cpp @@ -29,7 +29,7 @@ const PluginDescriptor HackRFOutputPlugin::m_pluginDescriptor = { QString("HackRF Output"), - QString("3.8.0"), + QString("3.8.6"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, diff --git a/plugins/samplesink/limesdroutput/limesdroutput.cpp b/plugins/samplesink/limesdroutput/limesdroutput.cpp index c9a1568ed..d75c30c52 100644 --- a/plugins/samplesink/limesdroutput/limesdroutput.cpp +++ b/plugins/samplesink/limesdroutput/limesdroutput.cpp @@ -22,10 +22,12 @@ #include "SWGDeviceSettings.h" #include "SWGLimeSdrOutputSettings.h" +#include "SWGDeviceState.h" #include "device/devicesourceapi.h" #include "device/devicesinkapi.h" #include "dsp/dspcommands.h" +#include "dsp/dspengine.h" #include "limesdroutputthread.h" #include "limesdr/devicelimesdrparam.h" #include "limesdr/devicelimesdr.h" @@ -1077,3 +1079,33 @@ int LimeSDROutput::webapiSettingsPutPatch( return 200; } + +int LimeSDROutput::webapiRunGet( + SWGSDRangel::SWGDeviceState& response, + QString& errorMessage __attribute__((unused))) +{ + m_deviceAPI->getDeviceEngineStateStr(*response.getState()); + return 200; +} + +int LimeSDROutput::webapiRun( + bool run, + SWGSDRangel::SWGDeviceState& response, + QString& errorMessage __attribute__((unused))) +{ + if (run) + { + if (m_deviceAPI->initGeneration()) + { + m_deviceAPI->startGeneration(); + DSPEngine::instance()->startAudioInputImmediate(); + } + } + else + { + m_deviceAPI->stopGeneration(); + } + + m_deviceAPI->getDeviceEngineStateStr(*response.getState()); + return 200; +} diff --git a/plugins/samplesink/limesdroutput/limesdroutput.h b/plugins/samplesink/limesdroutput/limesdroutput.h index 238174f26..ce0f5d978 100644 --- a/plugins/samplesink/limesdroutput/limesdroutput.h +++ b/plugins/samplesink/limesdroutput/limesdroutput.h @@ -187,6 +187,15 @@ public: SWGSDRangel::SWGDeviceSettings& response, // query + response QString& errorMessage); + virtual int webapiRunGet( + SWGSDRangel::SWGDeviceState& response, + QString& errorMessage); + + virtual int webapiRun( + bool run, + SWGSDRangel::SWGDeviceState& response, + QString& errorMessage); + std::size_t getChannelIndex(); void getLORange(float& minF, float& maxF, float& stepF) const; void getSRRange(float& minF, float& maxF, float& stepF) const; diff --git a/plugins/samplesink/plutosdroutput/CMakeLists.txt b/plugins/samplesink/plutosdroutput/CMakeLists.txt index 6e54c74c9..313514d6f 100644 --- a/plugins/samplesink/plutosdroutput/CMakeLists.txt +++ b/plugins/samplesink/plutosdroutput/CMakeLists.txt @@ -1,5 +1,7 @@ project(plutosdroutput) +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") + set(plutosdroutput_SOURCES plutosdroutputgui.cpp plutosdroutput.cpp @@ -24,6 +26,7 @@ if (BUILD_DEBIAN) include_directories( . ${CMAKE_CURRENT_BINARY_DIR} + ${CMAKE_SOURCE_DIR}/swagger/sdrangel/code/qt5/client ${CMAKE_SOURCE_DIR}/devices ${LIBIIOSRC} ) @@ -31,6 +34,7 @@ else (BUILD_DEBIAN) include_directories( . ${CMAKE_CURRENT_BINARY_DIR} + ${CMAKE_SOURCE_DIR}/swagger/sdrangel/code/qt5/client ${CMAKE_SOURCE_DIR}/devices ${LIBIIO_INCLUDE_DIR} ) @@ -56,6 +60,7 @@ target_link_libraries(outputplutosdr iio sdrbase sdrgui + swagger plutosdrdevice ) else (BUILD_DEBIAN) @@ -64,6 +69,7 @@ target_link_libraries(outputplutosdr ${LIBIIO_LIBRARIES} sdrbase sdrgui + swagger plutosdrdevice ) endif (BUILD_DEBIAN) diff --git a/plugins/samplesink/plutosdroutput/plutosdroutput.cpp b/plugins/samplesink/plutosdroutput/plutosdroutput.cpp index afe37339d..b1ec278ba 100644 --- a/plugins/samplesink/plutosdroutput/plutosdroutput.cpp +++ b/plugins/samplesink/plutosdroutput/plutosdroutput.cpp @@ -16,7 +16,11 @@ #include +#include "SWGDeviceSettings.h" +#include "SWGDeviceState.h" + #include "dsp/dspcommands.h" +#include "dsp/dspengine.h" #include "device/devicesourceapi.h" #include "device/devicesinkapi.h" #include "plutosdr/deviceplutosdrparams.h" @@ -473,3 +477,34 @@ float PlutoSDROutput::getTemperature() DevicePlutoSDRBox *plutoBox = m_deviceShared.m_deviceParams->getBox(); return plutoBox->getTemp(); } + +int PlutoSDROutput::webapiRunGet( + SWGSDRangel::SWGDeviceState& response, + QString& errorMessage __attribute__((unused))) +{ + m_deviceAPI->getDeviceEngineStateStr(*response.getState()); + return 200; +} + +int PlutoSDROutput::webapiRun( + bool run, + SWGSDRangel::SWGDeviceState& response, + QString& errorMessage __attribute__((unused))) +{ + if (run) + { + if (m_deviceAPI->initGeneration()) + { + m_deviceAPI->startGeneration(); + DSPEngine::instance()->startAudioInputImmediate(); + } + } + else + { + m_deviceAPI->stopGeneration(); + } + + m_deviceAPI->getDeviceEngineStateStr(*response.getState()); + return 200; +} + diff --git a/plugins/samplesink/plutosdroutput/plutosdroutput.h b/plugins/samplesink/plutosdroutput/plutosdroutput.h index 746162306..596da1f5c 100644 --- a/plugins/samplesink/plutosdroutput/plutosdroutput.h +++ b/plugins/samplesink/plutosdroutput/plutosdroutput.h @@ -66,6 +66,15 @@ public: virtual bool handleMessage(const Message& message); + virtual int webapiRunGet( + SWGSDRangel::SWGDeviceState& response, + QString& errorMessage); + + virtual int webapiRun( + bool run, + SWGSDRangel::SWGDeviceState& response, + QString& errorMessage); + uint32_t getDACSampleRate() const { return m_deviceSampleRates.m_addaConnvRate; } uint32_t getFIRSampleRate() const { return m_deviceSampleRates.m_hb1Rate; } void getRSSI(std::string& rssiStr); diff --git a/plugins/samplesink/plutosdroutput/plutosdroutput.pro b/plugins/samplesink/plutosdroutput/plutosdroutput.pro index 7128c214f..96dd9551e 100644 --- a/plugins/samplesink/plutosdroutput/plutosdroutput.pro +++ b/plugins/samplesink/plutosdroutput/plutosdroutput.pro @@ -23,6 +23,7 @@ CONFIG(MINGW64):LIBIIOSRC = "D:\softs\libiio" INCLUDEPATH += $$PWD INCLUDEPATH += ../../../sdrbase INCLUDEPATH += ../../../sdrgui +INCLUDEPATH += ../../../swagger/sdrangel/code/qt5/client INCLUDEPATH += ../../../devices INCLUDEPATH += ../../../libiio/includemw INCLUDEPATH += $$LIBIIOSRC @@ -46,6 +47,7 @@ FORMS += plutosdroutputgui.ui LIBS += -L../../../sdrbase/$${build_subdir} -lsdrbase LIBS += -L../../../sdrgui/$${build_subdir} -lsdrgui +LIBS += -L../../../swagger/$${build_subdir} -lswagger LIBS += -L../../../libiio/$${build_subdir} -llibiio LIBS += -L../../../devices/$${build_subdir} -ldevices diff --git a/plugins/samplesink/plutosdroutput/plutosdroutputplugin.cpp b/plugins/samplesink/plutosdroutput/plutosdroutputplugin.cpp index ffaa23c14..a11c77201 100644 --- a/plugins/samplesink/plutosdroutput/plutosdroutputplugin.cpp +++ b/plugins/samplesink/plutosdroutput/plutosdroutputplugin.cpp @@ -28,7 +28,7 @@ class DeviceSourceAPI; const PluginDescriptor PlutoSDROutputPlugin::m_pluginDescriptor = { QString("PlutoSDR Output"), - QString("3.8.0"), + QString("3.8.6"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, diff --git a/plugins/samplesource/bladerfinput/bladerfinput.cpp b/plugins/samplesource/bladerfinput/bladerfinput.cpp index c670bae7b..06cffba9f 100644 --- a/plugins/samplesource/bladerfinput/bladerfinput.cpp +++ b/plugins/samplesource/bladerfinput/bladerfinput.cpp @@ -21,7 +21,6 @@ #include #include "SWGDeviceSettings.h" -#include "SWGRtlSdrSettings.h" #include "SWGDeviceState.h" #include "util/simpleserializer.h" @@ -564,13 +563,12 @@ int BladerfInput::webapiRun( if (m_deviceAPI->initAcquisition()) { m_deviceAPI->startAcquisition(); - DSPEngine::instance()->startAudioOutput(); + DSPEngine::instance()->startAudioOutputImmediate(); } } else { m_deviceAPI->stopAcquisition(); - DSPEngine::instance()->stopAudioOutput(); } m_deviceAPI->getDeviceEngineStateStr(*response.getState()); diff --git a/plugins/samplesource/hackrfinput/CMakeLists.txt b/plugins/samplesource/hackrfinput/CMakeLists.txt index bb2c25c72..98881b3d1 100644 --- a/plugins/samplesource/hackrfinput/CMakeLists.txt +++ b/plugins/samplesource/hackrfinput/CMakeLists.txt @@ -1,5 +1,7 @@ project(hackrfinput) +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") + set(hackrfinput_SOURCES hackrfinputgui.cpp hackrfinput.cpp @@ -24,6 +26,7 @@ if (BUILD_DEBIAN) include_directories( . ${CMAKE_CURRENT_BINARY_DIR} + ${CMAKE_SOURCE_DIR}/swagger/sdrangel/code/qt5/client ${CMAKE_SOURCE_DIR}/devices ${LIBHACKRFSRC} ${LIBHACKRFSRC}/libhackrf/src @@ -32,6 +35,7 @@ else (BUILD_DEBIAN) include_directories( . ${CMAKE_CURRENT_BINARY_DIR} + ${CMAKE_SOURCE_DIR}/swagger/sdrangel/code/qt5/client ${CMAKE_SOURCE_DIR}/devices ${LIBHACKRF_INCLUDE_DIR} ) @@ -58,6 +62,7 @@ target_link_libraries(inputhackrf hackrf sdrbase sdrgui + swagger hackrfdevice ) else (BUILD_DEBIAN) @@ -66,6 +71,7 @@ target_link_libraries(inputhackrf ${LIBHACKRF_LIBRARIES} sdrbase sdrgui + swagger hackrfdevice ) endif (BUILD_DEBIAN) diff --git a/plugins/samplesource/hackrfinput/hackrfinput.cpp b/plugins/samplesource/hackrfinput/hackrfinput.cpp index 1a7e0350b..cf4fa8b10 100644 --- a/plugins/samplesource/hackrfinput/hackrfinput.cpp +++ b/plugins/samplesource/hackrfinput/hackrfinput.cpp @@ -20,6 +20,9 @@ #include #include +#include "SWGDeviceSettings.h" +#include "SWGDeviceState.h" + #include "util/simpleserializer.h" #include "dsp/dspcommands.h" #include "dsp/dspengine.h" @@ -486,6 +489,36 @@ bool HackRFInput::applySettings(const HackRFInputSettings& settings, bool force) return true; } +int HackRFInput::webapiRunGet( + SWGSDRangel::SWGDeviceState& response, + QString& errorMessage __attribute__((unused))) +{ + m_deviceAPI->getDeviceEngineStateStr(*response.getState()); + return 200; +} + +int HackRFInput::webapiRun( + bool run, + SWGSDRangel::SWGDeviceState& response, + QString& errorMessage __attribute__((unused))) +{ + if (run) + { + if (m_deviceAPI->initAcquisition()) + { + m_deviceAPI->startAcquisition(); + DSPEngine::instance()->startAudioOutputImmediate(); + } + } + else + { + m_deviceAPI->stopAcquisition(); + } + + m_deviceAPI->getDeviceEngineStateStr(*response.getState()); + return 200; +} + //hackrf_device *HackRFInput::open_hackrf_from_sequence(int sequence) //{ // hackrf_device_list_t *hackrf_devices = hackrf_device_list(); diff --git a/plugins/samplesource/hackrfinput/hackrfinput.h b/plugins/samplesource/hackrfinput/hackrfinput.h index 33f7bc6cd..29a6654f0 100644 --- a/plugins/samplesource/hackrfinput/hackrfinput.h +++ b/plugins/samplesource/hackrfinput/hackrfinput.h @@ -104,6 +104,16 @@ public: virtual bool handleMessage(const Message& message); + virtual int webapiRunGet( + SWGSDRangel::SWGDeviceState& response, + QString& errorMessage); + + virtual int webapiRun( + bool run, + SWGSDRangel::SWGDeviceState& response, + QString& errorMessage); + + private: bool openDevice(); void closeDevice(); diff --git a/plugins/samplesource/hackrfinput/hackrfinput.pro b/plugins/samplesource/hackrfinput/hackrfinput.pro index d031d124c..a6f151a9c 100644 --- a/plugins/samplesource/hackrfinput/hackrfinput.pro +++ b/plugins/samplesource/hackrfinput/hackrfinput.pro @@ -22,6 +22,7 @@ CONFIG(MINGW64):LIBHACKRFSRC = "D:\softs\hackrf\host" INCLUDEPATH += $$PWD INCLUDEPATH += ../../../sdrbase INCLUDEPATH += ../../../sdrgui +INCLUDEPATH += ../../../swagger/sdrangel/code/qt5/client INCLUDEPATH += ../../../devices !macx:INCLUDEPATH += $$LIBHACKRFSRC macx:INCLUDEPATH += /opt/local/include @@ -45,6 +46,7 @@ FORMS += hackrfinputgui.ui LIBS += -L../../../sdrbase/$${build_subdir} -lsdrbase LIBS += -L../../../sdrgui/$${build_subdir} -lsdrgui +LIBS += -L../../../swagger/$${build_subdir} -lswagger !macx:LIBS += -L../../../libhackrf/$${build_subdir} -llibhackrf macx:LIBS += -L/opt/local/lib -lhackrf LIBS += -L../../../devices/$${build_subdir} -ldevices diff --git a/plugins/samplesource/hackrfinput/hackrfinputplugin.cpp b/plugins/samplesource/hackrfinput/hackrfinputplugin.cpp index 5bd613327..297d778d4 100644 --- a/plugins/samplesource/hackrfinput/hackrfinputplugin.cpp +++ b/plugins/samplesource/hackrfinput/hackrfinputplugin.cpp @@ -29,7 +29,7 @@ const PluginDescriptor HackRFInputPlugin::m_pluginDescriptor = { QString("HackRF Input"), - QString("3.8.2"), + QString("3.8.6"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, diff --git a/plugins/samplesource/limesdrinput/limesdrinput.cpp b/plugins/samplesource/limesdrinput/limesdrinput.cpp index e585cc071..d2ffdc771 100644 --- a/plugins/samplesource/limesdrinput/limesdrinput.cpp +++ b/plugins/samplesource/limesdrinput/limesdrinput.cpp @@ -22,11 +22,13 @@ #include "SWGDeviceSettings.h" #include "SWGLimeSdrInputSettings.h" +#include "SWGDeviceState.h" #include "device/devicesourceapi.h" #include "device/devicesinkapi.h" #include "dsp/dspcommands.h" #include "dsp/filerecord.h" +#include "dsp/dspengine.h" #include "limesdrinput.h" #include "limesdrinputthread.h" #include "limesdr/devicelimesdrparam.h" @@ -1243,3 +1245,33 @@ int LimeSDRInput::webapiSettingsPutPatch( return 200; } +int LimeSDRInput::webapiRunGet( + SWGSDRangel::SWGDeviceState& response, + QString& errorMessage __attribute__((unused))) +{ + m_deviceAPI->getDeviceEngineStateStr(*response.getState()); + return 200; +} + +int LimeSDRInput::webapiRun( + bool run, + SWGSDRangel::SWGDeviceState& response, + QString& errorMessage __attribute__((unused))) +{ + if (run) + { + if (m_deviceAPI->initAcquisition()) + { + m_deviceAPI->startAcquisition(); + DSPEngine::instance()->startAudioOutputImmediate(); + } + } + else + { + m_deviceAPI->stopAcquisition(); + } + + m_deviceAPI->getDeviceEngineStateStr(*response.getState()); + return 200; +} + diff --git a/plugins/samplesource/limesdrinput/limesdrinput.h b/plugins/samplesource/limesdrinput/limesdrinput.h index 1a5441f27..967b8df15 100644 --- a/plugins/samplesource/limesdrinput/limesdrinput.h +++ b/plugins/samplesource/limesdrinput/limesdrinput.h @@ -207,6 +207,15 @@ public: SWGSDRangel::SWGDeviceSettings& response, // query + response QString& errorMessage); + virtual int webapiRunGet( + SWGSDRangel::SWGDeviceState& response, + QString& errorMessage); + + virtual int webapiRun( + bool run, + SWGSDRangel::SWGDeviceState& response, + QString& errorMessage); + std::size_t getChannelIndex(); void getLORange(float& minF, float& maxF, float& stepF) const; void getSRRange(float& minF, float& maxF, float& stepF) const; diff --git a/plugins/samplesource/plutosdrinput/CMakeLists.txt b/plugins/samplesource/plutosdrinput/CMakeLists.txt index 68a1fe431..827bd4b0d 100644 --- a/plugins/samplesource/plutosdrinput/CMakeLists.txt +++ b/plugins/samplesource/plutosdrinput/CMakeLists.txt @@ -1,5 +1,7 @@ project(plutosdrinput) +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") + set(plutosdrinput_SOURCES plutosdrinputgui.cpp plutosdrinput.cpp @@ -24,6 +26,7 @@ if (BUILD_DEBIAN) include_directories( . ${CMAKE_CURRENT_BINARY_DIR} + ${CMAKE_SOURCE_DIR}/swagger/sdrangel/code/qt5/client ${CMAKE_SOURCE_DIR}/devices ${LIBIIOSRC} ) @@ -31,6 +34,7 @@ else (BUILD_DEBIAN) include_directories( . ${CMAKE_CURRENT_BINARY_DIR} + ${CMAKE_SOURCE_DIR}/swagger/sdrangel/code/qt5/client ${CMAKE_SOURCE_DIR}/devices ${LIBIIO_INCLUDE_DIR} ) @@ -56,6 +60,7 @@ target_link_libraries(inputplutosdr iio sdrbase sdrgui + swagger plutosdrdevice ) else (BUILD_DEBIAN) @@ -64,6 +69,7 @@ target_link_libraries(inputplutosdr ${LIBIIO_LIBRARIES} sdrbase sdrgui + swagger plutosdrdevice ) endif (BUILD_DEBIAN) diff --git a/plugins/samplesource/plutosdrinput/plutosdrinput.cpp b/plugins/samplesource/plutosdrinput/plutosdrinput.cpp index a898a58cb..c0e90cf59 100644 --- a/plugins/samplesource/plutosdrinput/plutosdrinput.cpp +++ b/plugins/samplesource/plutosdrinput/plutosdrinput.cpp @@ -16,8 +16,12 @@ #include +#include "SWGDeviceSettings.h" +#include "SWGDeviceState.h" + #include "dsp/filerecord.h" #include "dsp/dspcommands.h" +#include "dsp/dspengine.h" #include "device/devicesourceapi.h" #include "device/devicesinkapi.h" #include "plutosdr/deviceplutosdrparams.h" @@ -560,3 +564,34 @@ float PlutoSDRInput::getTemperature() DevicePlutoSDRBox *plutoBox = m_deviceShared.m_deviceParams->getBox(); return plutoBox->getTemp(); } + +int PlutoSDRInput::webapiRunGet( + SWGSDRangel::SWGDeviceState& response, + QString& errorMessage __attribute__((unused))) +{ + m_deviceAPI->getDeviceEngineStateStr(*response.getState()); + return 200; +} + +int PlutoSDRInput::webapiRun( + bool run, + SWGSDRangel::SWGDeviceState& response, + QString& errorMessage __attribute__((unused))) +{ + if (run) + { + if (m_deviceAPI->initAcquisition()) + { + m_deviceAPI->startAcquisition(); + DSPEngine::instance()->startAudioOutputImmediate(); + } + } + else + { + m_deviceAPI->stopAcquisition(); + } + + m_deviceAPI->getDeviceEngineStateStr(*response.getState()); + return 200; +} + diff --git a/plugins/samplesource/plutosdrinput/plutosdrinput.h b/plugins/samplesource/plutosdrinput/plutosdrinput.h index 3c664037d..7b33ca3d8 100644 --- a/plugins/samplesource/plutosdrinput/plutosdrinput.h +++ b/plugins/samplesource/plutosdrinput/plutosdrinput.h @@ -87,6 +87,15 @@ public: virtual bool handleMessage(const Message& message); + virtual int webapiRunGet( + SWGSDRangel::SWGDeviceState& response, + QString& errorMessage); + + virtual int webapiRun( + bool run, + SWGSDRangel::SWGDeviceState& response, + QString& errorMessage); + uint32_t getADCSampleRate() const { return m_deviceSampleRates.m_addaConnvRate; } uint32_t getFIRSampleRate() const { return m_deviceSampleRates.m_hb1Rate; } void getRSSI(std::string& rssiStr); diff --git a/plugins/samplesource/plutosdrinput/plutosdrinput.pro b/plugins/samplesource/plutosdrinput/plutosdrinput.pro index 5d335f85d..dab6ad546 100644 --- a/plugins/samplesource/plutosdrinput/plutosdrinput.pro +++ b/plugins/samplesource/plutosdrinput/plutosdrinput.pro @@ -23,6 +23,7 @@ CONFIG(MINGW64):LIBIIOSRC = "D:\softs\libiio" INCLUDEPATH += $$PWD INCLUDEPATH += ../../../sdrbase INCLUDEPATH += ../../../sdrgui +INCLUDEPATH += ../../../swagger/sdrangel/code/qt5/client INCLUDEPATH += ../../../devices INCLUDEPATH += ../../../libiio/includemw INCLUDEPATH += $$LIBIIOSRC @@ -46,6 +47,7 @@ FORMS += plutosdrinputgui.ui LIBS += -L../../../sdrbase/$${build_subdir} -lsdrbase LIBS += -L../../../sdrgui/$${build_subdir} -lsdrgui +LIBS += -L../../../swagger/$${build_subdir} -lswagger LIBS += -L../../../libiio/$${build_subdir} -llibiio LIBS += -L../../../devices/$${build_subdir} -ldevices diff --git a/plugins/samplesource/plutosdrinput/plutosdrinputplugin.cpp b/plugins/samplesource/plutosdrinput/plutosdrinputplugin.cpp index 2f9847eec..0205aef7c 100644 --- a/plugins/samplesource/plutosdrinput/plutosdrinputplugin.cpp +++ b/plugins/samplesource/plutosdrinput/plutosdrinputplugin.cpp @@ -28,7 +28,7 @@ class DeviceSourceAPI; const PluginDescriptor PlutoSDRInputPlugin::m_pluginDescriptor = { QString("PlutoSDR Input"), - QString("3.8.0"), + QString("3.8.6"), QString("(c) Edouard Griffiths, F4EXB"), QString("https://github.com/f4exb/sdrangel"), true, diff --git a/plugins/samplesource/rtlsdr/rtlsdrinput.cpp b/plugins/samplesource/rtlsdr/rtlsdrinput.cpp index 89b816194..a691e96bc 100644 --- a/plugins/samplesource/rtlsdr/rtlsdrinput.cpp +++ b/plugins/samplesource/rtlsdr/rtlsdrinput.cpp @@ -546,13 +546,12 @@ int RTLSDRInput::webapiRun( if (m_deviceAPI->initAcquisition()) { m_deviceAPI->startAcquisition(); - DSPEngine::instance()->startAudioOutput(); + DSPEngine::instance()->startAudioOutputImmediate(); } } else { m_deviceAPI->stopAcquisition(); - DSPEngine::instance()->stopAudioOutput(); } m_deviceAPI->getDeviceEngineStateStr(*response.getState()); diff --git a/plugins/samplesource/sdrdaemonsource/sdrdaemonsourceinput.cpp b/plugins/samplesource/sdrdaemonsource/sdrdaemonsourceinput.cpp index 844f1fabf..bfd2c03ef 100644 --- a/plugins/samplesource/sdrdaemonsource/sdrdaemonsourceinput.cpp +++ b/plugins/samplesource/sdrdaemonsource/sdrdaemonsourceinput.cpp @@ -19,7 +19,6 @@ #include #include "SWGDeviceSettings.h" -#include "SWGRtlSdrSettings.h" #include "SWGDeviceState.h" #include "util/simpleserializer.h" @@ -228,13 +227,12 @@ int SDRdaemonSourceInput::webapiRun( if (m_deviceAPI->initAcquisition()) { m_deviceAPI->startAcquisition(); - DSPEngine::instance()->startAudioOutput(); + DSPEngine::instance()->startAudioOutputImmediate(); } } else { m_deviceAPI->stopAcquisition(); - DSPEngine::instance()->stopAudioOutput(); } m_deviceAPI->getDeviceEngineStateStr(*response.getState()); diff --git a/plugins/samplesource/sdrplay/sdrplayinput.cpp b/plugins/samplesource/sdrplay/sdrplayinput.cpp index 853f43cca..6376c2a48 100644 --- a/plugins/samplesource/sdrplay/sdrplayinput.cpp +++ b/plugins/samplesource/sdrplay/sdrplayinput.cpp @@ -19,7 +19,6 @@ #include #include "SWGDeviceSettings.h" -#include "SWGRtlSdrSettings.h" #include "SWGDeviceState.h" #include "util/simpleserializer.h" @@ -588,13 +587,12 @@ int SDRPlayInput::webapiRun( if (m_deviceAPI->initAcquisition()) { m_deviceAPI->startAcquisition(); - DSPEngine::instance()->startAudioOutput(); + DSPEngine::instance()->startAudioOutputImmediate(); } } else { m_deviceAPI->stopAcquisition(); - DSPEngine::instance()->stopAudioOutput(); } m_deviceAPI->getDeviceEngineStateStr(*response.getState()); diff --git a/sdrbase/audio/audioinput.cpp b/sdrbase/audio/audioinput.cpp index ba7bcb36c..05f0b1b35 100644 --- a/sdrbase/audio/audioinput.cpp +++ b/sdrbase/audio/audioinput.cpp @@ -117,6 +117,79 @@ bool AudioInput::start(int device, int rate) return true; } +bool AudioInput::startImmediate(int device, int rate) +{ + + if (QIODevice::isOpen()) + { + qInfo("AudioInput::startImmediate: already started"); + return true; + } + + QAudioDeviceInfo devInfo; + QMutexLocker mutexLocker(&m_mutex); + + if (device < 0) + { + devInfo = QAudioDeviceInfo::defaultInputDevice(); + qWarning("AudioInput::startImmediate: using default device %s", qPrintable(devInfo.defaultInputDevice().deviceName())); + } + else + { + QList devicesInfo = QAudioDeviceInfo::availableDevices(QAudio::AudioInput); + + if (device < devicesInfo.size()) + { + devInfo = devicesInfo[device]; + qWarning("AudioInput::startImmediate: using audio device #%d: %s", device, qPrintable(devInfo.defaultInputDevice().deviceName())); + } + else + { + devInfo = QAudioDeviceInfo::defaultInputDevice(); + qWarning("AudioInput::startImmediate: audio device #%d does not exist. Using default device %s", device, qPrintable(devInfo.defaultInputDevice().deviceName())); + } + } + + //QAudioDeviceInfo devInfo(QAudioDeviceInfo::defaultOutputDevice()); + + m_audioFormat.setSampleRate(rate); + m_audioFormat.setChannelCount(2); + m_audioFormat.setSampleSize(16); + m_audioFormat.setCodec("audio/pcm"); + m_audioFormat.setByteOrder(QAudioFormat::LittleEndian); + m_audioFormat.setSampleType(QAudioFormat::SignedInt); + + if (!devInfo.isFormatSupported(m_audioFormat)) + { + m_audioFormat = devInfo.nearestFormat(m_audioFormat); + qWarning("AudioInput::startImmediate: %d Hz S16_LE audio format not supported. New rate: %d", rate, m_audioFormat.sampleRate()); + } + else + { + qInfo("AudioInput::startImmediate: audio format OK"); + } + + if (m_audioFormat.sampleSize() != 16) + { + qWarning("AudioInput::startImmediate: Audio device ( %s ) failed", qPrintable(devInfo.defaultInputDevice().deviceName())); + return false; + } + + m_audioInput = new QAudioInput(devInfo, m_audioFormat); + m_audioInput->setVolume(m_volume); + + QIODevice::open(QIODevice::ReadWrite); + + m_audioInput->start(this); + + if (m_audioInput->state() != QAudio::ActiveState) + { + qWarning("AudioInput::startImmediate: cannot start"); + } + + return true; +} + void AudioInput::stop() { qDebug("AudioInput::stop"); @@ -129,6 +202,7 @@ void AudioInput::stop() if (m_audioUsageCount == 0) { + qDebug("AudioInput::stop: effectively close QIODevice"); QIODevice::close(); if (!m_onExit) { @@ -138,6 +212,21 @@ void AudioInput::stop() } } +void AudioInput::stopImmediate() +{ + if (!QIODevice::isOpen()) + { + qInfo("AudioInput::stopImmediate: already stopped"); + } + else + { + qDebug("AudioInput::stopImmediate"); + QMutexLocker mutexLocker(&m_mutex); + QIODevice::close(); + delete m_audioInput; + } +} + void AudioInput::addFifo(AudioFifo* audioFifo) { QMutexLocker mutexLocker(&m_mutex); diff --git a/sdrbase/audio/audioinput.h b/sdrbase/audio/audioinput.h index c08d366b6..645143a0f 100644 --- a/sdrbase/audio/audioinput.h +++ b/sdrbase/audio/audioinput.h @@ -37,7 +37,10 @@ public: bool start(int device, int rate); void stop(); - void addFifo(AudioFifo* audioFifo); + bool startImmediate(int device, int rate); + void stopImmediate(); + + void addFifo(AudioFifo* audioFifo); void removeFifo(AudioFifo* audioFifo); uint getRate() const { return m_audioFormat.sampleRate(); } diff --git a/sdrbase/audio/audiooutput.cpp b/sdrbase/audio/audiooutput.cpp index c72dc5ca1..62b4bbe66 100644 --- a/sdrbase/audio/audiooutput.cpp +++ b/sdrbase/audio/audiooutput.cpp @@ -116,6 +116,77 @@ bool AudioOutput::start(int device, int rate) return true; } +bool AudioOutput::startImmediate(int device, int rate) +{ + if (QIODevice::isOpen()) + { + qInfo("AudioOutput::startImmediate: already open"); + return true; + } + + QMutexLocker mutexLocker(&m_mutex); + QAudioDeviceInfo devInfo; + + if (device < 0) + { + devInfo = QAudioDeviceInfo::defaultOutputDevice(); + qWarning("AudioOutput::startImmediate: using default device %s", qPrintable(devInfo.defaultOutputDevice().deviceName())); + } + else + { + QList devicesInfo = QAudioDeviceInfo::availableDevices(QAudio::AudioOutput); + + if (device < devicesInfo.size()) + { + devInfo = devicesInfo[device]; + qWarning("AudioOutput::startImmediate: using audio device #%d: %s", device, qPrintable(devInfo.defaultOutputDevice().deviceName())); + } + else + { + devInfo = QAudioDeviceInfo::defaultOutputDevice(); + qWarning("AudioOutput::startImmediate: audio device #%d does not exist. Using default device %s", device, qPrintable(devInfo.defaultOutputDevice().deviceName())); + } + } + + //QAudioDeviceInfo devInfo(QAudioDeviceInfo::defaultOutputDevice()); + + m_audioFormat.setSampleRate(rate); + m_audioFormat.setChannelCount(2); + m_audioFormat.setSampleSize(16); + m_audioFormat.setCodec("audio/pcm"); + m_audioFormat.setByteOrder(QAudioFormat::LittleEndian); + m_audioFormat.setSampleType(QAudioFormat::SignedInt); + + if (!devInfo.isFormatSupported(m_audioFormat)) + { + m_audioFormat = devInfo.nearestFormat(m_audioFormat); + qWarning("AudioOutput::startImmediate: %d Hz S16_LE audio format not supported. New rate: %d", rate, m_audioFormat.sampleRate()); + } + else + { + qInfo("AudioOutput::startImmediate: audio format OK"); + } + + if (m_audioFormat.sampleSize() != 16) + { + qWarning("AudioOutput::startImmediate: Audio device ( %s ) failed", qPrintable(devInfo.defaultOutputDevice().deviceName())); + return false; + } + + m_audioOutput = new QAudioOutput(devInfo, m_audioFormat); + + QIODevice::open(QIODevice::ReadOnly); + + m_audioOutput->start(this); + + if (m_audioOutput->state() != QAudio::ActiveState) + { + qWarning("AudioOutput::startImmediate: cannot start"); + } + + return true; +} + void AudioOutput::stop() { qDebug("AudioOutput::stop"); @@ -137,6 +208,21 @@ void AudioOutput::stop() } } +void AudioOutput::stopImmediate() +{ + if (!QIODevice::isOpen()) + { + qInfo("AudioOutput::stopImmediate"); + } + else + { + qDebug("AudioOutput::stopImmediate"); + QMutexLocker mutexLocker(&m_mutex); + QIODevice::close(); + delete m_audioOutput; + } +} + void AudioOutput::addFifo(AudioFifo* audioFifo) { QMutexLocker mutexLocker(&m_mutex); diff --git a/sdrbase/audio/audiooutput.h b/sdrbase/audio/audiooutput.h index 6e3f19a15..a6d5b6ced 100644 --- a/sdrbase/audio/audiooutput.h +++ b/sdrbase/audio/audiooutput.h @@ -37,6 +37,9 @@ public: bool start(int device, int rate); void stop(); + bool startImmediate(int device, int rate); + void stopImmediate(); + void addFifo(AudioFifo* audioFifo); void removeFifo(AudioFifo* audioFifo); diff --git a/sdrbase/dsp/dspengine.cpp b/sdrbase/dsp/dspengine.cpp index 2589ce9bf..67c93c9d6 100644 --- a/sdrbase/dsp/dspengine.cpp +++ b/sdrbase/dsp/dspengine.cpp @@ -104,13 +104,13 @@ void DSPEngine::stopAudioOutput() void DSPEngine::startAudioOutputImmediate() { - m_audioOutput.start(m_audioOutputDeviceIndex, m_audioOutputSampleRate); + m_audioOutput.startImmediate(m_audioOutputDeviceIndex, m_audioOutputSampleRate); m_audioOutputSampleRate = m_audioOutput.getRate(); // update with actual rate } void DSPEngine::stopAudioOutputImmediate() { - m_audioOutput.stop(); + m_audioOutput.stopImmediate(); } void DSPEngine::startAudioInput() @@ -126,13 +126,13 @@ void DSPEngine::stopAudioInput() void DSPEngine::startAudioInputImmediate() { - m_audioInput.start(m_audioInputDeviceIndex, m_audioInputSampleRate); + m_audioInput.startImmediate(m_audioInputDeviceIndex, m_audioInputSampleRate); m_audioInputSampleRate = m_audioInput.getRate(); // update with actual rate } void DSPEngine::stopAudioInputImmediate() { - m_audioInput.stop(); + m_audioInput.stopImmediate(); } void DSPEngine::addAudioSink(AudioFifo* audioFifo) diff --git a/swagger/sdrangel/examples/start_stop.py b/swagger/sdrangel/examples/start_stop.py new file mode 100644 index 000000000..0dc10d702 --- /dev/null +++ b/swagger/sdrangel/examples/start_stop.py @@ -0,0 +1,107 @@ +#!/usr/bin/env python + +import requests, json, traceback, sys +from optparse import OptionParser + +base_url = "http://127.0.0.1:8888/sdrangel" + +# ====================================================================== +def getInputOptions(): + + parser = OptionParser(usage="usage: %%prog [-t]\n") + parser.add_option("-a", "--address", dest="address", help="address and port", metavar="ADDRESS", type="string") + parser.add_option("-d", "--device-index", dest="device_index", help="device set index", metavar="INDEX", type="int") + parser.add_option("-t", "--stop", dest="stop", help="stop device", metavar="STOP", action="store_true", default=False) + parser.add_option("-s", "--start", dest="start", help="start device", metavar="START", action="store_true", default=False) + + (options, args) = parser.parse_args() + + if (options.address == None): + options.address = "127.0.0.1:8888" + + if options.device_index < 0: + otions.device_index = 0 + + if options.start and options.stop: + print("Cannot start and stop at the same time") + exit(1) + + if not options.start and not options.stop: + print("Must start or stop") + exit(1) + + return options + +# ====================================================================== +def startDevice(deviceIndex): + dev_run_url = base_url+("/deviceset/%d/device/run" % deviceIndex) + r = requests.get(url=dev_run_url) + if r.status_code == 200: + rj = r.json() + state = rj.get("state", None) + if state is not None: + if state == "idle": + r = requests.post(url=dev_run_url) + if r.status_code == 200: + print("Device %d started" % deviceIndex) + else: + print("Error starting device %d" % deviceIndex) + else: + print("device %d not in idle state" % deviceIndex) + else: + print("Cannot get device %d running state" % deviceIndex) + else: + print("Error getting device %d running state" % deviceIndex) + +# ====================================================================== +def stopDevice(deviceIndex): + dev_run_url = base_url+("/deviceset/%d/device/run" % deviceIndex) + r = requests.get(url=dev_run_url) + if r.status_code == 200: + rj = r.json() + state = rj.get("state", None) + if state is not None: + if state == "running": + r = requests.delete(url=dev_run_url) + if r.status_code == 200: + print("Device %d stopped" % deviceIndex) + else: + print("Error stopping device %d" % deviceIndex) + else: + print("device %d not in running state" % deviceIndex) + else: + print("Cannot get device %d running state" % deviceIndex) + else: + print("Error getting device %d running state" % deviceIndex) + +# ====================================================================== +def main(): + try: + options = getInputOptions() + global base_url + base_url = "http://%s/sdrangel" % options.address + r = requests.get(url=base_url+"/devicesets") + if r.status_code == 200: + rj = r.json() + deviceSets = rj.get("deviceSets", None) + if deviceSets is not None: + if options.device_index < len(deviceSets): + if options.start: + startDevice(options.device_index) + if options.stop: + stopDevice(options.device_index) + else: + print("Invalid device set index. Number of device sets is %d" % len(deviceSets)) + else: + print("Cannot get device sets configuration") + else: + print("Error getting device sets configuration") + + except Exception, msg: + tb = traceback.format_exc() + print >> sys.stderr, tb + + +if __name__ == "__main__": + main() +