summaryrefslogtreecommitdiffstatshomepage
path: root/src/emu
diff options
context:
space:
mode:
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
commit994dde76eb0f30cc1107408dcbefee722ff76a8b (patch)
tree621cf71d0467a093e4054b58e256afc130d10752 /src/emu
parentcb21196ecd0e6e3c00fb747dad19a6801f15d637 (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.c6
-rw-r--r--src/emu/sound/discrete.c44
-rw-r--r--src/emu/sound/discrete.h6
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