3 * Copyright (C) 2010 Adam Williams <broadcast at earthling dot net>
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22 #include "automation.h"
28 #include "edlsession.h"
33 #include "localsession.h"
38 #include "mainsession.h"
42 #include "trackcanvas.h"
44 #include "transportque.inc"
48 Tracks::Tracks(EDL *edl)
69 void Tracks::equivalent_output(Tracks *tracks, double *result)
71 if(total_playable_vtracks() != tracks->total_playable_vtracks())
77 Track *current = first;
78 Track *that_current = tracks->first;
79 while(current || that_current)
81 // Get next video track
82 while(current && current->data_type != TRACK_VIDEO)
85 while(that_current && that_current->data_type != TRACK_VIDEO)
86 that_current = that_current->next;
88 // One doesn't exist but the other does
89 if((!current && that_current) ||
90 (current && !that_current))
97 if(current && that_current)
99 current->equivalent_output(that_current, result);
101 that_current = that_current->next;
110 void Tracks::get_affected_edits(ArrayList<Edit*> *drag_edits, double position, Track *start_track)
112 drag_edits->remove_all();
114 for(Track *track = start_track;
118 //printf("Tracks::get_affected_edits 1 %p %d %d\n", track, track->data_type, track->record);
121 for(Edit *edit = track->edits->first; edit; edit = edit->next)
123 double startproject = track->from_units(edit->startproject);
124 //printf("Tracks::get_affected_edits 1 %d\n", edl->equivalent(startproject, position));
125 if(edl->equivalent(startproject, position))
127 drag_edits->append(edit);
136 void Tracks::get_automation_extents(float *min,
143 int coords_undefined = 1;
144 for(Track *current = first; current; current = NEXT)
148 current->automation->get_extents(min,
151 current->to_units(start, 1),
152 current->to_units(end, 1));
158 void Tracks::copy_from(Tracks *tracks)
160 Track *new_track = 0;
163 for(Track *current = tracks->first; current; current = NEXT)
165 switch(current->data_type)
168 new_track = add_audio_track(0, 0);
171 new_track = add_video_track(0, 0);
174 new_track = add_subttl_track(0, 0);
179 new_track->copy_from(current);
183 Tracks& Tracks::operator=(Tracks &tracks)
185 printf("Tracks::operator= 1\n");
190 int Tracks::load(FileXML *xml,
194 // add the appropriate type of track
195 char string[BCTEXTLEN];
199 xml->tag.get_property("TYPE", string);
201 if((load_flags & LOAD_ALL) == LOAD_ALL ||
202 (load_flags & LOAD_EDITS))
204 if(!strcmp(string, "VIDEO"))
206 add_video_track(0, 0);
209 if(!strcmp(string, "SUBTTL"))
211 add_subttl_track(0, 0);
215 add_audio_track(0, 0); // default to audio
221 track = get_item_number(track_offset);
226 if(track) track->load(xml, track_offset, load_flags);
231 Track* Tracks::add_audio_track(int above, Track *dst_track)
233 ATrack* new_track = new ATrack(edl, this);
236 dst_track = (above ? first : last);
241 insert_before(dst_track, (Track*)new_track);
245 insert_after(dst_track, (Track*)new_track);
246 // Shift effects referenced below the destination track
249 // Shift effects referenced below the new track
250 for(Track *track = last;
251 track && track != new_track;
252 track = track->previous)
254 change_modules(number_of(track) - 1, number_of(track), 0);
258 new_track->create_objects();
259 new_track->set_default_title();
262 for(Track *current = first;
263 current != (Track*)new_track;
266 if(current->data_type == TRACK_AUDIO) current_pan++;
267 if(current_pan >= edl->session->audio_channels) current_pan = 0;
273 (PanAuto*)new_track->automation->autos[AUTOMATION_PAN]->default_auto;
274 pan_auto->values[current_pan] = 1.0;
276 BC_Pan::calculate_stick_position(edl->session->audio_channels,
277 edl->session->achannel_positions,
286 Track* Tracks::add_video_track(int above, Track *dst_track)
289 if(debug) printf("Tracks::add_video_track %d\n", __LINE__);
290 VTrack* new_track = new VTrack(edl, this);
291 if(debug) printf("Tracks::add_video_track %d\n", __LINE__);
293 dst_track = (above ? first : last);
295 if(debug) printf("Tracks::add_video_track %d\n", __LINE__);
298 insert_before(dst_track, (Track*)new_track);
302 insert_after(dst_track, (Track*)new_track);
304 if(debug) printf("Tracks::add_video_track %d\n", __LINE__);
308 // Shift effects referenced below the new track
309 for(Track *track = last;
310 track && track != new_track;
311 track = track->previous)
313 change_modules(number_of(track) - 1, number_of(track), 0);
316 if(debug) printf("Tracks::add_video_track %d\n", __LINE__);
319 new_track->create_objects();
320 if(debug) printf("Tracks::add_video_track %d\n", __LINE__);
321 new_track->set_default_title();
322 if(debug) printf("Tracks::add_video_track %d\n", __LINE__);
327 Track* Tracks::add_subttl_track(int above, Track *dst_track)
330 if(debug) printf("Tracks::add_subttl_track %d\n", __LINE__);
331 STrack* new_track = new STrack(edl, this);
332 if(debug) printf("Tracks::add_subttl_track %d\n", __LINE__);
334 dst_track = (above ? first : last);
336 if(debug) printf("Tracks::add_subttl_track %d\n", __LINE__);
339 insert_before(dst_track, (Track*)new_track);
343 insert_after(dst_track, (Track*)new_track);
345 if(debug) printf("Tracks::add_subttl_track %d\n", __LINE__);
349 // Shift effects referenced below the new track
350 for(Track *track = last;
351 track && track != new_track;
352 track = track->previous)
354 change_modules(number_of(track) - 1, number_of(track), 0);
357 if(debug) printf("Tracks::add_subttl_track %d\n", __LINE__);
360 new_track->create_objects();
361 if(debug) printf("Tracks::add_subttl_track %d\n", __LINE__);
362 new_track->set_default_title();
363 if(debug) printf("Tracks::add_subttl_track %d\n", __LINE__);
365 // new_track->paste_silence(0,total_length(),0);
370 int Tracks::delete_track(Track *track)
375 int old_location = number_of(track);
376 detach_shared_effects(old_location);
378 // Shift effects referencing effects below the deleted track
379 for(Track *current = track;
383 change_modules(number_of(current), number_of(current) - 1, 0);
385 if(track) delete track;
390 int Tracks::detach_shared_effects(int module)
392 for(Track *current = first; current; current = NEXT)
394 current->detach_shared_effects(module);
400 int Tracks::total_of(int type)
403 IntAuto *mute_keyframe = 0;
405 for(Track *current = first; current; current = NEXT)
407 long unit_start = current->to_units(edl->local_session->get_selectionstart(1), 0);
409 (IntAuto*)current->automation->autos[AUTOMATION_MUTE]->get_prev_auto(
412 (Auto* &)mute_keyframe);
415 (current->play && type == PLAY) ||
416 (current->record && type == RECORD) ||
417 (current->gang && type == GANG) ||
418 (current->draw && type == DRAW) ||
419 (mute_keyframe->value && type == MUTE) ||
420 (current->expand_view && type == EXPAND);
425 int Tracks::recordable_audio_tracks()
428 for(Track *current = first; current; current = NEXT)
429 if(current->data_type == TRACK_AUDIO && current->record) result++;
433 int Tracks::recordable_video_tracks()
436 for(Track *current = first; current; current = NEXT)
438 if(current->data_type == TRACK_VIDEO && current->record) result++;
444 int Tracks::playable_audio_tracks()
448 for(Track *current = first; current; current = NEXT)
450 if(current->data_type == TRACK_AUDIO && current->play)
459 int Tracks::playable_video_tracks()
463 for(Track *current = first; current; current = NEXT)
465 if(current->data_type == TRACK_VIDEO && current->play)
473 int Tracks::total_audio_tracks()
476 for(Track *current = first; current; current = NEXT)
477 if(current->data_type == TRACK_AUDIO) result++;
481 int Tracks::total_video_tracks()
484 for(Track *current = first; current; current = NEXT)
485 if(current->data_type == TRACK_VIDEO) result++;
489 double Tracks::total_playable_length()
492 for(Track *current = first; current; current = NEXT)
494 double length = current->get_length();
495 if(length > total) total = length;
500 double Tracks::total_recordable_length()
503 for(Track *current = first; current; current = NEXT)
507 double length = current->get_length();
508 if(length > total) total = length;
514 double Tracks::total_length()
517 for(Track *current = first; current; current = NEXT)
519 if(current->get_length() > total) total = current->get_length();
524 double Tracks::total_video_length()
527 for(Track *current = first; current; current = NEXT)
529 if(current->data_type == TRACK_VIDEO &&
530 current->get_length() > total) total = current->get_length();
536 void Tracks::translate_camera(float offset_x, float offset_y)
538 for(Track *current = first; current; current = NEXT)
540 if(current->data_type == TRACK_VIDEO)
542 ((VTrack*)current)->translate(offset_x, offset_y, 1);
546 void Tracks::translate_projector(float offset_x, float offset_y)
548 for(Track *current = first; current; current = NEXT)
550 if(current->data_type == TRACK_VIDEO)
552 ((VTrack*)current)->translate(offset_x, offset_y, 0);
557 void Tracks::update_y_pixels(Theme *theme)
559 // int y = -edl->local_session->track_start;
561 for(Track *current = first; current; current = NEXT)
563 //printf("Tracks::update_y_pixels %d\n", y);
564 current->y_pixel = y;
565 y += current->vertical_span(theme);
569 int Tracks::dump(FILE *fp)
571 for(Track* current = first; current; current = NEXT)
573 fprintf(fp," Track: %p\n", current);
580 void Tracks::select_all(int type,
583 for(Track* current = first; current; current = NEXT)
585 double position = edl->local_session->get_selectionstart(1);
587 if(type == PLAY) current->play = value;
588 if(type == RECORD) current->record = value;
589 if(type == GANG) current->gang = value;
590 if(type == DRAW) current->draw = value;
594 ((IntAuto*)current->automation->autos[AUTOMATION_MUTE]->get_auto_for_editing(position))->value = value;
597 if(type == EXPAND) current->expand_view = value;
642 // ===================================== file operations
644 int Tracks::popup_transition(int cursor_x, int cursor_y)
647 for(Track* current = first; current && !result; current = NEXT)
649 result = current->popup_transition(cursor_x, cursor_y);
655 int Tracks::change_channels(int oldchannels, int newchannels)
657 for(Track *current = first; current; current = NEXT)
658 { current->change_channels(oldchannels, newchannels); }
664 int Tracks::totalpixels()
667 for(Track* current = first; current; current = NEXT)
669 result += edl->local_session->zoom_track;
674 int Tracks::number_of(Track *track)
677 for(Track *current = first; current && current != track; current = NEXT)
684 Track* Tracks::number(int number)
688 for(current = first; current && i < number; current = NEXT)
696 int Tracks::total_playable_vtracks()
699 for(Track *current = first; current; current = NEXT)
701 if(current->data_type == TRACK_VIDEO && current->play) result++;
706 int Tracks::plugin_exists(Plugin *plugin)
708 for(Track *track = first; track; track = track->next)
710 if(track->plugin_exists(plugin)) return 1;
715 int Tracks::track_exists(Track *track)
717 for(Track *current = first; current; current = NEXT)
719 if(current == track) return 1;
725 Track *Tracks::get(int idx, int data_type)
727 for(Track *current = first; current; current = NEXT)
729 if( current->data_type != data_type ) continue;
730 if( --idx < 0 ) return current;