6 #include "autoconf.inc"
7 #include "automation.inc"
9 #include "defaults.inc"
13 #include "filexml.inc"
14 #include "floatautos.inc"
16 #include "keyframe.inc"
21 #include "pluginset.inc"
22 #include "renderengine.inc"
23 #include "sharedlocation.inc"
25 #include "intautos.inc"
26 #include "trackcanvas.inc"
28 #include "transition.inc"
32 // UNITS ARE SAMPLES FOR ALL
34 class Track
: public ListItem
<Track
>
37 Track(EDL
*edl
, Tracks
*tracks
);
43 virtual int load_defaults(Defaults
*defaults
);
44 int load(FileXML
*file
, int track_offset
, uint32_t load_flags
);
45 virtual int save_header(FileXML
*file
) { return 0; };
46 virtual int save_derived(FileXML
*file
) { return 0; };
47 virtual int load_header(FileXML
*file
, uint32_t load_flags
) { return 0; };
48 virtual int load_derived(FileXML
*file
, uint32_t load_flags
) { return 0; };
49 void equivalent_output(Track
*track
, double *result
);
51 virtual void copy_from(Track
*track
);
52 Track
& operator=(Track
& track
);
53 virtual PluginSet
* new_plugins() { return 0; };
54 // Synchronize playback numbers
55 virtual void synchronize_params(Track
*track
);
57 // Get number of pixels to display
58 virtual int vertical_span(Theme
*theme
);
59 int64_t horizontal_span();
60 void resample(double old_rate
, double new_rate
);
62 // Get length of track in seconds
64 // Get dimensions of source for convenience functions
65 void get_source_dimensions(double position
, int &w
, int &h
);
68 void insert_asset(Asset
*asset
,
72 Plugin
* insert_effect(char *title
,
73 SharedLocation
*shared_location
,
75 PluginSet
*plugin_set
,
79 void insert_plugin_set(Track
*track
, double position
);
80 void detach_effect(Plugin
*plugin
);
81 void detach_shared_effects(int module
); // detach shared effects referencing module
82 // Insert a track from another EDL
83 void insert_track(Track
*track
,
89 int is_muted(int64_t position
, int direction
); // Test muting status
91 void move_plugins_up(PluginSet
*plugin_set
);
92 void move_plugins_down(PluginSet
*plugin_set
);
93 void remove_pluginset(PluginSet
*plugin_set
);
94 void remove_asset(Asset
*asset
);
96 // Used for determining a selection for editing so leave as int.
97 // converts the selection to SAMPLES OR FRAMES and stores in value
98 virtual int64_t to_units(double position
, int round
);
100 virtual double to_doubleunits(double position
);
101 virtual double from_units(int64_t position
);
105 // Positions are identical for handle modifications
106 virtual int identical(int64_t sample1
, int64_t sample2
) { return 0; };
108 // Get the plugin belonging to the set.
109 Plugin
* get_current_plugin(double position
,
114 Plugin
* get_current_transition(double position
,
121 // Called by playable tracks to test for playable server.
122 // Descends the plugin tree without creating a virtual console.
123 // Used by PlayableTracks::is_playable.
124 int is_synthesis(RenderEngine
*renderengine
,
128 // Used by PlayableTracks::is_playable
129 virtual int channel_is_playable(int64_t position
,
133 // Test direct copy conditions common to all the rendering routines
134 virtual int direct_copy_possible(int64_t start
, int direction
, int use_nudge
);
136 // Used by PlayableTracks::is_playable
137 int plugin_used(int64_t position
, int64_t direction
);
143 virtual int copy_settings(Track
*track
);
144 void shift_keyframes(double position
, double length
, int convert_units
);
145 void shift_effects(double position
, double length
, int convert_units
);
146 void change_plugins(SharedLocation
&old_location
,
147 SharedLocation
&new_location
,
149 void change_modules(int old_location
,
157 // Plugin set uses key frames for automation
158 ArrayList
<PluginSet
*> plugin_set
;
159 Automation
*automation
;
161 // Vertical offset from top of timeline
165 // There is some debate on whether to expand gang from faders to
166 // dragging operations. This would allow every edit in a column to get dragged
169 char title
[BCTEXTLEN
];
172 // Nudge in track units. Positive shifts track earlier in time. This way
173 // the position variables only need to add the nudge.
175 // TRACK_AUDIO or TRACK_VIDEO
196 int load_automation(FileXML
*file
);
197 int load_edits(FileXML
*file
);
199 virtual int change_channels(int oldchannels
, int newchannels
) { return 0; };
204 // ===================================== editing
205 int copy(double start
,
208 char *output_path
= "");
209 int copy_assets(double start
,
211 ArrayList
<Asset
*> *asset_list
);
212 virtual int copy_derived(int64_t start
, int64_t end
, FileXML
*file
) { return 0; };
213 virtual int paste_derived(int64_t start
, int64_t end
, int64_t total_length
, FileXML
*file
, int ¤t_channel
) { return 0; };
214 int clear(double start
,
221 // Returns the point to restart background rendering at.
222 // -1 means nothing changed.
223 void clear_automation(double selectionstart
,
225 int shift_autos
/* = 1 */,
226 int default_only
/* = 0 */);
227 virtual int clear_automation_derived(AutoConf
*auto_conf
,
228 double selectionstart
,
230 int shift_autos
= 1) { return 0; };
231 virtual int clear_derived(double start
,
232 double end
) { return 0; };
234 int copy_automation(double selectionstart
,
239 virtual int copy_automation_derived(AutoConf
*auto_conf
,
240 double selectionstart
,
242 FileXML
*file
) { return 0; };
243 int paste_automation(double selectionstart
,
249 virtual int paste_automation_derived(double selectionstart
,
254 int ¤t_pan
) { return 0; };
255 int paste_auto_silence(double start
, double end
);
256 virtual int paste_auto_silence_derived(int64_t start
, int64_t end
) { return 0; };
257 int scale_time(float rate_scale
, int scale_edits
, int scale_autos
, int64_t start
, int64_t end
);
258 virtual int scale_time_derived(float rate_scale
, int scale_edits
, int scale_autos
, int64_t start
, int64_t end
) { return 0; };
259 int purge_asset(Asset
*asset
);
260 int asset_used(Asset
*asset
);
261 int clear_handle(double start
,
266 int paste_silence(double start
, double end
, int edit_plugins
);
267 virtual int select_translation(int cursor_x
, int cursor_y
) { return 0; }; // select video coordinates for frame
268 virtual int update_translation(int cursor_x
, int cursor_y
, int shift_down
) { return 0; }; // move video coordinates
269 int select_auto(AutoConf
*auto_conf
, int cursor_x
, int cursor_y
);
270 virtual int select_auto_derived(float zoom_units
, float view_start
, AutoConf
*auto_conf
, int cursor_x
, int cursor_y
) { return 0; };
271 int move_auto(AutoConf
*auto_conf
, int cursor_x
, int cursor_y
, int shift_down
);
272 virtual int move_auto_derived(float zoom_units
, float view_start
, AutoConf
*auto_conf
, int cursor_x
, int cursor_y
, int shift_down
) { return 0; };
274 virtual int release_auto_derived() { return 0; };
275 // Return whether automation would prevent direct frame copies. Not fully implemented.
276 int automation_is_used(int64_t start
, int64_t end
);
277 virtual int automation_is_used_derived(int64_t start
, int64_t end
) { return 0; }
279 int popup_transition(int cursor_x
, int cursor_y
);
281 // Return 1 if the left handle was selected 2 if the right handle was selected 3 if the track isn't recordable
282 int modify_edithandles(double oldposition
,
288 int modify_pluginhandles(double oldposition
,
294 int select_edit(int cursor_x
,
298 virtual int end_translation() { return 0; };
299 virtual int reset_translation(int64_t start
, int64_t end
) { return 0; };
300 int feather_edits(int64_t start
, int64_t end
, int64_t units
);
301 int64_t get_feather(int64_t selectionstart
, int64_t selectionend
);
304 // Absolute number of this track
307 // get_dimensions is used for getting drawing regions so use floats for partial frames
308 // get the display dimensions in SAMPLES OR FRAMES
309 virtual int get_dimensions(double &view_start
,
311 double &zoom_units
) { return 0; };
312 // Longest time from current_position in which nothing changes
313 int64_t edit_change_duration(int64_t input_position
,
314 int64_t input_length
,
316 int test_transitions
,
318 int64_t plugin_change_duration(int64_t input_position
,
319 int64_t input_length
,
322 // Utility for edit_change_duration.
323 int need_edit(Edit
*current
, int test_transitions
);
324 // If the edit under position is playable.
325 // Used by PlayableTracks::is_playable.
326 int playable_edit(int64_t position
, int direction
);
328 // ===================================== for handles, titles, etc
330 int64_t old_view_start
;
331 int pixel
; // pixel position from top of track view
332 // Dimensions of this track if video
333 int track_w
, track_h
;
339 // Identification of the track