X-Git-Url: http://git.cinelerra-gg.org/git/?p=goodguy%2Fhistory.git;a=blobdiff_plain;f=cinelerra-5.1%2Fcinelerra%2Famodule.C;h=1ef4a4fa4009c31870591b82870b8e971e8016a9;hp=bd45a39ca50af60a8cd6a9c5f8eb5b4c906a3204;hb=a4de4732339bf38b5b225c533be1bdf60748f04a;hpb=dab459d8fcf93c377836bc30a1c4bc5505b79323 diff --git a/cinelerra-5.1/cinelerra/amodule.C b/cinelerra-5.1/cinelerra/amodule.C index bd45a39c..1ef4a4fa 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) @@ -173,7 +173,7 @@ AModule::~AModule() delete [] level_history; delete [] level_samples; } - + for(int i = 0; i < MAX_CHANNELS; i++) { if(nested_output[i]) @@ -181,7 +181,7 @@ AModule::~AModule() delete nested_output[i]; } } - + delete resample; } @@ -227,7 +227,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 +238,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 +259,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 +268,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=%ld\n", +if(debug) printf("AModule::import_samples %d speed_fragment_len=%jd\n", __LINE__, speed_fragment_len); @@ -284,7 +284,7 @@ speed_fragment_len); 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, + double speed = speed_autos->get_value(i, PLAY_FORWARD, previous, next); @@ -299,7 +299,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 +321,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 +336,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 +357,7 @@ speed_fragment_len); { int command; asset = 0; - + if(direction == PLAY_REVERSE) command = NORMAL_REWIND; else @@ -385,14 +385,10 @@ if(debug) printf("AModule::import_samples %d\n", __LINE__); nested_command->get_edl()->copy_all(nested_edl); nested_command->change_type = CHANGE_ALL; nested_command->realtime = renderengine->command->realtime; - nested_renderengine = new RenderEngine(0, - get_preferences(), - 0, - renderengine ? renderengine->channeldb : 0, - 1); + 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; @@ -439,7 +435,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); @@ -457,7 +453,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__); @@ -516,7 +512,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); @@ -532,15 +528,15 @@ asset->sample_rate); { if(debug) -printf("AModule::import_samples %d channel=%d start_source=%ld len=%d\n", __LINE__, edit->channel, start_source, (int)speed_fragment_len); +printf("AModule::import_samples %d channel=%d start_source=%jd len=%d\n", __LINE__, edit->channel, start_source, (int)speed_fragment_len); file->set_audio_position(start_source); 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) { @@ -613,7 +609,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); @@ -630,7 +626,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); @@ -657,9 +653,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; @@ -678,7 +674,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) { @@ -686,7 +682,7 @@ if(debug) printf("AModule::import_samples %d\n", __LINE__); } else if(in_offset1 >= 0) - { + { value1 = speed_samples[in_offset1]; } else @@ -711,7 +707,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 @@ -723,10 +719,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); @@ -738,17 +734,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, @@ -760,8 +756,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; @@ -785,8 +781,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) @@ -846,9 +842,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) @@ -880,31 +876,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, @@ -935,7 +931,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; @@ -952,7 +948,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, @@ -967,7 +963,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; } @@ -985,12 +981,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);