Audio thread lock fix

This commit is contained in:
Charles J. Cliffe 2015-01-08 21:12:49 -05:00
parent 36ff762d3a
commit 95fcb30733
6 changed files with 62 additions and 8 deletions

View File

@ -72,6 +72,9 @@ static int audioCallback(void *outputBuffer, void *inputBuffer, unsigned int nBu
continue; continue;
} }
srcmix->inputQueue->pop(srcmix->currentInput); srcmix->inputQueue->pop(srcmix->currentInput);
if (srcmix->terminated) {
continue;
}
srcmix->audioQueuePtr = 0; srcmix->audioQueuePtr = 0;
continue; continue;
} }
@ -88,6 +91,9 @@ static int audioCallback(void *outputBuffer, void *inputBuffer, unsigned int nBu
continue; continue;
} }
srcmix->inputQueue->pop(srcmix->currentInput); srcmix->inputQueue->pop(srcmix->currentInput);
if (srcmix->terminated) {
continue;
}
srcmix->audioQueuePtr = 0; srcmix->audioQueuePtr = 0;
} }
continue; continue;
@ -104,6 +110,9 @@ static int audioCallback(void *outputBuffer, void *inputBuffer, unsigned int nBu
continue; continue;
} }
srcmix->inputQueue->pop(srcmix->currentInput); srcmix->inputQueue->pop(srcmix->currentInput);
if (srcmix->terminated) {
continue;
}
srcmix->audioQueuePtr = 0; srcmix->audioQueuePtr = 0;
} }
if (srcmix->currentInput && srcmix->currentInput->data.size()) { if (srcmix->currentInput && srcmix->currentInput->data.size()) {
@ -124,6 +133,9 @@ static int audioCallback(void *outputBuffer, void *inputBuffer, unsigned int nBu
continue; continue;
} }
srcmix->inputQueue->pop(srcmix->currentInput); srcmix->inputQueue->pop(srcmix->currentInput);
if (srcmix->terminated) {
continue;
}
srcmix->audioQueuePtr = 0; srcmix->audioQueuePtr = 0;
} }
if (srcmix->currentInput && srcmix->currentInput->data.size()) { if (srcmix->currentInput && srcmix->currentInput->data.size()) {
@ -151,6 +163,9 @@ static int audioCallback(void *outputBuffer, void *inputBuffer, unsigned int nBu
if (!src->currentInput) { if (!src->currentInput) {
src->inputQueue->pop(src->currentInput); src->inputQueue->pop(src->currentInput);
if (src->terminated) {
return 1;
}
src->audioQueuePtr = 0; src->audioQueuePtr = 0;
return 0; return 0;
} }
@ -167,6 +182,9 @@ static int audioCallback(void *outputBuffer, void *inputBuffer, unsigned int nBu
return 1; return 1;
} }
src->inputQueue->pop(src->currentInput); src->inputQueue->pop(src->currentInput);
if (src->terminated) {
return 1;
}
src->audioQueuePtr = 0; src->audioQueuePtr = 0;
} }
return 0; return 0;
@ -183,6 +201,9 @@ static int audioCallback(void *outputBuffer, void *inputBuffer, unsigned int nBu
return 1; return 1;
} }
src->inputQueue->pop(src->currentInput); src->inputQueue->pop(src->currentInput);
if (src->terminated) {
return 1;
}
src->audioQueuePtr = 0; src->audioQueuePtr = 0;
} }
if (src->currentInput && src->currentInput->data.size()) { if (src->currentInput && src->currentInput->data.size()) {
@ -201,6 +222,9 @@ static int audioCallback(void *outputBuffer, void *inputBuffer, unsigned int nBu
return 1; return 1;
} }
src->inputQueue->pop(src->currentInput); src->inputQueue->pop(src->currentInput);
if (src->terminated) {
return 1;
}
src->audioQueuePtr = 0; src->audioQueuePtr = 0;
} }
if (src->currentInput && src->currentInput->data.size()) { if (src->currentInput && src->currentInput->data.size()) {
@ -348,6 +372,8 @@ void AudioThread::threadMain() {
std::cout << "Audio thread started." << std::endl; std::cout << "Audio thread started." << std::endl;
terminated = false;
while (!terminated) { while (!terminated) {
AudioThreadCommand command; AudioThreadCommand command;
cmdQueue.pop(command); cmdQueue.pop(command);
@ -357,6 +383,9 @@ void AudioThread::threadMain() {
} }
} }
AudioThreadInput dummy;
inputQueue->push(&dummy);
#ifdef __APPLE__ #ifdef __APPLE__
if (deviceController[parameters.deviceId] != this) { if (deviceController[parameters.deviceId] != this) {
deviceController[parameters.deviceId]->removeThread(this); deviceController[parameters.deviceId]->removeThread(this);

View File

@ -60,6 +60,7 @@ public:
std::atomic<unsigned int> audioQueuePtr; std::atomic<unsigned int> audioQueuePtr;
std::atomic<unsigned int> underflowCount; std::atomic<unsigned int> underflowCount;
std::atomic<bool> terminated; std::atomic<bool> terminated;
std::atomic<bool> initialized;
std::atomic<bool> active; std::atomic<bool> active;
std::atomic<int> outputDevice; std::atomic<int> outputDevice;
float gain; float gain;

View File

@ -1,8 +1,8 @@
#include "DemodulatorInstance.h" #include "DemodulatorInstance.h"
DemodulatorInstance::DemodulatorInstance() : DemodulatorInstance::DemodulatorInstance() :
t_Demod(NULL), t_PreDemod(NULL), t_Audio(NULL), threadQueueDemod(NULL), demodulatorThread(NULL), terminated(false), audioTerminated(false), demodTerminated( t_Demod(NULL), t_PreDemod(NULL), t_Audio(NULL), threadQueueDemod(NULL), demodulatorThread(NULL), terminated(true), audioTerminated(true), demodTerminated(
false), preDemodTerminated(false), active(false), squelch(false), stereo(false), currentFrequency(0), currentBandwidth(0) { true), preDemodTerminated(true), active(false), squelch(false), stereo(false), currentFrequency(0), currentBandwidth(0) {
label = new std::string("Unnamed"); label = new std::string("Unnamed");
threadQueueDemod = new DemodulatorThreadInputQueue; threadQueueDemod = new DemodulatorThreadInputQueue;
@ -26,9 +26,13 @@ DemodulatorInstance::DemodulatorInstance() :
DemodulatorInstance::~DemodulatorInstance() { DemodulatorInstance::~DemodulatorInstance() {
delete audioThread; delete audioThread;
delete demodulatorThread; delete demodulatorThread;
delete demodulatorPreThread;
delete audioInputQueue;
delete threadQueueDemod; delete threadQueueDemod;
delete threadQueuePostDemod;
delete threadQueueCommand;
delete threadQueueNotify;
delete threadQueueControl;
delete audioInputQueue;
} }
void DemodulatorInstance::setVisualOutputQueue(DemodulatorThreadOutputQueue *tQueue) { void DemodulatorInstance::setVisualOutputQueue(DemodulatorThreadOutputQueue *tQueue) {
@ -36,7 +40,16 @@ void DemodulatorInstance::setVisualOutputQueue(DemodulatorThreadOutputQueue *tQu
} }
void DemodulatorInstance::run() { void DemodulatorInstance::run() {
if (active) {
return;
}
// while (!isTerminated()) {
// std::this_thread::sleep_for(std::chrono::milliseconds(1));
// }
currentFrequency = demodulatorPreThread->getParams().frequency; currentFrequency = demodulatorPreThread->getParams().frequency;
currentDemodType = demodulatorThread->getDemodulatorType();
t_Audio = new std::thread(&AudioThread::threadMain, audioThread); t_Audio = new std::thread(&AudioThread::threadMain, audioThread);
@ -63,6 +76,8 @@ void DemodulatorInstance::run() {
t_Demod = new std::thread(&DemodulatorThread::threadMain, demodulatorThread); t_Demod = new std::thread(&DemodulatorThread::threadMain, demodulatorThread);
#endif #endif
active = true; active = true;
audioTerminated = demodTerminated = preDemodTerminated = terminated = false;
} }
void DemodulatorInstance::updateLabel(long long freq) { void DemodulatorInstance::updateLabel(long long freq) {
@ -109,12 +124,10 @@ bool DemodulatorInstance::isTerminated() {
switch (cmd.cmd) { switch (cmd.cmd) {
case DemodulatorThreadCommand::DEMOD_THREAD_CMD_AUDIO_TERMINATED: case DemodulatorThreadCommand::DEMOD_THREAD_CMD_AUDIO_TERMINATED:
audioThread = NULL;
t_Audio->join(); t_Audio->join();
audioTerminated = true; audioTerminated = true;
break; break;
case DemodulatorThreadCommand::DEMOD_THREAD_CMD_DEMOD_TERMINATED: case DemodulatorThreadCommand::DEMOD_THREAD_CMD_DEMOD_TERMINATED:
demodulatorThread = NULL;
#ifdef __APPLE__ #ifdef __APPLE__
pthread_join(t_Demod, NULL); pthread_join(t_Demod, NULL);
#else #else
@ -123,7 +136,6 @@ bool DemodulatorInstance::isTerminated() {
demodTerminated = true; demodTerminated = true;
break; break;
case DemodulatorThreadCommand::DEMOD_THREAD_CMD_DEMOD_PREPROCESS_TERMINATED: case DemodulatorThreadCommand::DEMOD_THREAD_CMD_DEMOD_PREPROCESS_TERMINATED:
demodulatorPreThread = NULL;
#ifdef __APPLE__ #ifdef __APPLE__
pthread_join(t_PreDemod, NULL); pthread_join(t_PreDemod, NULL);
#else #else
@ -146,8 +158,12 @@ bool DemodulatorInstance::isActive() {
} }
void DemodulatorInstance::setActive(bool state) { void DemodulatorInstance::setActive(bool state) {
active = state; if (active && !state) {
audioThread->setActive(state); audioThread->setActive(state);
} else if (!active && state) {
audioThread->setActive(state);
}
active = state;
} }
bool DemodulatorInstance::isStereo() { bool DemodulatorInstance::isStereo() {

View File

@ -70,6 +70,8 @@ void DemodulatorPreThread::threadMain() {
std::vector<liquid_float_complex> in_buf_data; std::vector<liquid_float_complex> in_buf_data;
std::vector<liquid_float_complex> out_buf_data; std::vector<liquid_float_complex> out_buf_data;
terminated = false;
while (!terminated) { while (!terminated) {
DemodulatorThreadIQData *inp; DemodulatorThreadIQData *inp;
iqInputQueue->pop(inp); iqInputQueue->pop(inp);

View File

@ -32,6 +32,10 @@ public:
return params; return params;
} }
void setParams(DemodulatorThreadParameters &params_in) {
params = params_in;
}
void initialize(); void initialize();
void terminate(); void terminate();

View File

@ -92,6 +92,8 @@ void DemodulatorThread::threadMain() {
std::cout << "Demodulator thread started.." << std::endl; std::cout << "Demodulator thread started.." << std::endl;
terminated = false;
while (!terminated) { while (!terminated) {
DemodulatorThreadPostIQData *inp; DemodulatorThreadPostIQData *inp;
iqInputQueue->pop(inp); iqInputQueue->pop(inp);