mirror of
https://github.com/mackron/miniaudio.git
synced 2026-04-23 16:54:03 +02:00
Finish refactoring for generalization of the job system.
This commit is contained in:
+122
-39
@@ -1519,7 +1519,7 @@ manage your job threads if, for example, you want to integrate the job processin
|
|||||||
existing job infrastructure, or if you simply don't like the way the resource manager does it. To
|
existing job infrastructure, or if you simply don't like the way the resource manager does it. To
|
||||||
do this, just set the job thread count to 0 and process jobs manually. To process jobs, you first
|
do this, just set the job thread count to 0 and process jobs manually. To process jobs, you first
|
||||||
need to retrieve a job using `ma_resource_manager_next_job()` and then process it using
|
need to retrieve a job using `ma_resource_manager_next_job()` and then process it using
|
||||||
`ma_resource_manager_process_job()`:
|
`ma_job_process()`:
|
||||||
|
|
||||||
```c
|
```c
|
||||||
config = ma_resource_manager_config_init();
|
config = ma_resource_manager_config_init();
|
||||||
@@ -1547,7 +1547,7 @@ need to retrieve a job using `ma_resource_manager_next_job()` and then process i
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ma_resource_manager_process_job(pMyResourceManager, &job);
|
ma_job_process(&job);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
@@ -5827,9 +5827,21 @@ MA_API ma_result ma_slot_allocator_alloc(ma_slot_allocator* pAllocator, ma_uint6
|
|||||||
MA_API ma_result ma_slot_allocator_free(ma_slot_allocator* pAllocator, ma_uint64 slot);
|
MA_API ma_result ma_slot_allocator_free(ma_slot_allocator* pAllocator, ma_uint64 slot);
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct ma_job ma_job;
|
||||||
|
|
||||||
|
/*
|
||||||
|
Callback for processing a job. Each job type will have their own processing callback which will be
|
||||||
|
called by ma_job_process().
|
||||||
|
*/
|
||||||
|
typedef ma_result (* ma_job_proc)(ma_job* pJob);
|
||||||
|
|
||||||
typedef enum
|
typedef enum
|
||||||
{
|
{
|
||||||
|
/* Miscellaneous. */
|
||||||
MA_JOB_TYPE_QUIT = 0,
|
MA_JOB_TYPE_QUIT = 0,
|
||||||
|
MA_JOB_TYPE_CUSTOM,
|
||||||
|
|
||||||
|
/* Resource Manager. */
|
||||||
MA_JOB_TYPE_RESOURCE_MANAGER_LOAD_DATA_BUFFER_NODE,
|
MA_JOB_TYPE_RESOURCE_MANAGER_LOAD_DATA_BUFFER_NODE,
|
||||||
MA_JOB_TYPE_RESOURCE_MANAGER_FREE_DATA_BUFFER_NODE,
|
MA_JOB_TYPE_RESOURCE_MANAGER_FREE_DATA_BUFFER_NODE,
|
||||||
MA_JOB_TYPE_RESOURCE_MANAGER_PAGE_DATA_BUFFER_NODE,
|
MA_JOB_TYPE_RESOURCE_MANAGER_PAGE_DATA_BUFFER_NODE,
|
||||||
@@ -5838,10 +5850,13 @@ typedef enum
|
|||||||
MA_JOB_TYPE_RESOURCE_MANAGER_LOAD_DATA_STREAM,
|
MA_JOB_TYPE_RESOURCE_MANAGER_LOAD_DATA_STREAM,
|
||||||
MA_JOB_TYPE_RESOURCE_MANAGER_FREE_DATA_STREAM,
|
MA_JOB_TYPE_RESOURCE_MANAGER_FREE_DATA_STREAM,
|
||||||
MA_JOB_TYPE_RESOURCE_MANAGER_PAGE_DATA_STREAM,
|
MA_JOB_TYPE_RESOURCE_MANAGER_PAGE_DATA_STREAM,
|
||||||
MA_JOB_TYPE_RESOURCE_MANAGER_SEEK_DATA_STREAM
|
MA_JOB_TYPE_RESOURCE_MANAGER_SEEK_DATA_STREAM,
|
||||||
|
|
||||||
|
/* Count. Must always be last. */
|
||||||
|
MA_JOB_TYPE_COUNT
|
||||||
} ma_job_type;
|
} ma_job_type;
|
||||||
|
|
||||||
typedef struct
|
struct ma_job
|
||||||
{
|
{
|
||||||
union
|
union
|
||||||
{
|
{
|
||||||
@@ -5861,6 +5876,7 @@ typedef struct
|
|||||||
/* Miscellaneous. */
|
/* Miscellaneous. */
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
|
ma_job_proc proc;
|
||||||
ma_uintptr data0;
|
ma_uintptr data0;
|
||||||
ma_uintptr data1;
|
ma_uintptr data1;
|
||||||
} custom;
|
} custom;
|
||||||
@@ -5938,9 +5954,10 @@ typedef struct
|
|||||||
} seekDataStream;
|
} seekDataStream;
|
||||||
} resourceManager;
|
} resourceManager;
|
||||||
} data;
|
} data;
|
||||||
} ma_job;
|
};
|
||||||
|
|
||||||
MA_API ma_job ma_job_init(ma_uint16 code);
|
MA_API ma_job ma_job_init(ma_uint16 code);
|
||||||
|
MA_API ma_result ma_job_process(ma_job* pJob);
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -10003,7 +10020,7 @@ MA_API ma_result ma_resource_manager_data_source_get_available_frames(ma_resourc
|
|||||||
MA_API ma_result ma_resource_manager_post_job(ma_resource_manager* pResourceManager, const ma_job* pJob);
|
MA_API ma_result ma_resource_manager_post_job(ma_resource_manager* pResourceManager, const ma_job* pJob);
|
||||||
MA_API ma_result ma_resource_manager_post_job_quit(ma_resource_manager* pResourceManager); /* Helper for posting a quit job. */
|
MA_API ma_result ma_resource_manager_post_job_quit(ma_resource_manager* pResourceManager); /* Helper for posting a quit job. */
|
||||||
MA_API ma_result ma_resource_manager_next_job(ma_resource_manager* pResourceManager, ma_job* pJob);
|
MA_API ma_result ma_resource_manager_next_job(ma_resource_manager* pResourceManager, ma_job* pJob);
|
||||||
MA_API ma_result ma_resource_manager_process_job(ma_resource_manager* pResourceManager, ma_job* pJob);
|
MA_API ma_result ma_resource_manager_process_job(ma_resource_manager* pResourceManager, ma_job* pJob); /* DEPRECATED. Use ma_job_process(). Will be removed in version 0.12. */
|
||||||
MA_API ma_result ma_resource_manager_process_next_job(ma_resource_manager* pResourceManager); /* Returns MA_CANCELLED if a MA_JOB_TYPE_QUIT job is found. In non-blocking mode, returns MA_NO_DATA_AVAILABLE if no jobs are available. */
|
MA_API ma_result ma_resource_manager_process_next_job(ma_resource_manager* pResourceManager); /* Returns MA_CANCELLED if a MA_JOB_TYPE_QUIT job is found. In non-blocking mode, returns MA_NO_DATA_AVAILABLE if no jobs are available. */
|
||||||
#endif /* MA_NO_RESOURCE_MANAGER */
|
#endif /* MA_NO_RESOURCE_MANAGER */
|
||||||
|
|
||||||
@@ -40233,6 +40250,72 @@ MA_API ma_job ma_job_init(ma_uint16 code)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static ma_result ma_job_process__quit(ma_job* pJob);
|
||||||
|
static ma_result ma_job_process__custom(ma_job* pJob);
|
||||||
|
static ma_result ma_job_process__resource_manager__load_data_buffer_node(ma_job* pJob);
|
||||||
|
static ma_result ma_job_process__resource_manager__free_data_buffer_node(ma_job* pJob);
|
||||||
|
static ma_result ma_job_process__resource_manager__page_data_buffer_node(ma_job* pJob);
|
||||||
|
static ma_result ma_job_process__resource_manager__load_data_buffer(ma_job* pJob);
|
||||||
|
static ma_result ma_job_process__resource_manager__free_data_buffer(ma_job* pJob);
|
||||||
|
static ma_result ma_job_process__resource_manager__load_data_stream(ma_job* pJob);
|
||||||
|
static ma_result ma_job_process__resource_manager__free_data_stream(ma_job* pJob);
|
||||||
|
static ma_result ma_job_process__resource_manager__page_data_stream(ma_job* pJob);
|
||||||
|
static ma_result ma_job_process__resource_manager__seek_data_stream(ma_job* pJob);
|
||||||
|
|
||||||
|
static ma_job_proc g_jobVTable[MA_JOB_TYPE_COUNT] =
|
||||||
|
{
|
||||||
|
/* Miscellaneous. */
|
||||||
|
ma_job_process__quit, /* MA_JOB_TYPE_QUIT */
|
||||||
|
ma_job_process__custom, /* MA_JOB_TYPE_CUSTOM */
|
||||||
|
|
||||||
|
/* Resource Manager. */
|
||||||
|
ma_job_process__resource_manager__load_data_buffer_node, /* MA_JOB_TYPE_RESOURCE_MANAGER_LOAD_DATA_BUFFER_NODE */
|
||||||
|
ma_job_process__resource_manager__free_data_buffer_node, /* MA_JOB_TYPE_RESOURCE_MANAGER_FREE_DATA_BUFFER_NODE */
|
||||||
|
ma_job_process__resource_manager__page_data_buffer_node, /* MA_JOB_TYPE_RESOURCE_MANAGER_PAGE_DATA_BUFFER_NODE */
|
||||||
|
ma_job_process__resource_manager__load_data_buffer, /* MA_JOB_TYPE_RESOURCE_MANAGER_LOAD_DATA_BUFFER */
|
||||||
|
ma_job_process__resource_manager__free_data_buffer, /* MA_JOB_TYPE_RESOURCE_MANAGER_FREE_DATA_BUFFER */
|
||||||
|
ma_job_process__resource_manager__load_data_stream, /* MA_JOB_TYPE_RESOURCE_MANAGER_LOAD_DATA_STREAM */
|
||||||
|
ma_job_process__resource_manager__free_data_stream, /* MA_JOB_TYPE_RESOURCE_MANAGER_FREE_DATA_STREAM */
|
||||||
|
ma_job_process__resource_manager__page_data_stream, /* MA_JOB_TYPE_RESOURCE_MANAGER_PAGE_DATA_STREAM */
|
||||||
|
ma_job_process__resource_manager__seek_data_stream, /* MA_JOB_TYPE_RESOURCE_MANAGER_SEEK_DATA_STREAM */
|
||||||
|
};
|
||||||
|
|
||||||
|
MA_API ma_result ma_job_process(ma_job* pJob)
|
||||||
|
{
|
||||||
|
if (pJob == NULL) {
|
||||||
|
return MA_INVALID_ARGS;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pJob->toc.breakup.code > MA_JOB_TYPE_COUNT) {
|
||||||
|
return MA_INVALID_OPERATION;
|
||||||
|
}
|
||||||
|
|
||||||
|
return g_jobVTable[pJob->toc.breakup.code](pJob);
|
||||||
|
}
|
||||||
|
|
||||||
|
static ma_result ma_job_process__quit(ma_job* pJob)
|
||||||
|
{
|
||||||
|
MA_ASSERT(pJob != NULL);
|
||||||
|
|
||||||
|
/* No-op. */
|
||||||
|
(void)pJob;
|
||||||
|
|
||||||
|
return MA_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
static ma_result ma_job_process__custom(ma_job* pJob)
|
||||||
|
{
|
||||||
|
MA_ASSERT(pJob != NULL);
|
||||||
|
|
||||||
|
/* No-op if there's no callback. */
|
||||||
|
if (pJob->data.custom.proc == NULL) {
|
||||||
|
return MA_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
return pJob->data.custom.proc(pJob);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
MA_API ma_job_queue_config ma_job_queue_config_init(ma_uint32 flags, ma_uint32 capacity)
|
MA_API ma_job_queue_config ma_job_queue_config_init(ma_uint32 flags, ma_uint32 capacity)
|
||||||
{
|
{
|
||||||
@@ -63851,7 +63934,7 @@ static ma_thread_result MA_THREADCALL ma_resource_manager_job_thread(void* pUser
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
ma_resource_manager_process_job(pResourceManager, &job);
|
ma_job_process(&job);
|
||||||
}
|
}
|
||||||
|
|
||||||
return (ma_thread_result)0;
|
return (ma_thread_result)0;
|
||||||
@@ -66573,7 +66656,7 @@ MA_API ma_result ma_resource_manager_next_job(ma_resource_manager* pResourceMana
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static ma_result ma_resource_manager_process_job__load_data_buffer_node(ma_job* pJob)
|
static ma_result ma_job_process__resource_manager__load_data_buffer_node(ma_job* pJob)
|
||||||
{
|
{
|
||||||
ma_result result = MA_SUCCESS;
|
ma_result result = MA_SUCCESS;
|
||||||
ma_resource_manager* pResourceManager;
|
ma_resource_manager* pResourceManager;
|
||||||
@@ -66725,7 +66808,7 @@ done:
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
static ma_result ma_resource_manager_process_job__free_data_buffer_node(ma_job* pJob)
|
static ma_result ma_job_process__resource_manager__free_data_buffer_node(ma_job* pJob)
|
||||||
{
|
{
|
||||||
ma_resource_manager* pResourceManager;
|
ma_resource_manager* pResourceManager;
|
||||||
ma_resource_manager_data_buffer_node* pDataBufferNode;
|
ma_resource_manager_data_buffer_node* pDataBufferNode;
|
||||||
@@ -66757,7 +66840,7 @@ static ma_result ma_resource_manager_process_job__free_data_buffer_node(ma_job*
|
|||||||
return MA_SUCCESS;
|
return MA_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static ma_result ma_resource_manager_process_job__page_data_buffer_node(ma_job* pJob)
|
static ma_result ma_job_process__resource_manager__page_data_buffer_node(ma_job* pJob)
|
||||||
{
|
{
|
||||||
ma_result result = MA_SUCCESS;
|
ma_result result = MA_SUCCESS;
|
||||||
ma_resource_manager* pResourceManager;
|
ma_resource_manager* pResourceManager;
|
||||||
@@ -66832,7 +66915,7 @@ done:
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static ma_result ma_resource_manager_process_job__load_data_buffer(ma_job* pJob)
|
static ma_result ma_job_process__resource_manager__load_data_buffer(ma_job* pJob)
|
||||||
{
|
{
|
||||||
ma_result result = MA_SUCCESS;
|
ma_result result = MA_SUCCESS;
|
||||||
ma_resource_manager* pResourceManager;
|
ma_resource_manager* pResourceManager;
|
||||||
@@ -66928,7 +67011,7 @@ done:
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
static ma_result ma_resource_manager_process_job__free_data_buffer(ma_job* pJob)
|
static ma_result ma_job_process__resource_manager__free_data_buffer(ma_job* pJob)
|
||||||
{
|
{
|
||||||
ma_resource_manager* pResourceManager;
|
ma_resource_manager* pResourceManager;
|
||||||
ma_resource_manager_data_buffer* pDataBuffer;
|
ma_resource_manager_data_buffer* pDataBuffer;
|
||||||
@@ -66959,7 +67042,7 @@ static ma_result ma_resource_manager_process_job__free_data_buffer(ma_job* pJob)
|
|||||||
return MA_SUCCESS;
|
return MA_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static ma_result ma_resource_manager_process_job__load_data_stream(ma_job* pJob)
|
static ma_result ma_job_process__resource_manager__load_data_stream(ma_job* pJob)
|
||||||
{
|
{
|
||||||
ma_result result = MA_SUCCESS;
|
ma_result result = MA_SUCCESS;
|
||||||
ma_decoder_config decoderConfig;
|
ma_decoder_config decoderConfig;
|
||||||
@@ -67045,7 +67128,7 @@ done:
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
static ma_result ma_resource_manager_process_job__free_data_stream(ma_job* pJob)
|
static ma_result ma_job_process__resource_manager__free_data_stream(ma_job* pJob)
|
||||||
{
|
{
|
||||||
ma_resource_manager* pResourceManager;
|
ma_resource_manager* pResourceManager;
|
||||||
ma_resource_manager_data_stream* pDataStream;
|
ma_resource_manager_data_stream* pDataStream;
|
||||||
@@ -67087,7 +67170,7 @@ static ma_result ma_resource_manager_process_job__free_data_stream(ma_job* pJob)
|
|||||||
return MA_SUCCESS;
|
return MA_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static ma_result ma_resource_manager_process_job__page_data_stream(ma_job* pJob)
|
static ma_result ma_job_process__resource_manager__page_data_stream(ma_job* pJob)
|
||||||
{
|
{
|
||||||
ma_result result = MA_SUCCESS;
|
ma_result result = MA_SUCCESS;
|
||||||
ma_resource_manager* pResourceManager;
|
ma_resource_manager* pResourceManager;
|
||||||
@@ -67117,7 +67200,7 @@ done:
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
static ma_result ma_resource_manager_process_job__seek_data_stream(ma_job* pJob)
|
static ma_result ma_job_process__resource_manager__seek_data_stream(ma_job* pJob)
|
||||||
{
|
{
|
||||||
ma_result result = MA_SUCCESS;
|
ma_result result = MA_SUCCESS;
|
||||||
ma_resource_manager* pResourceManager;
|
ma_resource_manager* pResourceManager;
|
||||||
@@ -67163,28 +67246,7 @@ MA_API ma_result ma_resource_manager_process_job(ma_resource_manager* pResourceM
|
|||||||
return MA_INVALID_ARGS;
|
return MA_INVALID_ARGS;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (pJob->toc.breakup.code)
|
return ma_job_process(pJob);
|
||||||
{
|
|
||||||
/* Data Buffer Node */
|
|
||||||
case MA_JOB_TYPE_RESOURCE_MANAGER_LOAD_DATA_BUFFER_NODE: return ma_resource_manager_process_job__load_data_buffer_node(pJob);
|
|
||||||
case MA_JOB_TYPE_RESOURCE_MANAGER_FREE_DATA_BUFFER_NODE: return ma_resource_manager_process_job__free_data_buffer_node(pJob);
|
|
||||||
case MA_JOB_TYPE_RESOURCE_MANAGER_PAGE_DATA_BUFFER_NODE: return ma_resource_manager_process_job__page_data_buffer_node(pJob);
|
|
||||||
|
|
||||||
/* Data Buffer */
|
|
||||||
case MA_JOB_TYPE_RESOURCE_MANAGER_LOAD_DATA_BUFFER: return ma_resource_manager_process_job__load_data_buffer(pJob);
|
|
||||||
case MA_JOB_TYPE_RESOURCE_MANAGER_FREE_DATA_BUFFER: return ma_resource_manager_process_job__free_data_buffer(pJob);
|
|
||||||
|
|
||||||
/* Data Stream */
|
|
||||||
case MA_JOB_TYPE_RESOURCE_MANAGER_LOAD_DATA_STREAM: return ma_resource_manager_process_job__load_data_stream(pJob);
|
|
||||||
case MA_JOB_TYPE_RESOURCE_MANAGER_FREE_DATA_STREAM: return ma_resource_manager_process_job__free_data_stream(pJob);
|
|
||||||
case MA_JOB_TYPE_RESOURCE_MANAGER_PAGE_DATA_STREAM: return ma_resource_manager_process_job__page_data_stream(pJob);
|
|
||||||
case MA_JOB_TYPE_RESOURCE_MANAGER_SEEK_DATA_STREAM: return ma_resource_manager_process_job__seek_data_stream(pJob);
|
|
||||||
|
|
||||||
default: break;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Getting here means we don't know what the job code is and cannot do anything with it. */
|
|
||||||
return MA_INVALID_OPERATION;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
MA_API ma_result ma_resource_manager_process_next_job(ma_resource_manager* pResourceManager)
|
MA_API ma_result ma_resource_manager_process_next_job(ma_resource_manager* pResourceManager)
|
||||||
@@ -67202,8 +67264,29 @@ MA_API ma_result ma_resource_manager_process_next_job(ma_resource_manager* pReso
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
return ma_resource_manager_process_job(pResourceManager, &job);
|
return ma_job_process(&job);
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
/* We'll get here if the resource manager is being excluded from the build. We need to define the job processing callbacks as no-ops. */
|
||||||
|
static ma_result ma_job_process__resource_manager__noop(ma_job* pJob)
|
||||||
|
{
|
||||||
|
MA_ASSERT(pJob != NULL);
|
||||||
|
|
||||||
|
/* No-op. */
|
||||||
|
(void)pJob;
|
||||||
|
|
||||||
|
return MA_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
static ma_result ma_job_process__resource_manager__load_data_buffer_node(ma_job* pJob) { return ma_job_process__resource_manager__noop(pJob); }
|
||||||
|
static ma_result ma_job_process__resource_manager__free_data_buffer_node(ma_job* pJob) { return ma_job_process__resource_manager__noop(pJob); }
|
||||||
|
static ma_result ma_job_process__resource_manager__page_data_buffer_node(ma_job* pJob) { return ma_job_process__resource_manager__noop(pJob); }
|
||||||
|
static ma_result ma_job_process__resource_manager__load_data_buffer(ma_job* pJob) { return ma_job_process__resource_manager__noop(pJob); }
|
||||||
|
static ma_result ma_job_process__resource_manager__free_data_buffer(ma_job* pJob) { return ma_job_process__resource_manager__noop(pJob); }
|
||||||
|
static ma_result ma_job_process__resource_manager__load_data_stream(ma_job* pJob) { return ma_job_process__resource_manager__noop(pJob); }
|
||||||
|
static ma_result ma_job_process__resource_manager__free_data_stream(ma_job* pJob) { return ma_job_process__resource_manager__noop(pJob); }
|
||||||
|
static ma_result ma_job_process__resource_manager__page_data_stream(ma_job* pJob) { return ma_job_process__resource_manager__noop(pJob); }
|
||||||
|
static ma_result ma_job_process__resource_manager__seek_data_stream(ma_job* pJob) { return ma_job_process__resource_manager__noop(pJob); }
|
||||||
#endif /* MA_NO_RESOURCE_MANAGER */
|
#endif /* MA_NO_RESOURCE_MANAGER */
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user