2014-11-22 22:33:32 -05:00
|
|
|
#include <DemodulatorMgr.h>
|
2014-12-10 00:34:27 -05:00
|
|
|
#include <sstream>
|
|
|
|
#include <algorithm>
|
2014-12-10 21:22:13 -05:00
|
|
|
#include "CubicSDR.h"
|
2014-12-11 20:50:58 -05:00
|
|
|
#include <string>
|
|
|
|
#include <sstream>
|
2014-11-22 22:33:32 -05:00
|
|
|
|
2014-12-10 00:34:27 -05:00
|
|
|
DemodulatorMgr::DemodulatorMgr() :
|
2014-12-16 21:30:03 -05:00
|
|
|
activeDemodulator(NULL), lastActiveDemodulator(NULL), activeVisualDemodulator(NULL) {
|
2014-11-22 22:33:32 -05:00
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
DemodulatorMgr::~DemodulatorMgr() {
|
2014-12-16 21:30:03 -05:00
|
|
|
terminateAll();
|
2014-11-22 22:33:32 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
DemodulatorInstance *DemodulatorMgr::newThread() {
|
2014-12-16 21:30:03 -05:00
|
|
|
DemodulatorInstance *newDemod = new DemodulatorInstance;
|
2014-12-10 00:34:27 -05:00
|
|
|
|
2014-12-16 21:30:03 -05:00
|
|
|
demods.push_back(newDemod);
|
2014-12-10 00:34:27 -05:00
|
|
|
|
2014-12-16 21:30:03 -05:00
|
|
|
std::stringstream label;
|
|
|
|
label << demods.size();
|
|
|
|
newDemod->setLabel(label.str());
|
2014-12-10 00:34:27 -05:00
|
|
|
|
2014-12-16 21:30:03 -05:00
|
|
|
return newDemod;
|
2014-11-22 22:33:32 -05:00
|
|
|
}
|
2014-11-23 19:39:27 -05:00
|
|
|
|
|
|
|
void DemodulatorMgr::terminateAll() {
|
2014-12-16 21:30:03 -05:00
|
|
|
while (demods.size()) {
|
|
|
|
DemodulatorInstance *d = demods.back();
|
2015-01-10 22:45:39 -05:00
|
|
|
demods.pop_back();
|
2015-01-10 12:27:03 -05:00
|
|
|
wxGetApp().removeDemodulator(d);
|
2014-12-16 21:30:03 -05:00
|
|
|
deleteThread(d);
|
|
|
|
}
|
2014-11-23 19:39:27 -05:00
|
|
|
}
|
2014-11-26 21:05:19 -05:00
|
|
|
|
|
|
|
std::vector<DemodulatorInstance *> &DemodulatorMgr::getDemodulators() {
|
2014-12-16 21:30:03 -05:00
|
|
|
return demods;
|
2014-11-26 21:05:19 -05:00
|
|
|
}
|
2014-11-30 18:54:13 -05:00
|
|
|
|
2014-12-10 21:22:13 -05:00
|
|
|
void DemodulatorMgr::deleteThread(DemodulatorInstance *demod) {
|
2014-12-16 21:30:03 -05:00
|
|
|
std::vector<DemodulatorInstance *>::iterator i;
|
2014-12-10 21:22:13 -05:00
|
|
|
|
2014-12-16 21:30:03 -05:00
|
|
|
i = std::find(demods.begin(), demods.end(), demod);
|
2014-12-10 21:22:13 -05:00
|
|
|
|
2014-12-16 21:30:03 -05:00
|
|
|
if (activeDemodulator == demod) {
|
|
|
|
activeDemodulator = NULL;
|
|
|
|
}
|
|
|
|
if (lastActiveDemodulator == demod) {
|
|
|
|
lastActiveDemodulator = NULL;
|
|
|
|
}
|
|
|
|
if (activeVisualDemodulator == demod) {
|
|
|
|
activeVisualDemodulator = NULL;
|
|
|
|
}
|
2014-12-10 21:22:13 -05:00
|
|
|
|
2014-12-16 21:30:03 -05:00
|
|
|
if (i != demods.end()) {
|
|
|
|
demods.erase(i);
|
|
|
|
}
|
2015-01-10 12:27:03 -05:00
|
|
|
demod->terminate();
|
2014-12-11 19:07:21 -05:00
|
|
|
|
2014-12-16 21:30:03 -05:00
|
|
|
demods_deleted.push_back(demod);
|
2014-12-11 19:07:21 -05:00
|
|
|
|
2014-12-16 21:30:03 -05:00
|
|
|
garbageCollect();
|
2014-12-10 21:22:13 -05:00
|
|
|
}
|
|
|
|
|
2015-01-04 17:11:20 -05:00
|
|
|
std::vector<DemodulatorInstance *> *DemodulatorMgr::getDemodulatorsAt(long long freq, int bandwidth) {
|
2014-12-16 21:30:03 -05:00
|
|
|
std::vector<DemodulatorInstance *> *foundDemods = new std::vector<DemodulatorInstance *>();
|
2014-11-30 18:54:13 -05:00
|
|
|
|
2014-12-16 21:30:03 -05:00
|
|
|
for (int i = 0, iMax = demods.size(); i < iMax; i++) {
|
|
|
|
DemodulatorInstance *testDemod = demods[i];
|
2014-11-30 18:54:13 -05:00
|
|
|
|
2015-01-04 17:11:20 -05:00
|
|
|
long long freqTest = testDemod->getParams().frequency;
|
|
|
|
long long bandwidthTest = testDemod->getParams().bandwidth;
|
|
|
|
long long halfBandwidthTest = bandwidthTest / 2;
|
2014-11-30 18:54:13 -05:00
|
|
|
|
2015-01-04 17:11:20 -05:00
|
|
|
long long halfBuffer = bandwidth / 2;
|
2014-11-30 18:54:13 -05:00
|
|
|
|
2014-12-16 21:30:03 -05:00
|
|
|
if ((freq <= (freqTest + halfBandwidthTest + halfBuffer)) && (freq >= (freqTest - halfBandwidthTest - halfBuffer))) {
|
|
|
|
foundDemods->push_back(testDemod);
|
|
|
|
}
|
|
|
|
}
|
2014-11-30 18:54:13 -05:00
|
|
|
|
2014-12-16 21:30:03 -05:00
|
|
|
return foundDemods;
|
2014-11-30 18:54:13 -05:00
|
|
|
}
|
2014-12-10 00:34:27 -05:00
|
|
|
|
|
|
|
void DemodulatorMgr::setActiveDemodulator(DemodulatorInstance *demod, bool temporary) {
|
2014-12-16 21:30:03 -05:00
|
|
|
if (!temporary) {
|
|
|
|
if (activeDemodulator != NULL) {
|
|
|
|
lastActiveDemodulator = activeDemodulator;
|
|
|
|
} else {
|
|
|
|
lastActiveDemodulator = demod;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (activeVisualDemodulator) {
|
|
|
|
activeVisualDemodulator->setVisualOutputQueue(NULL);
|
|
|
|
}
|
|
|
|
if (demod) {
|
|
|
|
demod->setVisualOutputQueue(wxGetApp().getAudioVisualQueue());
|
|
|
|
activeVisualDemodulator = demod;
|
|
|
|
} else {
|
|
|
|
DemodulatorInstance *last = getLastActiveDemodulator();
|
|
|
|
if (last) {
|
|
|
|
last->setVisualOutputQueue(wxGetApp().getAudioVisualQueue());
|
|
|
|
}
|
|
|
|
activeVisualDemodulator = last;
|
|
|
|
}
|
|
|
|
|
|
|
|
activeDemodulator = demod;
|
|
|
|
|
|
|
|
garbageCollect();
|
2014-12-10 00:34:27 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
DemodulatorInstance *DemodulatorMgr::getActiveDemodulator() {
|
2014-12-16 21:30:03 -05:00
|
|
|
return activeDemodulator;
|
2014-12-10 00:34:27 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
DemodulatorInstance *DemodulatorMgr::getLastActiveDemodulator() {
|
2014-12-16 21:30:03 -05:00
|
|
|
if (std::find(demods.begin(), demods.end(), lastActiveDemodulator) == demods.end()) {
|
|
|
|
lastActiveDemodulator = activeDemodulator;
|
|
|
|
}
|
2014-12-10 00:34:27 -05:00
|
|
|
|
2014-12-16 21:30:03 -05:00
|
|
|
return lastActiveDemodulator;
|
2014-12-10 00:34:27 -05:00
|
|
|
}
|
2014-12-11 19:07:21 -05:00
|
|
|
|
|
|
|
void DemodulatorMgr::garbageCollect() {
|
2014-12-16 21:30:03 -05:00
|
|
|
if (demods_deleted.size()) {
|
|
|
|
std::vector<DemodulatorInstance *>::iterator i;
|
2014-12-11 19:07:21 -05:00
|
|
|
|
2014-12-16 21:30:03 -05:00
|
|
|
for (i = demods_deleted.begin(); i != demods_deleted.end(); i++) {
|
|
|
|
if ((*i)->isTerminated()) {
|
|
|
|
DemodulatorInstance *deleted = (*i);
|
|
|
|
demods_deleted.erase(i);
|
2014-12-11 19:07:21 -05:00
|
|
|
|
2014-12-16 21:30:03 -05:00
|
|
|
std::cout << "Garbage collected demodulator instance " << deleted->getLabel() << std::endl;
|
2014-12-11 19:07:21 -05:00
|
|
|
|
2014-12-16 21:30:03 -05:00
|
|
|
delete deleted;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2014-12-11 19:07:21 -05:00
|
|
|
}
|
|
|
|
|