00001 #include "bcdisplayinfo.h"
00002 #include "bchash.h"
00003 #include "mainprogress.h"
00004 #include "normalize.h"
00005 #include "normalizewindow.h"
00006 #include "picon_png.h"
00007 #include "units.h"
00008 #include "vframe.h"
00009
00010 #include <stdio.h>
00011 #include <string.h>
00012
00013 #include <libintl.h>
00014 #define _(String) gettext(String)
00015 #define gettext_noop(String) String
00016 #define N_(String) gettext_noop (String)
00017
00018 REGISTER_PLUGIN(NormalizeMain)
00019
00020
00021
00022
00023
00024
00025 NormalizeMain::NormalizeMain(PluginServer *server)
00026 : PluginAClient(server)
00027 {
00028 load_defaults();
00029 }
00030
00031 NormalizeMain::~NormalizeMain()
00032 {
00033 save_defaults();
00034 delete defaults;
00035 }
00036
00037 char* NormalizeMain::plugin_title() { return N_("Normalize"); }
00038 int NormalizeMain::is_realtime() { return 0; }
00039 int NormalizeMain::is_multichannel() { return 1; }
00040
00041
00042 VFrame* NormalizeMain::new_picon()
00043 {
00044 return new VFrame(picon_png);
00045 }
00046
00047
00048 int NormalizeMain::load_defaults()
00049 {
00050 char directory[BCTEXTLEN];
00051
00052
00053 sprintf(directory, "%snormalize.rc", BCASTDIR);
00054
00055
00056
00057 defaults = new BC_Hash(directory);
00058
00059 defaults->load();
00060
00061 db_over = defaults->get("DBOVER", 0);
00062 separate_tracks = defaults->get("SEPERATE_TRACKS", 1);
00063 return 0;
00064 }
00065
00066 int NormalizeMain::save_defaults()
00067 {
00068 defaults->update("DBOVER", db_over);
00069 defaults->update("SEPERATE_TRACKS", separate_tracks);
00070 defaults->save();
00071 return 0;
00072 }
00073
00074 int NormalizeMain::get_parameters()
00075 {
00076 BC_DisplayInfo info;
00077 NormalizeWindow window(info.get_abs_cursor_x(), info.get_abs_cursor_y());
00078 window.create_objects(&db_over, &separate_tracks);
00079 int result = window.run_window();
00080 return result;
00081 }
00082
00083 int NormalizeMain::start_loop()
00084 {
00085 char string[BCTEXTLEN];
00086 sprintf(string, "%s...", plugin_title());
00087 progress = start_progress(string, (PluginClient::end - PluginClient::start) * 2);
00088
00089 writing = 0;
00090 current_position = PluginClient::start;
00091 peak = new double[PluginClient::total_in_buffers];
00092 scale = new double[PluginClient::total_in_buffers];
00093 bzero(peak, sizeof(double) * PluginClient::total_in_buffers);
00094 return 0;
00095 }
00096
00097
00098 int NormalizeMain::process_loop(double **buffer, int64_t &write_length)
00099 {
00100 int result = 0;
00101 int64_t fragment_len;
00102
00103
00104 if(writing)
00105 {
00106 fragment_len = PluginClient::in_buffer_size;
00107 if(current_position + fragment_len > PluginClient::end) fragment_len = PluginClient::end - current_position;
00108
00109
00110 for(int i = 0; i < PluginClient::total_in_buffers; i++)
00111 {
00112 read_samples(buffer[i], i, current_position, fragment_len);
00113 for(int j = 0; j < fragment_len; j++)
00114 buffer[i][j] *= scale[i];
00115 }
00116
00117
00118 current_position += fragment_len;
00119 write_length = fragment_len;
00120 result = progress->update(PluginClient::end -
00121 PluginClient::start +
00122 current_position -
00123 PluginClient::start);
00124 if(current_position >= PluginClient::end) result = 1;
00125 }
00126 else
00127 {
00128
00129
00130 for(int i = PluginClient::start;
00131 i < PluginClient::end && !result;
00132 i += fragment_len)
00133 {
00134 fragment_len = PluginClient::in_buffer_size;
00135 if(i + fragment_len > PluginClient::end) fragment_len = PluginClient::end - i;
00136
00137
00138 for(int j = 0; j < PluginClient::total_in_buffers; j++)
00139 {
00140
00141 read_samples(buffer[j], j, i, fragment_len);
00142
00143
00144 for(int k = 0; k < fragment_len; k++)
00145 {
00146 if(peak[j] < fabs(buffer[j][k])) peak[j] = fabs(buffer[j][k]);
00147 }
00148 }
00149
00150 result = progress->update(i - PluginClient::start);
00151
00152 }
00153
00154
00155 double max = 0;
00156 for(int i = 0; i < PluginClient::total_in_buffers; i++)
00157 {
00158 if(peak[i] > max) max = peak[i];
00159 }
00160 if(!separate_tracks)
00161 {
00162 for(int i = 0; i < PluginClient::total_in_buffers; i++)
00163 {
00164 peak[i] = max;
00165 }
00166 }
00167
00168 for(int i = 0; i < PluginClient::total_in_buffers; i++)
00169 {
00170 scale[i] = DB::fromdb(db_over) / peak[i];
00171 }
00172
00173
00174 char string[BCTEXTLEN];
00175 sprintf(string, "%s %.0f%%...", plugin_title(), (DB::fromdb(db_over) / max) * 100);
00176 progress->update_title(string);
00177
00178 writing = 1;
00179 }
00180
00181 return result;
00182 }
00183
00184 int NormalizeMain::stop_loop()
00185 {
00186 progress->stop_progress();
00187 delete [] peak;
00188 delete [] scale;
00189 delete progress;
00190 return 0;
00191 }