X-Git-Url: http://git.cinelerra-gg.org/git/?a=blobdiff_plain;f=cinelerra-5.1%2Fcinelerra%2Fvirtualanode.C;h=a1ad5235c65841c413e88d309034820a5e3d7395;hb=a0f90514d89589e1136ce90eda493c9545b8f10b;hp=f922c7f774eb46525809e9dda890c7aab0b2b089;hpb=30bdb85eb33a8ee7ba675038a86c6be59c43d7bd;p=goodguy%2Fhistory.git diff --git a/cinelerra-5.1/cinelerra/virtualanode.C b/cinelerra-5.1/cinelerra/virtualanode.C index f922c7f7..a1ad5235 100644 --- a/cinelerra-5.1/cinelerra/virtualanode.C +++ b/cinelerra-5.1/cinelerra/virtualanode.C @@ -281,8 +281,6 @@ if(debug) printf("VirtualANode::render_as_module %d\n", __LINE__); // Scan fragment in meter sized fragments for(int i = 0; i < len; ) { - int current_level = ((AModule*)real_module)->current_level; - double peak = 0; meter_render_start = i; meter_render_end = i + meter_render_fragment; if(meter_render_end > len) @@ -290,25 +288,20 @@ if(debug) printf("VirtualANode::render_as_module %d\n", __LINE__); // Number of samples into the fragment this meter sized fragment is, // normalized to project sample rate. int64_t meter_render_start_project = meter_render_start * - project_sample_rate / - sample_rate; + project_sample_rate / sample_rate; // Scan meter sized fragment - double *output_samples = output_temp->get_data(); - for( ; i < meter_render_end; i++) - { - double sample = fabs(output_samples[i]); - if(sample > peak) peak = sample; + double peak = 0, *output_samples = output_temp->get_data(); + while( i < meter_render_end ) { + double sample = fabs(output_samples[i++]); + if( sample > peak ) peak = sample; } - ((AModule*)real_module)->level_history[current_level] = - peak; - ((AModule*)real_module)->level_samples[current_level] = - (direction == PLAY_FORWARD) ? + MeterHistory *meter_history = ((AModule*)real_module)->meter_history; + int64_t pos = (direction == PLAY_FORWARD) ? (start_position_project + meter_render_start_project) : - (start_position_project - meter_render_start_project); - ((AModule*)real_module)->current_level = - arender->get_next_peak(current_level); + (start_position_project - meter_render_start_project) ; + meter_history->set_peak(0, peak, pos); } } if(debug) printf("VirtualANode::render_as_module %d\n", __LINE__); @@ -515,53 +508,50 @@ void VirtualANode::get_pan_automation(double &slope, intercept = 0; slope = 0; - PanAuto *prev_keyframe = 0; - PanAuto *next_keyframe = 0; - prev_keyframe = (PanAuto*)autos->get_prev_auto(input_position, - direction, - (Auto* &)prev_keyframe); - next_keyframe = (PanAuto*)autos->get_next_auto(input_position, - direction, - (Auto* &)next_keyframe); + Auto *prev_keyframe = 0, *next_keyframe = 0; + prev_keyframe = autos->get_prev_auto(input_position, direction, prev_keyframe); + next_keyframe = autos->get_next_auto(input_position, direction, next_keyframe); + PanAuto *prev_pan_auto = (PanAuto *)prev_keyframe; + PanAuto *next_pan_auto = (PanAuto *)next_keyframe; if(direction == PLAY_FORWARD) { // Two distinct automation points within range - if(next_keyframe->position > prev_keyframe->position) + if(next_pan_auto->position > prev_pan_auto->position) { - slope = ((double)next_keyframe->values[channel] - prev_keyframe->values[channel]) / - ((double)next_keyframe->position - prev_keyframe->position); - intercept = ((double)input_position - prev_keyframe->position) * slope + - prev_keyframe->values[channel]; + slope = ((double)next_pan_auto->values[channel] - prev_pan_auto->values[channel]) / + ((double)next_pan_auto->position - prev_pan_auto->position); + intercept = ((double)input_position - prev_pan_auto->position) * slope + + prev_pan_auto->values[channel]; - if(next_keyframe->position < input_position + slope_len) - slope_len = next_keyframe->position - input_position; + if(next_pan_auto->position < input_position + slope_len) + slope_len = next_pan_auto->position - input_position; } else // One automation point within range { slope = 0; - intercept = prev_keyframe->values[channel]; + intercept = prev_pan_auto->values[channel]; } } else { // Two distinct automation points within range - if(next_keyframe->position < prev_keyframe->position) + if(next_pan_auto->position < prev_pan_auto->position) { - slope = ((double)next_keyframe->values[channel] - prev_keyframe->values[channel]) / - ((double)next_keyframe->position - prev_keyframe->position); - intercept = ((double)input_position - prev_keyframe->position) * slope + - prev_keyframe->values[channel]; + slope = ((double)next_pan_auto->values[channel] - prev_pan_auto->values[channel]) / + ((double)next_pan_auto->position - prev_pan_auto->position); + intercept = ((double)input_position - prev_pan_auto->position) * slope + + prev_pan_auto->values[channel]; - if(next_keyframe->position > input_position - slope_len) - slope_len = input_position - next_keyframe->position; + if(next_pan_auto->position > input_position - slope_len) + slope_len = input_position - next_pan_auto->position; } else // One automation point within range { slope = 0; - intercept = next_keyframe->values[channel]; + intercept = next_pan_auto->values[channel]; } } }