static MDynamicAudioNormalizer *instance_add(MDynamicAudioNormalizer *const instance)
{
	MY_CRITSEC_ENTER(g_instance_mutex);
	g_instances.insert(instance);
	MY_CRITSEC_LEAVE(g_instance_mutex);
	return instance;
}
static bool instance_check(MDynamicAudioNormalizer *const instance)
{
	bool result;
	MY_CRITSEC_ENTER(g_instance_mutex);
	result = (g_instances.find(instance) != g_instances.end());
	MY_CRITSEC_LEAVE(g_instance_mutex);
	return result;
}
DYNAUDNORM_LOG_CALLBACK *DYNAUDNORM_LOG_SETCALLBACK(DYNAUDNORM_LOG_CALLBACK *const callback)
{
	MY_CRITSEC_ENTER(g_mutex);
	DYNAUDNORM_LOG_CALLBACK *const oldCallback = g_loggingCallback;
	g_loggingCallback = callback;
	MY_CRITSEC_LEAVE(g_mutex);

	return oldCallback;
}
static MDynamicAudioNormalizer *instance_remove(MDynamicAudioNormalizer *const instance)
{
	MY_CRITSEC_ENTER(g_instance_mutex);
	const std::unordered_set<MDynamicAudioNormalizer*>::iterator iter = g_instances.find(instance);
	if (iter != g_instances.end())
	{
		g_instances.erase(iter);
	}
	MY_CRITSEC_LEAVE(g_instance_mutex);
	return instance;
}
static bool global_exit(void)
{
	bool success = false;
	MY_CRITSEC_ENTER(g_initalization_mutex);
	if (g_initialized)
	{
		success = (--g_initialized) ? true : global_exit_function();
	}
	MY_CRITSEC_LEAVE(g_initalization_mutex);
	return success;
}
static bool global_init(void)
{
	bool success = false;
	MY_CRITSEC_ENTER(g_initalization_mutex);
	if ((success = (g_initialized ? true : global_init_function())))
	{
		g_initialized++;
	}
	MY_CRITSEC_LEAVE(g_initalization_mutex);
	return success;
}
static int log_callback_set(PyObject *const callback)
{
	int result = (-1);
	if ((callback) && PyCallable_Check(callback))
	{
		MY_CRITSEC_ENTER(g_logging_mutex);
		result = (g_log_callback) ? 0 : 1;
		PY_FREE(&g_log_callback);
		g_log_callback = callback;
		Py_INCREF(g_log_callback);
		MY_CRITSEC_LEAVE(g_logging_mutex);
	}
	return result;
}
void DYNAUDNORM_LOG_POSTMESSAGE(const int &logLevel, const char *const message, ...)
{
	MY_CRITSEC_ENTER(g_mutex);

	if(g_loggingCallback)
	{
		va_list args;
		va_start (args, message);
		vsnprintf(g_messageBuffer, 1024, message, args);
		va_end(args);
		g_loggingCallback(logLevel, g_messageBuffer);
	}

	MY_CRITSEC_LEAVE(g_mutex);
}
static void log_callback_invoke(const int logLevel, const char *const message)
{
	PyObject *callback;
	MY_CRITSEC_ENTER(g_logging_mutex);
	callback = g_log_callback;
	MY_CRITSEC_LEAVE(g_logging_mutex);

	if (callback)
	{
		if (PyObject *const result = PyObject_CallFunction(callback, "is", logLevel, message))
		{
			Py_DECREF(result); /*discard result*/
		}
	}
}