X-Git-Url: http://git.cinelerra-gg.org/git/?a=blobdiff_plain;f=cinelerra-5.1%2Fplugins%2Ftimestretchrt%2Ftimestretchrt.C;fp=cinelerra-5.1%2Fplugins%2Ftimestretchrt%2Ftimestretchrt.C;h=89b7efa4bc3a47a4b475a8327235d26faa91f080;hb=9d832a1fff11b11aaa1108c460690ed05e2bdc05;hp=5023212e154f121ece897dd3d95c64a99597221b;hpb=4fedf98530b3a6ff1ada6d2b9fbbc470e3df300c;p=goodguy%2Fhistory.git diff --git a/cinelerra-5.1/plugins/timestretchrt/timestretchrt.C b/cinelerra-5.1/plugins/timestretchrt/timestretchrt.C index 5023212e..89b7efa4 100644 --- a/cinelerra-5.1/plugins/timestretchrt/timestretchrt.C +++ b/cinelerra-5.1/plugins/timestretchrt/timestretchrt.C @@ -42,19 +42,26 @@ REGISTER_PLUGIN(TimeStretchRT); TimeStretchRTConfig::TimeStretchRTConfig() { - scale = 1; +// scale = 1; + num = 1; + denom = 1; size = 40; } int TimeStretchRTConfig::equivalent(TimeStretchRTConfig &src) { - return fabs(scale - src.scale) < 0.0001 && size == src.size; +// return fabs(scale - src.scale) < 0.0001 && size == src.size; + return fabs(num - src.num) < 0.0001 && + fabs(denom - src.denom) < 0.0001 && + size == src.size; } void TimeStretchRTConfig::copy_from(TimeStretchRTConfig &src) { - this->scale = src.scale; + this->num = src.num; + this->denom = src.denom; +// this->scale = src.scale; this->size = src.size; } @@ -64,15 +71,19 @@ void TimeStretchRTConfig::interpolate(TimeStretchRTConfig &prev, int64_t next_frame, int64_t current_frame) { - this->scale = prev.scale; + this->num = prev.num; + this->denom = prev.denom; +// this->scale = prev.scale; this->size = prev.size; boundaries(); } void TimeStretchRTConfig::boundaries() { - if(fabs(scale) < 0.01) scale = 0.01; - if(fabs(scale) > 100) scale = 100; + if(num < 0.0001) num = 0.0001; + if(denom < 0.0001) denom = 0.0001; +// if(fabs(scale) < 0.01) scale = 0.01; +// if(fabs(scale) > 100) scale = 100; if(size < 10) size = 10; if(size > 1000) size = 1000; } @@ -82,10 +93,10 @@ void TimeStretchRTConfig::boundaries() TimeStretchRTWindow::TimeStretchRTWindow(TimeStretchRT *plugin) : PluginClientWindow(plugin, + 210, + 200, + 200, 210, - 160, - 200, - 160, 0) { this->plugin = plugin; @@ -98,19 +109,31 @@ TimeStretchRTWindow::~TimeStretchRTWindow() void TimeStretchRTWindow::create_objects() { int x = 10, y = 10; + int margin = plugin->get_theme()->widget_border; BC_Title *title = 0; - add_subwindow(title = new BC_Title(x, y, _("Fraction of original speed:"))); + add_subwindow(title = new BC_Title(x, y, _("Input samples:"))); y += title->get_h() + plugin->get_theme()->widget_border; - scale = new TimeStretchRTScale(this, - plugin, - x, - y); - scale->create_objects(); - - y += scale->get_h() + plugin->get_theme()->widget_border; - add_subwindow(title = new BC_Title(x, y, _("Window size (ms):"))); + num = new TimeStretchRTScale(this, + plugin, + x, + y, + &plugin->config.num); + num->create_objects(); + y += num->get_h() + margin; + + add_subwindow(title = new BC_Title(x, y, _("Output samples:"))); y += title->get_h() + plugin->get_theme()->widget_border; + denom = new TimeStretchRTScale(this, + plugin, + x, + y, + &plugin->config.denom); + denom->create_objects(); + + y += denom->get_h() + margin; + add_subwindow(title = new BC_Title(x, y, _("Window size (ms):"))); + y += title->get_h() + margin; size = new TimeStretchRTSize(this, plugin, x, @@ -128,9 +151,10 @@ void TimeStretchRTWindow::create_objects() TimeStretchRTScale::TimeStretchRTScale(TimeStretchRTWindow *window, TimeStretchRT *plugin, int x, - int y) + int y, + double *value) : BC_TumbleTextBox(window, - (float)(1.0 / plugin->config.scale), + (float)*value, (float)0.0001, (float)1000, x, @@ -138,12 +162,14 @@ TimeStretchRTScale::TimeStretchRTScale(TimeStretchRTWindow *window, 100) { this->plugin = plugin; + this->value = value; set_increment(0.01); } int TimeStretchRTScale::handle_event() { - plugin->config.scale = 1.0 / atof(get_text()); + *value = atof(get_text()); + plugin->config.boundaries(); plugin->send_configure_change(); return 1; } @@ -213,7 +239,7 @@ int TimeStretchRT::process_buffer(int64_t size, { need_reconfigure = load_configuration(); - if(!engine) engine = new TimeStretchEngine(config.scale, + if(!engine) engine = new TimeStretchEngine(config.denom / config.num, sample_rate, config.size); @@ -222,7 +248,6 @@ int TimeStretchRT::process_buffer(int64_t size, // Get start position of the input. // Sample 0 is the keyframe position -//printf("TimeStretchRT::process_buffer %d %f\n", __LINE__, config.scale); if(need_reconfigure) { int64_t prev_position = edl_to_local( @@ -234,15 +259,18 @@ int TimeStretchRT::process_buffer(int64_t size, prev_position = get_source_start(); } - source_start = (int64_t)((start_position - prev_position) / - config.scale) + prev_position; + source_start = (int64_t)((start_position - prev_position) * + config.num / config.denom) + prev_position; engine->reset(); - engine->update(config.scale, sample_rate, config.size); + engine->update(config.denom / config.num, sample_rate, config.size); need_reconfigure = 0; -//printf("TimeStretchRT::process_buffer %d start_position=" _LD -// " prev_position=%jd scale=%f source_start=%jd\n", -// __LINE__, start_position, prev_position, config.scale, source_start); +// printf("TimeStretchRT::process_buffer %d start_position=%lld prev_position=%lld scale=%f source_start=%lld\n", +// __LINE__, +// start_position, +// prev_position, +// config.scale, +// source_start); } // process buffers until output length is reached @@ -297,7 +325,8 @@ void TimeStretchRT::save_data(KeyFrame *keyframe) // cause data to be stored directly in text output.set_shared_output(keyframe->get_data(), MESSAGESIZE); output.tag.set_title("TIMESTRETCHRT"); - output.tag.set_property("SCALE", config.scale); + output.tag.set_property("NUM", config.num); + output.tag.set_property("DENOM", config.denom); output.tag.set_property("SIZE", config.size); output.append_tag(); output.tag.set_title("/TIMESTRETCHRT"); @@ -316,7 +345,8 @@ void TimeStretchRT::read_data(KeyFrame *keyframe) { if(input.tag.title_is("TIMESTRETCHRT")) { - config.scale = input.tag.get_property("SCALE", config.scale); + config.num = input.tag.get_property("NUM", config.num); + config.denom = input.tag.get_property("DENOM", config.denom); config.size = input.tag.get_property("SIZE", config.size); } } @@ -330,7 +360,8 @@ void TimeStretchRT::update_gui() { thread->window->lock_window("TimeStretchRT::update_gui"); - ((TimeStretchRTWindow*)thread->window)->scale->update((float)(1.0 / config.scale)); + ((TimeStretchRTWindow*)thread->window)->num->update((float)config.num); + ((TimeStretchRTWindow*)thread->window)->denom->update((float)config.denom); ((TimeStretchRTWindow*)thread->window)->size->update((int64_t)config.size); thread->window->unlock_window(); }