for(int i = 0; i < clips.size(); i++)
clips.get(i)->Garbage::remove_user();
clips.remove_all();
+ mixers.remove_all_objects();
}
if(load_flags & LOAD_TIMEBAR)
new_folder(folder);
}
else
+ if(file->tag.title_is("MIXERS"))
+ {
+ if((load_flags & LOAD_SESSION))
+ mixers.load(file);
+ else
+ result = file->skip_tag();
+ }
+ else
if(file->tag.title_is("ASSETS"))
{
- if((load_flags & LOAD_ASSETS) &&
- !parent_edl)
+ if(load_flags & LOAD_ASSETS)
assets->load(file, load_flags);
else
result = file->skip_tag();
copy_session(edl);
copy_assets(edl);
copy_clips(edl);
+ copy_mixers(edl);
tracks->copy_from(edl->tracks);
labels->copy_from(edl->labels);
return 0;
}
}
+void EDL::copy_mixers(EDL *edl)
+{
+ if(this == edl) return;
+ mixers.copy_from(edl->mixers);
+}
+
void EDL::copy_session(EDL *edl, int session_only)
{
if(this == edl) return;
// Media
// Don't replicate all assets for every clip.
-// The assets for the clips are probably in the mane EDL.
- if(!is_clip)
- copy_assets(start,
- end,
- file,
- all,
- output_path);
-
+// The assets for the clips are probably in the main EDL.
+ if( !is_clip )
+ copy_assets(start, end, file, all, output_path);
// Clips
// Don't want this if using clipboard
if(all)
output_path,
1,
0);
+ mixers.save(file);
}
file->append_newline();
//printf("EDL::copy 2\n");
// terminate file
- if(is_clip)
+ if( is_clip )
file->tag.set_title("/CLIP_EDL");
- else
- if(is_vwindow)
+ else if( is_vwindow )
file->tag.set_title("/VWINDOW_EDL");
else
file->tag.set_title("/EDL");
}
}
+void EDL::deglitch(double position)
+{
+ if( !session->cursor_on_frames ) return;
+ Track *current_track = tracks->first;
+ for( ; current_track; current_track=current_track->next ) {
+ if( !current_track->record ) continue;
+ if( current_track->data_type != TRACK_AUDIO ) continue;
+ ATrack *atrack = (ATrack*)current_track;
+ atrack->deglitch(position,
+ session->labels_follow_edits,
+ session->plugins_follow_edits,
+ session->autos_follow_edits);
+ }
+}
-int EDL::clear(double start,
- double end,
- int clear_labels,
- int clear_plugins,
- int edit_autos)
+int EDL::clear(double start, double end,
+ int clear_labels, int clear_plugins, int edit_autos)
{
if(start == end)
{
if(new_nested_edl)
{
- length = new_nested_edl->tracks->total_playable_length();
+ length = new_nested_edl->tracks->total_length();
layers = 1;
channels = new_nested_edl->session->audio_channels;
}
int64_t EDL::get_audio_samples()
{
- return (int64_t)(tracks->total_playable_length() *
+ return (int64_t)(tracks->total_length() *
session->sample_rate);
}
int64_t EDL::get_video_frames()
{
- return (int64_t)(tracks->total_playable_length() *
+ return (int64_t)(tracks->total_length() *
session->frame_rate);
}
}
+double EDL::next_edit(double position)
+{
+ Units::fix_double(&position);
+ double new_position = tracks->total_length();
+
+ double max_rate = get_frame_rate();
+ int sample_rate = get_sample_rate();
+ if( sample_rate > max_rate ) max_rate = sample_rate;
+ double min_movement = max_rate > 0 ? 1. / max_rate : 1e-6;
+
+// Test for edit handles after position
+ for( Track *track=tracks->first; track; track=track->next ) {
+ if( !track->record ) continue;
+ for( Edit *edit=track->edits->first; edit; edit=edit->next ) {
+ double edit_end = track->from_units(edit->startproject + edit->length);
+ Units::fix_double(&edit_end);
+ if( fabs(edit_end-position) < min_movement ) continue;
+ if( edit_end > position && edit_end < new_position )
+ new_position = edit_end;
+ }
+ }
+ return new_position;
+}
+
+double EDL::prev_edit(double position)
+{
+ Units::fix_double(&position);
+ double new_position = -1;
+
+ double max_rate = get_frame_rate();
+ int sample_rate = get_sample_rate();
+ if( sample_rate > max_rate ) max_rate = sample_rate;
+ double min_movement = max_rate > 0 ? 1. / max_rate : 1e-6;
+
+// Test for edit handles before cursor position
+ for( Track *track=tracks->first; track; track=track->next ) {
+ if( !track->record ) continue;
+ for( Edit *edit=track->edits->first; edit; edit=edit->next ) {
+ double edit_end = track->from_units(edit->startproject);
+ Units::fix_double(&edit_end);
+ if( fabs(edit_end-position) < min_movement ) continue;
+ if( edit_end < position && edit_end > new_position )
+ new_position = edit_end;
+ }
+ }
+ return new_position;
+}
+