diff options
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 |
commit | cb21196ecd0e6e3c00fb747dad19a6801f15d637 (patch) | |
tree | 4be090b279141f188adc5e48ba7d70c390ef3407 /src/emu | |
parent | e4c8040702dd99f0d755b567ded6bafdb179926d (diff) |
Maintenance work
- more descriptive names
- preparation for more general task definition
Diffstat (limited to 'src/emu')
-rw-r--r-- | src/emu/sound/disc_sys.c | 37 | ||||
-rw-r--r-- | src/emu/sound/discrete.c | 71 | ||||
-rw-r--r-- | src/emu/sound/discrete.h | 21 |
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 * */ |