#include #include #include #include #include #include #include #define CONCAT(a, b) ((std::string(a) + b).c_str()) MOD_INFO { /* Name: */ "fike_source", /* Description: */ "File input module for SDR++", /* Author: */ "Ryzerth", /* Version: */ "0.1.0" }; class FileSourceModule { public: FileSourceModule(std::string name) { this->name = name; handler.ctx = this; handler.selectHandler = menuSelected; handler.deselectHandler = menuDeselected; handler.menuHandler = menuHandler; handler.startHandler = start; handler.stopHandler = stop; handler.tuneHandler = tune; handler.stream = &stream; sigpath::sourceManager.registerSource("File", &handler); reader = new WavReader("D:/Downloads/20120416_glv_594_2.wav"); spdlog::info("Samplerate: {0}, Bit depth: {1}, Channel count: {2}", reader->getSampleRate(), reader->getBitDepth(), reader->getChannelCount()); spdlog::info("FileSourceModule '{0}': Instance created!", name); } ~FileSourceModule() { spdlog::info("FileSourceModule '{0}': Instance deleted!", name); } private: static void menuSelected(void* ctx) { FileSourceModule* _this = (FileSourceModule*)ctx; core::setInputSampleRate(_this->reader->getSampleRate()); spdlog::info("FileSourceModule '{0}': Menu Select!", _this->name); } static void menuDeselected(void* ctx) { FileSourceModule* _this = (FileSourceModule*)ctx; spdlog::info("FileSourceModule '{0}': Menu Deselect!", _this->name); } static void start(void* ctx) { FileSourceModule* _this = (FileSourceModule*)ctx; _this->workerThread = std::thread(worker, _this); spdlog::info("FileSourceModule '{0}': Start!", _this->name); } static void stop(void* ctx) { FileSourceModule* _this = (FileSourceModule*)ctx; _this->stream.stopWriter(); _this->workerThread.join(); _this->stream.clearWriteStop(); spdlog::info("FileSourceModule '{0}': Stop!", _this->name); } static void tune(double freq, void* ctx) { FileSourceModule* _this = (FileSourceModule*)ctx; spdlog::info("FileSourceModule '{0}': Tune: {1}!", _this->name, freq); } static void menuHandler(void* ctx) { FileSourceModule* _this = (FileSourceModule*)ctx; ImGui::Text("Hi from %s!", _this->name.c_str()); } static void worker(void* ctx) { FileSourceModule* _this = (FileSourceModule*)ctx; double sampleRate = _this->reader->getSampleRate(); int blockSize = sampleRate / 200.0; int16_t* inBuf = new int16_t[blockSize * 2]; while (true) { _this->reader->readSamples(inBuf, blockSize * 2 * sizeof(int16_t)); if (_this->stream.aquire() < 0) { break; }; for (int i = 0; i < blockSize; i++) { _this->stream.data[i].q = (float)inBuf[i * 2] / (float)0x7FFF; _this->stream.data[i].i = (float)inBuf[(i * 2) + 1] / (float)0x7FFF; } _this->stream.write(blockSize); //std::this_thread::sleep_for(std::chrono::milliseconds(5)); } delete[] inBuf; } std::string name; dsp::stream stream; SourceManager::SourceHandler handler; WavReader* reader; std::thread workerThread; }; MOD_EXPORT void _INIT_() { // Do your one time init here } MOD_EXPORT void* _CREATE_INSTANCE_(std::string name) { return new FileSourceModule(name); } MOD_EXPORT void _DELETE_INSTANCE_(void* instance) { delete (FileSourceModule*)instance; } MOD_EXPORT void _STOP_() { // Do your one shutdown here }