00001 #include "bcdisplayinfo.h"
00002 #include "bchash.h"
00003 #include "mainprogress.h"
00004 #include "picon_png.h"
00005 #include "../../cinelerra/resample.h"
00006 #include "resample.h"
00007 #include "vframe.h"
00008
00009
00010
00011
00012 PluginClient* new_plugin(PluginServer *server)
00013 {
00014 return new ResampleEffect(server);
00015 }
00016
00017
00018
00019 ResampleFraction::ResampleFraction(ResampleEffect *plugin, int x, int y)
00020 : BC_TextBox(x, y, 100, 1, (float)plugin->scale, 1, MEDIUMFONT, 6)
00021 {
00022 this->plugin = plugin;
00023 }
00024
00025 int ResampleFraction::handle_event()
00026 {
00027 plugin->scale = atof(get_text());
00028 return 1;
00029 }
00030
00031
00032
00033
00034
00035
00036
00037
00038 ResampleWindow::ResampleWindow(ResampleEffect *plugin, int x, int y)
00039 : BC_Window(PROGRAM_NAME ": Resample",
00040 x - 160,
00041 y - 75,
00042 320,
00043 150,
00044 320,
00045 150,
00046 0,
00047 0,
00048 1)
00049 {
00050 this->plugin = plugin;
00051 }
00052
00053 void ResampleWindow::create_objects()
00054 {
00055 int x = 10, y = 10;
00056 add_subwindow(new BC_Title(x, y, _("Scale factor:")));
00057 y += 20;
00058 add_subwindow(new ResampleFraction(plugin, x, y));
00059 add_subwindow(new BC_OKButton(this));
00060 add_subwindow(new BC_CancelButton(this));
00061 show_window();
00062 flush();
00063 }
00064
00065
00066
00067
00068
00069
00070
00071
00072 ResampleEffect::ResampleEffect(PluginServer *server)
00073 : PluginAClient(server)
00074 {
00075 reset();
00076 load_defaults();
00077 }
00078
00079 ResampleEffect::~ResampleEffect()
00080 {
00081 save_defaults();
00082 delete defaults;
00083 }
00084
00085 char* ResampleEffect::plugin_title() { return N_("Resample"); }
00086
00087 VFrame* ResampleEffect::new_picon()
00088 {
00089 return new VFrame(picon_png);
00090 }
00091
00092 void ResampleEffect::reset()
00093 {
00094 resample = 0;
00095 }
00096
00097 int ResampleEffect::get_parameters()
00098 {
00099 BC_DisplayInfo info;
00100 ResampleWindow window(this, info.get_abs_cursor_x(), info.get_abs_cursor_y());
00101 window.create_objects();
00102 int result = window.run_window();
00103
00104 return result;
00105 }
00106
00107
00108 int ResampleEffect::load_defaults()
00109 {
00110 char directory[BCTEXTLEN];
00111
00112
00113 sprintf(directory, "%sresample.rc", BCASTDIR);
00114
00115 defaults = new BC_Hash(directory);
00116 defaults->load();
00117
00118 scale = defaults->get("SCALE", (double)1);
00119 return 0;
00120 }
00121
00122 int ResampleEffect::save_defaults()
00123 {
00124 defaults->update("SCALE", scale);
00125 defaults->save();
00126 return 0;
00127 }
00128
00129
00130
00131 int ResampleEffect::start_loop()
00132 {
00133 if(PluginClient::interactive)
00134 {
00135 char string[BCTEXTLEN];
00136 sprintf(string, "%s...", plugin_title());
00137 progress = start_progress(string,
00138 (int64_t)((double)(PluginClient::end - PluginClient::start) / scale));
00139 }
00140
00141 current_position = PluginClient::start;
00142 total_written = 0;
00143
00144 resample = new Resample(0, 1);
00145 return 0;
00146 }
00147
00148 int ResampleEffect::stop_loop()
00149 {
00150 if(PluginClient::interactive)
00151 {
00152 progress->stop_progress();
00153 delete progress;
00154 }
00155 return 0;
00156 }
00157
00158 int ResampleEffect::process_loop(double *buffer, int64_t &write_length)
00159 {
00160 int result = 0;
00161
00162
00163 int64_t size = (int64_t)((double)PluginAClient::in_buffer_size * scale);
00164 int64_t predicted_total = (int64_t)((double)(PluginClient::end - PluginClient::start) / scale + 0.5);
00165
00166 double *input = new double[size];
00167
00168 read_samples(input, 0, current_position, size);
00169 current_position += size;
00170
00171 resample->resample_chunk(input,
00172 size,
00173 1000000,
00174 (int)(1000000.0 / scale),
00175 0);
00176
00177
00178 if(resample->get_output_size(0))
00179 {
00180 int64_t output_size = resample->get_output_size(0);
00181
00182 if(output_size)
00183 {
00184 total_written += output_size;
00185 }
00186
00187
00188 if(total_written > predicted_total)
00189 {
00190 output_size -= total_written - predicted_total;
00191 result = 1;
00192 }
00193
00194 resample->read_output(buffer, 0, output_size);
00195
00196 write_length = output_size;
00197 }
00198
00199 if(PluginClient::interactive) result = progress->update(total_written);
00200
00201
00202 delete [] input;
00203
00204 return result;
00205 }
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217