summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Couriersud <couriersud@users.noreply.github.com>2009-10-03 00:30:57 +0000
committer Couriersud <couriersud@users.noreply.github.com>2009-10-03 00:30:57 +0000
commitcb21196ecd0e6e3c00fb747dad19a6801f15d637 (patch)
tree4be090b279141f188adc5e48ba7d70c390ef3407
parente4c8040702dd99f0d755b567ded6bafdb179926d (diff)
Maintenance work
- more descriptive names - preparation for more general task definition
-rw-r--r--src/emu/sound/disc_sys.c37
-rw-r--r--src/emu/sound/discrete.c71
-rw-r--r--src/emu/sound/discrete.h21
3 files changed, 85 insertions, 44 deletions
diff --git a/src/emu/sound/disc_sys.c b/src/emu/sound/disc_sys.c
index 83351ef780a..d9290ceb357 100644
--- a/src/emu/sound/disc_sys.c
+++ b/src/emu/sound/disc_sys.c
@@ -38,7 +38,7 @@ struct dso_wavelog_context
static DISCRETE_START( dso_task )
{
- discrete_task_context *task = (discrete_task_context *) node->context;
+ discrete_task *task = (discrete_task *) node->context;
int inputnum;
const linked_list_entry *node_entry;
const linked_list_entry *step_entry;
@@ -48,20 +48,20 @@ static DISCRETE_START( dso_task )
*/
for (node_entry = task->list; node_entry != NULL; node_entry = node_entry->next)
{
- node_description *node = (node_description *) node_entry->ptr;
+ node_description *task_node = (node_description *) node_entry->ptr;
int found = 0;
- for (step_entry = node->info->step_list; step_entry != NULL; step_entry = step_entry->next)
+ for (step_entry = task_node->info->main_list; step_entry != NULL; step_entry = step_entry->next)
{
- node_description *snode = (node_description *) step_entry->ptr;
+ node_description *main_node = (node_description *) step_entry->ptr;
/* loop over all active inputs */
- for (inputnum = 0; inputnum < snode->active_inputs; inputnum++)
+ for (inputnum = 0; inputnum < main_node->active_inputs; inputnum++)
{
- int inputnode = snode->block->input_node[inputnum];
+ int inputnode = main_node->block->input_node[inputnum];
if IS_VALUE_A_NODE(inputnode)
{
- if (NODE_DEFAULT_NODE(node->block->node) == NODE_DEFAULT_NODE(inputnode))
+ if (NODE_DEFAULT_NODE(task_node->block->node) == NODE_DEFAULT_NODE(inputnode))
{
int i;
found = 0;
@@ -70,13 +70,24 @@ static DISCRETE_START( dso_task )
found = 1;
if (!found)
{
+ discrete_source_node *source;
+
if (task->numbuffered >= DISCRETE_MAX_TASK_OUTPUTS)
fatalerror("dso_task_start - Number of maximum buffered nodes exceeded");
- discrete_log(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(snode));
- task->node_buf[task->numbuffered] = auto_alloc_array(node->info->device->machine, double, 2048);
- task->dest[task->numbuffered] = (double **) &snode->input[inputnum];
- task->nodes[task->numbuffered] = discrete_find_node(node->info, inputnode);
+ 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->nodes[task->numbuffered] = discrete_find_node(task_node->info, inputnode);
+
+ /* register into source list */
+ source = auto_alloc(task_node->info->device->machine, discrete_source_node);
+ linked_list_add(task_node->info,
+ (linked_list_entry **) &task_node->info->source_list,
+ source);
+ source->task = task;
+ source->output_node = task->numbuffered;
+
task->numbuffered++;
}
}
@@ -88,11 +99,11 @@ static DISCRETE_START( dso_task )
static DISCRETE_STEP( dso_task )
{
- discrete_task_context *task = (discrete_task_context *) node->context;
+ discrete_task *task = (discrete_task *) node->context;
int i;
for (i = 0; i < task->numbuffered; i++)
- *(task->ptr[i]++) = **task->dest[i]; //DISCRETE_INPUT(i);
+ *(task->ptr[i]++) = *task->dest[i]; //DISCRETE_INPUT(i);
}
static DISCRETE_RESET( dso_task )
diff --git a/src/emu/sound/discrete.c b/src/emu/sound/discrete.c
index ef0a09b7d48..fea60604b8d 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 *context;
+ discrete_task *context;
int samples;
};
@@ -132,7 +132,7 @@ INLINE int node_module_index(const node_description *node)
return -1;
}
-INLINE void linked_list_add(const discrete_info *info, linked_list_entry ***list_tail_ptr, const void *ptr)
+INLINE void linked_list_tail_add(const discrete_info *info, linked_list_entry ***list_tail_ptr, const void *ptr)
{
**list_tail_ptr = auto_alloc(info->device->machine, linked_list_entry);
(**list_tail_ptr)->ptr = ptr;
@@ -150,6 +150,27 @@ INLINE int linked_list_count(const linked_list_entry *list)
return cnt;
}
+
+INLINE void linked_list_add(const discrete_info *info, linked_list_entry **list, const void *ptr)
+{
+ linked_list_entry *entry;
+
+ if (*list == NULL)
+ {
+ *list = auto_alloc(info->device->machine, linked_list_entry);
+ (*list)->ptr = ptr;
+ (*list)->next = NULL;
+ }
+ else
+ {
+ for (entry = *list; entry != NULL && entry->next != NULL; entry = entry->next)
+ ;
+ entry->next = auto_alloc(info->device->machine, linked_list_entry);
+ entry->next->ptr = ptr;
+ entry->next->next = NULL;
+ }
+}
+
/*************************************
*
* Included simulation objects
@@ -395,7 +416,7 @@ static void discrete_build_list(discrete_info *info, const discrete_sound_block
else
{
discrete_log(info, "discrete_build_list() - adding node %d (*current %p)\n", node_count, *current);
- linked_list_add(info, current, &intf[node_count]);
+ linked_list_tail_add(info, current, &intf[node_count]);
}
node_count++;
@@ -482,9 +503,10 @@ static DEVICE_START( discrete )
/* Start with empty lists */
info->node_list = NULL;
- info->step_list = NULL;
+ info->main_list = NULL;
info->output_list = NULL;
info->input_list = NULL;
+ info->source_list = NULL;
/* allocate memory to hold pointers to nodes by index */
info->indexed_node = auto_alloc_array_clear(device->machine, node_description *, DISCRETE_MAX_NODES);
@@ -562,12 +584,12 @@ static void display_profiling(const discrete_info *info)
/* Task information */
for (entry = info->task_list; entry != 0; entry = entry->next)
{
- discrete_task_context *task = (discrete_task_context *) entry->ptr;
+ discrete_task *task = (discrete_task *) entry->ptr;
tt = list_run_time(task->list);
printf("Task: %8.2f %15.2f\n", tt / (double) total * 100.0, tt / (double) info->total_samples);
}
- tt = list_run_time(info->step_list);
+ tt = list_run_time(info->main_list);
printf("Main: %8.2f %15.2f\n", tt / (double) total * 100.0, tt / (double) info->total_samples);
@@ -663,7 +685,7 @@ static void *task_callback(void *param, int threadid)
return NULL;
}
-INLINE void discrete_stream_update_nodes(discrete_info *info)
+INLINE void update_main_nodes(discrete_info *info)
{
linked_list_entry *entry;
@@ -671,17 +693,14 @@ INLINE void discrete_stream_update_nodes(discrete_info *info)
info->total_samples++;
/* update task nodes */
- for (entry = info->task_list; entry != 0; entry = entry->next)
+ for (entry = info->source_list; entry != 0; entry = entry->next)
{
- discrete_task_context *task = (discrete_task_context *) entry->ptr;
- int i;
-
- for (i = task->numbuffered - 1; i >= 0 ; i--)
- **task->dest[i] = *task->ptr[i]++;
+ discrete_source_node *sn = (discrete_source_node *) entry->ptr;
+ *sn->task->dest[sn->output_node] = *sn->task->ptr[sn->output_node]++;
}
/* loop over all nodes */
- step_nodes_in_list(info->step_list);
+ step_nodes_in_list(info->main_list);
}
static STREAM_UPDATE( buffer_stream_update )
@@ -723,7 +742,7 @@ static STREAM_UPDATE( discrete_stream_update )
for (entry = info->task_list; entry != 0; entry = entry->next)
{
task_info *ti = (task_info *)malloc(sizeof(task_info));
- discrete_task_context *task = (discrete_task_context *) entry->ptr;
+ discrete_task *task = (discrete_task *) entry->ptr;
/* Fire task */
ti->context = task;
@@ -736,7 +755,7 @@ static STREAM_UPDATE( discrete_stream_update )
/* Now we must do samples iterations of the node list, one output for each step */
for (samplenum = 0; samplenum < samples; samplenum++)
- discrete_stream_update_nodes(info);
+ update_main_nodes(info);
if (DISCRETE_PROFILING)
info->total_stream_updates++;
@@ -757,9 +776,9 @@ static void init_nodes(discrete_info *info, linked_list_entry *block_list, const
linked_list_entry **task_node_list_ptr = NULL;
linked_list_entry *entry;
linked_list_entry *task_node_list = NULL;
- discrete_task_context *task = NULL;
+ discrete_task *task = NULL;
/* list tail pointers */
- linked_list_entry **step_list_ptr = &info->step_list;
+ linked_list_entry **main_list_ptr = &info->main_list;
linked_list_entry **node_list_ptr = &info->node_list;
linked_list_entry **task_list_ptr = &info->task_list;
linked_list_entry **output_list_ptr = &info->output_list;
@@ -808,7 +827,7 @@ static void init_nodes(discrete_info *info, linked_list_entry *block_list, const
{
/* Output Node */
case DSO_OUTPUT:
- linked_list_add(info, &output_list_ptr, node);
+ linked_list_tail_add(info, &output_list_ptr, node);
break;
/* CSVlog Node for debugging */
@@ -830,10 +849,10 @@ static void init_nodes(discrete_info *info, linked_list_entry *block_list, const
case DSO_TASK_END:
if (task_node_list_ptr == NULL)
fatalerror("init_nodes() - NO DISCRETE_START_TASK.");
- task = auto_alloc_clear(info->device->machine, discrete_task_context);
+ task = auto_alloc_clear(info->device->machine, discrete_task);
task->numbuffered = 0;
task->list = task_node_list;
- linked_list_add(info, &task_list_ptr, task);
+ linked_list_tail_add(info, &task_list_ptr, task);
node->context = task;
task = NULL;
task_node_list = NULL;
@@ -855,15 +874,15 @@ static void init_nodes(discrete_info *info, linked_list_entry *block_list, const
/* if we are an stream input node, track that */
if (block->type == DSS_INPUT_STREAM)
{
- linked_list_add(info, &input_list_ptr, node);
+ linked_list_tail_add(info, &input_list_ptr, node);
}
else if (block->type == DSS_INPUT_BUFFER)
{
- linked_list_add(info, &input_list_ptr, node);
+ linked_list_tail_add(info, &input_list_ptr, node);
}
/* add to node list */
- linked_list_add(info, &node_list_ptr, node);
+ linked_list_tail_add(info, &node_list_ptr, node);
/* our running order just follows the order specified */
/* does the node step ? */
@@ -871,9 +890,9 @@ static void init_nodes(discrete_info *info, linked_list_entry *block_list, const
{
/* do we belong to a task? */
if (task_node_list_ptr == NULL)
- linked_list_add(info, &step_list_ptr, node);
+ linked_list_tail_add(info, &main_list_ptr, node);
else
- linked_list_add(info, &task_node_list_ptr, node);
+ linked_list_tail_add(info, &task_node_list_ptr, node);
}
if (block->type == DSO_TASK_END)
diff --git a/src/emu/sound/discrete.h b/src/emu/sound/discrete.h
index 5dcc515a372..c54aadfe555 100644
--- a/src/emu/sound/discrete.h
+++ b/src/emu/sound/discrete.h
@@ -3705,8 +3705,8 @@ struct _linked_list_entry
linked_list_entry *next;
};
-typedef struct _discrete_task_context discrete_task_context;
-struct _discrete_task_context
+typedef struct _discrete_task discrete_task;
+struct _discrete_task
{
const linked_list_entry *list;
@@ -3714,10 +3714,17 @@ struct _discrete_task_context
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 *dest[DISCRETE_MAX_TASK_OUTPUTS];
};
+typedef struct _discrete_source_node discrete_source_node;
+struct _discrete_source_node
+{
+ discrete_task *task;
+ int output_node;
+};
+
struct _discrete_info
{
const device_config *device;
@@ -3733,8 +3740,12 @@ struct _discrete_info
/* list of all nodes */
linked_list_entry *node_list; /* node_description * */
- /* list of nodes which step */
- linked_list_entry *step_list; /* node_description * */
+ /* list of "main" task nodes */
+ linked_list_entry *main_list; /* node_description * */
+
+ /* list of main source nodes */
+
+ linked_list_entry *source_list; /* discrete_source_node */
/* list of discrete blocks after prescan (IMPORT, DELETE, REPLACE) */
linked_list_entry *block_list; /* discrete_sound_block * */