/***************************************************************************** function: get_form_vars purpose: Runs through the submitted browser form variables and calls extract_var() as needed to assign values to globals. notes: currently a duplicate of the same function in output.c, with different variable names to extract returns: nothing. *****************************************************************************/ void get_form_vars(void) { char vars[2048], request[10], *temp; int length; if(!getenv("REQUEST_METHOD")) exit(0); strncpy(request, getenv("REQUEST_METHOD"), 9); request[9] = 0; if(!strlen(request)) exit(0); if(strncmp(request, "GET", 3) == 0) { strncpy(vars, getenv("QUERY_STRING"), 2048); vars[2047] = 0; if(!strlen(vars)) exit(0); } else if(strncmp(request, "POST", 4) == 0) { if(!getenv("CONTENT_LENGTH")) exit(0); length = atoi(getenv("CONTENT_LENGTH")); if(!length || length == 0) exit(0); fread(vars, length > 2048 ? 2048 : length, 1, stdin); vars[length] = 0; } else exit(0); temp = extract_var(vars, "pid"); if (temp) pid = atoi(temp); else { printf("<html>\n<head>\n<title>fatal error</title>\n</head>\n<body>\n"); printf("FATAL ERROR: couldn't extract running PID!\n"); printf("</body>\n</html>\n"); exit(0); } strcpy(filename, TEMP_PATH); strcat(filename, temp); temp = extract_var(vars, "passwordmode"); if (temp) passwordmode = atoi(temp); temp = extract_var(vars, "submitted"); if (temp) submitted = atoi(temp); temp = extract_var(vars, "theme"); if (temp) strncpy(theme, temp, MAX_VARLEN); else strcpy(theme, DEFAULT_THEME); temp = extract_var(vars, "cmd"); if (temp) strncpy(cmd, temp, MAX_VARLEN); else cmd[0] = 0; }
program_t parse(string fn) { int n_osc=0; oscillator_t *osc=NULL; env_settings_t *env=NULL; filter_params_t filter; fixed_t sync_factor=0; bool sync_factor_const=true; char buf[2000]; string line; string var; string array; string strval; float val; parameter_enum p; int ind,ind2=0; int state; program_t result; ifstream f; f.open(fn.c_str()); if (f.good()) { state=0; while (!f.eof()) { f.getline(buf,sizeof(buf)/sizeof(*buf)-1); line=buf; line=remove_all_spaces(buf); if ((line!="") && (line[0]!='#')) //ignore comments and empty lines { if (line=="controllers:") { state=2; continue; } else if (line=="defaults:") { state=3; continue; } else if (line=="velocity:") { state=4; continue; } else if (line=="variable:") { state=5; continue; } var=extract_var(line); array=extract_array_name(var); strval=extract_val(line); val=atof(strval.c_str()); switch (state) { case 0: //expect and read number of oscillators if (var!="oscillators") throw string("need to know number of oscillators"); else n_osc=val; if (n_osc<=0) throw string("invalid number of oscillators"); //init stuff env=new env_settings_t[n_osc]; osc=new oscillator_t[n_osc]; init_oscs(n_osc, osc); init_envs(n_osc, env); init_filter(filter); state=1; break; case 1: //read and set information about oscillator settings p=param_to_enum(array); ind=extract_array_index(var,1); if ( param_needs_index(p) && (!((ind>=0) && (ind<n_osc))) ) throw string("out of array bounds"); switch (p) { case MODULATION: ind2=extract_array_index(var,2); if (!((ind2>=0) && (ind2<n_osc))) throw string("out of array bounds"); osc[ind].fm_strength[ind2]=val*ONE; break; case OUTPUT: osc[ind].output=val*ONE; break; case WAVEFORM: if (isfloat(strval)) { osc[ind].waveform=int(val); } else { osc[ind].have_custom_wave=true; } break; case FACTOR: osc[ind].factor=val*ONE; break; case TREMOLO: osc[ind].tremolo_depth=int(val); break; case TREM_LFO: if (strval=="snh") osc[ind].tremolo_lfo=SNH_LFO; else { osc[ind].tremolo_lfo= int(val); if ((val<0) || (val>=N_LFOS)) throw string("invalid value for tremolo_lfo"); } break; case VIBRATO: osc[ind].vibrato_depth=val; break; case VIB_LFO: if (strval=="snh") osc[ind].vibrato_lfo= SNH_LFO; else { osc[ind].vibrato_lfo= int(val); if ((val<0) || (val>=N_LFOS)) throw string("invalid value for vibrato_lfo"); } break; case ATTACK: env[ind].attack=val; break; case DECAY: env[ind].decay=val; break; case SUSTAIN: env[ind].sustain=val; break; case RELEASE: env[ind].release=val; break; case HOLD: env[ind].hold=(val!=0); break; case KSR: osc[ind].ksr=val; break; case KSL: osc[ind].ksl=val; break; case SYNC: osc[ind].sync=(val!=0); break; case FILTER_ENABLED: filter.enabled=(val!=0); break; case FILTER_ENV_AMOUNT: filter.env_amount=val; break; case FILTER_ATTACK: filter.env_settings.attack=val; break; case FILTER_DECAY: filter.env_settings.decay=val; break; case FILTER_SUSTAIN: filter.env_settings.sustain=val; break; case FILTER_RELEASE: filter.env_settings.release=val; break; case FILTER_HOLD: filter.env_settings.hold=(val!=0); break; case FILTER_OFFSET: filter.freqfactor_offset=val; break; case FILTER_RESONANCE: filter.resonance=val; break; case FILTER_TREMOLO: filter.trem_strength=int(val); break; case FILTER_TREM_LFO: if (strval=="snh") filter.trem_lfo=SNH_LFO; else { filter.trem_lfo=int(val); if ((val<0) || (val>=N_LFOS)) throw string("invalid value for filter_trem_lfo"); } break; case SYNC_FACTOR: sync_factor=val*ONE; break; default: throw string("unknown variable ('"+array+"')"); } break; case 5: //read which params shall be variable, even if //there are currently no controllers which change them case 4: //read velocity-influence over certain params case 2: //read how controllers influence parameters p=param_to_enum(array); ind=extract_array_index(var,1); if ( param_needs_index(p) && (!((ind>=0) && (ind<n_osc))) ) throw string("out of array bounds"); if (state==4) //velocity-influence { switch (p) { case MODULATION: case OUTPUT: case FILTER_ENV_AMOUNT: case FILTER_RESONANCE: case FILTER_OFFSET: // everything ok, do nothing break; default: // other params than the above may not be influenced! throw string("velocity cannot influence parameter '"+array+"'"); } } switch (p) { case MODULATION: ind2=extract_array_index(var,2); if (!((ind2>=0) && (ind2<n_osc))) throw string("out of array bounds"); osc[ind].fm_strength_const[ind2]=false; break; case OUTPUT: if (state!=4) // not vel.-influence osc[ind].output_const=false; break; case WAVEFORM: osc[ind].waveform_const=false; break; case FACTOR: osc[ind].factor_const=false; break; case TREMOLO: osc[ind].tremolo_depth_const=false; break; case TREM_LFO: osc[ind].tremolo_lfo_const=false; break; case VIBRATO: osc[ind].vibrato_depth_const=false; break; case VIB_LFO: osc[ind].vibrato_lfo_const=false; break; case ATTACK: env[ind].attack_const=false; break; case DECAY: env[ind].decay_const=false; break; case SUSTAIN: env[ind].sustain_const=false; break; case RELEASE: env[ind].release_const=false; break; case HOLD: env[ind].hold_const=false; break; case KSR: osc[ind].ksr_const=false; break; case KSL: osc[ind].ksl_const=false; break; case SYNC: osc[ind].sync_const=false; break; case FILTER_ENABLED: filter.enabled_const=false; break; case FILTER_ENV_AMOUNT: filter.env_amount_const=false; break; case FILTER_ATTACK: filter.env_settings.attack_const=false; break; case FILTER_DECAY: filter.env_settings.decay_const=false; break; case FILTER_SUSTAIN: filter.env_settings.sustain_const=false; break; case FILTER_RELEASE: filter.env_settings.release_const=false; break; case FILTER_HOLD: filter.env_settings.hold_const=false; break; case FILTER_OFFSET: filter.freqfactor_offset_const=false; break; case FILTER_RESONANCE: filter.resonance_const=false; break; case FILTER_TREMOLO: filter.trem_strength_const=false; break; case FILTER_TREM_LFO: filter.trem_lfo_const=false; break; case SYNC_FACTOR: sync_factor_const=false; break; default: throw string("unknown variable ('"+array+"')"); } break; case 3: //read controller default values //ignored break; } } } //some optimizations and checks for (int i=0;i<n_osc;i++) if ((env[i].attack==0) && (env[i].sustain==1.0) && (env[i].release>100)) //TODO FINDMICH besseres kriterium? env[i].enabled=false; if ( ((filter.env_settings.attack==0) && (filter.env_settings.sustain==1.0) && (filter.env_settings.release>100)) //TODO FINDMICH siehe oben || ((filter.env_amount==0) && (filter.env_amount_const==true)) ) filter.env_settings.enabled=false; bool use_sync=false; for (int i=0;i<n_osc;i++) if ((osc[i].sync==true) || (osc[i].sync_const==false)) { use_sync=true; break; } if (!use_sync) { sync_factor=0; sync_factor_const=true; } if ((sync_factor==0) && (sync_factor_const==true)) for (int i=0;i<n_osc;i++) { osc[i].sync=false; osc[i].sync_const=true; } for (int i=0;i<n_osc;i++) if ( !((osc[i].output==0) && (osc[i].output_const=true)) ) osc[i].output_const=false; //end optimizations and checks result.n_osc=n_osc; result.osc=osc; result.env=env; result.filter=filter; result.sync_factor=sync_factor; result.sync_factor_const=sync_factor_const; } else throw string ("could not open '"+fn+"'"); return result; //no uninit / free of osc and env here, as it must be done by the caller }