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,
124 int coords_undefined = 1;
125 for(Track *current = first; current; current = NEXT)
129 current->automation->get_extents(min,
132 current->to_units(start, 1),
133 current->to_units(end, 1),
140 void Tracks::copy_from(Tracks *tracks)
145 for(Track *current = tracks->first; current; current = NEXT)
147 switch(current->data_type)
150 new_track = add_audio_track(0, 0);
153 new_track = add_video_track(0, 0);
156 new_track->copy_from(current);
160 Tracks& Tracks::operator=(Tracks &tracks)
162 printf("Tracks::operator= 1\n");
167 int Tracks::load(FileXML *xml, int &track_offset, uint32_t load_flags)
169 // add the appropriate type of track
170 char string[BCTEXTLEN];
174 xml->tag.get_property("TYPE", string);
176 if((load_flags & LOAD_ALL) == LOAD_ALL ||
177 (load_flags & LOAD_EDITS))
179 if(!strcmp(string, "VIDEO"))
181 add_video_track(0, 0);
185 add_audio_track(0, 0); // default to audio
191 track = get_item_number(track_offset);
196 if(track) track->load(xml, track_offset, load_flags);
201 Track* Tracks::add_audio_track(int above, Track *dst_track)
204 ATrack* new_track = new ATrack(edl, this);
207 dst_track = (above ? first : last);
212 insert_before(dst_track, (Track*)new_track);
216 insert_after(dst_track, (Track*)new_track);
217 // Shift effects referenced below the destination track
220 // Shift effects referenced below the new track
221 for(Track *track = last;
222 track && track != new_track;
223 track = track->previous)
225 change_modules(number_of(track) - 1, number_of(track), 0);
229 new_track->create_objects();
230 new_track->set_default_title();
233 for(Track *current = first;
234 current != (Track*)new_track;
237 if(current->data_type == TRACK_AUDIO) current_pan++;
238 if(current_pan >= edl->session->audio_channels) current_pan = 0;
244 (PanAuto*)new_track->automation->autos[AUTOMATION_PAN]->default_auto;
245 pan_auto->values[current_pan] = 1.0;
247 BC_Pan::calculate_stick_position(edl->session->audio_channels,
248 edl->session->achannel_positions,
257 Track* Tracks::add_video_track(int above, Track *dst_track)
260 VTrack* new_track = new VTrack(edl, this);
262 dst_track = (above ? first : last);
266 insert_before(dst_track, (Track*)new_track);
270 insert_after(dst_track, (Track*)new_track);
275 // Shift effects referenced below the new track
276 for(Track *track = last;
277 track && track != new_track;
278 track = track->previous)
280 change_modules(number_of(track) - 1, number_of(track), 0);
285 new_track->create_objects();
286 new_track->set_default_title();
291 int Tracks::delete_track(Track *track)
296 int old_location = number_of(track);
297 detach_shared_effects(old_location);
299 // Shift effects referencing effects below the deleted track
300 for(Track *current = track;
304 change_modules(number_of(current), number_of(current) - 1, 0);
306 if(track) delete track;
311 int Tracks::detach_shared_effects(int module)
313 for(Track *current = first; current; current = NEXT)
315 current->detach_shared_effects(module);
321 int Tracks::total_of(int type)
324 IntAuto *mute_keyframe = 0;
326 for(Track *current = first; current; current = NEXT)
328 long unit_start = current->to_units(edl->local_session->get_selectionstart(1), 0);
330 (IntAuto*)current->automation->autos[AUTOMATION_MUTE]->get_prev_auto(
333 (Auto* &)mute_keyframe);
336 (current->play && type == PLAY) ||
337 (current->record && type == RECORD) ||
338 (current->gang && type == GANG) ||
339 (current->draw && type == DRAW) ||
340 (mute_keyframe->value && type == MUTE) ||
341 (current->expand_view && type == EXPAND);
346 int Tracks::recordable_audio_tracks()
349 for(Track *current = first; current; current = NEXT)
350 if(current->data_type == TRACK_AUDIO && current->record) result++;
354 int Tracks::recordable_video_tracks()
357 for(Track *current = first; current; current = NEXT)
359 if(current->data_type == TRACK_VIDEO && current->record) result++;
365 int Tracks::playable_audio_tracks()
369 for(Track *current = first; current; current = NEXT)
371 if(current->data_type == TRACK_AUDIO && current->play)
380 int Tracks::playable_video_tracks()
384 for(Track *current = first; current; current = NEXT)
386 if(current->data_type == TRACK_VIDEO && current->play)
394 int Tracks::total_audio_tracks()
397 for(Track *current = first; current; current = NEXT)
398 if(current->data_type == TRACK_AUDIO) result++;
402 int Tracks::total_video_tracks()
405 for(Track *current = first; current; current = NEXT)
406 if(current->data_type == TRACK_VIDEO) result++;
410 double Tracks::total_playable_length()
413 for(Track *current = first; current; current = NEXT)
415 double length = current->get_length();
416 if(length > total) total = length;
421 double Tracks::total_recordable_length()
424 for(Track *current = first; current; current = NEXT)
428 double length = current->get_length();
429 if(length > total) total = length;
435 double Tracks::total_length()
438 for(Track *current = first; current; current = NEXT)
440 if(current->get_length() > total) total = current->get_length();
445 double Tracks::total_video_length()
448 for(Track *current = first; current; current = NEXT)
450 if(current->data_type == TRACK_VIDEO &&
451 current->get_length() > total) total = current->get_length();
457 void Tracks::translate_camera(float offset_x, float offset_y)
459 for(Track *current = first; current; current = NEXT)
461 if(current->data_type == TRACK_VIDEO)
463 ((VTrack*)current)->translate(offset_x, offset_y, 1);
467 void Tracks::translate_projector(float offset_x, float offset_y)
469 for(Track *current = first; current; current = NEXT)
471 if(current->data_type == TRACK_VIDEO)
473 ((VTrack*)current)->translate(offset_x, offset_y, 0);
478 void Tracks::update_y_pixels(Theme *theme)
480 int y = -edl->local_session->track_start;
481 for(Track *current = first; current; current = NEXT)
483 //printf("Tracks::update_y_pixels %d\n", y);
484 current->y_pixel = y;
485 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++;