LiVES  1.6.4-svn
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros
multitrack.h
Go to the documentation of this file.
1 // multitrack.h
2 // LiVES
3 // (c) G. Finch 2005 - 2010 <salsaman@xs4all.nl,salsaman@gmail.com>
4 // released under the GNU GPL 3 or later
5 // see file ../COPYING for licensing details
6 
7 // multitrack window
8 
9 #ifndef HAS_LIVES_MULTITRACK_H
10 #define HAS_LIVES_MULTITRACK_H
11 
12 #define CLIP_THUMB_WIDTH 72
13 #define CLIP_THUMB_HEIGHT 72
14 
15 #define CLIP_LABEL_LENGTH 20
16 
17 #define BLOCK_THUMB_WIDTH 40
18 
19 #define BLOCK_DRAW_SIMPLE 1
20 #define BLOCK_DRAW_THUMB 2
21 #define BLOCK_DRAW_TYPE BLOCK_DRAW_THUMB
22 
23 #define MT_PLAY_WIDTH_SMALL 320
24 #define MT_PLAY_HEIGHT_SMALL 216
25 
26 #define MT_PLAY_WIDTH_EXP 432
27 #define MT_PLAY_HEIGHT_EXP 324
28 
29 #define MT_CTX_WIDTH 320
30 #define MT_CTX_HEIGHT 220
31 
32 #define FX_BLOCK_WIDTH 80
33 #define FX_BLOCK_HEIGHT 20
34 
35 
36 #define TIMECODE_LENGTH 14
37 
38 #define DEF_TIME 120
39 
40 #define MT_BORDER_WIDTH 20
41 
42 #define IN_OUT_SEP 10
43 
44 typedef struct _mt lives_mt;
45 
46 typedef struct _track_rect track_rect;
47 
48 typedef struct _mt_opts mt_opts;
49 
50 typedef struct _lives_amixer_t lives_amixer_t;
51 
52 #define MAX_DISP_VTRACKS 5
53 
54 typedef enum {
59 
60 
61 typedef enum {
63 
64  // not implemented yet
70 
71 
72 typedef enum {
77 
78 
79 typedef enum {
80 // undo actions
85 
86 // minimal event_list
92 
93 // full backups of event_list
101 
102 
103 
104 typedef enum {
111 
112 
113 
114 typedef enum {
124 
125 
126 
127 typedef enum {
131 
132 
133 typedef enum {
138 
139 
140 typedef enum {
145 
146 
147 typedef enum {
148 // block state
152 
153 
154 
155 struct _mt_opts {
156  gboolean set;
157  gboolean move_effects;
158  gboolean fx_auto_preview;
159  gboolean snap_over;
163  gboolean show_audio;
164  gboolean show_ctx;
165  gboolean ign_ins_sel;
166  gboolean follow_playback;
167  gboolean insert_audio;
168  gboolean pertrack_audio;
169  gboolean audio_bleedthru;
170  gboolean gang_audio;
172 };
173 
174 
175 struct _mt {
176  // widgets
177  GtkWidget *window;
178  GtkWidget *top_vbox;
179  GtkWidget *hbox;
180  GtkWidget *play_blank;
181  GtkWidget *play_box;
182  GtkWidget *poly_box;
183  GtkWidget *clip_scroll;
184  GtkWidget *clip_inner_box;
185  GtkWidget *in_out_box;
186  GtkWidget *in_hbox;
187  GtkWidget *out_hbox;
188  GtkWidget *in_image;
189  GtkWidget *out_image;
190  GtkWidget *context_box;
191  GtkWidget *context_scroll;
192  GtkWidget *sep_image;
194  GtkWidget *tl_eventbox;
195  GtkWidget *timeline_table;
196  GtkWidget *timeline;
197  GtkWidget *timeline_eb;
198  GtkWidget *timeline_reg;
199  GtkWidget *infobar;
200  GtkWidget *stop;
201  GtkWidget *rewind;
202  GtkWidget *sepwin;
203  GtkWidget *mute_audio;
204  GtkWidget *loop_continue;
205  GtkWidget *insert;
206  GtkWidget *audio_insert;
207  GtkWidget *delblock;
208  GtkWidget *clipedit;
209  GtkWidget *vpaned;
210  GtkWidget *hpaned;
211  GtkWidget *scrollbar;
212  GtkWidget *playall;
213  GtkWidget *playsel;
214  GtkWidget *jumpnext;
215  GtkWidget *jumpback;
216  GtkWidget *render;
217  GtkWidget *prerender_aud;
218  GtkWidget *fx_block;
219  GtkWidget *fx_delete;
220  GtkWidget *fx_edit;
221  GtkWidget *fx_region;
222  GtkWidget *fx_region_1;
223  GtkWidget *fx_region_2;
224  GtkWidget *fx_region_2av;
225  GtkWidget *fx_region_2v;
226  GtkWidget *fx_region_2a;
227  GtkWidget *fx_region_3;
228  GtkWidget *atrans_menuitem;
229  GtkWidget *submenu_atransfx;
230  GtkWidget *move_fx;
231  GtkWidget *mm_menuitem;
232  GtkWidget *mm_move;
233  GtkWidget *mm_select;
234  GtkWidget *ins_menuitem;
235  GtkWidget *ins_normal;
236  GtkToolItem *grav_menuitem;
237  GtkWidget *grav_normal;
238  GtkWidget *grav_left;
239  GtkWidget *grav_right;
240  GtkWidget *select_track;
241  GtkWidget *view_events;
242  GtkWidget *view_clips;
243  GtkWidget *view_in_out;
244  GtkWidget *view_effects;
245  GtkWidget *avel_box;
247  GtkWidget *spinbutton_avel;
248  GtkWidget *avel_scale;
249  GtkWidget *spinbutton_in;
250  GtkWidget *spinbutton_out;
253  GtkWidget *timecode;
254  GtkWidget *spinbutton_start;
255  GtkWidget *spinbutton_end;
256  GtkWidget *tl_hbox;
257  GtkWidget *fx_base_box;
258  GtkWidget *fx_contents_box;
259  GtkWidget *fx_box;
260  GtkWidget *fx_label;
261  GtkWidget *param_inner_box;
262  GtkWidget *param_box;
263  GtkWidget *next_node_button;
264  GtkWidget *prev_node_button;
265  GtkWidget *del_node_button;
266  GtkWidget *node_spinbutton;
267  GtkWidget *node_scale;
268  GtkWidget *sel_label;
269  GtkWidget *l_sel_arrow;
270  GtkWidget *r_sel_arrow;
271  GtkWidget *save_event_list;
272  GtkWidget *load_event_list;
273  GtkWidget *clear_event_list;
274  GtkWidget *tc_to_rs;
275  GtkWidget *tc_to_re;
276  GtkWidget *rs_to_tc;
277  GtkWidget *re_to_tc;
278  GtkWidget *undo;
279  GtkWidget *redo;
280  GtkWidget *remove_gaps;
281  GtkWidget *remove_first_gaps;
282  GtkWidget *split_sel;
283  GtkWidget *ins_gap_sel;
284  GtkWidget *ins_gap_cur;
285  GtkWidget *last_filter_map;
286  GtkWidget *next_filter_map;
287  GtkWidget *fx_list_box;
288  GtkWidget *fx_list_scroll;
289  GtkWidget *fx_list_vbox;
290  GtkWidget *next_fm_button;
291  GtkWidget *prev_fm_button;
292  GtkWidget *fx_ibefore_button;
293  GtkWidget *fx_iafter_button;
294  GtkWidget *cback_audio;
295  GtkWidget *aload_subs;
296  GtkWidget *load_vals;
297  GtkWidget *change_vals;
298  GtkWidget *aparam_separator;
299  GtkWidget *aparam_menuitem;
300  GtkWidget *aparam_submenu;
301  GtkWidget *render_sep;
302  GtkWidget *render_vid;
303  GtkWidget *render_aud;
304  GtkWidget *normalise_aud;
305  GtkWidget *view_audio;
306  GtkWidget *clear_marks;
307  GtkWidget *fd_frame;
308  GtkWidget *apply_fx_button;
309  GtkWidget *eview_button;
310  GtkWidget *follow_play;
311  GtkWidget *change_max_disp;
312  GtkWidget *add_vid_behind;
313  GtkWidget *add_vid_front;
314  GtkWidget *quit;
315  GtkWidget *troubleshoot;
316  GtkWidget *fx_params_label;
317  GtkWidget *amixer_button;
318  GtkWidget *view_sel_events;
319  GtkWidget *adjust_start_end;
320  GtkWidget *in_eventbox;
321  GtkWidget *out_eventbox;
322  GtkWidget *start_in_label;
323  GtkWidget *end_out_label;
324  GtkWidget *context_frame;
325  GtkWidget *nb;
326  GtkWidget *nb_label;
327 
328  GtkWidget *open_menu;
329  GtkWidget *recent_menu;
330  GtkWidget *recent1;
331  GtkWidget *recent2;
332  GtkWidget *recent3;
333  GtkWidget *recent4;
334 
335  GtkWidget *time_scrollbar;
336  GtkWidget *show_layout_errors;
337 
338  GtkWidget *load_set;
339  GtkWidget *save_set;
340 
341  GtkWidget *close;
342 
343  GtkWidget *clear_ds;
344 
345  GtkWidget *gens_submenu;
346  GtkWidget *capture;
347 
348  GtkWidget *insa_eventbox;
349  GtkWidget *insa_checkbutton;
350  GtkWidget *snapo_checkbutton;
351 
354 
355  GdkCursor *cursor;
356 
357  GObject *hadjustment;
358  GObject *node_adj;
359 
360  GList *audio_draws;
361 
362  GList *audio_vols;
364 
365  GtkAccelGroup *accel_group;
366  GList *video_draws;
367  GObject *vadjustment;
368 
369  GdkDisplay *display;
370 
372 
373  GdkPixbuf *sepwin_pixbuf;
374 
375  gulong spin_in_func;
381 
382  gulong mm_move_func;
384 
386 
390 
391  gulong sepwin_func;
394 
396 
397  gulong tc_func;
398 
400 
401  weed_plant_t *event_list;
402 
403  weed_plant_t *init_event;
404  weed_plant_t *selected_init_event;
405 
407  gdouble end_secs;
408 
409  // timeline min and max display values
410  gdouble tl_min;
411  gdouble tl_max;
412 
416 
418 
420 
422 
424 
425  track_rect *block_selected;
426  track_rect *putative_block;
427 
428  gdouble ptr_time;
429 
430  gdouble tl_fixed_length;
431 
432  gdouble fps;
433 
434  gdouble region_start;
435  gdouble region_end;
436  gdouble region_init;
437  gboolean region_updating;
438 
439  gboolean is_rendering;
440  gboolean pr_audio;
441 
444 
446 
448 
449  gchar layout_name[256];
450 
451  // cursor warping for mouse move mode
452  gdouble hotspot_x;
453  gint hotspot_y;
454 
455  gboolean moving_block;
456 
458 
459  gint sel_x;
460  gint sel_y;
461 
462  gulong mouse_mot1;
463  gulong mouse_mot2;
464 
465  gboolean tl_selecting;
466 
467  /* start and end offset overrides for inserting (used during block move) */
468  weed_timecode_t insert_start;
469  weed_timecode_t insert_end;
470 
472  gdouble insert_avel;
473 
474  GList *undos;
476  unsigned char *undo_mem;
478  gboolean did_backup;
479 
480  gchar undo_text[32];
481  gchar redo_text[32];
482 
483  gboolean undoable;
484  gboolean redoable;
485 
486  gboolean changed;
487  gboolean auto_changed;
488 
489  int64_t auto_back_time;
490 
491  // stuff to do with framedraw "special" widgets
492  gint inwidth;
493  gint inheight;
494  gint outwidth;
495  gint outheight;
498 
500 
502 
503  mt_opts opts;
504 
505  gboolean auto_reloading;
506 
507  weed_plant_t *fm_edit_event;
508  weed_plant_t *moving_fx;
509 
510  int avol_fx;
511  weed_plant_t *avol_init_event;
512 
515 
516  gboolean layout_prompt;
519 
520  gdouble user_fps;
527 
528  gboolean render_vidp;
529  gboolean render_audp;
530  gboolean normalise_audp;
531 
533 
534 
535  GList *tl_marks;
536 
537  weed_plant_t *pb_start_event;
538  weed_plant_t *pb_loop_event;
539 
540  weed_plant_t *specific_event;
541 
542  gdouble context_time;
543  gboolean use_context;
544 
546 
547  gboolean is_paused;
548 
549  /* current size of frame inside playback/preview area */
552 
553  /* current size of playback/preview area */
556 
558 
559  gint top_track;
560 
561  gboolean redraw_block;
562 
563  gboolean was_undo_redo;
564 
565  gboolean no_expose;
566 
567  gboolean is_ready;
568 
570 
571  gboolean has_audio_file;
572 
573  gboolean tl_mouse;
574 
575  gboolean playing_sel;
576 
577  guint idlefunc;
578 
579  GList *clip_labels;
580 
581  lives_amixer_t *amixer;
582 
583  gdouble prev_fx_time;
584 
585  gboolean block_tl_move;
586  gboolean block_node_spin;
587 
588  gboolean is_atrans;
589 
590 }; // lives_mt
591 
592 
593 
594 
595 typedef struct {
597  weed_timecode_t tc;
598  void *extra;
599  size_t data_len;
600 } mt_undo;
601 
602 
604  GtkWidget *main_hbox;
605  GtkWidget **ch_sliders;
606  GtkWidget *gang_checkbutton;
607  GtkWidget *inv_checkbutton;
608  gulong *ch_slider_fns;
609  gint nchans;
610  lives_mt *mt;
611 };
612 
613 
614 // reasons for track invisibility (bitmap)
615 #define TRACK_I_HIDDEN_USER (1<<0)
616 #define TRACK_I_HIDDEN_SCROLLED (1<<1)
617 
622 struct _track_rect {
623  track_rect *next;
624  track_rect *prev;
625  weed_plant_t *start_event;
626  weed_plant_t *end_event;
627 
628  weed_timecode_t offset_start;
629 
631  gboolean start_anchored;
632  gboolean end_anchored;
633  gboolean ordered;
634 
635  GtkWidget *eventbox;
636 
637 };
638 
639 
640 /* translation table for matching event_id to init_event */
641 typedef struct {
642  uint64_t in;
643  void *out;
644 } ttable;
645 
646 
647 /* clip->layout use mapping, from layout.map file */
648 typedef struct {
649  gchar *handle;
650  gint64 unique_id;
651  gchar *name;
652  GList *list;
653 } layout_map;
654 
655 
656 
657 
658 
660 
661 // setup functions
662 
663 lives_mt *multitrack (weed_plant_t *, gint orig_file, gdouble fps);
664 void mt_init_tracks (lives_mt *, gboolean set_min_max);
665 gboolean on_multitrack_activate (GtkMenuItem *menuitem, weed_plant_t *event_list);
666 
667 // delete function
668 gboolean multitrack_delete (lives_mt *, gboolean save);
669 
670 // morph the poly window
671 void polymorph (lives_mt *, lives_mt_poly_state_t poly);
672 
673 // sens/desens
674 void mt_desensitise (lives_mt *);
675 void mt_sensitise (lives_mt *);
676 
677 // external control callbacks
678 void insert_here_cb (GtkMenuItem *, gpointer mt);
679 void insert_audio_here_cb (GtkMenuItem *, gpointer mt);
680 void insert_at_ctx_cb (GtkMenuItem *, gpointer mt);
681 void insert_audio_at_ctx_cb (GtkMenuItem *, gpointer mt);
682 void multitrack_end_cb (GtkMenuItem *, gpointer mt);
683 void delete_block_cb (GtkMenuItem *, gpointer mt);
684 void selblock_cb (GtkMenuItem *, gpointer mt);
685 void list_fx_here_cb (GtkMenuItem *, gpointer mt);
686 void edit_start_end_cb (GtkMenuItem *, gpointer mt);
687 void close_clip_cb (GtkMenuItem *, gpointer mt);
688 void show_clipinfo_cb (GtkMenuItem *, gpointer mt);
689 
690 // menuitem callbacks
691 void on_add_video_track_activate (GtkMenuItem *, gpointer mt);
692 void multitrack_insert (GtkMenuItem *, gpointer mt);
693 void multitrack_adj_start_end (GtkMenuItem *, gpointer mt);
694 void multitrack_audio_insert (GtkMenuItem *, gpointer mt);
695 void multitrack_view_events (GtkMenuItem *, gpointer mt);
696 void multitrack_view_sel_events (GtkMenuItem *, gpointer mt);
697 void on_render_activate (GtkMenuItem *, gpointer mt);
698 void on_prerender_aud_activate (GtkMenuItem *, gpointer mt);
699 void on_jumpnext_activate (GtkMenuItem *, gpointer mt);
700 void on_jumpback_activate (GtkMenuItem *, gpointer mt);
701 void on_delblock_activate (GtkMenuItem *, gpointer mt);
702 void on_seltrack_activate (GtkMenuItem *, gpointer mt);
703 void multitrack_view_details (GtkMenuItem *, gpointer mt);
704 void mt_add_region_effect (GtkMenuItem *, gpointer mt);
705 void mt_add_block_effect (GtkMenuItem *, gpointer mt);
706 void on_save_event_list_activate (GtkMenuItem *, gpointer mt);
707 void on_load_event_list_activate (GtkMenuItem *, gpointer mt);
708 void on_clear_event_list_activate (GtkMenuItem *, gpointer mt);
709 void show_frame_events_activate (GtkMenuItem *, gpointer);
710 void mt_save_vals_toggled (GtkMenuItem *, gpointer mt);
711 void mt_load_vals_toggled (GtkMenuItem *, gpointer mt);
712 void mt_load_vals_toggled (GtkMenuItem *, gpointer mt);
713 void mt_render_vid_toggled (GtkMenuItem *, gpointer mt);
714 void mt_render_aud_toggled (GtkMenuItem *, gpointer mt);
715 void mt_norm_aud_toggled (GtkMenuItem *, gpointer mt);
716 void mt_fplay_toggled (GtkMenuItem *, gpointer mt);
717 void mt_change_vals_activate (GtkMenuItem *, gpointer mt);
718 void on_set_pvals_clicked (GtkWidget *button, gpointer mt);
719 void on_move_fx_changed (GtkMenuItem *, gpointer mt);
720 void select_all_time (GtkMenuItem *, gpointer mt);
721 void select_from_zero_time (GtkMenuItem *, gpointer mt);
722 void select_to_end_time (GtkMenuItem *, gpointer mt);
723 void select_all_vid (GtkMenuItem *, gpointer mt);
724 void select_no_vid (GtkMenuItem *, gpointer mt);
725 void on_split_sel_activate (GtkMenuItem *, gpointer mt);
726 void on_split_curr_activate (GtkMenuItem *, gpointer mt);
727 void multitrack_undo (GtkMenuItem *, gpointer mt);
728 void multitrack_redo (GtkMenuItem *, gpointer mt);
729 void on_mt_showkeys_activate (GtkMenuItem *, gpointer);
730 void on_mt_list_fx_activate (GtkMenuItem *, gpointer mt);
731 void on_mt_delfx_activate (GtkMenuItem *, gpointer mt);
732 void on_mt_fx_edit_activate (GtkMenuItem *, gpointer mt);
733 void mt_view_audio_toggled (GtkMenuItem *, gpointer mt);
734 void mt_view_ctx_toggled (GtkMenuItem *, gpointer mt);
735 void mt_ign_ins_sel_toggled (GtkMenuItem *, gpointer mt);
736 void mt_change_max_disp_tracks (GtkMenuItem *, gpointer mt);
737 
738 // event_list functions
739 weed_plant_t *add_blank_frames_up_to (weed_plant_t *event_list, weed_plant_t *start_event, weed_timecode_t end_tc, gdouble fps);
740 
741 // track functions
742 void on_cback_audio_activate (GtkMenuItem *, gpointer mt);
743 GtkWidget *add_audio_track (lives_mt *, gint trackno, gboolean behind);
744 void add_video_track_behind (GtkMenuItem *, gpointer mt);
745 void add_video_track_front (GtkMenuItem *, gpointer mt);
746 void delete_video_track(lives_mt *, gint layer, gboolean full);
747 void delete_audio_track(lives_mt *, GtkWidget *eventbox, gboolean full);
748 void delete_audio_tracks(lives_mt *, GList *list, gboolean full);
749 void remove_gaps (GtkMenuItem *, gpointer mt);
750 void remove_first_gaps (GtkMenuItem *, gpointer mt);
751 void on_insgap_sel_activate (GtkMenuItem *, gpointer mt);
752 void on_insgap_cur_activate (GtkMenuItem *, gpointer mt);
753 void on_split_activate (GtkMenuItem *, gpointer mt);
754 void scroll_tracks (lives_mt *, gint top_track);
755 gboolean track_arrow_pressed (GtkWidget *ahbox, GdkEventButton *, gpointer mt);
756 void track_select (lives_mt *);
757 gboolean mt_track_is_audio(lives_mt *, int ntrack);
758 gboolean mt_track_is_video(lives_mt *, int ntrack);
759 
760 void mt_do_autotransition(lives_mt *, track_rect *block);
761 
762 
763 // track mouse movement
764 gboolean on_track_click (GtkWidget *eventbox, GdkEventButton *, gpointer mt);
765 gboolean on_atrack_click (GtkWidget *eventbox, GdkEventButton *, gpointer mt);
766 gboolean on_track_header_click (GtkWidget *eventbox, GdkEventButton *, gpointer mt);
767 gboolean on_track_between_click (GtkWidget *eventbox, GdkEventButton *, gpointer mt);
768 gboolean on_track_release (GtkWidget *eventbox, GdkEventButton *event, gpointer mt);
769 gboolean on_atrack_release (GtkWidget *eventbox, GdkEventButton *event, gpointer mt);
770 gboolean on_track_header_release (GtkWidget *eventbox, GdkEventButton *, gpointer mt);
771 gboolean on_track_between_release (GtkWidget *eventbox, GdkEventButton *, gpointer mt);
772 gboolean on_track_move (GtkWidget *widget, GdkEventMotion *event, gpointer mt);
773 gboolean on_track_header_move (GtkWidget *widget, GdkEventMotion *event, gpointer mt);
774 
775 void unselect_all (lives_mt *);
776 void insert_frames (gint filenum, weed_timecode_t offset_start, weed_timecode_t offset_end, weed_timecode_t tc, lives_direction_t direction, GtkWidget *eventbox, lives_mt *, track_rect *in_block);
777 void insert_audio (gint filenum, weed_timecode_t offset_start, weed_timecode_t offset_end, weed_timecode_t tc, gdouble avel, lives_direction_t direction, GtkWidget *eventbox, lives_mt *, track_rect *in_block);
778 void on_seltrack_toggled (GtkWidget *, gpointer mt);
779 void scroll_track_by_scrollbar (GtkVScrollbar *sbar, gpointer mt);
780 
781 // block functions
782 void in_out_start_changed (GtkWidget *, gpointer mt);
783 void in_out_end_changed (GtkWidget *, gpointer mt);
784 void in_anchor_toggled (GtkToggleButton *, gpointer mt);
785 void out_anchor_toggled (GtkToggleButton *, gpointer mt);
786 void avel_reverse_toggled (GtkToggleButton *, gpointer mt);
787 void avel_spin_changed (GtkSpinButton *, gpointer mt);
788 
789 // block API functions
790 gint mt_get_last_block_number(lives_mt *, int ntrack);
791 gint mt_get_block_count(lives_mt *, int ntrack);
792 gdouble mt_get_block_sttime(lives_mt *, int ntrack, int iblock);
793 gdouble mt_get_block_entime(lives_mt *, int ntrack, int iblock);
794 
795 
796 // timeline functions
797 void mt_tl_move(lives_mt *, gdouble pos_rel);
798 void set_timeline_end_secs (lives_mt *, gdouble secs);
799 gboolean on_timeline_press (GtkWidget *, GdkEventButton *, gpointer mt);
800 gboolean on_timeline_release (GtkWidget *, GdkEventButton *, gpointer mt);
801 gboolean on_timeline_update (GtkWidget *, GdkEventMotion *, gpointer mt);
802 gint expose_timeline_reg_event (GtkWidget *, GdkEventExpose *, gpointer mt);
803 gint mt_expose_laudtrack_event (GtkWidget *ebox, GdkEventExpose *, gpointer mt);
804 gint mt_expose_raudtrack_event (GtkWidget *ebox, GdkEventExpose *, gpointer mt);
805 void draw_region (lives_mt *mt);
806 void tc_to_rs (GtkMenuItem *, gpointer mt);
807 void tc_to_re (GtkMenuItem *, gpointer mt);
808 void rs_to_tc (GtkMenuItem *, gpointer mt);
809 void re_to_tc (GtkMenuItem *, gpointer mt);
810 gboolean mt_mark_callback (GtkAccelGroup *group, GObject *obj, guint keyval, GdkModifierType mod, gpointer user_data);
811 void multitrack_clear_marks (GtkMenuItem *, gpointer mt);
812 void mt_show_current_frame(lives_mt *, gboolean return_layer);
813 void mt_clear_timeline(lives_mt *mt);
814 
815 
816 // context box text
817 void clear_context (lives_mt *);
818 void add_context_label (lives_mt *, const gchar *text);
819 void mouse_mode_context(lives_mt *);
820 void do_sel_context (lives_mt *);
821 void do_fx_list_context (lives_mt *, gint fxcount);
822 void do_fx_move_context(lives_mt *mt);
823 
824 // playback / animation
825 void multitrack_playall (lives_mt *);
826 void multitrack_play_sel (GtkMenuItem *, gpointer mt);
827 void animate_multitrack (lives_mt *);
828 void unpaint_line(lives_mt *, GtkWidget *eventbox);
829 void unpaint_lines(lives_mt *);
830 
831 void mt_prepare_for_playback(lives_mt *);
832 void mt_post_playback(lives_mt *);
833 
834 
835 // effect node controls
836 void on_next_node_clicked (GtkWidget *, gpointer mt);
837 void on_prev_node_clicked (GtkWidget *, gpointer mt);
838 void on_del_node_clicked (GtkWidget *, gpointer mt);
839 void on_node_spin_value_changed (GtkSpinButton *, gpointer mt);
840 gdouble mt_get_effect_time(lives_mt *);
841 
842 void on_frame_preview_clicked (GtkButton *, gpointer mt);
843 void show_preview (lives_mt *, weed_timecode_t tc);
844 
845 // filter list controls
846 weed_plant_t *get_prev_fm (lives_mt *, gint current_track, weed_plant_t *frame);
847 weed_plant_t *get_next_fm (lives_mt *, gint current_track, weed_plant_t *frame);
848 
849 void on_prev_fm_clicked (GtkWidget *button, gpointer user_data);
850 void on_next_fm_clicked (GtkWidget *button, gpointer user_data);
851 void on_fx_insb_clicked (GtkWidget *button, gpointer user_data);
852 void on_fx_insa_clicked (GtkWidget *button, gpointer user_data);
853 
854 // utils
855 guint event_list_get_byte_size(lives_mt *mt, weed_plant_t *event_list, int *num_events);
856 gboolean event_list_rectify(lives_mt *, weed_plant_t *event_listy);
857 gboolean make_backup_space (lives_mt *, size_t space_needed);
858 void activate_mt_preview(lives_mt *);
859 void **mt_get_pchain(void);
860 void event_list_free_undos(lives_mt *);
861 gboolean used_in_current_layout(lives_mt *, gint file);
862 
863 // event_list utilities
864 gboolean compare_filter_maps(weed_plant_t *fm1, weed_plant_t *fm2, gint ctrack);
865 void move_init_in_filter_map(lives_mt *mt, weed_plant_t *event_list, weed_plant_t *fmap, weed_plant_t *ifrom, weed_plant_t *ito, gint track, gboolean after);
866 void update_filter_events(lives_mt *, weed_plant_t *first_event, weed_timecode_t start_tc, weed_timecode_t end_tc, int track, weed_timecode_t new_start_tc, int new_track);
867 void mt_fixup_events(lives_mt *, weed_plant_t *old_event, weed_plant_t *new_event);
868 
869 // event_list load/save
870 weed_plant_t *load_event_list(lives_mt *, gchar *eload_file);
871 
872 
873 // layouts and layout maps
874 GList *load_layout_map(void);
875 void add_markers(lives_mt *, weed_plant_t *event_list);
876 void remove_markers(weed_plant_t *event_list);
877 void save_layout_map (int *lmap, double *lmap_audio, const gchar *file, const gchar *dir);
878 
879 void wipe_layout(lives_mt *);
880 
881 void migrate_layouts (const gchar *old_set_name, const gchar *new_set_name);
882 
883 GList *layout_frame_is_affected(gint clipno, gint frame);
884 GList *layout_audio_is_affected(gint clipno, gdouble time);
885 
886 gboolean check_for_layout_del (lives_mt *, gboolean exiting);
887 
888 void stored_event_list_free_all(gboolean wiped);
890 void remove_current_from_affected_layouts(lives_mt *);
891 
892 
893 // auto backup
894 guint mt_idle_add(lives_mt *);
895 void recover_layout(GtkButton *, gpointer);
896 void recover_layout_cancelled(GtkButton *, gpointer user_data);
897 gboolean write_backup_layout_numbering(lives_mt *);
898 
899 
900 // internal functions
901 void mouse_select_end(GtkWidget *, lives_mt *);
902 
903 
904 // amixer funcs
905 void amixer_show (GtkButton *, gpointer mt);
906 void on_amixer_close_clicked (GtkButton *, lives_mt *mt);
907 GtkWidget * amixer_add_channel_slider (lives_mt *, gint i);
908 
909 
910 // misc
911 void mt_change_disp_tracks_ok (GtkButton *, gpointer user_data);
912 void mt_swap_play_pause (lives_mt *, gboolean put_pause);
913 gchar *set_values_from_defs(lives_mt *, gboolean from_prefs);
914 
915 
916 // clip boxes
917 void mt_clip_select (lives_mt *, gboolean scroll);
918 void mt_delete_clips(lives_mt *, gint file);
919 void mt_init_clips (lives_mt *, gint orig_file, gboolean add);
920 
921 // key shortcuts
922 gboolean mt_prevclip (GtkAccelGroup *group, GObject *obj, guint keyval, GdkModifierType mod, gpointer user_data);
923 gboolean mt_nextclip (GtkAccelGroup *group, GObject *obj, guint keyval, GdkModifierType mod, gpointer user_data);
924 
925 typedef enum {
926  /* default to warn about */
931 
932  /*non-default*/
937 
938  /* info */
941 
942 
943 
944 // array max: TODO - use dynamic arrays to bypass track limits
945 
946 #ifdef IS_MINGW
947 #define MAX_TRACKS 32768
948 #define MAX_VIDEO_TRACKS 32768
949 #define MAX_AUDIO_TRACKS 32768
950 #else
951 #define MAX_TRACKS 65536
952 #define MAX_VIDEO_TRACKS 65536
953 #define MAX_AUDIO_TRACKS 65536
954 #endif
955 
956 #endif