2 #include "automation.h"
8 #include "edlsession.h"
13 #include "localsession.h"
18 #include "mainsession.h"
21 #include "trackcanvas.h"
23 #include "transportque.inc"
27 Tracks::Tracks(EDL *edl)
49 void Tracks::equivalent_output(Tracks *tracks, double *result)
51 if(total_playable_vtracks() != tracks->total_playable_vtracks())
57 Track *current = first;
58 Track *that_current = tracks->first;
59 while(current || that_current)
61 // Get next video track
62 while(current && current->data_type != TRACK_VIDEO)
65 while(that_current && that_current->data_type != TRACK_VIDEO)
66 that_current = that_current->next;
68 // One doesn't exist but the other does
69 if((!current && that_current) ||
70 (current && !that_current))
77 if(current && that_current)
79 current->equivalent_output(that_current, result);
81 that_current = that_current->next;
90 void Tracks::get_affected_edits(ArrayList<Edit*> *drag_edits, double position, Track *start_track)
92 drag_edits->remove_all();
94 for(Track *track = start_track;
98 //printf("Tracks::get_affected_edits 1 %p %d %d\n", track, track->data_type, track->record);
101 for(Edit *edit = track->edits->first; edit; edit = edit->next)
103 double startproject = track->from_units(edit->startproject);
104 //printf("Tracks::get_affected_edits 1 %d\n", edl->equivalent(startproject, position));
105 if(edl->equivalent(startproject, position))
107 drag_edits->append(edit);
116 void Tracks::get_automation_extents(float *min,
123 int coords_undefined = 1;
124 for(Track *current = first; current; current = NEXT)
128 current->automation->get_extents(min,
131 current->to_units(start, 1),
132 current->to_units(end, 1));
138 void Tracks::copy_from(Tracks *tracks)
143 for(Track *current = tracks->first; current; current = NEXT)
145 switch(current->data_type)
148 new_track = add_audio_track(0, 0);
151 new_track = add_video_track(0, 0);
154 new_track->copy_from(current);
158 Tracks& Tracks::operator=(Tracks &tracks)
160 printf("Tracks::operator= 1\n");
165 int Tracks::load(FileXML *xml, int &track_offset, uint32_t load_flags)
167 // add the appropriate type of track
168 char string[BCTEXTLEN];
172 xml->tag.get_property("TYPE", string);
174 if((load_flags & LOAD_ALL) == LOAD_ALL ||
175 (load_flags & LOAD_EDITS))
177 if(!strcmp(string, "VIDEO"))
179 add_video_track(0, 0);
183 add_audio_track(0, 0); // default to audio
189 track = get_item_number(track_offset);
194 if(track) track->load(xml, track_offset, load_flags);
199 Track* Tracks::add_audio_track(int above, Track *dst_track)
202 ATrack* new_track = new ATrack(edl, this);
205 dst_track = (above ? first : last);
210 insert_before(dst_track, (Track*)new_track);
214 insert_after(dst_track, (Track*)new_track);
215 // Shift effects referenced below the destination track
218 // Shift effects referenced below the new track
219 for(Track *track = last;
220 track && track != new_track;
221 track = track->previous)
223 change_modules(number_of(track) - 1, number_of(track), 0);
227 new_track->create_objects();
228 new_track->set_default_title();
231 for(Track *current = first;
232 current != (Track*)new_track;
235 if(current->data_type == TRACK_AUDIO) current_pan++;
236 if(current_pan >= edl->session->audio_channels) current_pan = 0;
242 (PanAuto*)new_track->automation->autos[AUTOMATION_PAN]->default_auto;
243 pan_auto->values[current_pan] = 1.0;
245 BC_Pan::calculate_stick_position(edl->session->audio_channels,
246 edl->session->achannel_positions,
255 Track* Tracks::add_video_track(int above, Track *dst_track)
258 VTrack* new_track = new VTrack(edl, this);
260 dst_track = (above ? first : last);
264 insert_before(dst_track, (Track*)new_track);
268 insert_after(dst_track, (Track*)new_track);
273 // Shift effects referenced below the new track
274 for(Track *track = last;
275 track && track != new_track;
276 track = track->previous)
278 change_modules(number_of(track) - 1, number_of(track), 0);
283 new_track->create_objects();
284 new_track->set_default_title();
289 int Tracks::delete_track(Track *track)
294 int old_location = number_of(track);
295 detach_shared_effects(old_location);
297 // Shift effects referencing effects below the deleted track
298 for(Track *current = track;
302 change_modules(number_of(current), number_of(current) - 1, 0);
304 if(track) delete track;
309 int Tracks::detach_shared_effects(int module)
311 for(Track *current = first; current; current = NEXT)
313 current->detach_shared_effects(module);
319 int Tracks::total_of(int type)
322 IntAuto *mute_keyframe = 0;
324 for(Track *current = first; current; current = NEXT)
326 long unit_start = current->to_units(edl->local_session->get_selectionstart(1), 0);
328 (IntAuto*)current->automation->autos[AUTOMATION_MUTE]->get_prev_auto(
331 (Auto* &)mute_keyframe);
334 (current->play && type == PLAY) ||
335 (current->record && type == RECORD) ||
336 (current->gang && type == GANG) ||
337 (current->draw && type == DRAW) ||
338 (mute_keyframe->value && type == MUTE) ||
339 (current->expand_view && type == EXPAND);
344 int Tracks::recordable_audio_tracks()
347 for(Track *current = first; current; current = NEXT)
348 if(current->data_type == TRACK_AUDIO && current->record) result++;
352 int Tracks::recordable_video_tracks()
355 for(Track *current = first; current; current = NEXT)
357 if(current->data_type == TRACK_VIDEO && current->record) result++;
363 int Tracks::playable_audio_tracks()
367 for(Track *current = first; current; current = NEXT)
369 if(current->data_type == TRACK_AUDIO && current->play)
378 int Tracks::playable_video_tracks()
382 for(Track *current = first; current; current = NEXT)
384 if(current->data_type == TRACK_VIDEO && current->play)
392 int Tracks::total_audio_tracks()
395 for(Track *current = first; current; current = NEXT)
396 if(current->data_type == TRACK_AUDIO) result++;
400 int Tracks::total_video_tracks()
403 for(Track *current = first; current; current = NEXT)
404 if(current->data_type == TRACK_VIDEO) result++;
408 double Tracks::total_playable_length()
411 for(Track *current = first; current; current = NEXT)
413 double length = current->get_length();
414 if(length > total) total = length;
419 double Tracks::total_recordable_length()
422 for(Track *current = first; current; current = NEXT)
426 double length = current->get_length();
427 if(length > total) total = length;
433 double Tracks::total_length()
436 for(Track *current = first; current; current = NEXT)
438 if(current->get_length() > total) total = current->get_length();
443 double Tracks::total_video_length()
446 for(Track *current = first; current; current = NEXT)
448 if(current->data_type == TRACK_VIDEO &&
449 current->get_length() > total) total = current->get_length();
455 void Tracks::translate_camera(float offset_x, float offset_y)
457 for(Track *current = first; current; current = NEXT)
459 if(current->data_type == TRACK_VIDEO)
461 ((VTrack*)current)->translate(offset_x, offset_y, 1);
465 void Tracks::translate_projector(float offset_x, float offset_y)
467 for(Track *current = first; current; current = NEXT)
469 if(current->data_type == TRACK_VIDEO)
471 ((VTrack*)current)->translate(offset_x, offset_y, 0);
476 void Tracks::update_y_pixels(Theme *theme)
478 int y = -edl->local_session->track_start;
479 for(Track *current = first; current; current = NEXT)
481 //printf("Tracks::update_y_pixels %d\n", y);
482 current->y_pixel = y;
483 y += current->vertical_span(theme);
491 for(Track* current = first; current; current = NEXT)
493 printf(" Track: %x\n", current);
500 void Tracks::select_all(int type,
503 for(Track* current = first; current; current = NEXT)
505 double position = edl->local_session->get_selectionstart(1);
507 if(type == PLAY) current->play = value;
508 if(type == RECORD) current->record = value;
509 if(type == GANG) current->gang = value;
510 if(type == DRAW) current->draw = value;
514 ((IntAuto*)current->automation->autos[AUTOMATION_MUTE]->get_auto_for_editing(position))->value = value;
517 if(type == EXPAND) current->expand_view = value;
562 // ===================================== file operations
564 int Tracks::popup_transition(int cursor_x, int cursor_y)
567 for(Track* current = first; current && !result; current = NEXT)
569 result = current->popup_transition(cursor_x, cursor_y);
575 int Tracks::change_channels(int oldchannels, int newchannels)
577 for(Track *current = first; current; current = NEXT)
578 { current->change_channels(oldchannels, newchannels); }
584 int Tracks::totalpixels()
587 for(Track* current = first; current; current = NEXT)
589 result += edl->local_session->zoom_track;
594 int Tracks::number_of(Track *track)
597 for(Track *current = first; current && current != track; current = NEXT)
604 Track* Tracks::number(int number)
608 for(current = first; current && i < number; current = NEXT)
616 int Tracks::total_playable_vtracks()
619 for(Track *current = first; current; current = NEXT)
621 if(current->data_type == TRACK_VIDEO && current->play) result++;