00001 #include "automation.h"
00002 #include "clip.h"
00003 #include "bchash.h"
00004 #include "edl.h"
00005 #include "filexml.h"
00006 #include "localsession.h"
00007
00008
00009 static char *xml_autogrouptypes_titlesmax[] =
00010 {
00011 "AUTOGROUPTYPE_AUDIO_FADE_MAX",
00012 "AUTOGROUPTYPE_VIDEO_FADE_MAX",
00013 "AUTOGROUPTYPE_ZOOM_MAX",
00014 "AUTOGROUPTYPE_X_MAX",
00015 "AUTOGROUPTYPE_Y_MAX",
00016 "AUTOGROUPTYPE_INT255_MAX"
00017 };
00018
00019 static char *xml_autogrouptypes_titlesmin[] =
00020 {
00021 "AUTOGROUPTYPE_AUDIO_FADE_MIN",
00022 "AUTOGROUPTYPE_VIDEO_FADE_MIN",
00023 "AUTOGROUPTYPE_ZOOM_MIN",
00024 "AUTOGROUPTYPE_X_MIN",
00025 "AUTOGROUPTYPE_Y_MIN",
00026 "AUTOGROUPTYPE_INT255_MIN"
00027 };
00028
00029
00030 LocalSession::LocalSession(EDL *edl)
00031 {
00032 this->edl = edl;
00033
00034 selectionstart = selectionend = 0;
00035 in_point = out_point = -1;
00036 strcpy(folder, CLIP_FOLDER);
00037 sprintf(clip_title, "Program");
00038 strcpy(clip_notes, "Hello world");
00039 clipboard_length = 0;
00040 preview_start = preview_end = 0;
00041 loop_playback = 0;
00042 loop_start = 0;
00043 loop_end = 0;
00044 zoom_sample = 16384;
00045 zoom_y = 0;
00046 zoom_track = 0;
00047 view_start = 0;
00048 track_start = 0;
00049
00050 automation_mins[AUTOGROUPTYPE_AUDIO_FADE] = -80;
00051 automation_maxs[AUTOGROUPTYPE_AUDIO_FADE] = 6;
00052
00053 automation_mins[AUTOGROUPTYPE_VIDEO_FADE] = 0;
00054 automation_maxs[AUTOGROUPTYPE_VIDEO_FADE] = 100;
00055
00056 automation_mins[AUTOGROUPTYPE_ZOOM] = 0.001;
00057 automation_maxs[AUTOGROUPTYPE_ZOOM] = 4;
00058
00059 automation_mins[AUTOGROUPTYPE_X] = -100;
00060 automation_maxs[AUTOGROUPTYPE_X] = 100;
00061
00062 automation_mins[AUTOGROUPTYPE_Y] = -100;
00063 automation_maxs[AUTOGROUPTYPE_Y] = 100;
00064
00065 automation_mins[AUTOGROUPTYPE_INT255] = 0;
00066 automation_maxs[AUTOGROUPTYPE_INT255] = 255;
00067
00068 zoombar_showautotype = AUTOGROUPTYPE_AUDIO_FADE;
00069 red = green = blue = 0;
00070 }
00071
00072 LocalSession::~LocalSession()
00073 {
00074 }
00075
00076 void LocalSession::copy_from(LocalSession *that)
00077 {
00078 strcpy(clip_title, that->clip_title);
00079 strcpy(clip_notes, that->clip_notes);
00080 strcpy(folder, that->folder);
00081 in_point = that->in_point;
00082 loop_playback = that->loop_playback;
00083 loop_start = that->loop_start;
00084 loop_end = that->loop_end;
00085 out_point = that->out_point;
00086 selectionend = that->selectionend;
00087 selectionstart = that->selectionstart;
00088 track_start = that->track_start;
00089 view_start = that->view_start;
00090 zoom_sample = that->zoom_sample;
00091 zoom_y = that->zoom_y;
00092 zoom_track = that->zoom_track;
00093 preview_start = that->preview_start;
00094 preview_end = that->preview_end;
00095 red = that->red;
00096 green = that->green;
00097 for (int i = 0; i < AUTOGROUPTYPE_COUNT; i++) {
00098 automation_mins[i] = that->automation_mins[i];
00099 automation_maxs[i] = that->automation_maxs[i];
00100 }
00101 blue = that->blue;
00102 }
00103
00104 void LocalSession::save_xml(FileXML *file, double start)
00105 {
00106 file->tag.set_title("LOCALSESSION");
00107
00108 file->tag.set_property("IN_POINT", in_point - start);
00109 file->tag.set_property("LOOP_PLAYBACK", loop_playback);
00110 file->tag.set_property("LOOP_START", loop_start - start);
00111 file->tag.set_property("LOOP_END", loop_end - start);
00112 file->tag.set_property("OUT_POINT", out_point - start);
00113 file->tag.set_property("SELECTION_START", selectionstart - start);
00114 file->tag.set_property("SELECTION_END", selectionend - start);
00115 file->tag.set_property("CLIP_TITLE", clip_title);
00116 file->tag.set_property("CLIP_NOTES", clip_notes);
00117 file->tag.set_property("FOLDER", folder);
00118 file->tag.set_property("TRACK_START", track_start);
00119 file->tag.set_property("VIEW_START", view_start);
00120 file->tag.set_property("ZOOM_SAMPLE", zoom_sample);
00121
00122 file->tag.set_property("ZOOMY", zoom_y);
00123
00124 file->tag.set_property("ZOOM_TRACK", zoom_track);
00125
00126 double preview_start = this->preview_start - start;
00127 if(preview_start < 0) preview_start = 0;
00128 double preview_end = this->preview_end - start;
00129 if(preview_end < 0) preview_end = 0;
00130
00131 file->tag.set_property("PREVIEW_START", preview_start);
00132 file->tag.set_property("PREVIEW_END", preview_end);
00133 file->tag.set_property("RED", red);
00134 file->tag.set_property("GREEN", green);
00135 file->tag.set_property("BLUE", blue);
00136
00137 for (int i = 0; i < AUTOGROUPTYPE_COUNT; i++) {
00138 if (!Automation::autogrouptypes_fixedrange[i]) {
00139 file->tag.set_property(xml_autogrouptypes_titlesmin[i],automation_mins[i]);
00140 file->tag.set_property(xml_autogrouptypes_titlesmax[i],automation_maxs[i]);
00141 }
00142 }
00143 file->append_tag();
00144 file->tag.set_title("/LOCALSESSION");
00145 file->append_tag();
00146 file->append_newline();
00147 file->append_newline();
00148 }
00149
00150 void LocalSession::synchronize_params(LocalSession *that)
00151 {
00152 loop_playback = that->loop_playback;
00153 loop_start = that->loop_start;
00154 loop_end = that->loop_end;
00155 preview_start = that->preview_start;
00156 preview_end = that->preview_end;
00157 red = that->red;
00158 green = that->green;
00159 blue = that->blue;
00160 }
00161
00162
00163 void LocalSession::load_xml(FileXML *file, unsigned long load_flags)
00164 {
00165 if(load_flags & LOAD_SESSION)
00166 {
00167 clipboard_length = 0;
00168
00169 file->tag.get_property("CLIP_TITLE", clip_title);
00170 file->tag.get_property("CLIP_NOTES", clip_notes);
00171 file->tag.get_property("FOLDER", folder);
00172 loop_playback = file->tag.get_property("LOOP_PLAYBACK", 0);
00173 loop_start = file->tag.get_property("LOOP_START", (double)0);
00174 loop_end = file->tag.get_property("LOOP_END", (double)0);
00175 selectionstart = file->tag.get_property("SELECTION_START", (double)0);
00176 selectionend = file->tag.get_property("SELECTION_END", (double)0);
00177 track_start = file->tag.get_property("TRACK_START", track_start);
00178 view_start = file->tag.get_property("VIEW_START", view_start);
00179 zoom_sample = file->tag.get_property("ZOOM_SAMPLE", zoom_sample);
00180 zoom_y = file->tag.get_property("ZOOMY", zoom_y);
00181 zoom_track = file->tag.get_property("ZOOM_TRACK", zoom_track);
00182 preview_start = file->tag.get_property("PREVIEW_START", preview_start);
00183 preview_end = file->tag.get_property("PREVIEW_END", preview_end);
00184 red = file->tag.get_property("RED", red);
00185 green = file->tag.get_property("GREEN", green);
00186 blue = file->tag.get_property("BLUE", blue);
00187
00188 for (int i = 0; i < AUTOGROUPTYPE_COUNT; i++) {
00189 if (!Automation::autogrouptypes_fixedrange[i]) {
00190 automation_mins[i] = file->tag.get_property(xml_autogrouptypes_titlesmin[i],automation_mins[i]);
00191 automation_maxs[i] = file->tag.get_property(xml_autogrouptypes_titlesmax[i],automation_maxs[i]);
00192 }
00193 }
00194 }
00195
00196
00197
00198
00199 if(load_flags & LOAD_SESSION || load_flags & LOAD_TIMEBAR)
00200 {
00201 selectionstart = file->tag.get_property("SELECTION_START", (double)0);
00202 selectionend = file->tag.get_property("SELECTION_END", (double)0);
00203 }
00204
00205
00206
00207 if(load_flags & LOAD_TIMEBAR)
00208 {
00209 in_point = file->tag.get_property("IN_POINT", (double)-1);
00210 out_point = file->tag.get_property("OUT_POINT", (double)-1);
00211 }
00212 }
00213
00214 void LocalSession::boundaries()
00215 {
00216 zoom_sample = MAX(1, zoom_sample);
00217 }
00218
00219 int LocalSession::load_defaults(BC_Hash *defaults)
00220 {
00221 loop_playback = defaults->get("LOOP_PLAYBACK", 0);
00222 loop_start = defaults->get("LOOP_START", (double)0);
00223 loop_end = defaults->get("LOOP_END", (double)0);
00224 selectionstart = defaults->get("SELECTIONSTART", selectionstart);
00225 selectionend = defaults->get("SELECTIONEND", selectionend);
00226
00227
00228 zoom_sample = defaults->get("ZOOM_SAMPLE", 16384);
00229 zoom_y = defaults->get("ZOOMY", 64);
00230 zoom_track = defaults->get("ZOOM_TRACK", 64);
00231 red = defaults->get("RED", 0.0);
00232 green = defaults->get("GREEN", 0.0);
00233 blue = defaults->get("BLUE", 0.0);
00234
00235 for (int i = 0; i < AUTOGROUPTYPE_COUNT; i++) {
00236 if (!Automation::autogrouptypes_fixedrange[i]) {
00237 automation_mins[i] = defaults->get(xml_autogrouptypes_titlesmin[i], automation_mins[i]);
00238 automation_maxs[i] = defaults->get(xml_autogrouptypes_titlesmax[i], automation_maxs[i]);
00239 }
00240 }
00241
00242 return 0;
00243 }
00244
00245 int LocalSession::save_defaults(BC_Hash *defaults)
00246 {
00247 defaults->update("LOOP_PLAYBACK", loop_playback);
00248 defaults->update("LOOP_START", loop_start);
00249 defaults->update("LOOP_END", loop_end);
00250 defaults->update("SELECTIONSTART", selectionstart);
00251 defaults->update("SELECTIONEND", selectionend);
00252 defaults->update("TRACK_START", track_start);
00253 defaults->update("VIEW_START", view_start);
00254 defaults->update("ZOOM_SAMPLE", zoom_sample);
00255 defaults->update("ZOOMY", zoom_y);
00256 defaults->update("ZOOM_TRACK", zoom_track);
00257 defaults->update("RED", red);
00258 defaults->update("GREEN", green);
00259 defaults->update("BLUE", blue);
00260
00261 for (int i = 0; i < AUTOGROUPTYPE_COUNT; i++) {
00262 if (!Automation::autogrouptypes_fixedrange[i]) {
00263 defaults->update(xml_autogrouptypes_titlesmin[i], automation_mins[i]);
00264 defaults->update(xml_autogrouptypes_titlesmax[i], automation_maxs[i]);
00265 }
00266 }
00267
00268 return 0;
00269 }
00270
00271 void LocalSession::set_selectionstart(double value)
00272 {
00273 this->selectionstart = value;
00274 }
00275
00276 void LocalSession::set_selectionend(double value)
00277 {
00278 this->selectionend = value;
00279 }
00280
00281 void LocalSession::set_inpoint(double value)
00282 {
00283 in_point = value;
00284 }
00285
00286 void LocalSession::set_outpoint(double value)
00287 {
00288 out_point = value;
00289 }
00290
00291 void LocalSession::unset_inpoint()
00292 {
00293 in_point = -1;
00294 }
00295
00296 void LocalSession::unset_outpoint()
00297 {
00298 out_point = -1;
00299 }
00300
00301
00302
00303 double LocalSession::get_selectionstart(int highlight_only)
00304 {
00305 if(highlight_only || !EQUIV(selectionstart, selectionend))
00306 return selectionstart;
00307
00308 if(in_point >= 0)
00309 return in_point;
00310 else
00311 if(out_point >= 0)
00312 return out_point;
00313 else
00314 return selectionstart;
00315 }
00316
00317 double LocalSession::get_selectionend(int highlight_only)
00318 {
00319 if(highlight_only || !EQUIV(selectionstart, selectionend))
00320 return selectionend;
00321
00322 if(out_point >= 0)
00323 return out_point;
00324 else
00325 if(in_point >= 0)
00326 return in_point;
00327 else
00328 return selectionend;
00329 }
00330
00331 double LocalSession::get_inpoint()
00332 {
00333 return in_point;
00334 }
00335
00336 double LocalSession::get_outpoint()
00337 {
00338 return out_point;
00339 }
00340
00341 int LocalSession::inpoint_valid()
00342 {
00343 return in_point >= 0;
00344 }
00345
00346 int LocalSession::outpoint_valid()
00347 {
00348 return out_point >= 0;
00349 }
00350
00351
00352
00353