mirror of
https://github.com/cjcliffe/CubicSDR.git
synced 2026-06-01 21:54:39 -04:00
IOThread all the things!
This commit is contained in:
+12
-15
@@ -11,13 +11,12 @@ std::map<int, AudioThread *> AudioThread::deviceController;
|
||||
std::map<int, int> AudioThread::deviceSampleRate;
|
||||
std::map<int, std::thread *> AudioThread::deviceThread;
|
||||
|
||||
AudioThread::AudioThread(AudioThreadInputQueue *inputQueue, DemodulatorThreadCommandQueue* threadQueueNotify) :
|
||||
AudioThread::AudioThread(AudioThreadInputQueue *inputQueue, DemodulatorThreadCommandQueue* threadQueueNotify) : IOThread(),
|
||||
currentInput(NULL), inputQueue(inputQueue), gain(
|
||||
1.0), threadQueueNotify(threadQueueNotify), sampleRate(0), nBufferFrames(1024) {
|
||||
|
||||
audioQueuePtr.store(0);
|
||||
underflowCount.store(0);
|
||||
terminated.store(false);
|
||||
active.store(false);
|
||||
outputDevice.store(-1);
|
||||
|
||||
@@ -56,7 +55,7 @@ static int audioCallback(void *outputBuffer, void *inputBuffer, unsigned int nBu
|
||||
float *out = (float*) outputBuffer;
|
||||
memset(out, 0, nBufferFrames * 2 * sizeof(float));
|
||||
|
||||
if (src->terminated) {
|
||||
if (src->isTerminated()) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -72,17 +71,17 @@ static int audioCallback(void *outputBuffer, void *inputBuffer, unsigned int nBu
|
||||
|
||||
for (int j = 0; j < src->boundThreads.load()->size(); j++) {
|
||||
AudioThread *srcmix = (*(src->boundThreads.load()))[j];
|
||||
if (srcmix->terminated || !srcmix->inputQueue || srcmix->inputQueue->empty() || !srcmix->isActive()) {
|
||||
if (srcmix->isTerminated() || !srcmix->inputQueue || srcmix->inputQueue->empty() || !srcmix->isActive()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!srcmix->currentInput) {
|
||||
srcmix->audioQueuePtr = 0;
|
||||
if (srcmix->terminated || srcmix->inputQueue->empty()) {
|
||||
if (srcmix->isTerminated() || srcmix->inputQueue->empty()) {
|
||||
continue;
|
||||
}
|
||||
srcmix->inputQueue->pop(srcmix->currentInput);
|
||||
if (srcmix->terminated) {
|
||||
if (srcmix->isTerminated()) {
|
||||
continue;
|
||||
}
|
||||
continue;
|
||||
@@ -117,11 +116,11 @@ static int audioCallback(void *outputBuffer, void *inputBuffer, unsigned int nBu
|
||||
srcmix->currentInput->decRefCount();
|
||||
srcmix->currentInput = NULL;
|
||||
}
|
||||
if (srcmix->terminated || srcmix->inputQueue->empty()) {
|
||||
if (srcmix->isTerminated() || srcmix->inputQueue->empty()) {
|
||||
continue;
|
||||
}
|
||||
srcmix->inputQueue->pop(srcmix->currentInput);
|
||||
if (srcmix->terminated) {
|
||||
if (srcmix->isTerminated()) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
@@ -138,11 +137,11 @@ static int audioCallback(void *outputBuffer, void *inputBuffer, unsigned int nBu
|
||||
srcmix->currentInput->decRefCount();
|
||||
srcmix->currentInput = NULL;
|
||||
}
|
||||
if (srcmix->terminated || srcmix->inputQueue->empty()) {
|
||||
if (srcmix->isTerminated() || srcmix->inputQueue->empty()) {
|
||||
break;
|
||||
}
|
||||
srcmix->inputQueue->pop(srcmix->currentInput);
|
||||
if (srcmix->terminated) {
|
||||
if (srcmix->isTerminated()) {
|
||||
break;
|
||||
}
|
||||
float srcPeak = srcmix->currentInput->peak * srcmix->gain;
|
||||
@@ -165,11 +164,11 @@ static int audioCallback(void *outputBuffer, void *inputBuffer, unsigned int nBu
|
||||
srcmix->currentInput->decRefCount();
|
||||
srcmix->currentInput = NULL;
|
||||
}
|
||||
if (srcmix->terminated || srcmix->inputQueue->empty()) {
|
||||
if (srcmix->isTerminated() || srcmix->inputQueue->empty()) {
|
||||
break;
|
||||
}
|
||||
srcmix->inputQueue->pop(srcmix->currentInput);
|
||||
if (srcmix->terminated) {
|
||||
if (srcmix->isTerminated()) {
|
||||
break;
|
||||
}
|
||||
float srcPeak = srcmix->currentInput->peak * srcmix->gain;
|
||||
@@ -359,7 +358,7 @@ void AudioThread::setInitOutputDevice(int deviceId, int sampleRate) {
|
||||
this->sampleRate = sampleRate;
|
||||
}
|
||||
|
||||
void AudioThread::threadMain() {
|
||||
void AudioThread::run() {
|
||||
#ifdef __APPLE__
|
||||
pthread_t tID = pthread_self(); // ID of this thread
|
||||
int priority = sched_get_priority_max( SCHED_RR) - 1;
|
||||
@@ -378,8 +377,6 @@ void AudioThread::threadMain() {
|
||||
|
||||
std::cout << "Audio thread started." << std::endl;
|
||||
|
||||
terminated = false;
|
||||
|
||||
while (!terminated) {
|
||||
AudioThreadCommand command;
|
||||
cmdQueue.pop(command);
|
||||
|
||||
@@ -47,14 +47,13 @@ public:
|
||||
typedef ThreadQueue<AudioThreadInput *> AudioThreadInputQueue;
|
||||
typedef ThreadQueue<AudioThreadCommand> AudioThreadCommandQueue;
|
||||
|
||||
class AudioThread {
|
||||
class AudioThread : public IOThread {
|
||||
public:
|
||||
|
||||
AudioThreadInput *currentInput;
|
||||
AudioThreadInputQueue *inputQueue;
|
||||
std::atomic_uint audioQueuePtr;
|
||||
std::atomic_uint underflowCount;
|
||||
std::atomic_bool terminated;
|
||||
std::atomic_bool initialized;
|
||||
std::atomic_bool active;
|
||||
std::atomic_int outputDevice;
|
||||
@@ -70,7 +69,7 @@ public:
|
||||
int getOutputDevice();
|
||||
void setSampleRate(int sampleRate);
|
||||
int getSampleRate();
|
||||
void threadMain();
|
||||
void run();
|
||||
void terminate();
|
||||
|
||||
bool isActive();
|
||||
|
||||
Reference in New Issue
Block a user