diff options
author | Couriersud <couriersud@users.noreply.github.com> | 2009-10-03 00:58:15 +0000 |
---|---|---|
committer | Couriersud <couriersud@users.noreply.github.com> | 2009-10-03 00:58:15 +0000 |
commit | 994dde76eb0f30cc1107408dcbefee722ff76a8b (patch) | |
tree | 621cf71d0467a093e4054b58e256afc130d10752 /src/emu | |
parent | cb21196ecd0e6e3c00fb747dad19a6801f15d637 (diff) |
implemented m:n logic for buffered task nodes
- preparation work so that a task node output buffer may be read by
more than one following task.
- target: implementation of task groups: tasks in a task group run parallel, task groups serial. The current main task may than just be task (in the last task group)
Diffstat (limited to 'src/emu')
-rw-r--r-- | src/emu/sound/disc_sys.c | 6 | ||||
-rw-r--r-- | src/emu/sound/discrete.c | 44 | ||||
-rw-r--r-- | src/emu/sound/discrete.h | 6 |
3 files changed, 33 insertions, 23 deletions
diff --git a/src/emu/sound/disc_sys.c b/src/emu/sound/disc_sys.c index d9290ceb357..6d7ad5b82d1 100644 --- a/src/emu/sound/disc_sys.c +++ b/src/emu/sound/disc_sys.c @@ -77,7 +77,7 @@ static DISCRETE_START( dso_task ) discrete_log(task_node->info, "dso_task_start - buffering %d(%d) in task %p referenced by %d", NODE_INDEX(inputnode), NODE_CHILD_NODE_NUM(inputnode), task, NODE_BLOCKINDEX(main_node)); task->node_buf[task->numbuffered] = auto_alloc_array(task_node->info->device->machine, double, 2048); - task->dest[task->numbuffered] = (double *) main_node->input[inputnum]; + task->source[task->numbuffered] = (double *) main_node->input[inputnum]; task->nodes[task->numbuffered] = discrete_find_node(task_node->info, inputnode); /* register into source list */ @@ -87,6 +87,8 @@ static DISCRETE_START( dso_task ) source); source->task = task; source->output_node = task->numbuffered; + /* point the input to a buffered location */ + main_node->input[inputnum] = &source->buffer; task->numbuffered++; } @@ -103,7 +105,7 @@ static DISCRETE_STEP( dso_task ) int i; for (i = 0; i < task->numbuffered; i++) - *(task->ptr[i]++) = *task->dest[i]; //DISCRETE_INPUT(i); + *(task->ptr[i]++) = *task->source[i]; //DISCRETE_INPUT(i); } static DISCRETE_RESET( dso_task ) diff --git a/src/emu/sound/discrete.c b/src/emu/sound/discrete.c index fea60604b8d..6a2a06396c2 100644 --- a/src/emu/sound/discrete.c +++ b/src/emu/sound/discrete.c @@ -67,7 +67,7 @@ typedef struct _task_info task_info; struct _task_info { - discrete_task *context; + discrete_task *task; int samples; }; @@ -669,38 +669,45 @@ static void *task_callback(void *param, int threadid) int samples, i; /* set up task buffers */ - for (i = 0; i < ti->context->numbuffered; i++) - ti->context->ptr[i] = &ti->context->node_buf[i][0]; + for (i = 0; i < ti->task->numbuffered; i++) + ti->task->ptr[i] = ti->task->node_buf[i]; samples = ti->samples; while (samples-- > 0) { - step_nodes_in_list(ti->context->list); + step_nodes_in_list(ti->task->list); } - /* reset ptr */ - for (i = 0; i < ti->context->numbuffered; i++) - ti->context->ptr[i] = &ti->context->node_buf[i][0]; free(param); return NULL; } -INLINE void update_main_nodes(discrete_info *info) +INLINE void update_main_nodes(discrete_info *info, int samples) { linked_list_entry *entry; - if (DISCRETE_PROFILING) - info->total_samples++; - - /* update task nodes */ + /* initialize sources */ for (entry = info->source_list; entry != 0; entry = entry->next) { discrete_source_node *sn = (discrete_source_node *) entry->ptr; - *sn->task->dest[sn->output_node] = *sn->task->ptr[sn->output_node]++; + sn->ptr = sn->task->node_buf[sn->output_node]; } - /* loop over all nodes */ - step_nodes_in_list(info->main_list); + while (samples-- > 0) + { + if (DISCRETE_PROFILING) + info->total_samples++; + + /* update source node buffer */ + for (entry = info->source_list; entry != 0; entry = entry->next) + { + discrete_source_node *sn = (discrete_source_node *) entry->ptr; + sn->buffer = *sn->ptr++; + } + + /* loop over all nodes */ + step_nodes_in_list(info->main_list); + } } static STREAM_UPDATE( buffer_stream_update ) @@ -720,7 +727,7 @@ static STREAM_UPDATE( discrete_stream_update ) { discrete_info *info = (discrete_info *)param; linked_list_entry *entry; - int samplenum, outputnum; + int outputnum; if (samples == 0) return; @@ -745,7 +752,7 @@ static STREAM_UPDATE( discrete_stream_update ) discrete_task *task = (discrete_task *) entry->ptr; /* Fire task */ - ti->context = task; + ti->task = task; ti->samples = samples; osd_work_item_queue(info->queue, task_callback, (void *) ti, WORK_ITEM_FLAG_AUTO_RELEASE); } @@ -754,8 +761,7 @@ static STREAM_UPDATE( discrete_stream_update ) osd_work_queue_wait(info->queue, osd_ticks_per_second()*10); /* Now we must do samples iterations of the node list, one output for each step */ - for (samplenum = 0; samplenum < samples; samplenum++) - update_main_nodes(info); + update_main_nodes(info, samples); if (DISCRETE_PROFILING) info->total_stream_updates++; diff --git a/src/emu/sound/discrete.h b/src/emu/sound/discrete.h index c54aadfe555..eaf6b469775 100644 --- a/src/emu/sound/discrete.h +++ b/src/emu/sound/discrete.h @@ -3714,15 +3714,17 @@ struct _discrete_task double *ptr[DISCRETE_MAX_TASK_OUTPUTS]; double *node_buf[DISCRETE_MAX_TASK_OUTPUTS]; node_description *nodes[DISCRETE_MAX_TASK_OUTPUTS]; - double *dest[DISCRETE_MAX_TASK_OUTPUTS]; + double *source[DISCRETE_MAX_TASK_OUTPUTS]; }; typedef struct _discrete_source_node discrete_source_node; struct _discrete_source_node { - discrete_task *task; + const discrete_task *task; int output_node; + double buffer; + double *ptr; }; struct _discrete_info |