X-Git-Url: http://git.cinelerra-gg.org/git/?a=blobdiff_plain;f=cinelerra-5.1%2Fcinelerra%2Famodule.C;h=aee3f5f084431e9fb45b503bba95ac3ad382ed28;hb=ecf90ad2d14e5f72505b824b7b50edd717d2d404;hp=d3b1b18e99b15e24555009ef84c505f86943cd55;hpb=49f85559268fc040fe7ba5611cc0520793cf728b;p=goodguy%2Fhistory.git diff --git a/cinelerra-5.1/cinelerra/amodule.C b/cinelerra-5.1/cinelerra/amodule.C index d3b1b18e..aee3f5f0 100644 --- a/cinelerra-5.1/cinelerra/amodule.C +++ b/cinelerra-5.1/cinelerra/amodule.C @@ -2,21 +2,21 @@ /* * CINELERRA * Copyright (C) 2009-2013 Adam Williams - * + * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. - * + * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * + * */ #include "aattachmentpoint.h" @@ -76,7 +76,7 @@ int AModuleResample::read_samples(Samples *buffer, int64_t start, int64_t len) { int result = 0; - + if(module->asset) { // Files only read going forward. @@ -97,7 +97,7 @@ int AModuleResample::read_samples(Samples *buffer, int64_t start, int64_t len) else if(module->nested_edl) { - + // Nested EDL generates reversed buffer. for(int i = 0; i < module->nested_edl->session->audio_channels; i++) @@ -116,7 +116,7 @@ int AModuleResample::read_samples(Samples *buffer, int64_t start, int64_t len) result = module->nested_renderengine->arender->process_buffer( - nested_output, + nested_output, len, start); // printf("AModuleResample::read_samples buffer=%p module=%p len=%d\n", @@ -141,8 +141,8 @@ int AModuleResample::read_samples(Samples *buffer, int64_t start, int64_t len) -AModule::AModule(RenderEngine *renderengine, - CommonRender *commonrender, +AModule::AModule(RenderEngine *renderengine, + CommonRender *commonrender, PluginArray *plugin_array, Track *track) : Module(renderengine, commonrender, plugin_array, track) @@ -150,11 +150,10 @@ AModule::AModule(RenderEngine *renderengine, data_type = TRACK_AUDIO; transition_temp = 0; speed_temp = 0; - level_history = 0; - current_level = 0; bzero(nested_output, sizeof(Samples*) * MAX_CHANNELS); bzero(prev_head, SPEED_OVERLAP * sizeof(double)); bzero(prev_tail, SPEED_OVERLAP * sizeof(double)); + meter_history = new MeterHistory(); nested_allocation = 0; resample = 0; asset = 0; @@ -166,22 +165,11 @@ AModule::AModule(RenderEngine *renderengine, AModule::~AModule() { - if(transition_temp) delete transition_temp; - if(speed_temp) delete speed_temp; - if(level_history) - { - delete [] level_history; - delete [] level_samples; - } - + delete transition_temp; + delete speed_temp; + delete meter_history; for(int i = 0; i < MAX_CHANNELS; i++) - { - if(nested_output[i]) - { - delete nested_output[i]; - } - } - + delete nested_output[i]; delete resample; } @@ -195,17 +183,9 @@ void AModule::create_objects() { Module::create_objects(); // Not needed in pluginarray - if(commonrender) - { - level_history = new double[((ARender*)commonrender)->total_peaks]; - level_samples = new int64_t[((ARender*)commonrender)->total_peaks]; - current_level = 0; - - for(int i = 0; i < ((ARender*)commonrender)->total_peaks; i++) - { - level_history[i] = 0; - level_samples[i] = -1; - } + if( commonrender ) { + meter_history->init(1, ((ARender*)commonrender)->total_peaks); + meter_history->reset_channel(0); } } @@ -227,7 +207,7 @@ CICache* AModule::get_cache() } -int AModule::import_samples(AEdit *edit, +int AModule::import_samples(AEdit *edit, int64_t start_project, int64_t edit_startproject, int64_t edit_startsource, @@ -238,8 +218,8 @@ int AModule::import_samples(AEdit *edit, { int result = 0; // start in EDL samplerate - int64_t start_source = start_project - - edit_startproject + + int64_t start_source = start_project - + edit_startproject + edit_startsource; // fragment size adjusted for speed curve int64_t speed_fragment_len = fragment_len; @@ -259,7 +239,7 @@ int AModule::import_samples(AEdit *edit, Samples *speed_buffer = buffer; const int debug = 0; -if(debug) printf("AModule::import_samples %d edit=%p nested_edl=%p\n", +if(debug) printf("AModule::import_samples %d edit=%p nested_edl=%p\n", __LINE__, edit, nested_edl); @@ -268,7 +248,7 @@ nested_edl); if(debug) printf("AModule::import_samples %d\n", __LINE__); this->channel = edit->channel; -if(debug) printf("AModule::import_samples %d speed_fragment_len=%jd\n", +if(debug) printf("AModule::import_samples %d speed_fragment_len=%jd\n", __LINE__, speed_fragment_len); @@ -282,15 +262,8 @@ speed_fragment_len); FloatAuto *previous = 0; FloatAuto *next = 0; FloatAutos *speed_autos = (FloatAutos*)track->automation->autos[AUTOMATION_SPEED]; - for(int64_t i = edit_startproject; i < start_project; i++) - { - double speed = speed_autos->get_value(i, - PLAY_FORWARD, - previous, - next); - speed_position += speed; - } - + speed_position += speed_autos->automation_integral(edit_startproject, + start_project-edit_startproject, PLAY_FORWARD); speed_position1 = speed_position; @@ -299,7 +272,7 @@ speed_fragment_len); min_position = speed_position; for(int64_t i = start_project; i < start_project + fragment_len; i++) { - double speed = speed_autos->get_value(i, + double speed = speed_autos->get_value(i, PLAY_FORWARD, previous, next); @@ -321,7 +294,7 @@ speed_fragment_len); speed_fragment_len = (int64_t)(max_position - min_position); } -//printf("AModule::import_samples %d %f %f %f %f\n", +//printf("AModule::import_samples %d %f %f %f %f\n", // __LINE__, min_position, max_position, speed_position1, speed_position2); // new start of source to read from file @@ -336,12 +309,12 @@ speed_fragment_len); delete speed_temp; speed_temp = 0; } - + if(!speed_temp) { speed_temp = new Samples(speed_fragment_len); } - + speed_buffer = speed_temp; } @@ -357,7 +330,7 @@ speed_fragment_len); { int command; asset = 0; - + if(direction == PLAY_REVERSE) command = NORMAL_REWIND; else @@ -388,7 +361,7 @@ if(debug) printf("AModule::import_samples %d\n", __LINE__); nested_renderengine = new RenderEngine(0, get_preferences(), 0, 1); nested_renderengine->set_acache(get_cache()); // Must use a private cache for the audio -// if(!cache) +// if(!cache) // { // cache = new CICache(get_preferences()); // private_cache = 1; @@ -435,7 +408,7 @@ if(debug) printf("AModule::import_samples %d\n", __LINE__); resample = new AModuleResample(this); } -if(debug) printf("AModule::import_samples %d %d %d\n", +if(debug) printf("AModule::import_samples %d %d %d\n", __LINE__, (int)sample_rate, (int)nested_edl->session->sample_rate); @@ -453,7 +426,7 @@ if(debug) printf("AModule::import_samples %d\n", __LINE__); // Render without resampling if(debug) printf("AModule::import_samples %d\n", __LINE__); result = nested_renderengine->arender->process_buffer( - nested_output, + nested_output, speed_fragment_len, start_source); if(debug) printf("AModule::import_samples %d\n", __LINE__); @@ -512,7 +485,7 @@ if(debug) printf("AModule::import_samples %d\n", __LINE__); resample = new AModuleResample(this); } -if(debug) printf("AModule::import_samples %d %d %d\n", +if(debug) printf("AModule::import_samples %d %d %d\n", __LINE__, sample_rate, asset->sample_rate); @@ -533,10 +506,10 @@ printf("AModule::import_samples %d channel=%d start_source=%jd len=%d\n", __LINE file->set_channel(edit->channel); result = file->read_samples(speed_buffer, speed_fragment_len); // Reverse fragment so ::render can apply transitions going forward. -if(debug) printf("AModule::import_samples %d speed_buffer=%p data=%p speed_fragment_len=%d\n", -__LINE__, +if(debug) printf("AModule::import_samples %d speed_buffer=%p data=%p speed_fragment_len=%d\n", +__LINE__, (void*)speed_buffer, -(void*)speed_buffer->get_data(), +(void*)speed_buffer->get_data(), (int)speed_fragment_len); if(direction == PLAY_REVERSE) { @@ -609,7 +582,7 @@ if(debug) printf("AModule::import_samples %d\n", __LINE__); int in_offset = (int64_t)(speed_fragment_len - 1 - speed_position); CLAMP(in_offset, 0, speed_fragment_len - 1); buffer_samples[out_offset++] = speed_samples[in_offset]; - double speed = speed_autos->get_value(i, + double speed = speed_autos->get_value(i, PLAY_REVERSE, previous, next); @@ -626,7 +599,7 @@ if(debug) printf("AModule::import_samples %d\n", __LINE__); //printf("AModule::import_samples %d %f\n", __LINE__, speed_position); for(int64_t i = start_project; i < start_project + fragment_len; i++) { - double speed = speed_autos->get_value(i, + double speed = speed_autos->get_value(i, PLAY_FORWARD, previous, next); @@ -653,9 +626,9 @@ if(debug) printf("AModule::import_samples %d\n", __LINE__); // if(in_offset < 0 || in_offset >= speed_fragment_len) -// printf("AModule::import_samples %d %d %d\n", -// __LINE__, -// in_offset, +// printf("AModule::import_samples %d %d %d\n", +// __LINE__, +// in_offset, // speed_fragment_len); int in_offset1 = in_offset; @@ -674,7 +647,7 @@ if(debug) printf("AModule::import_samples %d\n", __LINE__); CLAMP(in_offset1, -SPEED_OVERLAP, speed_fragment_len - 1 + SPEED_OVERLAP); CLAMP(in_offset2, -SPEED_OVERLAP, speed_fragment_len - 1 + SPEED_OVERLAP); - + double value1 = 0; if(in_offset1 >= speed_fragment_len) { @@ -682,7 +655,7 @@ if(debug) printf("AModule::import_samples %d\n", __LINE__); } else if(in_offset1 >= 0) - { + { value1 = speed_samples[in_offset1]; } else @@ -707,7 +680,7 @@ if(debug) printf("AModule::import_samples %d\n", __LINE__); } double fraction = speed_position - floor(speed_position); - buffer_samples[out_offset++] = + buffer_samples[out_offset++] = value1 * (1.0 - fraction) + value2 * fraction; #endif @@ -719,10 +692,10 @@ if(debug) printf("AModule::import_samples %d\n", __LINE__); speed_position = next_speed_position; } } - + for(int i = 0; i < SPEED_OVERLAP; i++) { - int offset = speed_fragment_len - + int offset = speed_fragment_len - SPEED_OVERLAP + i; CLAMP(offset, 0, speed_fragment_len - 1); @@ -734,17 +707,17 @@ if(debug) printf("AModule::import_samples %d\n", __LINE__); } } } - - - - + + + + return result; } -int AModule::render(Samples *buffer, +int AModule::render(Samples *buffer, int64_t input_len, int64_t start_position, int direction, @@ -756,8 +729,8 @@ int AModule::render(Samples *buffer, if(debug) printf("AModule::render %d\n", __LINE__); - if(use_nudge) - start_position += track->nudge * + if(use_nudge) + start_position += track->nudge * sample_rate / edl_rate; AEdit *playable_edit; @@ -781,8 +754,8 @@ if(debug) printf("AModule::render %d\n", __LINE__); // Clear buffer bzero(buffer->get_data(), input_len * sizeof(double)); -// The EDL is normalized to the requested sample rate because -// the requested rate may be the project sample rate and a sample rate +// The EDL is normalized to the requested sample rate because +// the requested rate may be the project sample rate and a sample rate // might as well be directly from the source rate to the requested rate. // Get first edit containing the range if(direction == PLAY_FORWARD) @@ -842,9 +815,9 @@ if(debug) printf("AModule::render %d %jd %jd\n", __LINE__, start_position, end_p if(debug) printf("AModule::render %d %jd\n", __LINE__, fragment_len); // Normalize position here since update_transition is a boolean operation. - update_transition(start_position * - edl_rate / - sample_rate, + update_transition(start_position * + edl_rate / + sample_rate, PLAY_FORWARD); if(playable_edit) @@ -876,31 +849,31 @@ if(debug) printf("AModule::render %d %jd\n", __LINE__, fragment_len); // Clamp to end of transition int64_t transition_len = 0; - + if(transition && previous_edit) { - transition_len = transition->length * - sample_rate / + transition_len = transition->length * + sample_rate / edl_rate; if(direction == PLAY_FORWARD && start_position < edit_startproject + transition_len && start_position + fragment_len > edit_startproject + transition_len) fragment_len = edit_startproject + transition_len - start_position; else - if(direction == PLAY_REVERSE && + if(direction == PLAY_REVERSE && start_position > edit_startproject + transition_len && start_position - fragment_len < edit_startproject + transition_len) fragment_len = start_position - edit_startproject - transition_len; } -if(debug) printf("AModule::render %d buffer_offset=%d fragment_len=%jd\n", -__LINE__, +if(debug) printf("AModule::render %d buffer_offset=%d fragment_len=%jd\n", +__LINE__, buffer_offset, fragment_len); Samples output(buffer); output.set_offset(output.get_offset() + buffer_offset); - if(import_samples(playable_edit, + if(import_samples(playable_edit, start_position, edit_startproject, edit_startsource, @@ -931,7 +904,7 @@ if(debug) printf("AModule::render %d\n", __LINE__); // Read into temp buffers // Temp + master or temp + temp ? temp + master - if(transition_temp && + if(transition_temp && transition_temp->get_allocated() < fragment_len) { delete transition_temp; @@ -948,7 +921,7 @@ if(debug) printf("AModule::render %d %jd\n", __LINE__, fragment_len); if(transition_fragment_len > 0) { // Previous_edit is always the outgoing segment, regardless of direction - import_samples(previous_edit, + import_samples(previous_edit, start_position, previous_startproject, previous_startsource, @@ -963,7 +936,7 @@ if(debug) printf("AModule::render %d %jd\n", __LINE__, fragment_len); { Resample::reverse_buffer(output.get_data(), transition_fragment_len); Resample::reverse_buffer(transition_temp->get_data(), transition_fragment_len); - current_position = start_position - + current_position = start_position - transition_fragment_len - edit_startproject; } @@ -981,12 +954,12 @@ if(debug) printf("AModule::render %d %jd\n", __LINE__, fragment_len); // Reverse output buffer here so transitions always render forward. if(direction == PLAY_REVERSE) - Resample::reverse_buffer(output.get_data(), + Resample::reverse_buffer(output.get_data(), transition_fragment_len); } } -if(debug) printf("AModule::render %d start_position=%jd end_position=%jd fragment_len=%jd\n", -__LINE__, +if(debug) printf("AModule::render %d start_position=%jd end_position=%jd fragment_len=%jd\n", +__LINE__, start_position, end_position, fragment_len);