LiVES 1.4.9

src/multitrack.h

Go to the documentation of this file.
00001 // multitrack.h
00002 // LiVES
00003 // (c) G. Finch 2005 - 2010 <salsaman@xs4all.nl,salsaman@gmail.com>
00004 // released under the GNU GPL 3 or later
00005 // see file ../COPYING for licensing details
00006 
00007 // multitrack window
00008 
00009 #ifndef __HAS_MULTITRACK_H__
00010 #define __HAS_MULTITRACK_H__
00011 
00012 #define CLIP_THUMB_WIDTH 72
00013 #define CLIP_THUMB_HEIGHT 72
00014 
00015 #define CLIP_LABEL_LENGTH 20
00016 
00017 #define BLOCK_THUMB_WIDTH 40
00018 
00019 #define BLOCK_DRAW_SIMPLE 1
00020 #define BLOCK_DRAW_THUMB 2
00021 #define BLOCK_DRAW_TYPE BLOCK_DRAW_THUMB
00022 
00023 #define MT_PLAY_WIDTH_SMALL 320
00024 #define MT_PLAY_HEIGHT_SMALL 216
00025 
00026 #define MT_PLAY_WIDTH_EXP 480
00027 #define MT_PLAY_HEIGHT_EXP 360
00028 
00029 #define MT_CTX_WIDTH 320
00030 #define MT_CTX_HEIGHT 220
00031 
00032 #define FX_BLOCK_WIDTH 80
00033 #define FX_BLOCK_HEIGHT 20
00034 
00035 
00036 #define TIMECODE_LENGTH 14 ///< length of timecode text entry, must be >12
00037 
00038 #define DEF_TIME 120 ///< default seconds when there is no event_list
00039 
00040 #define MT_BORDER_WIDTH 20 ///< width border for window
00041 
00042 #define IN_OUT_SEP 10 ///< min pixel separation for in/out images in poly_box (per image) 
00043 
00044 typedef struct _mt lives_mt;
00045 
00046 typedef struct _track_rect track_rect;
00047 
00048 typedef struct _mt_opts mt_opts;
00049 
00050 typedef struct _lives_amixer_t lives_amixer_t;
00051 
00052 #define MAX_DISP_VTRACKS 5
00053 
00054 typedef enum {
00055   MOUSE_MODE_MOVE,
00056   MOUSE_MODE_SELECT,
00057   MOUSE_MODE_COPY
00058 } lives_mt_mouse_mode_t;
00059 
00060 
00061 typedef enum {
00062   INSERT_MODE_NORMAL,  
00063 
00064   // not implemented yet
00065   INSERT_MODE_OVERWRITE, 
00066   INSERT_MODE_EXPAND, 
00067   INSERT_MODE_FILL_START, 
00068   INSERT_MODE_FILL_END 
00069 } lives_mt_insert_mode_t;
00070 
00071 
00072 typedef enum {
00073   GRAV_MODE_NORMAL,
00074   GRAV_MODE_LEFT,
00075   GRAV_MODE_RIGHT
00076 } lives_mt_grav_mode_t;
00077 
00078 
00079 typedef enum {
00080 // undo actions
00082   MT_UNDO_NONE=0,
00083   MT_UNDO_INSERT_BLOCK=1,
00084   MT_UNDO_INSERT_AUDIO_BLOCK=2,
00085 
00086 // minimal event_list
00087   MT_UNDO_APPLY_FILTER=512,
00088   MT_UNDO_DELETE_FILTER=513,
00089   MT_UNDO_SPLIT=514,
00090   MT_UNDO_SPLIT_MULTI=515,
00091   MT_UNDO_FILTER_MAP_CHANGE=516,
00092 
00093 // full backups of event_list
00094   MT_UNDO_DELETE_BLOCK=1024,
00095   MT_UNDO_MOVE_BLOCK=1025,
00096   MT_UNDO_REMOVE_GAPS=1026,
00097   MT_UNDO_DELETE_AUDIO_BLOCK=1027,
00098   MT_UNDO_MOVE_AUDIO_BLOCK=1028,
00099   MT_UNDO_INSERT_GAP=1029
00100 } lives_mt_undo_t;
00101 
00102 
00103 
00104 typedef enum {
00105   NB_ERROR_SEL,
00106   NB_ERROR_NOEFFECT,
00107   NB_ERROR_NOTRANS,
00108   NB_ERROR_NOCOMP,
00109   NB_ERROR_NOCLIP
00110 } lives_mt_nb_error_t;
00111   
00112 
00113 
00114 typedef enum {
00115   POLY_NONE=0,
00116   POLY_CLIPS,
00117   POLY_IN_OUT,
00118   POLY_FX_STACK,
00119   POLY_EFFECTS,
00120   POLY_TRANS,
00121   POLY_COMP,
00122   POLY_PARAMS
00123 } lives_mt_poly_state_t;
00124 
00125 
00126 
00127 typedef enum {
00128   DIRECTION_NEGATIVE,
00129   DIRECTION_POSITIVE
00130 } lives_direction_t;
00131 
00132 
00133 typedef enum {
00134   MT_LAST_FX_NONE=0,
00135   MT_LAST_FX_BLOCK,
00136   MT_LAST_FX_REGION
00137 } lives_mt_last_fx_type_t;
00138 
00139 
00140 typedef enum {
00141   FX_ORD_NONE=0,
00142   FX_ORD_BEFORE,
00143   FX_ORD_AFTER
00144 } lives_mt_fx_order_t;
00145 
00146 
00147 typedef enum {
00148 // block state
00149   BLOCK_UNSELECTED=0,
00150   BLOCK_SELECTED
00151 } lives_mt_block_state_t;
00152 
00153 
00154 
00155 struct _mt_opts {
00156   gboolean set; 
00157   gboolean move_effects; 
00158   gboolean fx_auto_preview;
00159   gboolean snap_over; 
00160   lives_mt_grav_mode_t grav_mode;
00161   lives_mt_mouse_mode_t mouse_mode;
00162   lives_mt_insert_mode_t insert_mode;
00163   gboolean show_audio;
00164   gboolean show_ctx;
00165   gboolean ign_ins_sel;
00166   gboolean follow_playback;
00167   gboolean insert_audio;  
00168   gboolean pertrack_audio; 
00169   gboolean audio_bleedthru; 
00170   gboolean gang_audio; 
00171   gint back_audio_tracks; 
00172 };
00173 
00174 
00175 struct _mt {
00176   // widgets
00177   GtkWidget *window;
00178   GtkWidget *top_vbox;
00179   GtkWidget *hbox;
00180   GtkWidget *play_blank;
00181   GtkWidget *play_box;
00182   GtkWidget *poly_box;
00183   GtkWidget *clip_scroll;
00184   GtkWidget *clip_inner_box;
00185   GtkWidget *in_out_box;
00186   GtkWidget *in_hbox;
00187   GtkWidget *out_hbox;
00188   GtkWidget *in_image;
00189   GtkWidget *out_image;
00190   GtkWidget *context_box;
00191   GtkWidget *sep_image;
00192   GtkWidget *timeline_table_header;
00193   GtkWidget *tl_eventbox;
00194   GtkWidget *timeline_table;
00195   GtkWidget *timeline;
00196   GtkWidget *timeline_eb;
00197   GtkWidget *timeline_reg;
00198   GtkWidget *infobar;
00199   GtkWidget *stop;
00200   GtkWidget *rewind;
00201   GtkWidget *sepwin;
00202   GtkWidget *mute_audio;
00203   GtkWidget *loop_continue;
00204   GtkWidget *insert;
00205   GtkWidget *audio_insert;
00206   GtkWidget *delblock;
00207   GtkWidget *clipedit;
00208   GtkWidget *vpaned;
00209   GtkWidget *hpaned;
00210   GtkWidget *scrollbar;
00211   GtkWidget *playall;
00212   GtkWidget *playsel;
00213   GtkWidget *jumpnext;
00214   GtkWidget *jumpback;
00215   GtkWidget *render;
00216   GtkWidget *prerender_aud;
00217   GtkWidget *fx_block;
00218   GtkWidget *fx_delete;
00219   GtkWidget *fx_edit;
00220   GtkWidget *fx_region;
00221   GtkWidget *fx_region_1;
00222   GtkWidget *fx_region_2;
00223   GtkWidget *fx_region_2av;
00224   GtkWidget *fx_region_2v;
00225   GtkWidget *fx_region_2a;
00226   GtkWidget *fx_region_3;
00227   GtkWidget *atrans_menuitem;
00228   GtkWidget *submenu_atransfx;
00229   GtkWidget *move_fx;
00230   GtkWidget *mm_menuitem;
00231   GtkWidget *mm_move;
00232   GtkWidget *mm_select;
00233   GtkWidget *ins_menuitem;
00234   GtkWidget *ins_normal;
00235   GtkWidget *grav_menuitem;
00236   GtkWidget *grav_normal;
00237   GtkWidget *grav_left;
00238   GtkWidget *grav_right;
00239   GtkWidget *select_track;
00240   GtkWidget *view_events;
00241   GtkWidget *view_clips;
00242   GtkWidget *view_in_out;
00243   GtkWidget *view_effects;
00244   GtkWidget *avel_box;
00245   GtkWidget *checkbutton_avel_reverse;
00246   GtkWidget *spinbutton_avel;
00247   GtkWidget *avel_scale;
00248   GtkWidget *spinbutton_in;
00249   GtkWidget *spinbutton_out;
00250   GtkWidget *checkbutton_start_anchored;
00251   GtkWidget *checkbutton_end_anchored;
00252   GtkWidget *timecode;
00253   GtkWidget *spinbutton_start;
00254   GtkWidget *spinbutton_end;
00255   GtkWidget *tl_hbox;
00256   GtkWidget *fx_base_box;
00257   GtkWidget *fx_contents_box;
00258   GtkWidget *fx_box;
00259   GtkWidget *fx_label;
00260   GtkWidget *param_inner_box;
00261   GtkWidget *param_box;
00262   GtkWidget *next_node_button;
00263   GtkWidget *prev_node_button;
00264   GtkWidget *del_node_button;
00265   GtkWidget *node_spinbutton;
00266   GtkWidget *node_scale;
00267   GtkWidget *sel_label;
00268   GtkWidget *l_sel_arrow;
00269   GtkWidget *r_sel_arrow;
00270   GtkWidget *save_event_list; 
00271   GtkWidget *load_event_list; 
00272   GtkWidget *clear_event_list; 
00273   GtkWidget *tc_to_rs;
00274   GtkWidget *tc_to_re;
00275   GtkWidget *rs_to_tc;
00276   GtkWidget *re_to_tc;
00277   GtkWidget *undo;
00278   GtkWidget *redo;
00279   GtkWidget *remove_gaps;
00280   GtkWidget *remove_first_gaps;
00281   GtkWidget *split_sel;
00282   GtkWidget *ins_gap_sel;
00283   GtkWidget *ins_gap_cur;
00284   GtkWidget *last_filter_map;
00285   GtkWidget *next_filter_map;
00286   GtkWidget *fx_list_box;
00287   GtkWidget *fx_list_scroll;
00288   GtkWidget *fx_list_vbox;
00289   GtkWidget *next_fm_button;
00290   GtkWidget *prev_fm_button;
00291   GtkWidget *fx_ibefore_button;
00292   GtkWidget *fx_iafter_button;
00293   GtkWidget *cback_audio;
00294   GtkWidget *load_vals;
00295   GtkWidget *change_vals;
00296   GtkWidget *aparam_separator;
00297   GtkWidget *aparam_menuitem;
00298   GtkWidget *aparam_submenu;
00299   GtkWidget *render_sep;
00300   GtkWidget *render_vid;
00301   GtkWidget *render_aud;
00302   GtkWidget *view_audio;
00303   GtkWidget *clear_marks;
00304   GtkWidget *fd_frame;
00305   GtkWidget *apply_fx_button;
00306   GtkWidget *eview_button;
00307   GtkWidget *follow_play;
00308   GtkWidget *change_max_disp;
00309   GtkWidget *add_vid_behind;
00310   GtkWidget *add_vid_front;
00311   GtkWidget *quit;
00312   GtkWidget *troubleshoot;
00313   GtkWidget *fx_params_label;
00314   GtkWidget *amixer_button;
00315   GtkWidget *view_sel_events;
00316   GtkWidget *adjust_start_end;
00317   GtkWidget *in_eventbox;
00318   GtkWidget *out_eventbox;
00319   GtkWidget *start_in_label;
00320   GtkWidget *end_out_label;
00321   GtkWidget *context_frame;
00322   GtkWidget *nb;
00323   GtkWidget *nb_label;
00324 
00325   GtkWidget *open_menu;
00326   GtkWidget *recent_menu;
00327   GtkWidget *recent1;
00328   GtkWidget *recent2;
00329   GtkWidget *recent3;
00330   GtkWidget *recent4;
00331 
00332   GtkWidget *time_scrollbar;
00333   GtkWidget *show_layout_errors;
00334 
00335   GtkWidget *load_set;
00336   GtkWidget *save_set;
00337 
00338   GtkWidget *close;
00339 
00340   GtkWidget *clear_ds;
00341 
00342   GtkWidget *gens_submenu;
00343   GtkWidget *capture;
00344 
00345   GtkWidget *insa_eventbox;
00346   GtkWidget *insa_checkbutton;
00347   GtkWidget *snapo_checkbutton;
00348 
00349   GtkObject *spinbutton_in_adj;
00350   GtkObject *spinbutton_out_adj;
00351 
00352   GdkCursor *cursor;
00353 
00354   GtkObject *hadjustment;
00355   GtkObject *node_adj;
00356 
00357   GList *audio_draws; 
00358 
00359   GList *audio_vols; 
00360   GList *audio_vols_back; 
00361 
00362   GtkAccelGroup *accel_group;
00363   GList *video_draws; 
00364   GtkObject *vadjustment;
00365 
00366   GdkDisplay *display;
00367 
00368   GList *aparam_view_list;
00369 
00370   GdkPixbuf *sepwin_pixbuf;
00371 
00372   gulong spin_in_func;
00373   gulong spin_out_func;
00374   gulong spin_avel_func;
00375   gulong check_start_func;
00376   gulong check_end_func;
00377   gulong check_avel_rev_func;
00378 
00379   gulong mm_move_func;
00380   gulong mm_select_func;
00381 
00382   gulong ins_normal_func;
00383 
00384   gulong grav_normal_func;
00385   gulong grav_left_func;
00386   gulong grav_right_func;
00387   
00388   gulong sepwin_func;
00389   gulong mute_audio_func;
00390   gulong loop_cont_func;
00391 
00392   gulong seltrack_func;
00393 
00394   gulong tc_func;
00395 
00396   gulong node_adj_func;
00397 
00398   weed_plant_t *event_list;
00399 
00400   weed_plant_t *init_event;   
00401   weed_plant_t *selected_init_event;  
00402 
00403   gint num_video_tracks;
00404   gdouble end_secs;  
00405 
00406   // timeline min and max display values
00407   gdouble tl_min;
00408   gdouble tl_max;
00409 
00410   gint clip_selected; 
00411   gint file_selected; 
00412   gint current_track; 
00413 
00414   GList *selected_tracks;
00415 
00416   lives_mt_poly_state_t poly_state;  
00417 
00418   gint render_file;
00419 
00420   lives_direction_t last_direction; 
00421 
00422   track_rect *block_selected; 
00423   track_rect *putative_block; 
00424 
00425   gdouble ptr_time; 
00426 
00427   gdouble tl_fixed_length; 
00428 
00429   gdouble fps; 
00430 
00431   gdouble region_start; 
00432   gdouble region_end; 
00433   gdouble region_init; 
00434   gboolean region_updating;
00435 
00436   gboolean is_rendering; 
00437   gboolean pr_audio; 
00438 
00439   gint max_disp_vtracks;
00440   gint current_fx;
00441 
00442   gboolean mt_frame_preview;
00443 
00444   lives_rfx_t *current_rfx;
00445 
00446   gchar layout_name[256];
00447 
00448   // cursor warping for mouse move mode
00449   gdouble hotspot_x;
00450   gint hotspot_y;
00451 
00452   gboolean moving_block; 
00453 
00455 
00456   gint sel_x;
00457   gint sel_y;
00458 
00459   gulong mouse_mot1;
00460   gulong mouse_mot2;
00461 
00462   gboolean tl_selecting; 
00463 
00464   /* start and end offset overrides for inserting (used during block move) */
00465   weed_timecode_t insert_start;
00466   weed_timecode_t insert_end;
00467 
00469   gdouble insert_avel;
00470 
00471   GList *undos;
00472   size_t undo_buffer_used;
00473   unsigned char *undo_mem;
00474   gint undo_offset;
00475   gboolean did_backup;
00476 
00477   gchar undo_text[32];
00478   gchar redo_text[32];
00479 
00480   gboolean undoable;
00481   gboolean redoable;
00482 
00483   gboolean changed; 
00484   gboolean auto_changed; 
00485 
00486   int64_t auto_back_time;
00487 
00488   // stuff to do with framedraw "special" widgets
00489   gint inwidth;
00490   gint inheight;
00491   gint outwidth;
00492   gint outheight;
00493   lives_special_framedraw_rect_t *framedraw;
00494   gint track_index;
00495 
00496   lives_mt_last_fx_type_t last_fx_type;
00497 
00498   lives_mt_fx_order_t fx_order;
00499 
00500   mt_opts opts;
00501 
00502   gboolean auto_reloading;
00503 
00504   weed_plant_t *fm_edit_event;
00505   weed_plant_t *moving_fx;
00506 
00507   int avol_fx; 
00508   weed_plant_t *avol_init_event;
00509 
00510   gulong spin_start_func;
00511   gulong spin_end_func;
00512 
00513   gboolean layout_prompt; 
00514   gboolean layout_set_properties;
00515   gboolean ignore_load_vals;
00516 
00517   gdouble user_fps;
00518   gint user_width;
00519   gint user_height;
00520   gint user_arate;
00521   gint user_achans;
00522   gint user_asamps;
00523   gint user_signed_endian;
00524 
00525   gboolean render_vidp;
00526   gboolean render_audp;
00527 
00528   gint exact_preview;
00529 
00530 
00531   GList *tl_marks;
00532 
00533   weed_plant_t *pb_start_event; 
00534   weed_plant_t *pb_loop_event; 
00535 
00536   weed_plant_t *specific_event; 
00537 
00538   gdouble context_time; 
00539   gboolean use_context;
00540 
00541   gint cursor_style;
00542 
00543   gboolean is_paused;
00544 
00545   /* current size of frame inside playback/preview area */
00546   gint play_width;
00547   gint play_height;
00548 
00549   /* current size of playback/preview area */
00550   gint play_window_width;
00551   gint play_window_height;
00552 
00553   gint selected_filter; 
00554 
00555   gint top_track; 
00556 
00557   gboolean redraw_block; 
00558 
00559   gboolean was_undo_redo;
00560 
00561   gboolean no_expose; 
00562 
00563   gboolean is_ready;
00564 
00565   gboolean aud_track_selected;
00566 
00567   gboolean has_audio_file;
00568 
00569   gboolean tl_mouse;
00570 
00571   gboolean playing_sel; 
00572 
00573   guint idlefunc; 
00574 
00575   GList *clip_labels;
00576 
00577   lives_amixer_t *amixer;
00578 
00579   gdouble prev_fx_time;
00580 
00581   gboolean block_tl_move; 
00582   gboolean block_node_spin; 
00583 
00584   gboolean is_atrans; 
00585 
00586 };  // lives_mt
00587 
00588 
00589 
00590 
00591 typedef struct {
00592   lives_mt_undo_t action;
00593   weed_timecode_t tc;
00594   void *extra;
00595   size_t data_len; 
00596 } mt_undo;
00597 
00598 
00599 struct _lives_amixer_t {
00600   GtkWidget *main_hbox;
00601   GtkWidget **ch_sliders;
00602   GtkWidget *gang_checkbutton;
00603   GtkWidget *inv_checkbutton;
00604   gulong *ch_slider_fns;
00605   gint nchans;
00606   lives_mt *mt;
00607 };
00608 
00609 
00610 // reasons for track invisibility (bitmap)
00611 #define TRACK_I_HIDDEN_USER (1<<0)
00612 #define TRACK_I_HIDDEN_SCROLLED (1<<1)
00613 
00618 struct _track_rect {
00619   track_rect *next;
00620   track_rect *prev;
00621   weed_plant_t *start_event;
00622   weed_plant_t *end_event;
00623 
00624   weed_timecode_t offset_start; 
00625 
00626   lives_mt_block_state_t state;
00627   gboolean start_anchored;
00628   gboolean end_anchored;
00629   gboolean ordered; 
00630   
00631   GtkWidget *eventbox; 
00632 
00633 };
00634 
00635 
00636 /* translation table for matching event_id to init_event */
00637 typedef struct {
00638   void *in;
00639   void *out;
00640 } ttable;
00641 
00642 
00643 /* clip->layout use mapping, from layout.map file */
00644 typedef struct {
00645   gchar *handle;
00646   gint64 unique_id;
00647   gchar *name;
00648   GList *list;
00649 } layout_map;
00650 
00651 
00652 
00653 
00654 
00656 
00657 // setup functions
00658 
00659 lives_mt *multitrack (weed_plant_t *, gint orig_file, gdouble fps); 
00660 void mt_init_tracks (lives_mt *, gboolean set_min_max);  
00661 gboolean on_multitrack_activate (GtkMenuItem *menuitem, weed_plant_t *event_list); 
00662 
00663 // delete function
00664 gboolean multitrack_delete (lives_mt *, gboolean save);
00665 
00666 // morph the poly window
00667 void polymorph (lives_mt *, lives_mt_poly_state_t poly);
00668 
00669 // sens/desens
00670 void mt_desensitise (lives_mt *);
00671 void mt_sensitise (lives_mt *);
00672 
00673 // external control callbacks
00674 void insert_here_cb (GtkMenuItem *, gpointer mt);
00675 void insert_audio_here_cb (GtkMenuItem *, gpointer mt);
00676 void insert_at_ctx_cb (GtkMenuItem *, gpointer mt);
00677 void insert_audio_at_ctx_cb (GtkMenuItem *, gpointer mt);
00678 void multitrack_end_cb (GtkMenuItem *, gpointer mt);
00679 void delete_block_cb (GtkMenuItem *, gpointer mt);
00680 void selblock_cb (GtkMenuItem *, gpointer mt);
00681 void list_fx_here_cb (GtkMenuItem *, gpointer mt);
00682 void edit_start_end_cb (GtkMenuItem *, gpointer mt);
00683 void close_clip_cb (GtkMenuItem *, gpointer mt);
00684 void show_clipinfo_cb (GtkMenuItem *, gpointer mt);
00685 
00686 // menuitem callbacks
00687 void on_add_video_track_activate (GtkMenuItem *, gpointer mt);
00688 void multitrack_insert (GtkMenuItem *, gpointer mt);
00689 void multitrack_adj_start_end (GtkMenuItem *, gpointer mt);
00690 void multitrack_audio_insert (GtkMenuItem *, gpointer mt);
00691 void multitrack_view_events (GtkMenuItem *, gpointer mt);
00692 void multitrack_view_sel_events (GtkMenuItem *, gpointer mt);
00693 void on_render_activate (GtkMenuItem *, gpointer mt);
00694 void on_prerender_aud_activate (GtkMenuItem *, gpointer mt);
00695 void on_jumpnext_activate (GtkMenuItem *, gpointer mt);
00696 void on_jumpback_activate (GtkMenuItem *, gpointer mt);
00697 void on_delblock_activate (GtkMenuItem *, gpointer mt);
00698 void on_seltrack_activate (GtkMenuItem *, gpointer mt);
00699 void multitrack_view_details (GtkMenuItem *, gpointer mt);
00700 void mt_add_region_effect (GtkMenuItem *, gpointer mt);
00701 void mt_add_block_effect (GtkMenuItem *, gpointer mt);
00702 void on_save_event_list_activate (GtkMenuItem *, gpointer mt);
00703 void on_load_event_list_activate (GtkMenuItem *, gpointer mt);
00704 void on_clear_event_list_activate (GtkMenuItem *, gpointer mt);
00705 void show_frame_events_activate (GtkMenuItem *, gpointer);
00706 void mt_save_vals_toggled (GtkMenuItem *, gpointer mt);
00707 void mt_load_vals_toggled (GtkMenuItem *, gpointer mt);
00708 void mt_load_vals_toggled (GtkMenuItem *, gpointer mt);
00709 void mt_render_vid_toggled (GtkMenuItem *, gpointer mt);
00710 void mt_render_aud_toggled (GtkMenuItem *, gpointer mt);
00711 void mt_fplay_toggled (GtkMenuItem *, gpointer mt);
00712 void mt_change_vals_activate (GtkMenuItem *, gpointer mt);
00713 void on_set_pvals_clicked  (GtkWidget *button, gpointer mt);
00714 void on_move_fx_changed (GtkMenuItem *, gpointer mt);
00715 void select_all_time (GtkMenuItem *, gpointer mt);
00716 void select_from_zero_time (GtkMenuItem *, gpointer mt);
00717 void select_to_end_time (GtkMenuItem *, gpointer mt);
00718 void select_all_vid (GtkMenuItem *, gpointer mt);
00719 void select_no_vid (GtkMenuItem *, gpointer mt);
00720 void on_split_sel_activate (GtkMenuItem *, gpointer mt);
00721 void on_split_curr_activate (GtkMenuItem *, gpointer mt);
00722 void multitrack_undo (GtkMenuItem *, gpointer mt);
00723 void multitrack_redo (GtkMenuItem *, gpointer mt);
00724 void on_mt_showkeys_activate (GtkMenuItem *, gpointer);
00725 void on_mt_list_fx_activate (GtkMenuItem *, gpointer mt);
00726 void on_mt_delfx_activate (GtkMenuItem *, gpointer mt);
00727 void on_mt_fx_edit_activate (GtkMenuItem *, gpointer mt);
00728 void mt_view_audio_toggled (GtkMenuItem *, gpointer mt);
00729 void mt_view_ctx_toggled (GtkMenuItem *, gpointer mt);
00730 void mt_ign_ins_sel_toggled (GtkMenuItem *, gpointer mt);
00731 void mt_change_max_disp_tracks (GtkMenuItem *, gpointer mt);
00732 
00733 // event_list functions
00734 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);
00735 
00736 // track functions
00737 void on_cback_audio_activate (GtkMenuItem *, gpointer mt);
00738 GtkWidget *add_audio_track (lives_mt *, gint trackno, gboolean behind);
00739 void add_video_track_behind (GtkMenuItem *, gpointer mt);
00740 void add_video_track_front (GtkMenuItem *, gpointer mt);
00741 void delete_video_track(lives_mt *, gint layer, gboolean full);
00742 void delete_audio_track(lives_mt *, GtkWidget *eventbox, gboolean full);
00743 void delete_audio_tracks(lives_mt *, GList *list, gboolean full);
00744 void remove_gaps (GtkMenuItem *, gpointer mt);
00745 void remove_first_gaps (GtkMenuItem *, gpointer mt);
00746 void on_insgap_sel_activate (GtkMenuItem *, gpointer mt);
00747 void on_insgap_cur_activate (GtkMenuItem *, gpointer mt);
00748 void on_split_activate (GtkMenuItem *, gpointer mt);
00749 void scroll_tracks (lives_mt *, gint top_track);
00750 gboolean track_arrow_pressed (GtkWidget *ahbox, GdkEventButton *, gpointer mt);
00751 void track_select (lives_mt *); 
00752 gboolean mt_track_is_audio(lives_mt *, int ntrack); 
00753 gboolean mt_track_is_video(lives_mt *, int ntrack); 
00754 
00755 void mt_do_autotransition(lives_mt *, track_rect *block); 
00756 
00757 
00758 // track mouse movement
00759 gboolean on_track_click (GtkWidget *eventbox, GdkEventButton *, gpointer mt);
00760 gboolean on_atrack_click (GtkWidget *eventbox, GdkEventButton *, gpointer mt);
00761 gboolean on_track_header_click (GtkWidget *eventbox, GdkEventButton *, gpointer mt);
00762 gboolean on_track_between_click (GtkWidget *eventbox, GdkEventButton *, gpointer mt);
00763 gboolean on_track_release (GtkWidget *eventbox, GdkEventButton *event, gpointer mt);
00764 gboolean on_atrack_release (GtkWidget *eventbox, GdkEventButton *event, gpointer mt);
00765 gboolean on_track_header_release (GtkWidget *eventbox, GdkEventButton *, gpointer mt);
00766 gboolean on_track_between_release (GtkWidget *eventbox, GdkEventButton *, gpointer mt);
00767 gboolean on_track_move (GtkWidget *widget, GdkEventMotion *event, gpointer mt);
00768 gboolean on_track_header_move (GtkWidget *widget, GdkEventMotion *event, gpointer mt);
00769 
00770 void unselect_all (lives_mt *); 
00771 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);
00772 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);
00773 void on_seltrack_toggled (GtkWidget *, gpointer mt);
00774 void scroll_track_by_scrollbar (GtkVScrollbar *sbar, gpointer mt);
00775 
00776 // block functions
00777 void in_out_start_changed (GtkWidget *, gpointer mt);
00778 void in_out_end_changed (GtkWidget *, gpointer mt);
00779 void in_anchor_toggled (GtkToggleButton *, gpointer mt);
00780 void out_anchor_toggled (GtkToggleButton *, gpointer mt);
00781 void avel_reverse_toggled (GtkToggleButton *, gpointer mt);
00782 void avel_spin_changed (GtkSpinButton *, gpointer mt);
00783 
00784 // block API functions
00785 gint mt_get_last_block_number(lives_mt *, int ntrack); 
00786 gint mt_get_block_count(lives_mt *, int ntrack); 
00787 gdouble mt_get_block_sttime(lives_mt *, int ntrack, int iblock); 
00788 gdouble mt_get_block_entime(lives_mt *, int ntrack, int iblock); 
00789 
00790 
00791 // timeline functions
00792 void mt_tl_move(lives_mt *, gdouble pos_rel);
00793 void set_timeline_end_secs (lives_mt *, gdouble secs);
00794 gboolean on_timeline_press (GtkWidget *, GdkEventButton *, gpointer mt);
00795 gboolean on_timeline_release (GtkWidget *, GdkEventButton *, gpointer mt);
00796 gboolean on_timeline_update (GtkWidget *, GdkEventMotion *, gpointer mt);
00797 gint expose_timeline_reg_event (GtkWidget *, GdkEventExpose *, gpointer mt);
00798 gint mt_expose_laudtrack_event (GtkWidget *ebox, GdkEventExpose *, gpointer mt);
00799 gint mt_expose_raudtrack_event (GtkWidget *ebox, GdkEventExpose *, gpointer mt);
00800 void draw_region (lives_mt *mt);
00801 void tc_to_rs (GtkMenuItem *, gpointer mt);
00802 void tc_to_re (GtkMenuItem *, gpointer mt);
00803 void rs_to_tc (GtkMenuItem *, gpointer mt);
00804 void re_to_tc (GtkMenuItem *, gpointer mt);
00805 gboolean mt_mark_callback (GtkAccelGroup *group, GObject *obj, guint keyval, GdkModifierType mod, gpointer user_data);
00806 void multitrack_clear_marks (GtkMenuItem *, gpointer mt);
00807 void mt_show_current_frame(lives_mt *, gboolean return_layer);  
00808 void mt_clear_timeline(lives_mt *mt);
00809 
00810 
00811 // context box text
00812 void clear_context (lives_mt *);
00813 void add_context_label (lives_mt *, const gchar *text);
00814 void mouse_mode_context(lives_mt *);
00815 void do_sel_context (lives_mt *);
00816 void do_fx_list_context (lives_mt *, gint fxcount);
00817 void do_fx_move_context(lives_mt *mt);
00818 
00819 // playback / animation
00820 void multitrack_playall (lives_mt *);
00821 void multitrack_play_sel (GtkMenuItem *, gpointer mt);
00822 void animate_multitrack (lives_mt *);
00823 void unpaint_line(lives_mt *, GtkWidget *eventbox);
00824 void unpaint_lines(lives_mt *);
00825 
00826 void mt_prepare_for_playback(lives_mt *);
00827 void mt_post_playback(lives_mt *);
00828 
00829 
00830 // effect node controls
00831 void on_next_node_clicked  (GtkWidget *, gpointer mt);
00832 void on_prev_node_clicked  (GtkWidget *, gpointer mt);
00833 void on_del_node_clicked  (GtkWidget *, gpointer mt);
00834 void on_node_spin_value_changed (GtkSpinButton *, gpointer mt);
00835 gdouble mt_get_effect_time(lives_mt *);
00836 
00837 void on_frame_preview_clicked (GtkButton *, gpointer mt);
00838 void show_preview (lives_mt *, weed_timecode_t tc);
00839 
00840 // filter list controls
00841 weed_plant_t *get_prev_fm (lives_mt *, gint current_track, weed_plant_t *frame);
00842 weed_plant_t *get_next_fm (lives_mt *, gint current_track, weed_plant_t *frame);
00843 
00844 void on_prev_fm_clicked  (GtkWidget *button, gpointer user_data);
00845 void on_next_fm_clicked  (GtkWidget *button, gpointer user_data);
00846 void on_fx_insb_clicked  (GtkWidget *button, gpointer user_data);
00847 void on_fx_insa_clicked  (GtkWidget *button, gpointer user_data);
00848 
00849 // utils
00850 guint event_list_get_byte_size(lives_mt *mt, weed_plant_t *event_list, int *num_events);  
00851 gboolean event_list_rectify(lives_mt *, weed_plant_t *event_listy);
00852 gboolean make_backup_space (lives_mt *, size_t space_needed);
00853 void activate_mt_preview(lives_mt *); 
00854 void **mt_get_pchain(void);
00855 void event_list_free_undos(lives_mt *);
00856 gboolean used_in_current_layout(lives_mt *, gint file);
00857 
00858 // event_list utilities
00859 gboolean compare_filter_maps(weed_plant_t *fm1, weed_plant_t *fm2, gint ctrack); 
00860 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);
00861 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);
00862 void mt_fixup_events(lives_mt *, weed_plant_t *old_event, weed_plant_t *new_event);
00863 
00864 // event_list load/save
00865 weed_plant_t *load_event_list(lives_mt *, gchar *eload_file);
00866 
00867 
00868 // layouts and layout maps
00869 GList *load_layout_map(void);
00870 void add_markers(lives_mt *, weed_plant_t *event_list);
00871 void remove_markers(weed_plant_t *event_list);
00872 void save_layout_map (int *lmap, double *lmap_audio, const gchar *file, const gchar *dir);
00873 
00874 void wipe_layout(lives_mt *);
00875 
00876 void migrate_layouts (const gchar *old_set_name, const gchar *new_set_name);
00877 
00878 GList *layout_frame_is_affected(gint clipno, gint frame);
00879 GList *layout_audio_is_affected(gint clipno, gdouble time);
00880 
00881 gboolean check_for_layout_del (lives_mt *, gboolean exiting);
00882 
00883 void stored_event_list_free_all(gboolean wiped);
00884 void stored_event_list_free_undos(void);
00885 void remove_current_from_affected_layouts(lives_mt *);
00886 
00887 
00888 // auto backup
00889 guint mt_idle_add(lives_mt *);
00890 void recover_layout(GtkButton *, gpointer);
00891 void recover_layout_cancelled(GtkButton *, gpointer user_data);
00892 void write_backup_layout_numbering(lives_mt *);
00893 
00894 
00895 // internal functions
00896 void mouse_select_end(GtkWidget *, lives_mt *);
00897 
00898 
00899 // amixer funcs
00900 void amixer_show (GtkButton *, gpointer mt);
00901 void on_amixer_close_clicked (GtkButton *, lives_mt *mt);
00902 GtkWidget * amixer_add_channel_slider (lives_mt *, gint i);
00903 
00904 
00905 // misc
00906 void mt_change_disp_tracks_ok (GtkButton *, gpointer user_data);
00907 void mt_swap_play_pause (lives_mt *, gboolean put_pause);
00908 gchar *set_values_from_defs(lives_mt *, gboolean from_prefs);
00909 
00910 
00911 // clip boxes
00912 void mt_clip_select (lives_mt *, gboolean scroll);
00913 void mt_delete_clips(lives_mt *, gint file);
00914 void mt_init_clips (lives_mt *, gint orig_file, gboolean add);
00915 
00916 // key shortcuts
00917 gboolean mt_prevclip (GtkAccelGroup *group, GObject *obj, guint keyval, GdkModifierType mod, gpointer user_data);
00918 gboolean mt_nextclip (GtkAccelGroup *group, GObject *obj, guint keyval, GdkModifierType mod, gpointer user_data);
00919 
00920 typedef enum {
00921   /* default to warn about */
00922   LMAP_ERROR_MISSING_CLIP=1,
00923   LMAP_ERROR_CLOSE_FILE=2,
00924   LMAP_ERROR_DELETE_FRAMES=3,
00925   LMAP_ERROR_DELETE_AUDIO=4,
00926 
00927   /*non-default*/
00928   LMAP_ERROR_SHIFT_FRAMES=65,
00929   LMAP_ERROR_ALTER_FRAMES=66,
00930   LMAP_ERROR_SHIFT_AUDIO=67,
00931   LMAP_ERROR_ALTER_AUDIO=68,
00932 
00933   /* info */
00934   LMAP_INFO_SETNAME_CHANGED=1024
00935 } lives_lmap_error_t;
00936 
00937 #endif
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Defines