mirror of
https://github.com/cjcliffe/CubicSDR.git
synced 2026-06-26 21:43:11 -04:00
Can now spawn/delete demodulators
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
#include <DemodulatorMgr.h>
|
||||
#include <sstream>
|
||||
#include <algorithm>
|
||||
#include "CubicSDR.h"
|
||||
|
||||
DemodulatorInstance::DemodulatorInstance() :
|
||||
t_Demod(NULL), t_Audio(NULL), threadQueueDemod(NULL), demodulatorThread(NULL) {
|
||||
@@ -83,14 +84,12 @@ DemodulatorThreadParameters &DemodulatorInstance::getParams() {
|
||||
void DemodulatorInstance::terminate() {
|
||||
std::cout << "Terminating demodulator thread.." << std::endl;
|
||||
demodulatorThread->terminate();
|
||||
#ifdef __APPLE__
|
||||
pthread_join(t_Demod,NULL);
|
||||
#else
|
||||
t_Demod->join();
|
||||
#endif
|
||||
//#ifdef __APPLE__
|
||||
// pthread_join(t_Demod,NULL);
|
||||
//#else
|
||||
//#endif
|
||||
std::cout << "Terminating demodulator audio thread.." << std::endl;
|
||||
audioThread->terminate();
|
||||
t_Audio->join();
|
||||
}
|
||||
|
||||
std::string DemodulatorInstance::getLabel() {
|
||||
@@ -102,7 +101,7 @@ void DemodulatorInstance::setLabel(std::string labelStr) {
|
||||
}
|
||||
|
||||
DemodulatorMgr::DemodulatorMgr() :
|
||||
activeDemodulator(NULL), lastActiveDemodulator(NULL) {
|
||||
activeDemodulator(NULL), lastActiveDemodulator(NULL), activeVisualDemodulator(NULL) {
|
||||
|
||||
}
|
||||
|
||||
@@ -127,7 +126,6 @@ void DemodulatorMgr::terminateAll() {
|
||||
DemodulatorInstance *d = demods.back();
|
||||
demods.pop_back();
|
||||
d->terminate();
|
||||
delete d;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -135,6 +133,27 @@ std::vector<DemodulatorInstance *> &DemodulatorMgr::getDemodulators() {
|
||||
return demods;
|
||||
}
|
||||
|
||||
void DemodulatorMgr::deleteThread(DemodulatorInstance *demod) {
|
||||
std::vector<DemodulatorInstance *>::iterator i;
|
||||
|
||||
i = std::find(demods.begin(),demods.end(),demod);
|
||||
|
||||
if (activeDemodulator == demod) {
|
||||
activeDemodulator = NULL;
|
||||
}
|
||||
if (lastActiveDemodulator == demod) {
|
||||
lastActiveDemodulator = NULL;
|
||||
}
|
||||
if (activeVisualDemodulator == demod) {
|
||||
activeVisualDemodulator = NULL;
|
||||
}
|
||||
|
||||
if (i != demods.end()) {
|
||||
demods.erase(i);
|
||||
demod->terminate();
|
||||
}
|
||||
}
|
||||
|
||||
std::vector<DemodulatorInstance *> *DemodulatorMgr::getDemodulatorsAt(int freq, int bandwidth) {
|
||||
std::vector<DemodulatorInstance *> *foundDemods = new std::vector<DemodulatorInstance *>();
|
||||
|
||||
@@ -163,6 +182,22 @@ void DemodulatorMgr::setActiveDemodulator(DemodulatorInstance *demod, bool tempo
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
@@ -47,6 +47,7 @@ public:
|
||||
DemodulatorInstance *newThread();
|
||||
std::vector<DemodulatorInstance *> &getDemodulators();
|
||||
std::vector<DemodulatorInstance *> *getDemodulatorsAt(int freq, int bandwidth);
|
||||
void deleteThread(DemodulatorInstance *);
|
||||
|
||||
void terminateAll();
|
||||
|
||||
@@ -58,4 +59,5 @@ private:
|
||||
std::vector<DemodulatorInstance *> demods;
|
||||
DemodulatorInstance *activeDemodulator;
|
||||
DemodulatorInstance *lastActiveDemodulator;
|
||||
DemodulatorInstance *activeVisualDemodulator;
|
||||
};
|
||||
|
||||
@@ -255,7 +255,5 @@ void DemodulatorThread::terminate() {
|
||||
terminated = true;
|
||||
DemodulatorThreadIQData inp; // push dummy to nudge queue
|
||||
inputQueue->push(inp);
|
||||
|
||||
workerThread->terminate();
|
||||
t_Worker->join();
|
||||
}
|
||||
|
||||
@@ -131,7 +131,6 @@ public:
|
||||
|
||||
void setVisualOutputQueue(DemodulatorThreadOutputQueue *tQueue) {
|
||||
visOutQueue = tQueue;
|
||||
visOutQueue->set_max_num_items(1);
|
||||
}
|
||||
|
||||
void setCommandQueue(DemodulatorThreadCommandQueue *tQueue) {
|
||||
|
||||
Reference in New Issue
Block a user