void Tracks::set_transition_length(Transition *transition, double length)
{
// Must verify existence of transition
- int done = 0;
- if(!transition) return;
- for(Track *current_track = first;
- current_track && !done;
- current_track = current_track->next)
- {
- for(Edit *current_edit = current_track->edits->first;
- current_edit && !done;
- current_edit = current_edit->next)
- {
- if(current_edit->transition == transition)
- {
- transition->length = current_track->to_units(length, 1);
- if( current_edit == current_track->edits->last &&
- current_edit->silence() ) {
- current_edit->length = current_edit->transition->length;
+ int found = 0;
+ if( !transition ) return;
+ for( Track *track=first; track && !found; track=track->next ) {
+ for( Edit *edit=track->edits->first; edit && !found; edit = edit->next ) {
+ if( edit->transition == transition ) {
+ transition->length = track->to_units(length, 1);
+ if( edit == track->edits->last && edit->silence() ) {
+ edit->length = edit->transition->length;
}
- done = 1;
+ found = 1;
}
}
}
+ if( !found ) return;
+ if( edl->local_session->gang_tracks == GANG_NONE ) return;
+ Track *track = transition->edit->track;
+ double pos = track->from_units(transition->edit->startproject);
+ Track *current = edl->tracks->first;
+ for( ; current; current=current->next ) {
+ if( current == track ) continue;
+ if( current->data_type != track->data_type ) continue;
+ if( !current->armed_gang(track) ) continue;
+ int64_t track_pos = current->to_units(pos, 1);
+ Edit *edit = current->edits->editof(track_pos, PLAY_FORWARD, 0);
+ if( !edit || !edit->transition ) continue;
+ double edit_pos = track->from_units(edit->startproject);
+ if( !edl->equivalent(pos, edit_pos) ) continue;
+// modify gang same transitions at same position
+ if( edit->transition->Plugin::identical(transition) ) {
+ edit->transition->length = transition->length;
+ }
+ if( edit == track->edits->last && edit->silence() ) {
+ edit->length = edit->transition->length;
+ }
+ }
}
void Tracks::paste_transitions(double start, double end, int track_type, char* title)
{
int total_deleted = 0;
int done = 0;
- int gang = edl->session->gang_tracks != GANG_NONE ? 1 : 0;
+ int gang = edl->local_session->gang_tracks != GANG_NONE ? 1 : 0;
while( !done ) {
done = 1;
start, length, plugin->plugin_type);
result->copy_from(plugin);
result->shift(position - plugin->startproject);
+ result->gui_id = plugin->gui_id;
// Clear new plugin from old set
plugin->plugin_set->clear(plugin->startproject,
input_track = input_track->next)
{
if(input_track->data_type == data_type &&
- input_track->play &&
+ input_track->plays() &&
!input_track->is_armed()) break;
}
if(input_track->data_type == data_type &&
!input_track->is_armed() &&
- input_track->play) break;
+ input_track->plays()) break;
}
for(output_track = output_track->next;
-int Tracks::move_track_up(Track *track)
+int Tracks::roll_track_up(Track *track)
{
if( first == last ) return 1;
int n = 1;
Track *src = track, *dst = src->previous;
- if( edl->session->gang_tracks != GANG_NONE ) {
+ if( edl->local_session->gang_tracks != GANG_NONE ) {
while( src && !src->master ) src = src->previous;
if( !src ) src = first;
Track *nxt = src->next;
while( dst && !dst->master ) { dst = dst->previous; }
}
if( src == dst ) return 1;
- move_tracks(src, dst, n);
+ roll_tracks(src, dst, n);
return 0;
}
-int Tracks::move_track_down(Track *track)
+int Tracks::roll_track_down(Track *track)
{
if( first == last ) return 1;
int n = 1;
Track *src = track, *dst = src->next;
- if( edl->session->gang_tracks != GANG_NONE ) {
+ if( edl->local_session->gang_tracks != GANG_NONE ) {
while( src && !src->master ) src = src->previous;
if( !src ) src = first;
Track *nxt = src->next;
else
dst = !dst ? first : dst->next;
if( src == dst ) return 1;
- move_tracks(src, dst, n);
+ roll_tracks(src, dst, n);
return 0;
}
-int Tracks::move_tracks_up()
+int Tracks::roll_tracks_up()
{
if( first == last ) return 1;
int n = 1;
Track *src = first, *dst = 0;
- if( edl->session->gang_tracks != GANG_NONE ) {
+ if( edl->local_session->gang_tracks != GANG_NONE ) {
Track *nxt = src->next;
while( nxt && !nxt->master ) { ++n; nxt = nxt->next; }
}
if( src == dst ) return 1;
- move_tracks(src, dst, n);
+ roll_tracks(src, dst, n);
return 0;
}
-int Tracks::move_tracks_down()
+int Tracks::roll_tracks_down()
{
if( first == last ) return 1;
int n = 1;
Track *src = last, *dst = first;
- if( edl->session->gang_tracks != GANG_NONE ) {
+ if( edl->local_session->gang_tracks != GANG_NONE ) {
while( src && !src->master ) { ++n; src = src->previous; }
}
if( src == dst ) return 1;
- move_tracks(src, dst, n);
+ roll_tracks(src, dst, n);
+ return 0;
+}
+
+
+int Tracks::move_track_up(Track *track)
+{
+ Track *next_track = track->previous;
+ if(!next_track) next_track = last;
+
+ change_modules(number_of(track), number_of(next_track), 1);
+ swap(track, next_track);
+ return 0;
+}
+
+int Tracks::move_track_down(Track *track)
+{
+ Track *next_track = track->next;
+ if(!next_track) next_track = first;
+
+ change_modules(number_of(track), number_of(next_track), 1);
+ swap(track, next_track);
return 0;
}
+int Tracks::move_tracks_up()
+{
+ int result = 0;
+ Track *next = first;
+ while( next ) {
+ Track *track = next; next = track->next;
+ if( !track->armed ) continue;
+ if( track->previous ) {
+ change_modules(number_of(track->previous), number_of(track), 1);
+ swap(track->previous, track);
+ result = 1;
+ }
+ }
+
+ return result;
+}
+
+int Tracks::move_tracks_down()
+{
+ int result = 0;
+ Track *prev = last;
+ while( prev ) {
+ Track *track = prev; prev = track->previous;
+ if( !track->armed ) continue;
+ if( track->next ) {
+ change_modules(number_of(track), number_of(track->next), 1);
+ swap(track, track->next);
+ result = 1;
+ }
+ }
+
+ return result;
+}
+
void Tracks::paste_audio_transition(PluginServer *server)
{
for(Track *current = first; current; current = NEXT)
Track* current_atrack = 0;
Track* current_vtrack = 0;
Track* dst_track = 0;
- int src_type;
int result = 0;
double length;
double frame_rate = edl->session->frame_rate;
string[0] = 0;
// Search for start
- do{
- result = file->read_tag();
- }while(!result &&
- !file->tag.title_is("AUTO_CLIPBOARD"));
+ do {
+ result = file->read_tag();
+ } while(!result && !file->tag.title_is("AUTO_CLIPBOARD"));
if(!result)
{
frame_rate = file->tag.get_property("FRAMERATE", frame_rate);
sample_rate = file->tag.get_property("SAMPLERATE", sample_rate);
-
do
{
result = file->read_tag();
if(file->tag.title_is("TRACK"))
{
file->tag.get_property("TYPE", string);
- if(!strcmp(string, "AUDIO"))
- {
- src_type = TRACK_AUDIO;
- }
- else
- {
- src_type = TRACK_VIDEO;
- }
-
+ double src_rate = !strcmp(string, "AUDIO") ?
+ sample_rate : frame_rate;
+ double src_length = length / src_rate;
// paste to any media type
if(typeless)
{
if(dst_track)
{
- double frame_rate2 = frame_rate;
- double sample_rate2 = sample_rate;
-
- if(src_type != dst_track->data_type)
- {
- frame_rate2 = sample_rate;
- sample_rate2 = frame_rate;
- }
-
- dst_track->paste_automation(selectionstart,
- length,
- frame_rate2,
- sample_rate2,
- file,
- default_only,
- active_only);
+ dst_track->paste_automation(file,
+ selectionstart, src_length, src_rate,
+ default_only, active_only);
}
}
}
void Tracks::paste_transition(PluginServer *server, Edit *dest_edit)
{
dest_edit->insert_transition(server->title);
+ if( edl->local_session->gang_tracks == GANG_NONE ) return;
+ Track *track = dest_edit->track;
+ double pos = track->from_units(dest_edit->startproject);
+ for( Track *current=first; current; current=current->next ) {
+ if( current == track ) continue;
+ if( current->data_type != track->data_type ) continue;
+ if( !current->armed_gang(track) ) continue;
+ int64_t track_pos = current->to_units(pos, 1);
+ Edit *edit = current->edits->editof(track_pos, PLAY_FORWARD, 0);
+ if( !edit ) continue;
+ double edit_pos = track->from_units(edit->startproject);
+ if( !edl->equivalent(pos, edit_pos) ) continue;
+ edit->insert_transition(server->title);
+ }
}
void Tracks::paste_video_transition(PluginServer *server, int first_track)