void reloadPerFrame(char * s, preset_t * preset) { FILE * fs; int slen; char c; int eqn_count = 1; per_frame_eqn_t * per_frame; if (s == NULL) return; if (preset == NULL) return; /* Clear previous per frame equations */ splay_traverse(free_per_frame_eqn, preset->per_frame_eqn_tree); destroy_splaytree(preset->per_frame_eqn_tree); preset->per_frame_eqn_tree = create_splaytree(compare_int, copy_int, free_int); /* Convert string to a stream */ fs = fmemopen (s, strlen(s), "r"); while ((c = fgetc(fs)) != EOF) { ungetc(c, fs); if ((per_frame = parse_per_frame_eqn(fs, eqn_count, preset)) != NULL) { splay_insert(per_frame, &eqn_count, preset->per_frame_eqn_tree); eqn_count++; } } fclose(fs); /* Clear string space */ memset(preset->per_frame_eqn_string_buffer, 0, STRING_BUFFER_SIZE); /* Compute length of string */ slen = strlen(s); /* Copy new string into buffer */ strncpy(preset->per_frame_eqn_string_buffer, s, slen); /* Yet again no bounds checking */ preset->per_frame_eqn_string_index = slen; /* Finished */ printf("reloadPerFrame: %d eqns parsed succesfully\n", eqn_count-1); return; }
preset_t * load_preset(char * pathname) { preset_t * preset; int i; /* Initialize preset struct */ if ((preset = (preset_t*)malloc(sizeof(preset_t))) == NULL) return NULL; /* Initialize equation trees */ preset->init_cond_tree = create_splaytree(compare_string, copy_string, free_string); preset->user_param_tree = create_splaytree(compare_string, copy_string, free_string); preset->per_frame_eqn_tree = create_splaytree(compare_int, copy_int, free_int); preset->per_pixel_eqn_tree = create_splaytree(compare_int, copy_int, free_int); preset->per_frame_init_eqn_tree = create_splaytree(compare_string, copy_string, free_string); preset->custom_wave_tree = create_splaytree(compare_int, copy_int, free_int); preset->custom_shape_tree = create_splaytree(compare_int, copy_int, free_int); memset(preset->per_pixel_flag, 0, sizeof(int)*NUM_OPS); /* Copy file path */ strncpy(preset->file_path, pathname, MAX_PATH_SIZE-1); /* Set initial index values */ preset->per_pixel_eqn_string_index = 0; preset->per_frame_eqn_string_index = 0; preset->per_frame_init_eqn_string_index = 0; /* Clear string buffers */ memset(preset->per_pixel_eqn_string_buffer, 0, STRING_BUFFER_SIZE); memset(preset->per_frame_eqn_string_buffer, 0, STRING_BUFFER_SIZE); memset(preset->per_frame_init_eqn_string_buffer, 0, STRING_BUFFER_SIZE); if (load_preset_file(pathname, preset) < 0) { if (PRESET_DEBUG) printf("load_preset: failed to load file \"%s\"\n", pathname); close_preset(preset); return NULL; } /* It's kind of ugly to reset these values here. Should definitely be placed in the parser somewhere */ per_frame_eqn_count = 0; per_frame_init_eqn_count = 0; /* Finished, return new preset */ return preset; }
void reloadPerPixel(char *s, preset_t * preset) { FILE * fs; int slen; char c; int i; if (s == NULL) return; if (preset == NULL) return; /* Clear previous per pixel equations */ splay_traverse(free_per_pixel_eqn, preset->per_pixel_eqn_tree); destroy_splaytree(preset->per_pixel_eqn_tree); preset->per_pixel_eqn_tree = create_splaytree(compare_int, copy_int, free_int); /* Convert string to a stream */ fs = fmemopen (s, strlen(s), "r"); while ((c = fgetc(fs)) != EOF) { ungetc(c, fs); parse_per_pixel_eqn(fs, preset); } fclose(fs); /* Clear string space */ memset(preset->per_pixel_eqn_string_buffer, 0, STRING_BUFFER_SIZE); /* Compute length of string */ slen = strlen(s); /* Copy new string into buffer */ strncpy(preset->per_pixel_eqn_string_buffer, s, slen); /* Yet again no bounds checking */ preset->per_pixel_eqn_string_index = slen; /* Finished */ return; }
int init_idle_preset() { preset_t * preset; int i; /* Initialize idle preset struct */ if ((preset = (preset_t*)malloc(sizeof(preset_t))) == NULL) return FAILURE; strncpy(preset->name, "idlepreset", strlen("idlepreset")); /* Initialize equation trees */ preset->init_cond_tree = create_splaytree(compare_string, copy_string, free_string); preset->user_param_tree = create_splaytree(compare_string, copy_string, free_string); preset->per_frame_eqn_tree = create_splaytree(compare_int, copy_int, free_int); preset->per_pixel_eqn_tree = create_splaytree(compare_int, copy_int, free_int); preset->per_frame_init_eqn_tree = create_splaytree(compare_string, copy_string, free_string); preset->custom_wave_tree = create_splaytree(compare_int, copy_int, free_int); preset->custom_shape_tree = create_splaytree(compare_int, copy_int, free_int); /* Set file path to dummy name */ strncpy(preset->file_path, "IDLE PRESET", MAX_PATH_SIZE-1); /* Set initial index values */ preset->per_pixel_eqn_string_index = 0; preset->per_frame_eqn_string_index = 0; preset->per_frame_init_eqn_string_index = 0; memset(preset->per_pixel_flag, 0, sizeof(int)*NUM_OPS); /* Clear string buffers */ memset(preset->per_pixel_eqn_string_buffer, 0, STRING_BUFFER_SIZE); memset(preset->per_frame_eqn_string_buffer, 0, STRING_BUFFER_SIZE); memset(preset->per_frame_init_eqn_string_buffer, 0, STRING_BUFFER_SIZE); idle_preset = preset; return SUCCESS; }
/* Initialize the builtin parameter database. Should only be necessary once */ int init_builtin_param_db() { /* Create the builtin parameter splay tree (go Sleator...) */ if ((builtin_param_tree = create_splaytree(compare_string, copy_string, free_string)) == NULL) { if (PARAM_DEBUG) printf("init_builtin_param_db: failed to initialize database (FATAL)\n"); return OUTOFMEM_ERROR; } if (PARAM_DEBUG) { printf("init_builtin_param: loading database..."); fflush(stdout); } /* Loads all builtin parameters into the database */ if (load_all_builtin_param() < 0) { if (PARAM_DEBUG) printf("failed loading builtin parameters (FATAL)\n"); return ERROR; } if (PARAM_DEBUG) printf("success!\n"); /* Finished, no errors */ return SUCCESS; }
custom_wave_t * new_custom_wave(int id) { custom_wave_t * custom_wave; param_t * param; if ((custom_wave = (custom_wave_t*)malloc(sizeof(custom_wave_t))) == NULL) return NULL; custom_wave->id = id; custom_wave->per_frame_count = 0; custom_wave->samples = 512; custom_wave->bSpectrum = 0; custom_wave->enabled = 1; custom_wave->sep = 1; custom_wave->smoothing = 0.0; custom_wave->bUseDots = 0; custom_wave->bAdditive = 0; custom_wave->r = custom_wave->g = custom_wave->b = custom_wave->a = 0.0; custom_wave->scaling = 1.0; custom_wave->per_frame_eqn_string_index = 0; custom_wave->per_frame_init_eqn_string_index = 0; custom_wave->per_point_eqn_string_index = 0; custom_wave->r_mesh = malloc(MAX_SAMPLE_SIZE*sizeof(double)); custom_wave->g_mesh = malloc(MAX_SAMPLE_SIZE*sizeof(double)); custom_wave->b_mesh = malloc(MAX_SAMPLE_SIZE*sizeof(double)); custom_wave->a_mesh = malloc(MAX_SAMPLE_SIZE*sizeof(double)); custom_wave->x_mesh = malloc(MAX_SAMPLE_SIZE*sizeof(double)); custom_wave->y_mesh = malloc(MAX_SAMPLE_SIZE*sizeof(double)); custom_wave->value1 = malloc(MAX_SAMPLE_SIZE*sizeof(double)); custom_wave->value2 = malloc(MAX_SAMPLE_SIZE*sizeof(double)); custom_wave->sample_mesh = malloc(MAX_SAMPLE_SIZE*sizeof(double)); /* Initialize tree data structures */ if ((custom_wave->param_tree = create_splaytree(compare_string, copy_string, free_string)) == NULL) { free_custom_wave(custom_wave); return NULL; } if ((custom_wave->per_point_eqn_tree = create_splaytree(compare_int, copy_int, free_int)) == NULL) { free_custom_wave(custom_wave); return NULL; } if ((custom_wave->per_frame_eqn_tree = create_splaytree(compare_int, copy_int, free_int)) == NULL) { free_custom_wave(custom_wave); return NULL; } if ((custom_wave->init_cond_tree = create_splaytree(compare_string, copy_string, free_string)) == NULL) { free_custom_wave(custom_wave); return NULL; } if ((custom_wave->per_frame_init_eqn_tree = create_splaytree(compare_string, copy_string, free_string)) == NULL) { free_custom_wave(custom_wave); return NULL; } /* Start: Load custom wave parameters */ if ((param = new_param_double("r", P_FLAG_DONT_FREE_MATRIX | P_FLAG_PER_POINT, &custom_wave->r, custom_wave->r_mesh, 1.0, 0.0, .5)) == NULL) { free_custom_wave(custom_wave); return NULL; } if (insert_param(param, custom_wave->param_tree) < 0) { free_custom_wave(custom_wave); return NULL; } if ((param = new_param_double("g", P_FLAG_DONT_FREE_MATRIX | P_FLAG_PER_POINT, &custom_wave->g, custom_wave->g_mesh, 1.0, 0.0, .5)) == NULL){ free_custom_wave(custom_wave); return NULL; } if (insert_param(param, custom_wave->param_tree) < 0) { free_custom_wave(custom_wave); return NULL; } if ((param = new_param_double("b", P_FLAG_DONT_FREE_MATRIX | P_FLAG_PER_POINT, &custom_wave->b, custom_wave->b_mesh, 1.0, 0.0, .5)) == NULL){ free_custom_wave(custom_wave); return NULL; } if (insert_param(param, custom_wave->param_tree) < 0) { free_custom_wave(custom_wave); return NULL; } if ((param = new_param_double("a", P_FLAG_DONT_FREE_MATRIX | P_FLAG_PER_POINT, &custom_wave->a, custom_wave->a_mesh, 1.0, 0.0, .5)) == NULL){ free_custom_wave(custom_wave); return NULL; } if (insert_param(param, custom_wave->param_tree) < 0) { free_custom_wave(custom_wave); return NULL; } if ((param = new_param_double("x", P_FLAG_DONT_FREE_MATRIX | P_FLAG_PER_POINT, &custom_wave->x, custom_wave->x_mesh, 1.0, 0.0, .5)) == NULL) { free_custom_wave(custom_wave); return NULL; } if (insert_param(param, custom_wave->param_tree) < 0) { free_custom_wave(custom_wave); return NULL; } if ((param = new_param_double("y", P_FLAG_DONT_FREE_MATRIX | P_FLAG_PER_POINT, &custom_wave->y, custom_wave->y_mesh, 1.0, 0.0, .5)) == NULL) { free_custom_wave(custom_wave); return NULL; } if (insert_param(param, custom_wave->param_tree) < 0) { free_custom_wave(custom_wave); return NULL; } if ((param = new_param_bool("enabled", P_FLAG_NONE, &custom_wave->enabled, 1, 0, 0)) == NULL) { free_custom_wave(custom_wave); return NULL; } if (insert_param(param, custom_wave->param_tree) < 0) { free_custom_wave(custom_wave); return NULL; } if ((param = new_param_int("sep", P_FLAG_NONE, &custom_wave->sep, 100, -100, 0)) == NULL) { free_custom_wave(custom_wave); return NULL; } if (insert_param(param, custom_wave->param_tree) < 0) { free_custom_wave(custom_wave); return NULL; } if ((param = new_param_bool("bSpectrum", P_FLAG_NONE, &custom_wave->bSpectrum, 1, 0, 0)) == NULL) { free_custom_wave(custom_wave); return NULL; } if (insert_param(param, custom_wave->param_tree) < 0) { free_custom_wave(custom_wave); return NULL; } if ((param = new_param_bool("bDrawThick", P_FLAG_NONE, &custom_wave->bDrawThick, 1, 0, 0)) == NULL) { free_custom_wave(custom_wave); return NULL; } if (insert_param(param, custom_wave->param_tree) < 0) { free_custom_wave(custom_wave); return NULL; } if ((param = new_param_bool("bUseDots", P_FLAG_NONE, &custom_wave->bUseDots, 1, 0, 0)) == NULL) { free_custom_wave(custom_wave); return NULL; } if (insert_param(param, custom_wave->param_tree) < 0) { free_custom_wave(custom_wave); return NULL; } if ((param = new_param_bool("bAdditive", P_FLAG_NONE, &custom_wave->bAdditive, 1, 0, 0)) == NULL) { free_custom_wave(custom_wave); return NULL; } if (insert_param(param, custom_wave->param_tree) < 0) { free_custom_wave(custom_wave); return NULL; } if ((param = new_param_int("samples", P_FLAG_NONE, &custom_wave->samples, 2048, 1, 512)) == NULL) { free_custom_wave(custom_wave); return NULL; } if (insert_param(param, custom_wave->param_tree) < 0) { free_custom_wave(custom_wave); return NULL; } if ((param = new_param_double("sample", P_FLAG_READONLY | P_FLAG_DONT_FREE_MATRIX | P_FLAG_ALWAYS_MATRIX | P_FLAG_PER_POINT, &custom_wave->sample, custom_wave->sample_mesh, 1.0, 0.0, 0.0)) == NULL) { free_custom_wave(custom_wave); return NULL; } if (insert_param(param, custom_wave->param_tree) < 0) { printf("failed to insert sample\n"); free_custom_wave(custom_wave); return NULL; } if ((param = new_param_double("value1", P_FLAG_READONLY | P_FLAG_DONT_FREE_MATRIX | P_FLAG_ALWAYS_MATRIX | P_FLAG_PER_POINT, &custom_wave->v1, custom_wave->value1, 1.0, -1.0, 0.0)) == NULL) { free_custom_wave(custom_wave); return NULL; } if (insert_param(param, custom_wave->param_tree) < 0) { free_custom_wave(custom_wave); return NULL; } if ((param = new_param_double("value2", P_FLAG_READONLY | P_FLAG_DONT_FREE_MATRIX | P_FLAG_ALWAYS_MATRIX | P_FLAG_PER_POINT, &custom_wave->v2, custom_wave->value2, 1.0, -1.0, 0.0)) == NULL) { free_custom_wave(custom_wave); return NULL; } if (insert_param(param, custom_wave->param_tree) < 0) { free_custom_wave(custom_wave); return NULL; } if ((param = new_param_double("smoothing", P_FLAG_NONE, &custom_wave->smoothing, NULL, 1.0, 0.0, 0.0)) == NULL) { free_custom_wave(custom_wave); return NULL; } if (insert_param(param, custom_wave->param_tree) < 0) { free_custom_wave(custom_wave); return NULL; } if ((param = new_param_double("scaling", P_FLAG_NONE, &custom_wave->scaling, NULL, MAX_DOUBLE_SIZE, 0.0, 1.0)) == NULL) { free_custom_wave(custom_wave); return NULL; } if (insert_param(param, custom_wave->param_tree) < 0) { free_custom_wave(custom_wave); return NULL; } if ((param = new_param_double("t1", P_FLAG_PER_POINT | P_FLAG_TVAR, &custom_wave->t1, NULL, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, 0.0)) == NULL) { free_custom_wave(custom_wave); return NULL; } if (insert_param(param, custom_wave->param_tree) < 0) { free_custom_wave(custom_wave); return NULL; } if ((param = new_param_double("t2", P_FLAG_PER_POINT |P_FLAG_TVAR, &custom_wave->t2, NULL, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, 0.0)) == NULL) { free_custom_wave(custom_wave); return NULL; } if (insert_param(param, custom_wave->param_tree) < 0) { free_custom_wave(custom_wave); return NULL; } if ((param = new_param_double("t3", P_FLAG_PER_POINT |P_FLAG_TVAR, &custom_wave->t3, NULL, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, 0.0)) == NULL) { free_custom_wave(custom_wave); return NULL; } if (insert_param(param, custom_wave->param_tree) < 0) { free_custom_wave(custom_wave); return NULL; } if ((param = new_param_double("t4", P_FLAG_PER_POINT |P_FLAG_TVAR, &custom_wave->t4, NULL, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, 0.0)) == NULL) { free_custom_wave(custom_wave); return NULL; } if (insert_param(param, custom_wave->param_tree) < 0) { free_custom_wave(custom_wave); return NULL; } if ((param = new_param_double("t5", P_FLAG_TVAR, &custom_wave->t5, NULL, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, 0.0)) == NULL) { free_custom_wave(custom_wave); return NULL; } if (insert_param(param, custom_wave->param_tree) < 0) { free_custom_wave(custom_wave); return NULL; } if ((param = new_param_double("t6", P_FLAG_TVAR | P_FLAG_PER_POINT, &custom_wave->t6, NULL, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, 0.0)) == NULL) { free_custom_wave(custom_wave); return NULL; } if (insert_param(param, custom_wave->param_tree) < 0) { free_custom_wave(custom_wave); return NULL; } if ((param = new_param_double("t7", P_FLAG_TVAR | P_FLAG_PER_POINT, &custom_wave->t7, NULL, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, 0.0)) == NULL) { free_custom_wave(custom_wave); return NULL; } if (insert_param(param, custom_wave->param_tree) < 0) { free_custom_wave(custom_wave); return NULL; } if ((param = new_param_double("t8", P_FLAG_TVAR | P_FLAG_PER_POINT, &custom_wave->t8, NULL, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, 0.0)) == NULL) { free_custom_wave(custom_wave); return NULL; } if (insert_param(param, custom_wave->param_tree) < 0) { free_custom_wave(custom_wave); return NULL; } /* End of parameter loading. Note that the read only parameters associated with custom waves (ie, sample) are global variables, and not specific to the custom wave datastructure. */ return custom_wave; }
int loadPresetDir(char * dir) { struct dirent ** name_list; char * preset_name; int i, j, dir_size; if (dir == NULL) return ERROR; if (chrono_order_preset_name_tree != NULL) { if (PRESET_DEBUG) printf("loadPresetDir: previous directory doesn't appear to be closed!\n"); /* Let this slide for now */ } /* Scan the entire directory, storing each entry in a dirent struct array that needs to be freed later. For more information, consult scandir(3) in the man pages */ if ((dir_size = scandir(dir, &name_list, 0, alphasort)) < 0) { if (PRESET_DEBUG) printf("loadPresetDir: failed to open directory \"%s\"\n", dir); return ERROR; } chrono_order_preset_name_tree = create_splaytree(compare_int, copy_int, free_int); /* Iterate through entire dirent name list, adding to the preset name list if it is valid */ for (i = 0; ((i < dir_size) && (i < MAX_PRESETS_IN_DIR));i++) { /* Only perform the next set of operations if the preset name contains a valid extension */ if (is_valid_extension(name_list[i]->d_name)) { /* Handle the out of memory case. My guess is xmms would crash before this program would, but whatever...*/ if ((preset_name = (char*)malloc(MAX_PATH_SIZE)) == NULL) { if (PRESET_DEBUG) printf("loadPresetDir: out of memory! \n"); /* Free the rest of the dirent name list */ for (j = i; j < dir_size; j++) free(name_list[j]); destroy_splaytree(chrono_order_preset_name_tree); return OUTOFMEM_ERROR; } /* Now create the full path */ if (get_preset_path(&preset_name, dir, name_list[i]->d_name) < 0) { if (PRESET_DEBUG) printf("loadPresetDir: failed to generate full preset path name!\n"); /* Free the rest of the dirent name list */ for (j = i; j < dir_size; j++) free(name_list[j]); destroy_splaytree(chrono_order_preset_name_tree); return OUTOFMEM_ERROR; } /* Insert the character string into the splay tree, with the key being its sequence number */ splay_insert(preset_name, &preset_name_buffer_size, chrono_order_preset_name_tree); preset_name_buffer_size++; } /* Free the dirent struct */ free(name_list[i]); } free(name_list); /* No valid files in directory! */ if (chrono_order_preset_name_tree->root == NULL) { if (PRESET_DEBUG) printf("loadPresetDir: no valid files in directory \"%s\"\n", dir); destroy_splaytree(chrono_order_preset_name_tree); chrono_order_preset_name_tree = NULL; return FAILURE; } /* Start the prefix index right before the first entry, so next preset starts at the top of the list */ preset_index = -1; /* Start the first preset */ switchPreset(ALPHA_NEXT, HARD_CUT); return SUCCESS; }