Commit 60a8e3fd authored by David Reid's avatar David Reid

API CHANGE: Add support for context configuration.

This adds the mal_context_config structure and changes the
mal_context_init() API to take a pointer to a config object.
parent 9f4a9e42
// Mini audio library. Public domain. See "unlicense" statement at the end of this file. // Mini audio library. Public domain. See "unlicense" statement at the end of this file.
// mini_al - v0.4 - 2017-11-05 // mini_al - v0.5 - 2017-11-xx
// //
// David Reid - davidreidsoftware@gmail.com // David Reid - davidreidsoftware@gmail.com
...@@ -579,10 +579,20 @@ typedef struct ...@@ -579,10 +579,20 @@ typedef struct
} alsa; } alsa;
} mal_device_config; } mal_device_config;
typedef struct
{
mal_log_proc onLog;
struct
{
mal_bool32 useVerbsoseDeviceEnumeration;
} alsa;
} mal_context_config;
struct mal_context struct mal_context
{ {
mal_backend backend; // DirectSound, ALSA, etc. mal_backend backend; // DirectSound, ALSA, etc.
mal_log_proc onLog; mal_context_config config;
union union
{ {
...@@ -986,7 +996,7 @@ struct mal_device ...@@ -986,7 +996,7 @@ struct mal_device
// //
// Effeciency: LOW // Effeciency: LOW
// This will dynamically load backends DLLs/SOs (such as dsound.dll). // This will dynamically load backends DLLs/SOs (such as dsound.dll).
mal_result mal_context_init(mal_backend backends[], mal_uint32 backendCount, mal_log_proc onLog, mal_context* pContext); mal_result mal_context_init(mal_backend backends[], mal_uint32 backendCount, const mal_context_config* pConfig, mal_context* pContext);
// Uninitializes a context. // Uninitializes a context.
// //
...@@ -1203,6 +1213,9 @@ mal_uint32 mal_device_get_buffer_size_in_bytes(mal_device* pDevice); ...@@ -1203,6 +1213,9 @@ mal_uint32 mal_device_get_buffer_size_in_bytes(mal_device* pDevice);
// This is implemented with a lookup table. // This is implemented with a lookup table.
mal_uint32 mal_get_sample_size_in_bytes(mal_format format); mal_uint32 mal_get_sample_size_in_bytes(mal_format format);
// Helper function for initializing a mal_context_config object.
mal_context_config mal_context_config_init(mal_log_proc onLog);
// Helper function for initializing a mal_device_config object. // Helper function for initializing a mal_device_config object.
// //
// This is just a helper API, and as such the returned object can be safely modified as needed. // This is just a helper API, and as such the returned object can be safely modified as needed.
...@@ -2160,7 +2173,7 @@ static void mal_log(mal_context* pContext, mal_device* pDevice, const char* mess ...@@ -2160,7 +2173,7 @@ static void mal_log(mal_context* pContext, mal_device* pDevice, const char* mess
{ {
if (pContext == NULL) return; if (pContext == NULL) return;
mal_log_proc onLog = pContext->onLog; mal_log_proc onLog = pContext->config.onLog;
if (onLog) { if (onLog) {
onLog(pContext, pDevice, message); onLog(pContext, pDevice, message);
} }
...@@ -8027,11 +8040,17 @@ mal_result mal_context_uninit_backend_apis(mal_context* pContext) ...@@ -8027,11 +8040,17 @@ mal_result mal_context_uninit_backend_apis(mal_context* pContext)
return result; return result;
} }
mal_result mal_context_init(mal_backend backends[], mal_uint32 backendCount, mal_log_proc onLog, mal_context* pContext) mal_result mal_context_init(mal_backend backends[], mal_uint32 backendCount, const mal_context_config* pConfig, mal_context* pContext)
{ {
if (pContext == NULL) return MAL_INVALID_ARGS; if (pContext == NULL) return MAL_INVALID_ARGS;
mal_zero_object(pContext); mal_zero_object(pContext);
pContext->onLog = onLog; // <-- Set this at the top to ensure the application has access to every log message.
// Always make sure the config is set first to ensure properties are available as soon as possible.
if (pConfig != NULL) {
pContext->config = *pConfig;
} else {
pContext->config = mal_context_config_init(NULL);
}
// Backend APIs need to be initialized first. This is where external libraries will be loaded and linked. // Backend APIs need to be initialized first. This is where external libraries will be loaded and linked.
mal_result result = mal_context_init_backend_apis(pContext); mal_result result = mal_context_init_backend_apis(pContext);
...@@ -8298,8 +8317,8 @@ mal_result mal_device_init(mal_context* pContext, mal_device_type type, mal_devi ...@@ -8298,8 +8317,8 @@ mal_result mal_device_init(mal_context* pContext, mal_device_type type, mal_devi
pDevice->onRecv = config.onRecvCallback; pDevice->onRecv = config.onRecvCallback;
if (((mal_uint64)pDevice % sizeof(pDevice)) != 0) { if (((mal_uint64)pDevice % sizeof(pDevice)) != 0) {
if (pContext->onLog) { if (pContext->config.onLog) {
pContext->onLog(pContext, pDevice, "WARNING: mal_device_init() called for a device that is not properly aligned. Thread safety is not supported."); pContext->config.onLog(pContext, pDevice, "WARNING: mal_device_init() called for a device that is not properly aligned. Thread safety is not supported.");
} }
} }
...@@ -8697,6 +8716,16 @@ mal_uint32 mal_get_sample_size_in_bytes(mal_format format) ...@@ -8697,6 +8716,16 @@ mal_uint32 mal_get_sample_size_in_bytes(mal_format format)
return sizes[format]; return sizes[format];
} }
mal_context_config mal_context_config_init(mal_log_proc onLog)
{
mal_context_config config;
mal_zero_object(&config);
config.onLog = onLog;
return config;
}
mal_device_config mal_device_config_init(mal_format format, mal_uint32 channels, mal_uint32 sampleRate, mal_recv_proc onRecvCallback, mal_send_proc onSendCallback) mal_device_config mal_device_config_init(mal_format format, mal_uint32 channels, mal_uint32 sampleRate, mal_recv_proc onRecvCallback, mal_send_proc onSendCallback)
{ {
mal_device_config config; mal_device_config config;
...@@ -9902,6 +9931,12 @@ void mal_pcm_f32_to_s32(int* pOut, const float* pIn, unsigned int count) ...@@ -9902,6 +9931,12 @@ void mal_pcm_f32_to_s32(int* pOut, const float* pIn, unsigned int count)
// REVISION HISTORY // REVISION HISTORY
// ================ // ================
// //
// v0.5 - 2017-11-xx
// - API CHANGE: The mal_context_init() function now takes a pointer to a mal_context_config object for
// configuring the context. The works in the same kind of way as the device config. The rationale for this
// change is to give applications better control over context-level properties, add support for backend-
// specific configurations, and support extensibility without breaking the API.
//
// v0.4 - 2017-11-05 // v0.4 - 2017-11-05
// - API CHANGE: The log callback is now per-context rather than per-device and as is thus now passed to // - API CHANGE: The log callback is now per-context rather than per-device and as is thus now passed to
// mal_context_init(). The rationale for this change is that it allows applications to capture diagnostic // mal_context_init(). The rationale for this change is that it allows applications to capture diagnostic
......
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