Commit 1dc176df authored by David Reid's avatar David Reid

Add support for disabling the threading API.

This is useful for those only using miniaudio for data conversion,
decoding and/or encoding.

Public issue https://github.com/dr-soft/miniaudio/issues/171
parent 83298a44
...@@ -487,6 +487,11 @@ Build Options ...@@ -487,6 +487,11 @@ Build Options
Disables playback and recording. This will disable ma_context and ma_device APIs. This is useful if you only want to use miniaudio's data conversion and/or Disables playback and recording. This will disable ma_context and ma_device APIs. This is useful if you only want to use miniaudio's data conversion and/or
decoding APIs. decoding APIs.
#define MA_NO_THREADING
Disables the ma_thread, ma_mutex, ma_semaphore and ma_event APIs. This option is useful if you only need to use miniaudio for data conversion, decoding
and/or encoding. Some families of APIs require threading which means the following options must also be set:
MA_NO_DEVICE_IO
#define MA_NO_GENERATION #define MA_NO_GENERATION
Disables generation APIs such a ma_waveform and ma_noise. Disables generation APIs such a ma_waveform and ma_noise.
...@@ -2003,6 +2008,7 @@ typedef struct ...@@ -2003,6 +2008,7 @@ typedef struct
} ma_lcg; } ma_lcg;
#ifndef MA_NO_THREADING
/* Thread priorties should be ordered such that the default priority of the worker thread is 0. */ /* Thread priorties should be ordered such that the default priority of the worker thread is 0. */
typedef enum typedef enum
{ {
...@@ -2040,7 +2046,7 @@ typedef struct ...@@ -2040,7 +2046,7 @@ typedef struct
pthread_mutex_t lock; pthread_mutex_t lock;
pthread_cond_t cond; pthread_cond_t cond;
} ma_event; } ma_event;
#endif #endif /* MA_POSIX */
#if defined(MA_WIN32) #if defined(MA_WIN32)
typedef ma_handle ma_semaphore; typedef ma_handle ma_semaphore;
...@@ -2052,7 +2058,13 @@ typedef struct ...@@ -2052,7 +2058,13 @@ typedef struct
pthread_mutex_t lock; pthread_mutex_t lock;
pthread_cond_t cond; pthread_cond_t cond;
} ma_semaphore; } ma_semaphore;
#endif /* MA_POSIX */
#else
/* MA_NO_THREADING is set which means threading is disabled. Threading is required by some API families. If any of these are enabled we need to throw an error. */
#ifndef MA_NO_DEVICE_IO
#error "MA_NO_THREADING cannot be used without MA_NO_DEVICE_IO";
#endif #endif
#endif /* MA_NO_THREADING */
/* /*
...@@ -5189,6 +5201,7 @@ MA_API ma_bool32 ma_is_loopback_supported(ma_backend backend); ...@@ -5189,6 +5201,7 @@ MA_API ma_bool32 ma_is_loopback_supported(ma_backend backend);
#endif /* MA_NO_DEVICE_IO */ #endif /* MA_NO_DEVICE_IO */
#ifndef MA_NO_THREADING
/* /*
Creates a mutex. Creates a mutex.
...@@ -5231,6 +5244,7 @@ MA_API ma_result ma_event_wait(ma_event* pEvent); ...@@ -5231,6 +5244,7 @@ MA_API ma_result ma_event_wait(ma_event* pEvent);
Signals the specified auto-reset event. Signals the specified auto-reset event.
*/ */
MA_API ma_result ma_event_signal(ma_event* pEvent); MA_API ma_result ma_event_signal(ma_event* pEvent);
#endif /* MA_NO_THREADING */
/************************************************************************************************************************************************************ /************************************************************************************************************************************************************
...@@ -8540,6 +8554,7 @@ static ma_result ma_result_from_GetLastError(DWORD error) ...@@ -8540,6 +8554,7 @@ static ma_result ma_result_from_GetLastError(DWORD error)
Threading Threading
*******************************************************************************/ *******************************************************************************/
#ifndef MA_NO_THREADING
#ifdef MA_WIN32 #ifdef MA_WIN32
#define MA_THREADCALL WINAPI #define MA_THREADCALL WINAPI
typedef unsigned long ma_thread_result; typedef unsigned long ma_thread_result;
...@@ -9178,7 +9193,7 @@ MA_API ma_result ma_event_signal(ma_event* pEvent) ...@@ -9178,7 +9193,7 @@ MA_API ma_result ma_event_signal(ma_event* pEvent)
MA_API ma_result ma_semaphore_init(int initialValue, ma_semaphore* pSemaphore) MA_API ma_result ma_semaphore_init(int initialValue, ma_semaphore* pSemaphore)
{ {
if (pSemaphore == NULL) { if (pSemaphore == NULL) {
MA_ASSERT(MA_FALSE); /* Fire an assert to the caller is aware of this bug. */ MA_ASSERT(MA_FALSE); /* Fire an assert so the caller is aware of this bug. */
return MA_INVALID_ARGS; return MA_INVALID_ARGS;
} }
...@@ -9193,7 +9208,7 @@ MA_API ma_result ma_semaphore_init(int initialValue, ma_semaphore* pSemaphore) ...@@ -9193,7 +9208,7 @@ MA_API ma_result ma_semaphore_init(int initialValue, ma_semaphore* pSemaphore)
MA_API void ma_semaphore_uninit(ma_semaphore* pSemaphore) MA_API void ma_semaphore_uninit(ma_semaphore* pSemaphore)
{ {
if (pSemaphore == NULL) { if (pSemaphore == NULL) {
MA_ASSERT(MA_FALSE); /* Fire an assert to the caller is aware of this bug. */ MA_ASSERT(MA_FALSE); /* Fire an assert so the caller is aware of this bug. */
return; return;
} }
...@@ -9208,7 +9223,7 @@ MA_API void ma_semaphore_uninit(ma_semaphore* pSemaphore) ...@@ -9208,7 +9223,7 @@ MA_API void ma_semaphore_uninit(ma_semaphore* pSemaphore)
MA_API ma_result ma_semaphore_wait(ma_semaphore* pSemaphore) MA_API ma_result ma_semaphore_wait(ma_semaphore* pSemaphore)
{ {
if (pSemaphore == NULL) { if (pSemaphore == NULL) {
MA_ASSERT(MA_FALSE); /* Fire an assert to the caller is aware of this bug. */ MA_ASSERT(MA_FALSE); /* Fire an assert so the caller is aware of this bug. */
return MA_INVALID_ARGS; return MA_INVALID_ARGS;
} }
...@@ -9223,7 +9238,7 @@ MA_API ma_result ma_semaphore_wait(ma_semaphore* pSemaphore) ...@@ -9223,7 +9238,7 @@ MA_API ma_result ma_semaphore_wait(ma_semaphore* pSemaphore)
MA_API ma_result ma_semaphore_release(ma_semaphore* pSemaphore) MA_API ma_result ma_semaphore_release(ma_semaphore* pSemaphore)
{ {
if (pSemaphore == NULL) { if (pSemaphore == NULL) {
MA_ASSERT(MA_FALSE); /* Fire an assert to the caller is aware of this bug. */ MA_ASSERT(MA_FALSE); /* Fire an assert so the caller is aware of this bug. */
return MA_INVALID_ARGS; return MA_INVALID_ARGS;
} }
...@@ -9234,6 +9249,12 @@ MA_API ma_result ma_semaphore_release(ma_semaphore* pSemaphore) ...@@ -9234,6 +9249,12 @@ MA_API ma_result ma_semaphore_release(ma_semaphore* pSemaphore)
return ma_semaphore_release__posix(pSemaphore); return ma_semaphore_release__posix(pSemaphore);
#endif #endif
} }
#else
/* MA_NO_THREADING is set which means threading is disabled. Threading is required by some API families. If any of these are enabled we need to throw an error. */
#ifndef MA_NO_DEVICE_IO
#error "MA_NO_THREADING cannot be used without MA_NO_DEVICE_IO";
#endif
#endif /* MA_NO_THREADING */
/************************************************************************************************************************************************************ /************************************************************************************************************************************************************
...@@ -24,6 +24,7 @@ find a copy of this text in extras/speex_resampler/README.md in the miniaudio re ...@@ -24,6 +24,7 @@ find a copy of this text in extras/speex_resampler/README.md in the miniaudio re
#endif #endif
#define MA_NO_DEVICE_IO #define MA_NO_DEVICE_IO
#define MA_NO_THREADING
#define MINIAUDIO_IMPLEMENTATION #define MINIAUDIO_IMPLEMENTATION
#include "../../miniaudio.h" #include "../../miniaudio.h"
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment