Skip to content

Commit

Permalink
MOD Audio specific optimizations
Browse files Browse the repository at this point in the history
Signed-off-by: falkTX <[email protected]>
  • Loading branch information
falkTX committed Jun 5, 2024
1 parent c46c1b1 commit be556da
Show file tree
Hide file tree
Showing 5 changed files with 62 additions and 5 deletions.
31 changes: 31 additions & 0 deletions common/JackClient.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,37 @@ namespace Jack

#define IsRealTime() ((fProcess != NULL) | (fThreadFun != NULL) | (fSync != NULL) | (fTimebase != NULL))

/* Disables denormal numbers in floating point calculation. Denormal numbers
* happens often in IIR filters, and it can be very slow.
*/
/* Taken from cras/src/dsp/dsp_util.c in Chromium OS code.
* Copyright (c) 2013 The Chromium OS Authors. */
static void dsp_enable_flush_denormal_to_zero()
{
#if defined(__i386__) || defined(__x86_64__)
unsigned int mxcsr;
mxcsr = __builtin_ia32_stmxcsr();
__builtin_ia32_ldmxcsr(mxcsr | 0x8040);
#elif defined(__aarch64__)
uint64_t cw;
__asm__ __volatile__ (
"mrs %0, fpcr \n"
"orr %0, %0, #0x1000000 \n"
"msr fpcr, %0 \n"
"isb \n"
: "=r"(cw) :: "memory");
#elif defined(__arm__)
uint32_t cw;
__asm__ __volatile__ (
"vmrs %0, fpscr \n"
"orr %0, %0, #0x1000000 \n"
"vmsr fpscr, %0 \n"
: "=r"(cw) :: "memory");
#else
#warning "Don't know how to disable denorms. Performace may suffer."
#endif
}

JackClient::JackClient(JackSynchro* table):fThread(this)
{
fSynchroTable = table;
Expand Down
10 changes: 8 additions & 2 deletions common/JackEngine.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,12 @@ extern const char* JACK_METADATA_PRETTY_NAME;
namespace Jack
{

static bool areFutexesOptimizedForInternalClients()
{
static bool ret = (getenv("JACK_NO_OPTIMIZATIONS") == NULL);
return ret;
}

JackEngine::JackEngine(JackGraphManager* manager,
JackSynchro* table,
JackEngineControl* control,
Expand Down Expand Up @@ -635,7 +641,7 @@ int JackEngine::ClientExternalOpen(const char* name, int pid, jack_uuid_t uuid,

JackExternalClient* client = new JackExternalClient();

if (!fSynchroTable[refnum].Allocate(real_name, fEngineControl->fServerName, 0)) {
if (!fSynchroTable[refnum].Allocate(real_name, fEngineControl->fServerName, 0, false)) {
jack_error("Cannot allocate synchro");
goto error;
}
Expand Down Expand Up @@ -685,7 +691,7 @@ int JackEngine::ClientInternalOpen(const char* name, int* ref, JackEngineControl
goto error;
}

if (!fSynchroTable[refnum].Allocate(name, fEngineControl->fServerName, 0)) {
if (!fSynchroTable[refnum].Allocate(name, fEngineControl->fServerName, 0, areFutexesOptimizedForInternalClients())) {
jack_error("Cannot allocate synchro");
goto error;
}
Expand Down
8 changes: 7 additions & 1 deletion common/JackMidiAsyncWaitQueue.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -25,11 +25,17 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.

using Jack::JackMidiAsyncWaitQueue;

static bool areFutexesOptimizedForInternalClients()
{
static bool ret = (getenv("JACK_NO_OPTIMIZATIONS") == NULL);
return ret;
}

JackMidiAsyncWaitQueue::JackMidiAsyncWaitQueue(size_t max_bytes,
size_t max_messages):
JackMidiAsyncQueue(max_bytes, max_messages)
{
if (semaphore.Allocate("JackMidiAsyncWaitQueue", "midi-thread", 0)) {
if (semaphore.Allocate("JackMidiAsyncWaitQueue", "midi-thread", 0, areFutexesOptimizedForInternalClients())) {
throw std::bad_alloc();
}
}
Expand Down
16 changes: 15 additions & 1 deletion linux/JackLinuxFutex.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -48,11 +48,15 @@ void JackLinuxFutex::BuildName(const char* client_name, const char* server_name,
{
char ext_client_name[SYNC_MAX_NAME_SIZE + 1];
JackTools::RewriteName(client_name, ext_client_name);
#ifdef __MOD_DEVICES__
snprintf(res, size, "jack_sem.%s", ext_client_name);
#else
if (fPromiscuous) {
snprintf(res, size, "jack_sem.%s_%s", server_name, ext_client_name);
} else {
snprintf(res, size, "jack_sem.%d_%s_%s", JackTools::GetUID(), server_name, ext_client_name);
}
#endif
}

bool JackLinuxFutex::Signal()
Expand All @@ -78,7 +82,17 @@ bool JackLinuxFutex::Signal()

bool JackLinuxFutex::SignalAll()
{
return Signal();
if (!fFutex) {
jack_error("JackLinuxFutex::Signal name = %s already deallocated!!", fName);
return false;
}

if (fFlush) {
return true;
}

::syscall(SYS_futex, fFutex, fFutex->internal ? FUTEX_WAKE_PRIVATE : FUTEX_WAKE, INT32_MAX, NULL, NULL, 0);
return true;
}

bool JackLinuxFutex::Wait()
Expand Down
2 changes: 1 addition & 1 deletion linux/JackLinuxFutex.h
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ class SERVER_EXPORT JackLinuxFutex : public detail::JackSynchro
bool Wait();
bool TimedWait(long usec);

bool Allocate(const char* name, const char* server_name, int value, bool internal = false);
bool Allocate(const char* name, const char* server_name, int value, bool internal);
bool Connect(const char* name, const char* server_name);
bool ConnectInput(const char* name, const char* server_name);
bool ConnectOutput(const char* name, const char* server_name);
Expand Down

0 comments on commit be556da

Please sign in to comment.