dsp: fix threaded condition variable locking

This commit is contained in:
Antonio SJ Musumeci authored and trapexit committed 2026-06-02 15:11:40 -05:00
1 parent 4773346830
commit 8f5d03b100
3 files changed
+11 -11

No files matched your search

+3 -1
View File
@@ -1,7 +1,9 @@
#ifndef OPERA_LR_DSP_H_INCLUDED
#define OPERA_LR_DSP_H_INCLUDED
void opera_lr_dsp_init(const int threaded);
#include <stdbool.h>
void opera_lr_dsp_init(const bool threaded);
void opera_lr_dsp_destroy(void);
void opera_lr_dsp_upload(void);
+2 -1
View File
@@ -1,6 +1,7 @@
#include "libopera/opera_dsp.h"
#include "opera_lr_callbacks.h"
#include "opera_lr_dsp.h"
#include <stdint.h>
@@ -35,7 +36,7 @@ opera_lr_dsp_destroy(void)
}
void
opera_lr_dsp_init(const int threaded_)
opera_lr_dsp_init(const bool threaded_)
{
}
+6 -9
View File
@@ -1,6 +1,7 @@
#include "libopera/opera_dsp.h"
#include "opera_lr_callbacks.h"
#include "opera_lr_dsp.h"
#include "boolean.h"
@@ -24,7 +25,6 @@ static uint32_t g_DSP_BUF_PENDING = 0;
static int32_t g_DSP_BUF[DSP_BUF_SIZE];
static scond_t *g_DSP_COND = NULL;
static slock_t *g_DSP_COND_MUTEX = NULL;
static sthread_t *g_DSP_THREAD = NULL;
static bool g_DSP_THREAD_RUNNING = false;
static slock_t *g_DSP_THREAD_MUTEX = NULL;
@@ -46,14 +46,14 @@ dsp_thread_loop(void *handle_)
while(running)
{
slock_lock(g_DSP_THREAD_MUTEX);
running = g_DSP_THREAD_RUNNING;
pending = g_DSP_BUF_PENDING;
while(g_DSP_THREAD_RUNNING && (g_DSP_BUF_PENDING == 0))
scond_wait(g_DSP_COND,g_DSP_THREAD_MUTEX);
running = g_DSP_THREAD_RUNNING;
pending = g_DSP_BUF_PENDING;
g_DSP_BUF_PENDING = 0;
slock_unlock(g_DSP_THREAD_MUTEX);
if (running)
scond_wait(g_DSP_COND, g_DSP_COND_MUTEX);
while (pending > 0)
{
sample = opera_dsp_loop();
@@ -136,12 +136,10 @@ opera_lr_dsp_destroy(void)
sthread_join(g_DSP_THREAD);
scond_free(g_DSP_COND);
slock_free(g_DSP_COND_MUTEX);
slock_free(g_DSP_THREAD_MUTEX);
g_DSP_THREAD = NULL;
g_DSP_COND = NULL;
g_DSP_COND_MUTEX = NULL;
g_DSP_THREAD_MUTEX = NULL;
g_DSP_THREADED = false;
}
@@ -161,7 +159,6 @@ opera_lr_dsp_init(const bool threaded_)
if(g_DSP_THREADED)
{
g_DSP_COND = scond_new();
g_DSP_COND_MUTEX = slock_new();
g_DSP_THREAD_MUTEX = slock_new();
g_DSP_THREAD_RUNNING = true;
g_DSP_THREAD = sthread_create(dsp_thread_loop, NULL);