Initial commit
[fillmore] / src / marina / marina / track.c
diff --git a/src/marina/marina/track.c b/src/marina/marina/track.c
new file mode 100644 (file)
index 0000000..5ac6967
--- /dev/null
@@ -0,0 +1,2950 @@
+/* track.c generated by valac, the Vala compiler
+ * generated from track.vala, do not modify */
+
+/* Copyright 2009-2010 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later).  See the COPYING file in this distribution. 
+ */
+
+#include <glib.h>
+#include <glib-object.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include <gee.h>
+#include <gdk/gdk.h>
+#include <float.h>
+#include <math.h>
+
+
+#define MODEL_TYPE_TRACK (model_track_get_type ())
+#define MODEL_TRACK(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MODEL_TYPE_TRACK, ModelTrack))
+#define MODEL_TRACK_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), MODEL_TYPE_TRACK, ModelTrackClass))
+#define MODEL_IS_TRACK(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MODEL_TYPE_TRACK))
+#define MODEL_IS_TRACK_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), MODEL_TYPE_TRACK))
+#define MODEL_TRACK_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), MODEL_TYPE_TRACK, ModelTrackClass))
+
+typedef struct _ModelTrack ModelTrack;
+typedef struct _ModelTrackClass ModelTrackClass;
+typedef struct _ModelTrackPrivate ModelTrackPrivate;
+
+#define MODEL_TYPE_MEDIA_TYPE (model_media_type_get_type ())
+
+#define MODEL_TYPE_CLIP (model_clip_get_type ())
+#define MODEL_CLIP(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MODEL_TYPE_CLIP, ModelClip))
+#define MODEL_CLIP_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), MODEL_TYPE_CLIP, ModelClipClass))
+#define MODEL_IS_CLIP(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MODEL_TYPE_CLIP))
+#define MODEL_IS_CLIP_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), MODEL_TYPE_CLIP))
+#define MODEL_CLIP_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), MODEL_TYPE_CLIP, ModelClipClass))
+
+typedef struct _ModelClip ModelClip;
+typedef struct _ModelClipClass ModelClipClass;
+
+#define MODEL_TYPE_PROJECT (model_project_get_type ())
+#define MODEL_PROJECT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MODEL_TYPE_PROJECT, ModelProject))
+#define MODEL_PROJECT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), MODEL_TYPE_PROJECT, ModelProjectClass))
+#define MODEL_IS_PROJECT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MODEL_TYPE_PROJECT))
+#define MODEL_IS_PROJECT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), MODEL_TYPE_PROJECT))
+#define MODEL_PROJECT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), MODEL_TYPE_PROJECT, ModelProjectClass))
+
+typedef struct _ModelProject ModelProject;
+typedef struct _ModelProjectClass ModelProjectClass;
+#define _g_object_unref0(var) ((var == NULL) ? NULL : (var = (g_object_unref (var), NULL)))
+#define _g_free0(var) (var = (g_free (var), NULL))
+typedef struct _ModelClipPrivate ModelClipPrivate;
+
+#define MODEL_TYPE_CLIP_FILE (model_clip_file_get_type ())
+#define MODEL_CLIP_FILE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MODEL_TYPE_CLIP_FILE, ModelClipFile))
+#define MODEL_CLIP_FILE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), MODEL_TYPE_CLIP_FILE, ModelClipFileClass))
+#define MODEL_IS_CLIP_FILE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MODEL_TYPE_CLIP_FILE))
+#define MODEL_IS_CLIP_FILE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), MODEL_TYPE_CLIP_FILE))
+#define MODEL_CLIP_FILE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), MODEL_TYPE_CLIP_FILE, ModelClipFileClass))
+
+typedef struct _ModelClipFile ModelClipFile;
+typedef struct _ModelClipFileClass ModelClipFileClass;
+
+#define MODEL_TYPE_GAP (model_gap_get_type ())
+#define MODEL_GAP(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MODEL_TYPE_GAP, ModelGap))
+#define MODEL_GAP_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), MODEL_TYPE_GAP, ModelGapClass))
+#define MODEL_IS_GAP(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MODEL_TYPE_GAP))
+#define MODEL_IS_GAP_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), MODEL_TYPE_GAP))
+#define MODEL_GAP_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), MODEL_TYPE_GAP, ModelGapClass))
+
+typedef struct _ModelGap ModelGap;
+typedef struct _ModelGapClass ModelGapClass;
+#define _model_gap_unref0(var) ((var == NULL) ? NULL : (var = (model_gap_unref (var), NULL)))
+typedef struct _ModelGapPrivate ModelGapPrivate;
+
+#define MODEL_TYPE_TEMPO_INFORMATION (model_tempo_information_get_type ())
+#define MODEL_TEMPO_INFORMATION(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MODEL_TYPE_TEMPO_INFORMATION, ModelTempoInformation))
+#define MODEL_IS_TEMPO_INFORMATION(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MODEL_TYPE_TEMPO_INFORMATION))
+#define MODEL_TEMPO_INFORMATION_GET_INTERFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), MODEL_TYPE_TEMPO_INFORMATION, ModelTempoInformationIface))
+
+typedef struct _ModelTempoInformation ModelTempoInformation;
+typedef struct _ModelTempoInformationIface ModelTempoInformationIface;
+
+#define TYPE_FRACTION (fraction_get_type ())
+typedef struct _Fraction Fraction;
+typedef struct _ModelProjectPrivate ModelProjectPrivate;
+
+#define TYPE_TIME_CODE (time_code_get_type ())
+typedef struct _TimeCode TimeCode;
+
+#define VIEW_TYPE_MEDIA_ENGINE (view_media_engine_get_type ())
+#define VIEW_MEDIA_ENGINE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), VIEW_TYPE_MEDIA_ENGINE, ViewMediaEngine))
+#define VIEW_MEDIA_ENGINE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), VIEW_TYPE_MEDIA_ENGINE, ViewMediaEngineClass))
+#define VIEW_IS_MEDIA_ENGINE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), VIEW_TYPE_MEDIA_ENGINE))
+#define VIEW_IS_MEDIA_ENGINE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), VIEW_TYPE_MEDIA_ENGINE))
+#define VIEW_MEDIA_ENGINE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), VIEW_TYPE_MEDIA_ENGINE, ViewMediaEngineClass))
+
+typedef struct _ViewMediaEngine ViewMediaEngine;
+typedef struct _ViewMediaEngineClass ViewMediaEngineClass;
+
+#define MODEL_TYPE_PROJECT_LOADER (model_project_loader_get_type ())
+#define MODEL_PROJECT_LOADER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MODEL_TYPE_PROJECT_LOADER, ModelProjectLoader))
+#define MODEL_PROJECT_LOADER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), MODEL_TYPE_PROJECT_LOADER, ModelProjectLoaderClass))
+#define MODEL_IS_PROJECT_LOADER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MODEL_TYPE_PROJECT_LOADER))
+#define MODEL_IS_PROJECT_LOADER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), MODEL_TYPE_PROJECT_LOADER))
+#define MODEL_PROJECT_LOADER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), MODEL_TYPE_PROJECT_LOADER, ModelProjectLoaderClass))
+
+typedef struct _ModelProjectLoader ModelProjectLoader;
+typedef struct _ModelProjectLoaderClass ModelProjectLoaderClass;
+
+#define MODEL_TYPE_UNDO_MANAGER (model_undo_manager_get_type ())
+#define MODEL_UNDO_MANAGER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MODEL_TYPE_UNDO_MANAGER, ModelUndoManager))
+#define MODEL_UNDO_MANAGER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), MODEL_TYPE_UNDO_MANAGER, ModelUndoManagerClass))
+#define MODEL_IS_UNDO_MANAGER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MODEL_TYPE_UNDO_MANAGER))
+#define MODEL_IS_UNDO_MANAGER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), MODEL_TYPE_UNDO_MANAGER))
+#define MODEL_UNDO_MANAGER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), MODEL_TYPE_UNDO_MANAGER, ModelUndoManagerClass))
+
+typedef struct _ModelUndoManager ModelUndoManager;
+typedef struct _ModelUndoManagerClass ModelUndoManagerClass;
+
+#define MODEL_TYPE_LIBRARY_IMPORTER (model_library_importer_get_type ())
+#define MODEL_LIBRARY_IMPORTER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MODEL_TYPE_LIBRARY_IMPORTER, ModelLibraryImporter))
+#define MODEL_LIBRARY_IMPORTER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), MODEL_TYPE_LIBRARY_IMPORTER, ModelLibraryImporterClass))
+#define MODEL_IS_LIBRARY_IMPORTER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MODEL_TYPE_LIBRARY_IMPORTER))
+#define MODEL_IS_LIBRARY_IMPORTER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), MODEL_TYPE_LIBRARY_IMPORTER))
+#define MODEL_LIBRARY_IMPORTER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), MODEL_TYPE_LIBRARY_IMPORTER, ModelLibraryImporterClass))
+
+typedef struct _ModelLibraryImporter ModelLibraryImporter;
+typedef struct _ModelLibraryImporterClass ModelLibraryImporterClass;
+
+#define MODEL_TYPE_COMMAND (model_command_get_type ())
+#define MODEL_COMMAND(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MODEL_TYPE_COMMAND, ModelCommand))
+#define MODEL_COMMAND_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), MODEL_TYPE_COMMAND, ModelCommandClass))
+#define MODEL_IS_COMMAND(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MODEL_TYPE_COMMAND))
+#define MODEL_IS_COMMAND_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), MODEL_TYPE_COMMAND))
+#define MODEL_COMMAND_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), MODEL_TYPE_COMMAND, ModelCommandClass))
+
+typedef struct _ModelCommand ModelCommand;
+typedef struct _ModelCommandClass ModelCommandClass;
+
+#define MODEL_TYPE_CLIP_ADD_COMMAND (model_clip_add_command_get_type ())
+#define MODEL_CLIP_ADD_COMMAND(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MODEL_TYPE_CLIP_ADD_COMMAND, ModelClipAddCommand))
+#define MODEL_CLIP_ADD_COMMAND_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), MODEL_TYPE_CLIP_ADD_COMMAND, ModelClipAddCommandClass))
+#define MODEL_IS_CLIP_ADD_COMMAND(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MODEL_TYPE_CLIP_ADD_COMMAND))
+#define MODEL_IS_CLIP_ADD_COMMAND_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), MODEL_TYPE_CLIP_ADD_COMMAND))
+#define MODEL_CLIP_ADD_COMMAND_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), MODEL_TYPE_CLIP_ADD_COMMAND, ModelClipAddCommandClass))
+
+typedef struct _ModelClipAddCommand ModelClipAddCommand;
+typedef struct _ModelClipAddCommandClass ModelClipAddCommandClass;
+#define _model_command_unref0(var) ((var == NULL) ? NULL : (var = (model_command_unref (var), NULL)))
+
+#define LOGGING_TYPE_FACILITY (logging_facility_get_type ())
+
+#define LOGGING_TYPE_LEVEL (logging_level_get_type ())
+
+#define MODEL_CLIP_COMMAND_TYPE_ACTION (model_clip_command_action_get_type ())
+
+#define MODEL_TYPE_CLIP_COMMAND (model_clip_command_get_type ())
+#define MODEL_CLIP_COMMAND(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MODEL_TYPE_CLIP_COMMAND, ModelClipCommand))
+#define MODEL_CLIP_COMMAND_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), MODEL_TYPE_CLIP_COMMAND, ModelClipCommandClass))
+#define MODEL_IS_CLIP_COMMAND(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MODEL_TYPE_CLIP_COMMAND))
+#define MODEL_IS_CLIP_COMMAND_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), MODEL_TYPE_CLIP_COMMAND))
+#define MODEL_CLIP_COMMAND_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), MODEL_TYPE_CLIP_COMMAND, ModelClipCommandClass))
+
+typedef struct _ModelClipCommand ModelClipCommand;
+typedef struct _ModelClipCommandClass ModelClipCommandClass;
+
+#define MODEL_TYPE_CLIP_REVERT_COMMAND (model_clip_revert_command_get_type ())
+#define MODEL_CLIP_REVERT_COMMAND(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MODEL_TYPE_CLIP_REVERT_COMMAND, ModelClipRevertCommand))
+#define MODEL_CLIP_REVERT_COMMAND_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), MODEL_TYPE_CLIP_REVERT_COMMAND, ModelClipRevertCommandClass))
+#define MODEL_IS_CLIP_REVERT_COMMAND(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MODEL_TYPE_CLIP_REVERT_COMMAND))
+#define MODEL_IS_CLIP_REVERT_COMMAND_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), MODEL_TYPE_CLIP_REVERT_COMMAND))
+#define MODEL_CLIP_REVERT_COMMAND_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), MODEL_TYPE_CLIP_REVERT_COMMAND, ModelClipRevertCommandClass))
+
+typedef struct _ModelClipRevertCommand ModelClipRevertCommand;
+typedef struct _ModelClipRevertCommandClass ModelClipRevertCommandClass;
+
+#define MODEL_CLIP_SPLIT_COMMAND_TYPE_ACTION (model_clip_split_command_action_get_type ())
+
+#define MODEL_TYPE_CLIP_SPLIT_COMMAND (model_clip_split_command_get_type ())
+#define MODEL_CLIP_SPLIT_COMMAND(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MODEL_TYPE_CLIP_SPLIT_COMMAND, ModelClipSplitCommand))
+#define MODEL_CLIP_SPLIT_COMMAND_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), MODEL_TYPE_CLIP_SPLIT_COMMAND, ModelClipSplitCommandClass))
+#define MODEL_IS_CLIP_SPLIT_COMMAND(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MODEL_TYPE_CLIP_SPLIT_COMMAND))
+#define MODEL_IS_CLIP_SPLIT_COMMAND_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), MODEL_TYPE_CLIP_SPLIT_COMMAND))
+#define MODEL_CLIP_SPLIT_COMMAND_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), MODEL_TYPE_CLIP_SPLIT_COMMAND, ModelClipSplitCommandClass))
+
+typedef struct _ModelClipSplitCommand ModelClipSplitCommand;
+typedef struct _ModelClipSplitCommandClass ModelClipSplitCommandClass;
+
+#define MODEL_TYPE_CLIP_TRIM_COMMAND (model_clip_trim_command_get_type ())
+#define MODEL_CLIP_TRIM_COMMAND(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MODEL_TYPE_CLIP_TRIM_COMMAND, ModelClipTrimCommand))
+#define MODEL_CLIP_TRIM_COMMAND_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), MODEL_TYPE_CLIP_TRIM_COMMAND, ModelClipTrimCommandClass))
+#define MODEL_IS_CLIP_TRIM_COMMAND(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MODEL_TYPE_CLIP_TRIM_COMMAND))
+#define MODEL_IS_CLIP_TRIM_COMMAND_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), MODEL_TYPE_CLIP_TRIM_COMMAND))
+#define MODEL_CLIP_TRIM_COMMAND_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), MODEL_TYPE_CLIP_TRIM_COMMAND, ModelClipTrimCommandClass))
+
+typedef struct _ModelClipTrimCommand ModelClipTrimCommand;
+typedef struct _ModelClipTrimCommandClass ModelClipTrimCommandClass;
+
+#define MODEL_TYPE_AUDIO_TRACK (model_audio_track_get_type ())
+#define MODEL_AUDIO_TRACK(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MODEL_TYPE_AUDIO_TRACK, ModelAudioTrack))
+#define MODEL_AUDIO_TRACK_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), MODEL_TYPE_AUDIO_TRACK, ModelAudioTrackClass))
+#define MODEL_IS_AUDIO_TRACK(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MODEL_TYPE_AUDIO_TRACK))
+#define MODEL_IS_AUDIO_TRACK_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), MODEL_TYPE_AUDIO_TRACK))
+#define MODEL_AUDIO_TRACK_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), MODEL_TYPE_AUDIO_TRACK, ModelAudioTrackClass))
+
+typedef struct _ModelAudioTrack ModelAudioTrack;
+typedef struct _ModelAudioTrackClass ModelAudioTrackClass;
+typedef struct _ModelAudioTrackPrivate ModelAudioTrackPrivate;
+
+#define MODEL_TYPE_PARAMETER (model_parameter_get_type ())
+
+#define MODEL_TYPE_PARAMETER_COMMAND (model_parameter_command_get_type ())
+#define MODEL_PARAMETER_COMMAND(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MODEL_TYPE_PARAMETER_COMMAND, ModelParameterCommand))
+#define MODEL_PARAMETER_COMMAND_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), MODEL_TYPE_PARAMETER_COMMAND, ModelParameterCommandClass))
+#define MODEL_IS_PARAMETER_COMMAND(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MODEL_TYPE_PARAMETER_COMMAND))
+#define MODEL_IS_PARAMETER_COMMAND_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), MODEL_TYPE_PARAMETER_COMMAND))
+#define MODEL_PARAMETER_COMMAND_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), MODEL_TYPE_PARAMETER_COMMAND, ModelParameterCommandClass))
+
+typedef struct _ModelParameterCommand ModelParameterCommand;
+typedef struct _ModelParameterCommandClass ModelParameterCommandClass;
+
+typedef enum  {
+       MODEL_MEDIA_TYPE_AUDIO,
+       MODEL_MEDIA_TYPE_VIDEO
+} ModelMediaType;
+
+struct _ModelTrack {
+       GObject parent_instance;
+       ModelTrackPrivate * priv;
+       ModelProject* project;
+       GeeArrayList* clips;
+       char* display_name;
+};
+
+struct _ModelTrackClass {
+       GObjectClass parent_class;
+       char* (*name) (ModelTrack* self);
+       ModelMediaType (*media_type) (ModelTrack* self);
+       gboolean (*check) (ModelTrack* self, ModelClip* clip);
+       void (*on_clip_updated) (ModelTrack* self, ModelClip* clip);
+       void (*write_attributes) (ModelTrack* self, FILE* f);
+};
+
+struct _ModelTrackPrivate {
+       gboolean is_selected;
+};
+
+struct _ModelClip {
+       GObject parent_instance;
+       ModelClipPrivate * priv;
+       ModelClipFile* clipfile;
+       ModelMediaType type;
+       gboolean is_recording;
+       char* name;
+};
+
+struct _ModelClipClass {
+       GObjectClass parent_class;
+};
+
+struct _ModelGap {
+       GTypeInstance parent_instance;
+       volatile int ref_count;
+       ModelGapPrivate * priv;
+       gint64 start;
+       gint64 end;
+};
+
+struct _ModelGapClass {
+       GTypeClass parent_class;
+       void (*finalize) (ModelGap *self);
+};
+
+struct _Fraction {
+       gint numerator;
+       gint denominator;
+};
+
+struct _ModelTempoInformationIface {
+       GTypeInterface parent_iface;
+       void (*get_time_signature) (ModelTempoInformation* self, Fraction* result);
+       gint (*get_bpm) (ModelTempoInformation* self);
+};
+
+struct _TimeCode {
+       gint hour;
+       gint minute;
+       gint second;
+       gint frame;
+       gboolean drop_code;
+};
+
+struct _ModelProject {
+       GObject parent_instance;
+       ModelProjectPrivate * priv;
+       GeeArrayList* tracks;
+       GeeArrayList* inactive_tracks;
+       GeeArrayList* clipfiles;
+       ViewMediaEngine* media_engine;
+       char* project_file;
+       ModelProjectLoader* loader;
+       ModelUndoManager* undo_manager;
+       ModelLibraryImporter* importer;
+       Fraction default_framerate;
+       gboolean click_during_play;
+       gboolean click_during_record;
+       double click_volume;
+       gboolean library_visible;
+       gint library_width;
+       gboolean snap_to_clip;
+};
+
+struct _ModelProjectClass {
+       GObjectClass parent_class;
+       void (*get_clip_time) (ModelProject* self, ModelClipFile* f, TimeCode* result);
+       char* (*get_project_file) (ModelProject* self);
+       void (*do_append) (ModelProject* self, ModelTrack* track, ModelClipFile* clipfile, const char* name, gint64 insert_time);
+       void (*add_track) (ModelProject* self, ModelTrack* track);
+       void (*insert_track) (ModelProject* self, gint index, ModelTrack* track);
+       void (*load) (ModelProject* self, const char* fname);
+       void (*save) (ModelProject* self, const char* filename);
+       char* (*get_app_name) (ModelProject* self);
+       void (*load_complete) (ModelProject* self);
+};
+
+typedef enum  {
+       LOGGING_FACILITY_SIGNAL_HANDLERS,
+       LOGGING_FACILITY_DEVELOPER_WARNINGS,
+       LOGGING_FACILITY_GRAPH,
+       LOGGING_FACILITY_LOADING,
+       LOGGING_FACILITY_IMPORT,
+       LOGGING_FACILITY_SINGLEDECODEBIN
+} LoggingFacility;
+
+typedef enum  {
+       LOGGING_LEVEL_CRITICAL,
+       LOGGING_LEVEL_HIGH,
+       LOGGING_LEVEL_MEDIUM,
+       LOGGING_LEVEL_LOW,
+       LOGGING_LEVEL_INFO,
+       LOGGING_LEVEL_VERBOSE
+} LoggingLevel;
+
+typedef enum  {
+       MODEL_CLIP_COMMAND_ACTION_APPEND,
+       MODEL_CLIP_COMMAND_ACTION_DELETE
+} ModelClipCommandAction;
+
+typedef enum  {
+       MODEL_CLIP_SPLIT_COMMAND_ACTION_SPLIT,
+       MODEL_CLIP_SPLIT_COMMAND_ACTION_JOIN
+} ModelClipSplitCommandAction;
+
+struct _ModelAudioTrack {
+       ModelTrack parent_instance;
+       ModelAudioTrackPrivate * priv;
+};
+
+struct _ModelAudioTrackClass {
+       ModelTrackClass parent_class;
+};
+
+struct _ModelAudioTrackPrivate {
+       double pan;
+       double volume;
+       gint default_num_channels;
+};
+
+typedef enum  {
+       MODEL_PARAMETER_PAN,
+       MODEL_PARAMETER_VOLUME
+} ModelParameter;
+
+
+static gpointer model_track_parent_class = NULL;
+static gpointer model_audio_track_parent_class = NULL;
+
+GType model_track_get_type (void);
+GType model_media_type_get_type (void);
+GType model_clip_get_type (void);
+GType model_project_get_type (void);
+#define MODEL_TRACK_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), MODEL_TYPE_TRACK, ModelTrackPrivate))
+enum  {
+       MODEL_TRACK_DUMMY_PROPERTY
+};
+ModelTrack* model_track_construct (GType object_type, ModelProject* project, const char* display_name);
+char* model_track_name (ModelTrack* self);
+static char* model_track_real_name (ModelTrack* self);
+ModelMediaType model_track_media_type (ModelTrack* self);
+static ModelMediaType model_track_real_media_type (ModelTrack* self);
+void model_track_hide (ModelTrack* self);
+GType model_clip_file_get_type (void);
+gboolean model_track_contains_clipfile (ModelTrack* self, ModelClipFile* f);
+gboolean model_track_check (ModelTrack* self, ModelClip* clip);
+static gboolean model_track_real_check (ModelTrack* self, ModelClip* clip);
+gint64 model_clip_get_start (ModelClip* self);
+gint64 model_clip_get_duration (ModelClip* self);
+gint64 model_track_get_time_from_pos (ModelTrack* self, ModelClip* clip, gboolean after);
+gint64 model_clip_get_end (ModelClip* self);
+static gint model_track_get_clip_from_time (ModelTrack* self, gint64 time);
+gint64 model_clip_snap (ModelClip* self, ModelClip* other, gint64 pad);
+gint64 model_track_snap_clip (ModelTrack* self, ModelClip* c, gint64 span);
+gboolean model_clip_snap_coord (ModelClip* self, gint64* s, gint64 span);
+gboolean model_track_snap_coord (ModelTrack* self, gint64* coord, gint64 span);
+gboolean model_track_clip_is_near (ModelTrack* self, ModelClip* clip, gint64 range, gint64* adjustment);
+static gint model_track_get_insert_index (ModelTrack* self, gint64 time);
+ModelGap* model_gap_new (gint64 start, gint64 end);
+ModelGap* model_gap_construct (GType object_type, gint64 start, gint64 end);
+gpointer model_gap_ref (gpointer instance);
+void model_gap_unref (gpointer instance);
+GParamSpec* model_param_spec_gap (const gchar* name, const gchar* nick, const gchar* blurb, GType object_type, GParamFlags flags);
+void model_value_set_gap (GValue* value, gpointer v_object);
+void model_value_take_gap (GValue* value, gpointer v_object);
+gpointer model_value_get_gap (const GValue* value);
+GType model_gap_get_type (void);
+ModelGap* model_track_find_first_gap (ModelTrack* self, gint64 start);
+static gint model_track_get_gap_index (ModelTrack* self, gint64 time);
+void model_track_find_containing_gap (ModelTrack* self, gint64 time, ModelGap** g);
+gboolean model_clip_overlap_pos (ModelClip* self, gint64 start, gint64 length);
+ModelClip* model_track_find_overlapping_clip (ModelTrack* self, gint64 start, gint64 length);
+ModelClip* model_track_find_nearest_clip_edge (ModelTrack* self, gint64 time, gboolean* after);
+gint64 model_clip_get_media_start (ModelClip* self);
+ModelClip* model_clip_new (ModelClipFile* clipfile, ModelMediaType t, const char* name, gint64 start, gint64 media_start, gint64 duration, gboolean is_recording);
+ModelClip* model_clip_construct (GType object_type, ModelClipFile* clipfile, ModelMediaType t, const char* name, gint64 start, gint64 media_start, gint64 duration, gboolean is_recording);
+void model_track_append_at_time (ModelTrack* self, ModelClip* c, gint64 time, gboolean select);
+void model_track_trim (ModelTrack* self, ModelClip* clip, gint64 delta, GdkWindowEdge edge);
+GType fraction_get_type (void);
+Fraction* fraction_dup (const Fraction* self);
+void fraction_free (Fraction* self);
+GType model_tempo_information_get_type (void);
+GType time_code_get_type (void);
+TimeCode* time_code_dup (const TimeCode* self);
+void time_code_free (TimeCode* self);
+GType view_media_engine_get_type (void);
+GType model_project_loader_get_type (void);
+gpointer model_undo_manager_ref (gpointer instance);
+void model_undo_manager_unref (gpointer instance);
+GParamSpec* model_param_spec_undo_manager (const gchar* name, const gchar* nick, const gchar* blurb, GType object_type, GParamFlags flags);
+void model_value_set_undo_manager (GValue* value, gpointer v_object);
+void model_value_take_undo_manager (GValue* value, gpointer v_object);
+gpointer model_value_get_undo_manager (const GValue* value);
+GType model_undo_manager_get_type (void);
+GType model_library_importer_get_type (void);
+gboolean model_undo_manager_get_in_undo (ModelUndoManager* self);
+void model_track_delete_clip (ModelTrack* self, ModelClip* clip);
+static void model_track_do_clip_overwrite (ModelTrack* self, ModelClip* c);
+ModelClipAddCommand* model_clip_add_command_new (ModelTrack* track, ModelClip* clip, gint64 original_time, gint64 new_start);
+ModelClipAddCommand* model_clip_add_command_construct (GType object_type, ModelTrack* track, ModelClip* clip, gint64 original_time, gint64 new_start);
+gpointer model_command_ref (gpointer instance);
+void model_command_unref (gpointer instance);
+GParamSpec* model_param_spec_command (const gchar* name, const gchar* nick, const gchar* blurb, GType object_type, GParamFlags flags);
+void model_value_set_command (GValue* value, gpointer v_object);
+void model_value_take_command (GValue* value, gpointer v_object);
+gpointer model_value_get_command (const GValue* value);
+GType model_command_get_type (void);
+GType model_clip_add_command_get_type (void);
+void model_project_do_command (ModelProject* self, ModelCommand* the_command);
+void model_track_move (ModelTrack* self, ModelClip* c, gint64 pos, gint64 original_time);
+void model_clip_set_start (ModelClip* self, gint64 value);
+static void model_track_insert_clip_into_array (ModelTrack* self, ModelClip* c, gint pos);
+void model_project_reseek (ModelProject* self);
+void _model_track_move (ModelTrack* self, ModelClip* c, gint64 pos);
+void model_track_add (ModelTrack* self, ModelClip* c, gint64 pos, gboolean select);
+GType logging_facility_get_type (void);
+GType logging_level_get_type (void);
+void logging_emit (GObject* object, LoggingFacility facility, LoggingLevel level, const char* message);
+void model_track_on_clip_updated (ModelTrack* self, ModelClip* clip);
+static void model_track_real_on_clip_updated (ModelTrack* self, ModelClip* clip);
+void model_track_do_clip_paste (ModelTrack* self, ModelClip* clip, gint64 position);
+ModelClip* model_track_get_clip (ModelTrack* self, gint i);
+gint model_track_get_clip_index (ModelTrack* self, ModelClip* c);
+ModelClip* model_track_get_clip_by_position (ModelTrack* self, gint64 pos);
+gint64 model_track_get_length (ModelTrack* self);
+void _model_track_append_at_time (ModelTrack* self, ModelClip* c, gint64 time, gboolean select);
+GType model_clip_command_action_get_type (void);
+ModelClipCommand* model_clip_command_new (ModelClipCommandAction action, ModelTrack* track, ModelClip* clip, gint64 time, gboolean select);
+ModelClipCommand* model_clip_command_construct (GType object_type, ModelClipCommandAction action, ModelTrack* track, ModelClip* clip, gint64 time, gboolean select);
+GType model_clip_command_get_type (void);
+void _model_track_delete_clip (ModelTrack* self, ModelClip* clip);
+void model_track_delete_gap (ModelTrack* self, ModelGap* g);
+void model_track_remove_clip_from_array (ModelTrack* self, ModelClip* pos);
+static void _model_track_on_clip_updated_model_clip_updated (ModelClip* _sender, ModelClip* clip, gpointer self);
+void view_media_engine_go (ViewMediaEngine* self, gint64 pos);
+void model_track_delete_all_clips (ModelTrack* self);
+ModelClipRevertCommand* model_clip_revert_command_new (ModelTrack* track, ModelClip* clip);
+ModelClipRevertCommand* model_clip_revert_command_construct (GType object_type, ModelTrack* track, ModelClip* clip);
+GType model_clip_revert_command_get_type (void);
+void model_track_revert_to_original (ModelTrack* self, ModelClip* clip);
+void model_clip_set_media_start_duration (ModelClip* self, gint64 media_start, gint64 duration);
+gint64 model_clip_file_get_length (ModelClipFile* self);
+void _model_track_revert_to_original (ModelTrack* self, ModelClip* c);
+gboolean model_track_are_contiguous_clips (ModelTrack* self, gint64 position);
+GType model_clip_split_command_action_get_type (void);
+ModelClipSplitCommand* model_clip_split_command_new (ModelClipSplitCommandAction action, ModelTrack* track, gint64 time);
+ModelClipSplitCommand* model_clip_split_command_construct (GType object_type, ModelClipSplitCommandAction action, ModelTrack* track, gint64 time);
+GType model_clip_split_command_get_type (void);
+void model_track_split_at (ModelTrack* self, gint64 position);
+void model_clip_set_duration (ModelClip* self, gint64 value);
+void _model_track_split_at (ModelTrack* self, gint64 position);
+void model_track_join (ModelTrack* self, gint64 position);
+void _model_track_join (ModelTrack* self, gint64 position);
+ModelClipTrimCommand* model_clip_trim_command_new (ModelTrack* track, ModelClip* clip, gint64 delta, GdkWindowEdge edge);
+ModelClipTrimCommand* model_clip_trim_command_construct (GType object_type, ModelTrack* track, ModelClip* clip, gint64 delta, GdkWindowEdge edge);
+GType model_clip_trim_command_get_type (void);
+void model_clip_trim (ModelClip* self, gint64 delta, GdkWindowEdge edge);
+void _model_track_trim (ModelTrack* self, ModelClip* clip, gint64 delta, GdkWindowEdge edge);
+gint64 model_track_previous_edit (ModelTrack* self, gint64 pos);
+gint64 model_track_next_edit (ModelTrack* self, gint64 pos);
+char* model_track_get_display_name (ModelTrack* self);
+void model_track_write_attributes (ModelTrack* self, FILE* f);
+static void model_track_real_write_attributes (ModelTrack* self, FILE* f);
+void model_clip_save (ModelClip* self, FILE* f, gint id);
+gint model_project_get_clipfile_index (ModelProject* self, ModelClipFile* find);
+void model_track_save (ModelTrack* self, FILE* f);
+void model_track_set_display_name (ModelTrack* self, const char* new_display_name);
+void model_track_set_selected (ModelTrack* self, gboolean is_selected);
+gboolean model_track_get_is_selected (ModelTrack* self);
+static void model_track_finalize (GObject* obj);
+GType model_audio_track_get_type (void);
+#define MODEL_AUDIO_TRACK_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), MODEL_TYPE_AUDIO_TRACK, ModelAudioTrackPrivate))
+enum  {
+       MODEL_AUDIO_TRACK_DUMMY_PROPERTY
+};
+#define MODEL_AUDIO_TRACK_INVALID_CHANNEL_COUNT (-1)
+void model_audio_track_set_default_num_channels (ModelAudioTrack* self, gint num);
+void _model_audio_track_set_pan (ModelAudioTrack* self, double new_value);
+void _model_audio_track_set_volume (ModelAudioTrack* self, double new_volume);
+ModelAudioTrack* model_audio_track_new (ModelProject* project, const char* display_name);
+ModelAudioTrack* model_audio_track_construct (GType object_type, ModelProject* project, const char* display_name);
+static char* model_audio_track_real_name (ModelTrack* base);
+static ModelMediaType model_audio_track_real_media_type (ModelTrack* base);
+double model_audio_track_get_volume (ModelAudioTrack* self);
+double model_audio_track_get_pan (ModelAudioTrack* self);
+gboolean model_audio_track_get_num_channels (ModelAudioTrack* self, gint* num);
+static void model_audio_track_real_write_attributes (ModelTrack* base, FILE* f);
+gboolean float_within (double f, double epsilon);
+GType model_parameter_get_type (void);
+ModelParameterCommand* model_parameter_command_new (ModelAudioTrack* target, ModelParameter parameter, double new_value, double old_value);
+ModelParameterCommand* model_parameter_command_construct (GType object_type, ModelAudioTrack* target, ModelParameter parameter, double new_value, double old_value);
+GType model_parameter_command_get_type (void);
+void model_audio_track_set_pan (ModelAudioTrack* self, double new_value);
+void model_audio_track_set_volume (ModelAudioTrack* self, double new_volume);
+gboolean model_clip_file_is_online (ModelClipFile* self);
+gboolean model_clip_file_get_num_channels (ModelClipFile* self, gint* channels);
+static gboolean model_audio_track_real_check (ModelTrack* base, ModelClip* clip);
+void model_audio_track_on_level_changed (ModelAudioTrack* self, double level_left, double level_right);
+static void model_audio_track_real_on_clip_updated (ModelTrack* base, ModelClip* clip);
+static void model_audio_track_finalize (GObject* obj);
+static int _vala_strcmp0 (const char * str1, const char * str2);
+
+
+static void g_cclosure_user_marshal_VOID__OBJECT_BOOLEAN (GClosure * closure, GValue * return_value, guint n_param_values, const GValue * param_values, gpointer invocation_hint, gpointer marshal_data);
+static void g_cclosure_user_marshal_VOID__STRING_STRING (GClosure * closure, GValue * return_value, guint n_param_values, const GValue * param_values, gpointer invocation_hint, gpointer marshal_data);
+static void g_cclosure_user_marshal_VOID__ENUM_DOUBLE (GClosure * closure, GValue * return_value, guint n_param_values, const GValue * param_values, gpointer invocation_hint, gpointer marshal_data);
+static void g_cclosure_user_marshal_VOID__DOUBLE_DOUBLE (GClosure * closure, GValue * return_value, guint n_param_values, const GValue * param_values, gpointer invocation_hint, gpointer marshal_data);
+
+#line 26 "track.vala"
+ModelTrack* model_track_construct (GType object_type, ModelProject* project, const char* display_name) {
+#line 564 "track.c"
+       ModelTrack * self;
+       char* _tmp0_;
+#line 26 "track.vala"
+       g_return_val_if_fail (MODEL_IS_PROJECT (project), NULL);
+#line 26 "track.vala"
+       g_return_val_if_fail (display_name != NULL, NULL);
+#line 26 "track.vala"
+       self = (ModelTrack*) g_object_new (object_type, NULL);
+#line 27 "track.vala"
+       self->project = project;
+#line 28 "track.vala"
+       self->display_name = (_tmp0_ = g_strdup (display_name), _g_free0 (self->display_name), _tmp0_);
+#line 577 "track.c"
+       return self;
+}
+
+
+#line 31 "track.vala"
+static char* model_track_real_name (ModelTrack* self) {
+#line 584 "track.c"
+       g_return_val_if_fail (MODEL_IS_TRACK (self), NULL);
+       g_critical ("Type `%s' does not implement abstract method `model_track_name'", g_type_name (G_TYPE_FROM_INSTANCE (self)));
+       return NULL;
+}
+
+
+#line 31 "track.vala"
+char* model_track_name (ModelTrack* self) {
+#line 31 "track.vala"
+       return MODEL_TRACK_GET_CLASS (self)->name (self);
+#line 595 "track.c"
+}
+
+
+#line 32 "track.vala"
+static ModelMediaType model_track_real_media_type (ModelTrack* self) {
+#line 601 "track.c"
+       g_return_val_if_fail (MODEL_IS_TRACK (self), 0);
+       g_critical ("Type `%s' does not implement abstract method `model_track_media_type'", g_type_name (G_TYPE_FROM_INSTANCE (self)));
+       return 0;
+}
+
+
+#line 32 "track.vala"
+ModelMediaType model_track_media_type (ModelTrack* self) {
+#line 32 "track.vala"
+       return MODEL_TRACK_GET_CLASS (self)->media_type (self);
+#line 612 "track.c"
+}
+
+
+#line 34 "track.vala"
+void model_track_hide (ModelTrack* self) {
+#line 34 "track.vala"
+       g_return_if_fail (MODEL_IS_TRACK (self));
+#line 35 "track.vala"
+       g_signal_emit_by_name (self, "track-hidden", self);
+#line 622 "track.c"
+}
+
+
+#line 38 "track.vala"
+gboolean model_track_contains_clipfile (ModelTrack* self, ModelClipFile* f) {
+#line 628 "track.c"
+       gboolean result = FALSE;
+#line 38 "track.vala"
+       g_return_val_if_fail (MODEL_IS_TRACK (self), FALSE);
+#line 38 "track.vala"
+       g_return_val_if_fail (MODEL_IS_CLIP_FILE (f), FALSE);
+#line 634 "track.c"
+       {
+               GeeIterator* _c_it;
+               _c_it = gee_abstract_collection_iterator (GEE_ABSTRACT_COLLECTION (self->clips));
+#line 39 "track.vala"
+               while (TRUE) {
+#line 640 "track.c"
+                       ModelClip* c;
+#line 39 "track.vala"
+                       if (!gee_iterator_next (_c_it)) {
+#line 39 "track.vala"
+                               break;
+#line 646 "track.c"
+                       }
+#line 39 "track.vala"
+                       c = (ModelClip*) gee_iterator_get (_c_it);
+#line 40 "track.vala"
+                       if (c->clipfile == f) {
+#line 652 "track.c"
+                               result = TRUE;
+                               _g_object_unref0 (c);
+                               _g_object_unref0 (_c_it);
+#line 41 "track.vala"
+                               return result;
+#line 658 "track.c"
+                       }
+                       _g_object_unref0 (c);
+               }
+               _g_object_unref0 (_c_it);
+       }
+       result = FALSE;
+#line 43 "track.vala"
+       return result;
+#line 667 "track.c"
+}
+
+
+#line 46 "track.vala"
+static gboolean model_track_real_check (ModelTrack* self, ModelClip* clip) {
+#line 673 "track.c"
+       g_return_val_if_fail (MODEL_IS_TRACK (self), FALSE);
+       g_critical ("Type `%s' does not implement abstract method `model_track_check'", g_type_name (G_TYPE_FROM_INSTANCE (self)));
+       return FALSE;
+}
+
+
+#line 46 "track.vala"
+gboolean model_track_check (ModelTrack* self, ModelClip* clip) {
+#line 46 "track.vala"
+       return MODEL_TRACK_GET_CLASS (self)->check (self, clip);
+#line 684 "track.c"
+}
+
+
+#line 48 "track.vala"
+gint64 model_track_get_time_from_pos (ModelTrack* self, ModelClip* clip, gboolean after) {
+#line 690 "track.c"
+       gint64 result = 0LL;
+#line 48 "track.vala"
+       g_return_val_if_fail (MODEL_IS_TRACK (self), 0LL);
+#line 48 "track.vala"
+       g_return_val_if_fail (MODEL_IS_CLIP (clip), 0LL);
+#line 49 "track.vala"
+       if (after) {
+#line 698 "track.c"
+               result = model_clip_get_start (clip) + model_clip_get_duration (clip);
+#line 50 "track.vala"
+               return result;
+#line 702 "track.c"
+       } else {
+               result = model_clip_get_start (clip);
+#line 52 "track.vala"
+               return result;
+#line 707 "track.c"
+       }
+}
+
+
+#line 55 "track.vala"
+static gint model_track_get_clip_from_time (ModelTrack* self, gint64 time) {
+#line 714 "track.c"
+       gint result = 0;
+#line 55 "track.vala"
+       g_return_val_if_fail (MODEL_IS_TRACK (self), 0);
+#line 718 "track.c"
+       {
+               gint i;
+#line 56 "track.vala"
+               i = 0;
+#line 723 "track.c"
+               {
+                       gboolean _tmp0_;
+#line 56 "track.vala"
+                       _tmp0_ = TRUE;
+#line 56 "track.vala"
+                       while (TRUE) {
+#line 730 "track.c"
+                               gboolean _tmp1_ = FALSE;
+                               ModelClip* _tmp2_;
+                               gboolean _tmp3_;
+#line 56 "track.vala"
+                               if (!_tmp0_) {
+#line 56 "track.vala"
+                                       i++;
+#line 738 "track.c"
+                               }
+#line 56 "track.vala"
+                               _tmp0_ = FALSE;
+#line 56 "track.vala"
+                               if (!(i < gee_collection_get_size (GEE_COLLECTION (self->clips)))) {
+#line 56 "track.vala"
+                                       break;
+#line 746 "track.c"
+                               }
+#line 57 "track.vala"
+                               if ((_tmp3_ = time >= model_clip_get_start (_tmp2_ = (ModelClip*) gee_abstract_list_get (GEE_ABSTRACT_LIST (self->clips), i)), _g_object_unref0 (_tmp2_), _tmp3_)) {
+#line 750 "track.c"
+                                       ModelClip* _tmp4_;
+#line 58 "track.vala"
+                                       _tmp1_ = time < model_clip_get_end (_tmp4_ = (ModelClip*) gee_abstract_list_get (GEE_ABSTRACT_LIST (self->clips), i));
+#line 754 "track.c"
+                                       _g_object_unref0 (_tmp4_);
+                               } else {
+#line 57 "track.vala"
+                                       _tmp1_ = FALSE;
+#line 759 "track.c"
+                               }
+#line 57 "track.vala"
+                               if (_tmp1_) {
+#line 763 "track.c"
+                                       result = i;
+#line 59 "track.vala"
+                                       return result;
+#line 767 "track.c"
+                               }
+                       }
+               }
+       }
+       result = -1;
+#line 61 "track.vala"
+       return result;
+#line 775 "track.c"
+}
+
+
+#line 64 "track.vala"
+gint64 model_track_snap_clip (ModelTrack* self, ModelClip* c, gint64 span) {
+#line 781 "track.c"
+       gint64 result = 0LL;
+#line 64 "track.vala"
+       g_return_val_if_fail (MODEL_IS_TRACK (self), 0LL);
+#line 64 "track.vala"
+       g_return_val_if_fail (MODEL_IS_CLIP (c), 0LL);
+#line 787 "track.c"
+       {
+               GeeIterator* _cl_it;
+               _cl_it = gee_abstract_collection_iterator (GEE_ABSTRACT_COLLECTION (self->clips));
+#line 65 "track.vala"
+               while (TRUE) {
+#line 793 "track.c"
+                       ModelClip* cl;
+                       gint64 new_start;
+#line 65 "track.vala"
+                       if (!gee_iterator_next (_cl_it)) {
+#line 65 "track.vala"
+                               break;
+#line 800 "track.c"
+                       }
+#line 65 "track.vala"
+                       cl = (ModelClip*) gee_iterator_get (_cl_it);
+#line 66 "track.vala"
+                       new_start = model_clip_snap (c, cl, span);
+#line 67 "track.vala"
+                       if (new_start != model_clip_get_start (c)) {
+#line 808 "track.c"
+                               result = new_start;
+                               _g_object_unref0 (cl);
+                               _g_object_unref0 (_cl_it);
+#line 68 "track.vala"
+                               return result;
+#line 814 "track.c"
+                       }
+                       _g_object_unref0 (cl);
+               }
+               _g_object_unref0 (_cl_it);
+       }
+       result = model_clip_get_start (c);
+#line 71 "track.vala"
+       return result;
+#line 823 "track.c"
+}
+
+
+#line 74 "track.vala"
+gboolean model_track_snap_coord (ModelTrack* self, gint64* coord, gint64 span) {
+#line 829 "track.c"
+       gboolean result = FALSE;
+#line 74 "track.vala"
+       g_return_val_if_fail (MODEL_IS_TRACK (self), FALSE);
+#line 833 "track.c"
+       {
+               GeeIterator* _c_it;
+               _c_it = gee_abstract_collection_iterator (GEE_ABSTRACT_COLLECTION (self->clips));
+#line 75 "track.vala"
+               while (TRUE) {
+#line 839 "track.c"
+                       ModelClip* c;
+#line 75 "track.vala"
+                       if (!gee_iterator_next (_c_it)) {
+#line 75 "track.vala"
+                               break;
+#line 845 "track.c"
+                       }
+#line 75 "track.vala"
+                       c = (ModelClip*) gee_iterator_get (_c_it);
+#line 76 "track.vala"
+                       if (model_clip_snap_coord (c, coord, span)) {
+#line 851 "track.c"
+                               result = TRUE;
+                               _g_object_unref0 (c);
+                               _g_object_unref0 (_c_it);
+#line 77 "track.vala"
+                               return result;
+#line 857 "track.c"
+                       }
+                       _g_object_unref0 (c);
+               }
+               _g_object_unref0 (_c_it);
+       }
+       result = FALSE;
+#line 79 "track.vala"
+       return result;
+#line 866 "track.c"
+}
+
+
+#line 82 "track.vala"
+gboolean model_track_clip_is_near (ModelTrack* self, ModelClip* clip, gint64 range, gint64* adjustment) {
+#line 872 "track.c"
+       gboolean result = FALSE;
+#line 82 "track.vala"
+       g_return_val_if_fail (MODEL_IS_TRACK (self), FALSE);
+#line 82 "track.vala"
+       g_return_val_if_fail (MODEL_IS_CLIP (clip), FALSE);
+#line 878 "track.c"
+       {
+               GeeIterator* _potential_clip_it;
+               _potential_clip_it = gee_abstract_collection_iterator (GEE_ABSTRACT_COLLECTION (self->clips));
+#line 83 "track.vala"
+               while (TRUE) {
+#line 884 "track.c"
+                       ModelClip* potential_clip;
+#line 83 "track.vala"
+                       if (!gee_iterator_next (_potential_clip_it)) {
+#line 83 "track.vala"
+                               break;
+#line 890 "track.c"
+                       }
+#line 83 "track.vala"
+                       potential_clip = (ModelClip*) gee_iterator_get (_potential_clip_it);
+#line 84 "track.vala"
+                       if (potential_clip != clip) {
+#line 896 "track.c"
+                               gint64 difference;
+#line 85 "track.vala"
+                               difference = model_clip_get_start (clip) - model_clip_get_end (potential_clip);
+#line 86 "track.vala"
+                               if (llabs (difference) < range) {
+#line 87 "track.vala"
+                                       *adjustment = -difference;
+#line 904 "track.c"
+                                       result = TRUE;
+                                       _g_object_unref0 (potential_clip);
+                                       _g_object_unref0 (_potential_clip_it);
+#line 88 "track.vala"
+                                       return result;
+#line 910 "track.c"
+                               }
+#line 91 "track.vala"
+                               difference = model_clip_get_start (potential_clip) - model_clip_get_end (clip);
+#line 92 "track.vala"
+                               if (llabs (difference) < range) {
+#line 93 "track.vala"
+                                       *adjustment = difference;
+#line 918 "track.c"
+                                       result = TRUE;
+                                       _g_object_unref0 (potential_clip);
+                                       _g_object_unref0 (_potential_clip_it);
+#line 94 "track.vala"
+                                       return result;
+#line 924 "track.c"
+                               }
+                       }
+                       _g_object_unref0 (potential_clip);
+               }
+               _g_object_unref0 (_potential_clip_it);
+       }
+       result = FALSE;
+#line 98 "track.vala"
+       return result;
+#line 934 "track.c"
+}
+
+
+#line 101 "track.vala"
+static gint model_track_get_insert_index (ModelTrack* self, gint64 time) {
+#line 940 "track.c"
+       gint result = 0;
+       gint end_ret;
+#line 101 "track.vala"
+       g_return_val_if_fail (MODEL_IS_TRACK (self), 0);
+#line 102 "track.vala"
+       end_ret = 0;
+#line 947 "track.c"
+       {
+               gint i;
+#line 103 "track.vala"
+               i = 0;
+#line 952 "track.c"
+               {
+                       gboolean _tmp0_;
+#line 103 "track.vala"
+                       _tmp0_ = TRUE;
+#line 103 "track.vala"
+                       while (TRUE) {
+#line 959 "track.c"
+                               ModelClip* c;
+#line 103 "track.vala"
+                               if (!_tmp0_) {
+#line 103 "track.vala"
+                                       i++;
+#line 965 "track.c"
+                               }
+#line 103 "track.vala"
+                               _tmp0_ = FALSE;
+#line 103 "track.vala"
+                               if (!(i < gee_collection_get_size (GEE_COLLECTION (self->clips)))) {
+#line 103 "track.vala"
+                                       break;
+#line 973 "track.c"
+                               }
+                               c = (ModelClip*) gee_abstract_list_get (GEE_ABSTRACT_LIST (self->clips), i);
+#line 106 "track.vala"
+                               if (time >= model_clip_get_start (c)) {
+#line 107 "track.vala"
+                                       if (time < (model_clip_get_start (c) + (model_clip_get_duration (c) / 2))) {
+#line 980 "track.c"
+                                               result = i;
+                                               _g_object_unref0 (c);
+#line 108 "track.vala"
+                                               return result;
+#line 985 "track.c"
+                                       } else {
+#line 109 "track.vala"
+                                               if (time < (model_clip_get_start (c) + model_clip_get_duration (c))) {
+#line 989 "track.c"
+                                                       result = i + 1;
+                                                       _g_object_unref0 (c);
+#line 110 "track.vala"
+                                                       return result;
+#line 994 "track.c"
+                                               } else {
+#line 112 "track.vala"
+                                                       end_ret++;
+#line 998 "track.c"
+                                               }
+                                       }
+                               }
+                               _g_object_unref0 (c);
+                       }
+               }
+       }
+       result = end_ret;
+#line 115 "track.vala"
+       return result;
+#line 1009 "track.c"
+}
+
+
+#line 119 "track.vala"
+ModelGap* model_track_find_first_gap (ModelTrack* self, gint64 start) {
+#line 1015 "track.c"
+       ModelGap* result = NULL;
+       gint64 new_start;
+       gint64 new_end;
+#line 119 "track.vala"
+       g_return_val_if_fail (MODEL_IS_TRACK (self), NULL);
+#line 120 "track.vala"
+       new_start = (gint64) 0;
+#line 121 "track.vala"
+       new_end = G_MAXINT64;
+#line 1025 "track.c"
+       {
+               GeeIterator* _c_it;
+               _c_it = gee_abstract_collection_iterator (GEE_ABSTRACT_COLLECTION (self->clips));
+#line 123 "track.vala"
+               while (TRUE) {
+#line 1031 "track.c"
+                       ModelClip* c;
+                       gboolean _tmp0_ = FALSE;
+#line 123 "track.vala"
+                       if (!gee_iterator_next (_c_it)) {
+#line 123 "track.vala"
+                               break;
+#line 1038 "track.c"
+                       }
+#line 123 "track.vala"
+                       c = (ModelClip*) gee_iterator_get (_c_it);
+#line 124 "track.vala"
+                       if (model_clip_get_start (c) > new_start) {
+#line 125 "track.vala"
+                               _tmp0_ = model_clip_get_start (c) > start;
+#line 1046 "track.c"
+                       } else {
+#line 124 "track.vala"
+                               _tmp0_ = FALSE;
+#line 1050 "track.c"
+                       }
+#line 124 "track.vala"
+                       if (_tmp0_) {
+#line 126 "track.vala"
+                               new_end = model_clip_get_start (c);
+#line 1056 "track.c"
+                               _g_object_unref0 (c);
+#line 127 "track.vala"
+                               break;
+#line 1060 "track.c"
+                       }
+#line 129 "track.vala"
+                       new_start = model_clip_get_end (c);
+#line 1064 "track.c"
+                       _g_object_unref0 (c);
+               }
+               _g_object_unref0 (_c_it);
+       }
+       result = model_gap_new (new_start, new_end);
+#line 131 "track.vala"
+       return result;
+#line 1072 "track.c"
+}
+
+
+#line 135 "track.vala"
+static gint model_track_get_gap_index (ModelTrack* self, gint64 time) {
+#line 1078 "track.c"
+       gint result = 0;
+       gint i;
+#line 135 "track.vala"
+       g_return_val_if_fail (MODEL_IS_TRACK (self), 0);
+#line 136 "track.vala"
+       i = 0;
+#line 137 "track.vala"
+       while (TRUE) {
+#line 1087 "track.c"
+               ModelClip* _tmp0_;
+               gboolean _tmp1_;
+#line 137 "track.vala"
+               if (!(i < gee_collection_get_size (GEE_COLLECTION (self->clips)))) {
+#line 137 "track.vala"
+                       break;
+#line 1094 "track.c"
+               }
+#line 138 "track.vala"
+               if ((_tmp1_ = time <= model_clip_get_start (_tmp0_ = (ModelClip*) gee_abstract_list_get (GEE_ABSTRACT_LIST (self->clips), i)), _g_object_unref0 (_tmp0_), _tmp1_)) {
+#line 139 "track.vala"
+                       break;
+#line 1100 "track.c"
+               }
+#line 140 "track.vala"
+               i++;
+#line 1104 "track.c"
+       }
+       result = i;
+#line 142 "track.vala"
+       return result;
+#line 1109 "track.c"
+}
+
+
+#line 147 "track.vala"
+void model_track_find_containing_gap (ModelTrack* self, gint64 time, ModelGap** g) {
+#line 1115 "track.c"
+       ModelGap* _tmp0_;
+       gint index;
+#line 147 "track.vala"
+       g_return_if_fail (MODEL_IS_TRACK (self));
+#line 1120 "track.c"
+       if (g != NULL) {
+               *g = NULL;
+       }
+#line 148 "track.vala"
+       *g = (_tmp0_ = model_gap_new ((gint64) 0, (gint64) 0), _model_gap_unref0 (*g), _tmp0_);
+#line 150 "track.vala"
+       index = model_track_get_gap_index (self, time);
+#line 151 "track.vala"
+       if (index < gee_collection_get_size (GEE_COLLECTION (self->clips))) {
+#line 1130 "track.c"
+               gint64 _tmp1_ = 0LL;
+               ModelClip* _tmp3_;
+#line 152 "track.vala"
+               if (index > 0) {
+#line 1135 "track.c"
+                       ModelClip* _tmp2_;
+#line 152 "track.vala"
+                       _tmp1_ = model_clip_get_end (_tmp2_ = (ModelClip*) gee_abstract_list_get (GEE_ABSTRACT_LIST (self->clips), index - 1));
+#line 1139 "track.c"
+                       _g_object_unref0 (_tmp2_);
+               } else {
+#line 152 "track.vala"
+                       _tmp1_ = (gint64) 0;
+#line 1144 "track.c"
+               }
+#line 152 "track.vala"
+               (*g)->start = _tmp1_;
+#line 153 "track.vala"
+               (*g)->end = model_clip_get_start (_tmp3_ = (ModelClip*) gee_abstract_list_get (GEE_ABSTRACT_LIST (self->clips), index));
+#line 1150 "track.c"
+               _g_object_unref0 (_tmp3_);
+       }
+}
+
+
+#line 157 "track.vala"
+ModelClip* model_track_find_overlapping_clip (ModelTrack* self, gint64 start, gint64 length) {
+#line 1158 "track.c"
+       ModelClip* result = NULL;
+#line 157 "track.vala"
+       g_return_val_if_fail (MODEL_IS_TRACK (self), NULL);
+#line 1162 "track.c"
+       {
+               gint i;
+#line 158 "track.vala"
+               i = 0;
+#line 1167 "track.c"
+               {
+                       gboolean _tmp0_;
+#line 158 "track.vala"
+                       _tmp0_ = TRUE;
+#line 158 "track.vala"
+                       while (TRUE) {
+#line 1174 "track.c"
+                               ModelClip* c;
+#line 158 "track.vala"
+                               if (!_tmp0_) {
+#line 158 "track.vala"
+                                       i++;
+#line 1180 "track.c"
+                               }
+#line 158 "track.vala"
+                               _tmp0_ = FALSE;
+#line 158 "track.vala"
+                               if (!(i < gee_collection_get_size (GEE_COLLECTION (self->clips)))) {
+#line 158 "track.vala"
+                                       break;
+#line 1188 "track.c"
+                               }
+                               c = (ModelClip*) gee_abstract_list_get (GEE_ABSTRACT_LIST (self->clips), i);
+#line 160 "track.vala"
+                               if (model_clip_overlap_pos (c, start, length)) {
+#line 1193 "track.c"
+                                       result = c;
+#line 161 "track.vala"
+                                       return result;
+#line 1197 "track.c"
+                               }
+                               _g_object_unref0 (c);
+                       }
+               }
+       }
+       result = NULL;
+#line 163 "track.vala"
+       return result;
+#line 1206 "track.c"
+}
+
+
+#line 166 "track.vala"
+ModelClip* model_track_find_nearest_clip_edge (ModelTrack* self, gint64 time, gboolean* after) {
+#line 1212 "track.c"
+       ModelClip* result = NULL;
+       gint limit;
+       ModelClip* _tmp0_;
+       gint64 _tmp1_;
+       gint64 prev_time;
+#line 166 "track.vala"
+       g_return_val_if_fail (MODEL_IS_TRACK (self), NULL);
+#line 167 "track.vala"
+       limit = gee_collection_get_size (GEE_COLLECTION (self->clips)) * 2;
+#line 168 "track.vala"
+       prev_time = (_tmp1_ = model_clip_get_start (_tmp0_ = (ModelClip*) gee_abstract_list_get (GEE_ABSTRACT_LIST (self->clips), 0)), _g_object_unref0 (_tmp0_), _tmp1_);
+#line 1224 "track.c"
+       {
+               gint i;
+#line 170 "track.vala"
+               i = 1;
+#line 1229 "track.c"
+               {
+                       gboolean _tmp2_;
+#line 170 "track.vala"
+                       _tmp2_ = TRUE;
+#line 170 "track.vala"
+                       while (TRUE) {
+#line 1236 "track.c"
+                               ModelClip* c;
+                               gint64 t = 0LL;
+#line 170 "track.vala"
+                               if (!_tmp2_) {
+#line 170 "track.vala"
+                                       i++;
+#line 1243 "track.c"
+                               }
+#line 170 "track.vala"
+                               _tmp2_ = FALSE;
+#line 170 "track.vala"
+                               if (!(i < limit)) {
+#line 170 "track.vala"
+                                       break;
+#line 1251 "track.c"
+                               }
+                               c = (ModelClip*) gee_abstract_list_get (GEE_ABSTRACT_LIST (self->clips), i / 2);
+#line 174 "track.vala"
+                               if ((i % 2) == 0) {
+#line 175 "track.vala"
+                                       t = model_clip_get_start (c);
+#line 1258 "track.c"
+                               } else {
+#line 177 "track.vala"
+                                       t = model_clip_get_end (c);
+#line 1262 "track.c"
+                               }
+#line 179 "track.vala"
+                               if (t > time) {
+#line 180 "track.vala"
+                                       if ((t - time) < (time - prev_time)) {
+#line 181 "track.vala"
+                                               *after = (i % 2) != 0;
+#line 1270 "track.c"
+                                               result = (ModelClip*) gee_abstract_list_get (GEE_ABSTRACT_LIST (self->clips), i / 2);
+                                               _g_object_unref0 (c);
+#line 182 "track.vala"
+                                               return result;
+#line 1275 "track.c"
+                                       } else {
+#line 184 "track.vala"
+                                               *after = (i % 2) == 0;
+#line 1279 "track.c"
+                                               result = (ModelClip*) gee_abstract_list_get (GEE_ABSTRACT_LIST (self->clips), (i - 1) / 2);
+                                               _g_object_unref0 (c);
+#line 185 "track.vala"
+                                               return result;
+#line 1284 "track.c"
+                                       }
+                               }
+#line 188 "track.vala"
+                               prev_time = t;
+#line 1289 "track.c"
+                               _g_object_unref0 (c);
+                       }
+               }
+       }
+#line 191 "track.vala"
+       *after = TRUE;
+#line 1296 "track.c"
+       result = (ModelClip*) gee_abstract_list_get (GEE_ABSTRACT_LIST (self->clips), gee_collection_get_size (GEE_COLLECTION (self->clips)) - 1);
+#line 192 "track.vala"
+       return result;
+#line 1300 "track.c"
+}
+
+
+#line 195 "track.vala"
+static void model_track_do_clip_overwrite (ModelTrack* self, ModelClip* c) {
+#line 1306 "track.c"
+       gint start_index;
+       gint end_index;
+       gboolean _tmp11_ = FALSE;
+       gint i;
+#line 195 "track.vala"
+       g_return_if_fail (MODEL_IS_TRACK (self));
+#line 195 "track.vala"
+       g_return_if_fail (MODEL_IS_CLIP (c));
+#line 196 "track.vala"
+       start_index = model_track_get_clip_from_time (self, model_clip_get_start (c));
+#line 197 "track.vala"
+       end_index = model_track_get_clip_from_time (self, model_clip_get_end (c));
+#line 199 "track.vala"
+       if (end_index >= 0) {
+#line 1321 "track.c"
+               ModelClip* _tmp0_;
+               gint64 _tmp1_;
+               gint64 diff;
+#line 200 "track.vala"
+               diff = (_tmp1_ = model_clip_get_end (c) - model_clip_get_start (_tmp0_ = (ModelClip*) gee_abstract_list_get (GEE_ABSTRACT_LIST (self->clips), end_index)), _g_object_unref0 (_tmp0_), _tmp1_);
+#line 201 "track.vala"
+               if (end_index == start_index) {
+#line 1329 "track.c"
+                       ModelClip* _tmp2_;
+                       gboolean _tmp3_;
+#line 202 "track.vala"
+                       if ((_tmp3_ = c == (_tmp2_ = (ModelClip*) gee_abstract_list_get (GEE_ABSTRACT_LIST (self->clips), end_index)), _g_object_unref0 (_tmp2_), _tmp3_)) {
+#line 203 "track.vala"
+                               return;
+#line 1336 "track.c"
+                       }
+#line 206 "track.vala"
+                       if (diff > 0) {
+#line 1340 "track.c"
+                               ModelClip* _tmp8_;
+                               ModelClip* _tmp7_;
+                               ModelClip* _tmp6_;
+                               ModelClip* _tmp5_;
+                               ModelClip* _tmp4_;
+                               ModelClip* _tmp9_;
+                               ModelClip* cl;
+#line 207 "track.vala"
+                               cl = (_tmp9_ = model_clip_new ((_tmp4_ = (ModelClip*) gee_abstract_list_get (GEE_ABSTRACT_LIST (self->clips), end_index))->clipfile, (_tmp5_ = (ModelClip*) gee_abstract_list_get (GEE_ABSTRACT_LIST (self->clips), end_index))->type, (_tmp6_ = (ModelClip*) gee_abstract_list_get (GEE_ABSTRACT_LIST (self->clips), end_index))->name, model_clip_get_end (c), model_clip_get_media_start (_tmp7_ = (ModelClip*) gee_abstract_list_get (GEE_ABSTRACT_LIST (self->clips), end_index)) + diff, model_clip_get_duration (_tmp8_ = (ModelClip*) gee_abstract_list_get (GEE_ABSTRACT_LIST (self->clips), end_index)) - diff, FALSE), _g_object_unref0 (_tmp8_), _g_object_unref0 (_tmp7_), _g_object_unref0 (_tmp6_), _g_object_unref0 (_tmp5_), _g_object_unref0 (_tmp4_), _tmp9_);
+#line 211 "track.vala"
+                               model_track_append_at_time (self, cl, model_clip_get_start (cl), FALSE);
+#line 1352 "track.c"
+                               _g_object_unref0 (cl);
+                       }
+               } else {
+                       ModelClip* _tmp10_;
+#line 214 "track.vala"
+                       model_track_trim (self, _tmp10_ = (ModelClip*) gee_abstract_list_get (GEE_ABSTRACT_LIST (self->clips), end_index), diff, GDK_WINDOW_EDGE_WEST);
+#line 1359 "track.c"
+                       _g_object_unref0 (_tmp10_);
+               }
+       }
+#line 217 "track.vala"
+       if (start_index >= 0) {
+#line 1365 "track.c"
+               ModelClip* _tmp12_;
+#line 217 "track.vala"
+               _tmp11_ = (_tmp12_ = (ModelClip*) gee_abstract_list_get (GEE_ABSTRACT_LIST (self->clips), start_index)) != c;
+#line 1369 "track.c"
+               _g_object_unref0 (_tmp12_);
+       } else {
+#line 217 "track.vala"
+               _tmp11_ = FALSE;
+#line 1374 "track.c"
+       }
+#line 217 "track.vala"
+       if (_tmp11_) {
+#line 1378 "track.c"
+               ModelClip* _tmp13_;
+               gint64 _tmp14_;
+               gint64 delta;
+               ModelClip* _tmp15_;
+#line 218 "track.vala"
+               delta = (_tmp14_ = model_clip_get_end (_tmp13_ = (ModelClip*) gee_abstract_list_get (GEE_ABSTRACT_LIST (self->clips), start_index)) - model_clip_get_start (c), _g_object_unref0 (_tmp13_), _tmp14_);
+#line 219 "track.vala"
+               model_track_trim (self, _tmp15_ = (ModelClip*) gee_abstract_list_get (GEE_ABSTRACT_LIST (self->clips), start_index), -delta, GDK_WINDOW_EDGE_EAST);
+#line 1387 "track.c"
+               _g_object_unref0 (_tmp15_);
+       }
+#line 222 "track.vala"
+       i = 0;
+#line 226 "track.vala"
+       if (!model_undo_manager_get_in_undo (self->project->undo_manager)) {
+#line 227 "track.vala"
+               while (TRUE) {
+#line 1396 "track.c"
+                       gboolean _tmp16_ = FALSE;
+                       gboolean _tmp17_ = FALSE;
+                       ModelClip* _tmp18_;
+                       gboolean _tmp19_;
+#line 227 "track.vala"
+                       if (!(i < gee_collection_get_size (GEE_COLLECTION (self->clips)))) {
+#line 227 "track.vala"
+                               break;
+#line 1405 "track.c"
+                       }
+#line 228 "track.vala"
+                       if ((_tmp19_ = (_tmp18_ = (ModelClip*) gee_abstract_list_get (GEE_ABSTRACT_LIST (self->clips), i)) != c, _g_object_unref0 (_tmp18_), _tmp19_)) {
+#line 1409 "track.c"
+                               ModelClip* _tmp20_;
+#line 229 "track.vala"
+                               _tmp17_ = model_clip_get_start (_tmp20_ = (ModelClip*) gee_abstract_list_get (GEE_ABSTRACT_LIST (self->clips), i)) >= model_clip_get_start (c);
+#line 1413 "track.c"
+                               _g_object_unref0 (_tmp20_);
+                       } else {
+#line 228 "track.vala"
+                               _tmp17_ = FALSE;
+#line 1418 "track.c"
+                       }
+#line 228 "track.vala"
+                       if (_tmp17_) {
+#line 1422 "track.c"
+                               ModelClip* _tmp21_;
+#line 230 "track.vala"
+                               _tmp16_ = model_clip_get_end (_tmp21_ = (ModelClip*) gee_abstract_list_get (GEE_ABSTRACT_LIST (self->clips), i)) <= model_clip_get_end (c);
+#line 1426 "track.c"
+                               _g_object_unref0 (_tmp21_);
+                       } else {
+#line 228 "track.vala"
+                               _tmp16_ = FALSE;
+#line 1431 "track.c"
+                       }
+#line 228 "track.vala"
+                       if (_tmp16_) {
+#line 1435 "track.c"
+                               ModelClip* _tmp22_;
+#line 231 "track.vala"
+                               model_track_delete_clip (self, _tmp22_ = (ModelClip*) gee_abstract_list_get (GEE_ABSTRACT_LIST (self->clips), i));
+#line 1439 "track.c"
+                               _g_object_unref0 (_tmp22_);
+                       } else {
+#line 234 "track.vala"
+                               i++;
+#line 1444 "track.c"
+                       }
+               }
+       }
+}
+
+
+#line 239 "track.vala"
+void model_track_move (ModelTrack* self, ModelClip* c, gint64 pos, gint64 original_time) {
+#line 1453 "track.c"
+       ModelCommand* command;
+#line 239 "track.vala"
+       g_return_if_fail (MODEL_IS_TRACK (self));
+#line 239 "track.vala"
+       g_return_if_fail (MODEL_IS_CLIP (c));
+#line 240 "track.vala"
+       command = MODEL_COMMAND (model_clip_add_command_new (self, c, original_time, pos));
+#line 241 "track.vala"
+       model_project_do_command (self->project, command);
+#line 1463 "track.c"
+       _model_command_unref0 (command);
+}
+
+
+#line 244 "track.vala"
+void _model_track_move (ModelTrack* self, ModelClip* c, gint64 pos) {
+#line 244 "track.vala"
+       g_return_if_fail (MODEL_IS_TRACK (self));
+#line 244 "track.vala"
+       g_return_if_fail (MODEL_IS_CLIP (c));
+#line 245 "track.vala"
+       if (pos < 0) {
+#line 246 "track.vala"
+               pos = (gint64) 0;
+#line 1478 "track.c"
+       }
+#line 248 "track.vala"
+       model_clip_set_start (c, pos);
+#line 249 "track.vala"
+       model_track_do_clip_overwrite (self, c);
+#line 251 "track.vala"
+       model_track_insert_clip_into_array (self, c, model_track_get_insert_index (self, model_clip_get_start (c)));
+#line 252 "track.vala"
+       model_project_reseek (self->project);
+#line 1488 "track.c"
+}
+
+
+#line 255 "track.vala"
+void model_track_add (ModelTrack* self, ModelClip* c, gint64 pos, gboolean select) {
+#line 255 "track.vala"
+       g_return_if_fail (MODEL_IS_TRACK (self));
+#line 255 "track.vala"
+       g_return_if_fail (MODEL_IS_CLIP (c));
+#line 256 "track.vala"
+       if (!model_track_check (self, c)) {
+#line 257 "track.vala"
+               return;
+#line 1502 "track.c"
+       }
+#line 259 "track.vala"
+       _model_track_move (self, c, pos);
+#line 260 "track.vala"
+       g_signal_emit_by_name (self, "clip-added", c, select);
+#line 1508 "track.c"
+}
+
+
+#line 263 "track.vala"
+static void model_track_real_on_clip_updated (ModelTrack* self, ModelClip* clip) {
+#line 263 "track.vala"
+       g_return_if_fail (MODEL_IS_TRACK (self));
+#line 263 "track.vala"
+       g_return_if_fail (MODEL_IS_CLIP (clip));
+#line 264 "track.vala"
+       logging_emit (G_OBJECT (self), LOGGING_FACILITY_SIGNAL_HANDLERS, LOGGING_LEVEL_INFO, "on_clip_updated");
+#line 1520 "track.c"
+}
+
+
+#line 263 "track.vala"
+void model_track_on_clip_updated (ModelTrack* self, ModelClip* clip) {
+#line 263 "track.vala"
+       MODEL_TRACK_GET_CLASS (self)->on_clip_updated (self, clip);
+#line 1528 "track.c"
+}
+
+
+#line 267 "track.vala"
+void model_track_do_clip_paste (ModelTrack* self, ModelClip* clip, gint64 position) {
+#line 267 "track.vala"
+       g_return_if_fail (MODEL_IS_TRACK (self));
+#line 267 "track.vala"
+       g_return_if_fail (MODEL_IS_CLIP (clip));
+#line 268 "track.vala"
+       model_track_append_at_time (self, clip, position, TRUE);
+#line 1540 "track.c"
+}
+
+
+#line 271 "track.vala"
+ModelClip* model_track_get_clip (ModelTrack* self, gint i) {
+#line 1546 "track.c"
+       ModelClip* result = NULL;
+       gboolean _tmp0_ = FALSE;
+#line 271 "track.vala"
+       g_return_val_if_fail (MODEL_IS_TRACK (self), NULL);
+#line 272 "track.vala"
+       if (i < 0) {
+#line 272 "track.vala"
+               _tmp0_ = TRUE;
+#line 1555 "track.c"
+       } else {
+#line 272 "track.vala"
+               _tmp0_ = i >= gee_collection_get_size (GEE_COLLECTION (self->clips));
+#line 1559 "track.c"
+       }
+#line 272 "track.vala"
+       if (_tmp0_) {
+#line 273 "track.vala"
+               g_error ("track.vala:273: get_clip: Invalid index! %d (%d)", i, gee_collection_get_size (GEE_COLLECTION (self->clips)));
+#line 1565 "track.c"
+       }
+       result = (ModelClip*) gee_abstract_list_get (GEE_ABSTRACT_LIST (self->clips), i);
+#line 274 "track.vala"
+       return result;
+#line 1570 "track.c"
+}
+
+
+#line 277 "track.vala"
+gint model_track_get_clip_index (ModelTrack* self, ModelClip* c) {
+#line 1576 "track.c"
+       gint result = 0;
+#line 277 "track.vala"
+       g_return_val_if_fail (MODEL_IS_TRACK (self), 0);
+#line 277 "track.vala"
+       g_return_val_if_fail (MODEL_IS_CLIP (c), 0);
+#line 1582 "track.c"
+       {
+               gint i;
+#line 278 "track.vala"
+               i = 0;
+#line 1587 "track.c"
+               {
+                       gboolean _tmp0_;
+#line 278 "track.vala"
+                       _tmp0_ = TRUE;
+#line 278 "track.vala"
+                       while (TRUE) {
+#line 1594 "track.c"
+                               ModelClip* _tmp1_;
+                               gboolean _tmp2_;
+#line 278 "track.vala"
+                               if (!_tmp0_) {
+#line 278 "track.vala"
+                                       i++;
+#line 1601 "track.c"
+                               }
+#line 278 "track.vala"
+                               _tmp0_ = FALSE;
+#line 278 "track.vala"
+                               if (!(i < gee_collection_get_size (GEE_COLLECTION (self->clips)))) {
+#line 278 "track.vala"
+                                       break;
+#line 1609 "track.c"
+                               }
+#line 279 "track.vala"
+                               if ((_tmp2_ = (_tmp1_ = (ModelClip*) gee_abstract_list_get (GEE_ABSTRACT_LIST (self->clips), i)) == c, _g_object_unref0 (_tmp1_), _tmp2_)) {
+#line 1613 "track.c"
+                                       result = i;
+#line 280 "track.vala"
+                                       return result;
+#line 1617 "track.c"
+                               }
+                       }
+               }
+       }
+       result = -1;
+#line 283 "track.vala"
+       return result;
+#line 1625 "track.c"
+}
+
+
+#line 286 "track.vala"
+ModelClip* model_track_get_clip_by_position (ModelTrack* self, gint64 pos) {
+#line 1631 "track.c"
+       ModelClip* result = NULL;
+       gint length;
+#line 286 "track.vala"
+       g_return_val_if_fail (MODEL_IS_TRACK (self), NULL);
+#line 287 "track.vala"
+       length = gee_collection_get_size (GEE_COLLECTION (self->clips));
+#line 1638 "track.c"
+       {
+               gint i;
+#line 289 "track.vala"
+               i = length - 1;
+#line 1643 "track.c"
+               {
+                       gboolean _tmp0_;
+#line 289 "track.vala"
+                       _tmp0_ = TRUE;
+#line 289 "track.vala"
+                       while (TRUE) {
+#line 1650 "track.c"
+                               ModelClip* _tmp1_;
+                               gboolean _tmp2_;
+#line 289 "track.vala"
+                               if (!_tmp0_) {
+#line 289 "track.vala"
+                                       i--;
+#line 1657 "track.c"
+                               }
+#line 289 "track.vala"
+                               _tmp0_ = FALSE;
+#line 289 "track.vala"
+                               if (!(i >= 0)) {
+#line 289 "track.vala"
+                                       break;
+#line 1665 "track.c"
+                               }
+#line 290 "track.vala"
+                               if ((_tmp2_ = model_clip_get_start (_tmp1_ = (ModelClip*) gee_abstract_list_get (GEE_ABSTRACT_LIST (self->clips), i)) < pos, _g_object_unref0 (_tmp1_), _tmp2_)) {
+#line 1669 "track.c"
+                                       ModelClip* _tmp3_;
+                                       ModelClip* _tmp4_;
+                                       gboolean _tmp5_;
+                                       _tmp3_ = NULL;
+#line 291 "track.vala"
+                                       if ((_tmp5_ = pos >= model_clip_get_end (_tmp4_ = (ModelClip*) gee_abstract_list_get (GEE_ABSTRACT_LIST (self->clips), i)), _g_object_unref0 (_tmp4_), _tmp5_)) {
+#line 1676 "track.c"
+                                               ModelClip* _tmp6_;
+#line 291 "track.vala"
+                                               _tmp3_ = (_tmp6_ = NULL, _g_object_unref0 (_tmp3_), _tmp6_);
+#line 1680 "track.c"
+                                       } else {
+                                               ModelClip* _tmp7_;
+                                               _tmp3_ = (_tmp7_ = (ModelClip*) gee_abstract_list_get (GEE_ABSTRACT_LIST (self->clips), i), _g_object_unref0 (_tmp3_), _tmp7_);
+                                       }
+                                       result = _tmp3_;
+#line 291 "track.vala"
+                                       return result;
+#line 1688 "track.c"
+                               }
+                       }
+               }
+       }
+       result = NULL;
+#line 292 "track.vala"
+       return result;
+#line 1696 "track.c"
+}
+
+
+#line 295 "track.vala"
+gint64 model_track_get_length (ModelTrack* self) {
+#line 1702 "track.c"
+       gint64 result = 0LL;
+       gint64 _tmp0_ = 0LL;
+#line 295 "track.vala"
+       g_return_val_if_fail (MODEL_IS_TRACK (self), 0LL);
+#line 296 "track.vala"
+       if (gee_collection_get_size (GEE_COLLECTION (self->clips)) == 0) {
+#line 296 "track.vala"
+               _tmp0_ = (gint64) 0;
+#line 1711 "track.c"
+       } else {
+               ModelClip* _tmp2_;
+               ModelClip* _tmp1_;
+#line 296 "track.vala"
+               _tmp0_ = model_clip_get_start (_tmp1_ = (ModelClip*) gee_abstract_list_get (GEE_ABSTRACT_LIST (self->clips), gee_collection_get_size (GEE_COLLECTION (self->clips)) - 1)) + model_clip_get_duration (_tmp2_ = (ModelClip*) gee_abstract_list_get (GEE_ABSTRACT_LIST (self->clips), gee_collection_get_size (GEE_COLLECTION (self->clips)) - 1));
+#line 1717 "track.c"
+               _g_object_unref0 (_tmp2_);
+               _g_object_unref0 (_tmp1_);
+       }
+       result = _tmp0_;
+#line 296 "track.vala"
+       return result;
+#line 1724 "track.c"
+}
+
+
+#line 299 "track.vala"
+void _model_track_append_at_time (ModelTrack* self, ModelClip* c, gint64 time, gboolean select) {
+#line 299 "track.vala"
+       g_return_if_fail (MODEL_IS_TRACK (self));
+#line 299 "track.vala"
+       g_return_if_fail (MODEL_IS_CLIP (c));
+#line 300 "track.vala"
+       model_track_add (self, c, time, select);
+#line 1736 "track.c"
+}
+
+
+#line 303 "track.vala"
+void model_track_append_at_time (ModelTrack* self, ModelClip* c, gint64 time, gboolean select) {
+#line 1742 "track.c"
+       ModelCommand* command;
+#line 303 "track.vala"
+       g_return_if_fail (MODEL_IS_TRACK (self));
+#line 303 "track.vala"
+       g_return_if_fail (MODEL_IS_CLIP (c));
+#line 304 "track.vala"
+       command = MODEL_COMMAND (model_clip_command_new (MODEL_CLIP_COMMAND_ACTION_APPEND, self, c, time, select));
+#line 305 "track.vala"
+       model_project_do_command (self->project, command);
+#line 1752 "track.c"
+       _model_command_unref0 (command);
+}
+
+
+#line 308 "track.vala"
+void model_track_delete_clip (ModelTrack* self, ModelClip* clip) {
+#line 1759 "track.c"
+       ModelCommand* clip_command;
+#line 308 "track.vala"
+       g_return_if_fail (MODEL_IS_TRACK (self));
+#line 308 "track.vala"
+       g_return_if_fail (MODEL_IS_CLIP (clip));
+#line 309 "track.vala"
+       clip_command = MODEL_COMMAND (model_clip_command_new (MODEL_CLIP_COMMAND_ACTION_DELETE, self, clip, model_clip_get_start (clip), FALSE));
+#line 311 "track.vala"
+       model_project_do_command (self->project, clip_command);
+#line 1769 "track.c"
+       _model_command_unref0 (clip_command);
+}
+
+
+#line 314 "track.vala"
+void _model_track_delete_clip (ModelTrack* self, ModelClip* clip) {
+#line 1776 "track.c"
+       gint index;
+       ModelClip* _tmp0_;
+#line 314 "track.vala"
+       g_return_if_fail (MODEL_IS_TRACK (self));
+#line 314 "track.vala"
+       g_return_if_fail (MODEL_IS_CLIP (clip));
+#line 315 "track.vala"
+       index = model_track_get_clip_index (self, clip);
+#line 316 "track.vala"
+       g_assert (index != (-1));
+#line 317 "track.vala"
+       _tmp0_ = (ModelClip*) gee_abstract_list_remove_at (GEE_ABSTRACT_LIST (self->clips), index);
+#line 1789 "track.c"
+       _g_object_unref0 (_tmp0_);
+#line 319 "track.vala"
+       g_signal_emit_by_name (clip, "removed", clip);
+#line 320 "track.vala"
+       g_signal_emit_by_name (self, "clip-removed", clip);
+#line 1795 "track.c"
+}
+
+
+#line 323 "track.vala"
+void model_track_delete_gap (ModelTrack* self, ModelGap* g) {
+#line 323 "track.vala"
+       g_return_if_fail (MODEL_IS_TRACK (self));
+#line 323 "track.vala"
+       g_return_if_fail (MODEL_IS_GAP (g));
+#line 324 "track.vala"
+       model_project_reseek (self->project);
+#line 1807 "track.c"
+}
+
+
+#line 327 "track.vala"
+void model_track_remove_clip_from_array (ModelTrack* self, ModelClip* pos) {
+#line 327 "track.vala"
+       g_return_if_fail (MODEL_IS_TRACK (self));
+#line 327 "track.vala"
+       g_return_if_fail (MODEL_IS_CLIP (pos));
+#line 328 "track.vala"
+       gee_abstract_collection_remove (GEE_ABSTRACT_COLLECTION (self->clips), pos);
+#line 1819 "track.c"
+}
+
+
+#line 263 "track.vala"
+static void _model_track_on_clip_updated_model_clip_updated (ModelClip* _sender, ModelClip* clip, gpointer self) {
+#line 1825 "track.c"
+       model_track_on_clip_updated (self, clip);
+}
+
+
+#line 331 "track.vala"
+static void model_track_insert_clip_into_array (ModelTrack* self, ModelClip* c, gint pos) {
+#line 331 "track.vala"
+       g_return_if_fail (MODEL_IS_TRACK (self));
+#line 331 "track.vala"
+       g_return_if_fail (MODEL_IS_CLIP (c));
+#line 332 "track.vala"
+       g_signal_connect_object (c, "updated", (GCallback) _model_track_on_clip_updated_model_clip_updated, self, 0);
+#line 333 "track.vala"
+       gee_abstract_list_insert (GEE_ABSTRACT_LIST (self->clips), pos, c);
+#line 1840 "track.c"
+}
+
+
+#line 336 "track.vala"
+void model_track_delete_all_clips (ModelTrack* self) {
+#line 1846 "track.c"
+       guint size;
+#line 336 "track.vala"
+       g_return_if_fail (MODEL_IS_TRACK (self));
+#line 337 "track.vala"
+       size = (guint) gee_collection_get_size (GEE_COLLECTION (self->clips));
+#line 1852 "track.c"
+       {
+               gint i;
+#line 338 "track.vala"
+               i = 0;
+#line 1857 "track.c"
+               {
+                       gboolean _tmp0_;
+#line 338 "track.vala"
+                       _tmp0_ = TRUE;
+#line 338 "track.vala"
+                       while (TRUE) {
+#line 1864 "track.c"
+                               ModelClip* _tmp1_;
+#line 338 "track.vala"
+                               if (!_tmp0_) {
+#line 338 "track.vala"
+                                       i++;
+#line 1870 "track.c"
+                               }
+#line 338 "track.vala"
+                               _tmp0_ = FALSE;
+#line 338 "track.vala"
+                               if (!(i < size)) {
+#line 338 "track.vala"
+                                       break;
+#line 1878 "track.c"
+                               }
+#line 339 "track.vala"
+                               model_track_delete_clip (self, _tmp1_ = (ModelClip*) gee_abstract_list_get (GEE_ABSTRACT_LIST (self->clips), 0));
+#line 1882 "track.c"
+                               _g_object_unref0 (_tmp1_);
+                       }
+               }
+       }
+#line 341 "track.vala"
+       view_media_engine_go (self->project->media_engine, (gint64) 0);
+#line 1889 "track.c"
+}
+
+
+#line 344 "track.vala"
+void model_track_revert_to_original (ModelTrack* self, ModelClip* clip) {
+#line 1895 "track.c"
+       ModelCommand* command;
+#line 344 "track.vala"
+       g_return_if_fail (MODEL_IS_TRACK (self));
+#line 344 "track.vala"
+       g_return_if_fail (MODEL_IS_CLIP (clip));
+#line 345 "track.vala"
+       command = MODEL_COMMAND (model_clip_revert_command_new (self, clip));
+#line 346 "track.vala"
+       model_project_do_command (self->project, command);
+#line 1905 "track.c"
+       _model_command_unref0 (command);
+}
+
+
+#line 349 "track.vala"
+void _model_track_revert_to_original (ModelTrack* self, ModelClip* c) {
+#line 1912 "track.c"
+       gint index;
+#line 349 "track.vala"
+       g_return_if_fail (MODEL_IS_TRACK (self));
+#line 349 "track.vala"
+       g_return_if_fail (MODEL_IS_CLIP (c));
+#line 350 "track.vala"
+       index = model_track_get_clip_index (self, c);
+#line 351 "track.vala"
+       if (index == (-1)) {
+#line 352 "track.vala"
+               g_error ("track.vala:352: revert_to_original: Clip not in track array!");
+#line 1924 "track.c"
+       }
+#line 354 "track.vala"
+       model_clip_set_media_start_duration (c, (gint64) 0, model_clip_file_get_length (c->clipfile));
+#line 356 "track.vala"
+       view_media_engine_go (self->project->media_engine, model_clip_get_start (c));
+#line 1930 "track.c"
+}
+
+
+#line 359 "track.vala"
+gboolean model_track_are_contiguous_clips (ModelTrack* self, gint64 position) {
+#line 1936 "track.c"
+       gboolean result = FALSE;
+       ModelClip* right_clip;
+       ModelClip* left_clip;
+       gboolean _tmp0_ = FALSE;
+       gboolean _tmp1_ = FALSE;
+       gboolean _tmp2_ = FALSE;
+       gboolean _tmp3_ = FALSE;
+#line 359 "track.vala"
+       g_return_val_if_fail (MODEL_IS_TRACK (self), FALSE);
+#line 360 "track.vala"
+       right_clip = model_track_get_clip_by_position (self, position + 1);
+#line 361 "track.vala"
+       left_clip = model_track_get_clip_by_position (self, position - 1);
+#line 363 "track.vala"
+       if (left_clip != NULL) {
+#line 363 "track.vala"
+               _tmp3_ = right_clip != NULL;
+#line 1954 "track.c"
+       } else {
+#line 363 "track.vala"
+               _tmp3_ = FALSE;
+#line 1958 "track.c"
+       }
+#line 363 "track.vala"
+       if (_tmp3_) {
+#line 364 "track.vala"
+               _tmp2_ = left_clip != right_clip;
+#line 1964 "track.c"
+       } else {
+#line 363 "track.vala"
+               _tmp2_ = FALSE;
+#line 1968 "track.c"
+       }
+#line 363 "track.vala"
+       if (_tmp2_) {
+#line 365 "track.vala"
+               _tmp1_ = left_clip->clipfile == right_clip->clipfile;
+#line 1974 "track.c"
+       } else {
+#line 363 "track.vala"
+               _tmp1_ = FALSE;
+#line 1978 "track.c"
+       }
+#line 363 "track.vala"
+       if (_tmp1_) {
+#line 366 "track.vala"
+               _tmp0_ = model_clip_get_end (left_clip) == model_clip_get_start (right_clip);
+#line 1984 "track.c"
+       } else {
+#line 363 "track.vala"
+               _tmp0_ = FALSE;
+#line 1988 "track.c"
+       }
+       result = _tmp0_;
+       _g_object_unref0 (right_clip);
+       _g_object_unref0 (left_clip);
+#line 363 "track.vala"
+       return result;
+#line 1995 "track.c"
+}
+
+
+#line 369 "track.vala"
+void model_track_split_at (ModelTrack* self, gint64 position) {
+#line 2001 "track.c"
+       ModelCommand* command;
+#line 369 "track.vala"
+       g_return_if_fail (MODEL_IS_TRACK (self));
+#line 370 "track.vala"
+       command = MODEL_COMMAND (model_clip_split_command_new (MODEL_CLIP_SPLIT_COMMAND_ACTION_SPLIT, self, position));
+#line 371 "track.vala"
+       model_project_do_command (self->project, command);
+#line 2009 "track.c"
+       _model_command_unref0 (command);
+}
+
+
+#line 374 "track.vala"
+void _model_track_split_at (ModelTrack* self, gint64 position) {
+#line 2016 "track.c"
+       ModelClip* c;
+       ModelClip* cn;
+#line 374 "track.vala"
+       g_return_if_fail (MODEL_IS_TRACK (self));
+#line 375 "track.vala"
+       c = model_track_get_clip_by_position (self, position);
+#line 376 "track.vala"
+       if (c == NULL) {
+#line 2025 "track.c"
+               _g_object_unref0 (c);
+#line 377 "track.vala"
+               return;
+#line 2029 "track.c"
+       }
+#line 379 "track.vala"
+       cn = model_clip_new (c->clipfile, c->type, c->name, position, (position - model_clip_get_start (c)) + model_clip_get_media_start (c), (model_clip_get_start (c) + model_clip_get_duration (c)) - position, FALSE);
+#line 383 "track.vala"
+       model_clip_set_duration (c, position - model_clip_get_start (c));
+#line 385 "track.vala"
+       model_track_add (self, cn, position, FALSE);
+#line 2037 "track.c"
+       _g_object_unref0 (c);
+       _g_object_unref0 (cn);
+}
+
+
+#line 388 "track.vala"
+void model_track_join (ModelTrack* self, gint64 position) {
+#line 2045 "track.c"
+       ModelCommand* command;
+#line 388 "track.vala"
+       g_return_if_fail (MODEL_IS_TRACK (self));
+#line 389 "track.vala"
+       command = MODEL_COMMAND (model_clip_split_command_new (MODEL_CLIP_SPLIT_COMMAND_ACTION_JOIN, self, position));
+#line 390 "track.vala"
+       model_project_do_command (self->project, command);
+#line 2053 "track.c"
+       _model_command_unref0 (command);
+}
+
+
+#line 393 "track.vala"
+void _model_track_join (ModelTrack* self, gint64 position) {
+#line 393 "track.vala"
+       g_return_if_fail (MODEL_IS_TRACK (self));
+#line 394 "track.vala"
+       g_assert (model_track_are_contiguous_clips (self, position));
+#line 395 "track.vala"
+       if (model_track_are_contiguous_clips (self, position)) {
+#line 2066 "track.c"
+               ModelClip* right_clip;
+               gint right_clip_index;
+               gint left_clip_index;
+               ModelClip* left_clip;
+#line 396 "track.vala"
+               right_clip = model_track_get_clip_by_position (self, position + 1);
+#line 397 "track.vala"
+               g_assert (right_clip != NULL);
+#line 399 "track.vala"
+               right_clip_index = model_track_get_clip_index (self, right_clip);
+#line 400 "track.vala"
+               g_assert (right_clip_index > 0);
+#line 402 "track.vala"
+               left_clip_index = right_clip_index - 1;
+#line 403 "track.vala"
+               left_clip = model_track_get_clip (self, left_clip_index);
+#line 404 "track.vala"
+               g_assert (left_clip != NULL);
+#line 405 "track.vala"
+               model_clip_set_duration (left_clip, model_clip_get_end (right_clip) - model_clip_get_start (left_clip));
+#line 406 "track.vala"
+               _model_track_delete_clip (self, right_clip);
+#line 2089 "track.c"
+               _g_object_unref0 (right_clip);
+               _g_object_unref0 (left_clip);
+       }
+}
+
+
+#line 410 "track.vala"
+void model_track_trim (ModelTrack* self, ModelClip* clip, gint64 delta, GdkWindowEdge edge) {
+#line 2098 "track.c"
+       ModelCommand* command;
+#line 410 "track.vala"
+       g_return_if_fail (MODEL_IS_TRACK (self));
+#line 410 "track.vala"
+       g_return_if_fail (MODEL_IS_CLIP (clip));
+#line 411 "track.vala"
+       command = MODEL_COMMAND (model_clip_trim_command_new (self, clip, delta, edge));
+#line 412 "track.vala"
+       model_project_do_command (self->project, command);
+#line 2108 "track.c"
+       _model_command_unref0 (command);
+}
+
+
+#line 415 "track.vala"
+void _model_track_trim (ModelTrack* self, ModelClip* clip, gint64 delta, GdkWindowEdge edge) {
+#line 415 "track.vala"
+       g_return_if_fail (MODEL_IS_TRACK (self));
+#line 415 "track.vala"
+       g_return_if_fail (MODEL_IS_CLIP (clip));
+#line 416 "track.vala"
+       model_clip_trim (clip, delta, edge);
+#line 417 "track.vala"
+       model_track_do_clip_overwrite (self, clip);
+#line 2123 "track.c"
+}
+
+
+#line 420 "track.vala"
+gint64 model_track_previous_edit (ModelTrack* self, gint64 pos) {
+#line 2129 "track.c"
+       gint64 result = 0LL;
+#line 420 "track.vala"
+       g_return_val_if_fail (MODEL_IS_TRACK (self), 0LL);
+#line 2133 "track.c"
+       {
+               gint i;
+#line 421 "track.vala"
+               i = gee_collection_get_size (GEE_COLLECTION (self->clips)) - 1;
+#line 2138 "track.c"
+               {
+                       gboolean _tmp0_;
+#line 421 "track.vala"
+                       _tmp0_ = TRUE;
+#line 421 "track.vala"
+                       while (TRUE) {
+#line 2145 "track.c"
+                               ModelClip* c;
+#line 421 "track.vala"
+                               if (!_tmp0_) {
+#line 421 "track.vala"
+                                       i = i - 1;
+#line 2151 "track.c"
+                               }
+#line 421 "track.vala"
+                               _tmp0_ = FALSE;
+#line 421 "track.vala"
+                               if (!(i >= 0)) {
+#line 421 "track.vala"
+                                       break;
+#line 2159 "track.c"
+                               }
+                               c = (ModelClip*) gee_abstract_list_get (GEE_ABSTRACT_LIST (self->clips), i);
+#line 423 "track.vala"
+                               if (model_clip_get_end (c) < pos) {
+#line 2164 "track.c"
+                                       result = model_clip_get_end (c);
+                                       _g_object_unref0 (c);
+#line 424 "track.vala"
+                                       return result;
+#line 2169 "track.c"
+                               }
+#line 425 "track.vala"
+                               if (model_clip_get_start (c) < pos) {
+#line 2173 "track.c"
+                                       result = model_clip_get_start (c);
+                                       _g_object_unref0 (c);
+#line 426 "track.vala"
+                                       return result;
+#line 2178 "track.c"
+                               }
+                               _g_object_unref0 (c);
+                       }
+               }
+       }
+       result = (gint64) 0;
+#line 428 "track.vala"
+       return result;
+#line 2187 "track.c"
+}
+
+
+#line 431 "track.vala"
+gint64 model_track_next_edit (ModelTrack* self, gint64 pos) {
+#line 2193 "track.c"
+       gint64 result = 0LL;
+#line 431 "track.vala"
+       g_return_val_if_fail (MODEL_IS_TRACK (self), 0LL);
+#line 2197 "track.c"
+       {
+               GeeIterator* _c_it;
+               _c_it = gee_abstract_collection_iterator (GEE_ABSTRACT_COLLECTION (self->clips));
+#line 432 "track.vala"
+               while (TRUE) {
+#line 2203 "track.c"
+                       ModelClip* c;
+#line 432 "track.vala"
+                       if (!gee_iterator_next (_c_it)) {
+#line 432 "track.vala"
+                               break;
+#line 2209 "track.c"
+                       }
+#line 432 "track.vala"
+                       c = (ModelClip*) gee_iterator_get (_c_it);
+#line 433 "track.vala"
+                       if (model_clip_get_start (c) > pos) {
+#line 2215 "track.c"
+                               result = model_clip_get_start (c);
+                               _g_object_unref0 (c);
+                               _g_object_unref0 (_c_it);
+#line 434 "track.vala"
+                               return result;
+#line 2221 "track.c"
+                       } else {
+#line 435 "track.vala"
+                               if (model_clip_get_end (c) > pos) {
+#line 2225 "track.c"
+                                       result = model_clip_get_end (c);
+                                       _g_object_unref0 (c);
+                                       _g_object_unref0 (_c_it);
+#line 436 "track.vala"
+                                       return result;
+#line 2231 "track.c"
+                               }
+                       }
+                       _g_object_unref0 (c);
+               }
+               _g_object_unref0 (_c_it);
+       }
+       result = model_track_get_length (self);
+#line 437 "track.vala"
+       return result;
+#line 2241 "track.c"
+}
+
+
+#line 440 "track.vala"
+static void model_track_real_write_attributes (ModelTrack* self, FILE* f) {
+#line 2247 "track.c"
+       char* _tmp1_;
+       char* _tmp0_;
+#line 440 "track.vala"
+       g_return_if_fail (MODEL_IS_TRACK (self));
+#line 440 "track.vala"
+       g_return_if_fail (f != NULL);
+#line 441 "track.vala"
+       fprintf (f, "type=\"%s\" name=\"%s\" ", _tmp0_ = model_track_name (self), _tmp1_ = model_track_get_display_name (self));
+#line 2256 "track.c"
+       _g_free0 (_tmp1_);
+       _g_free0 (_tmp0_);
+}
+
+
+#line 440 "track.vala"
+void model_track_write_attributes (ModelTrack* self, FILE* f) {
+#line 440 "track.vala"
+       MODEL_TRACK_GET_CLASS (self)->write_attributes (self, f);
+#line 2266 "track.c"
+}
+
+
+#line 444 "track.vala"
+void model_track_save (ModelTrack* self, FILE* f) {
+#line 444 "track.vala"
+       g_return_if_fail (MODEL_IS_TRACK (self));
+#line 444 "track.vala"
+       g_return_if_fail (f != NULL);
+#line 445 "track.vala"
+       fprintf (f, "    <track ");
+#line 446 "track.vala"
+       model_track_write_attributes (self, f);
+#line 447 "track.vala"
+       fprintf (f, ">\n");
+#line 2282 "track.c"
+       {
+               gint i;
+#line 448 "track.vala"
+               i = 0;
+#line 2287 "track.c"
+               {
+                       gboolean _tmp0_;
+#line 448 "track.vala"
+                       _tmp0_ = TRUE;
+#line 448 "track.vala"
+                       while (TRUE) {
+#line 2294 "track.c"
+                               ModelClip* _tmp2_;
+                               ModelClip* _tmp1_;
+#line 448 "track.vala"
+                               if (!_tmp0_) {
+#line 448 "track.vala"
+                                       i++;
+#line 2301 "track.c"
+                               }
+#line 448 "track.vala"
+                               _tmp0_ = FALSE;
+#line 448 "track.vala"
+                               if (!(i < gee_collection_get_size (GEE_COLLECTION (self->clips)))) {
+#line 448 "track.vala"
+                                       break;
+#line 2309 "track.c"
+                               }
+#line 449 "track.vala"
+                               model_clip_save (_tmp1_ = (ModelClip*) gee_abstract_list_get (GEE_ABSTRACT_LIST (self->clips), i), f, model_project_get_clipfile_index (self->project, (_tmp2_ = (ModelClip*) gee_abstract_list_get (GEE_ABSTRACT_LIST (self->clips), i))->clipfile));
+#line 2313 "track.c"
+                               _g_object_unref0 (_tmp2_);
+                               _g_object_unref0 (_tmp1_);
+                       }
+               }
+       }
+#line 450 "track.vala"
+       fputs ("    </track>\n", f);
+#line 2321 "track.c"
+}
+
+
+#line 453 "track.vala"
+char* model_track_get_display_name (ModelTrack* self) {
+#line 2327 "track.c"
+       char* result = NULL;
+#line 453 "track.vala"
+       g_return_val_if_fail (MODEL_IS_TRACK (self), NULL);
+#line 2331 "track.c"
+       result = g_strdup (self->display_name);
+#line 454 "track.vala"
+       return result;
+#line 2335 "track.c"
+}
+
+
+#line 457 "track.vala"
+void model_track_set_display_name (ModelTrack* self, const char* new_display_name) {
+#line 457 "track.vala"
+       g_return_if_fail (MODEL_IS_TRACK (self));
+#line 457 "track.vala"
+       g_return_if_fail (new_display_name != NULL);
+#line 458 "track.vala"
+       if (_vala_strcmp0 (self->display_name, new_display_name) != 0) {
+#line 2347 "track.c"
+               char* _tmp0_;
+#line 459 "track.vala"
+               self->display_name = (_tmp0_ = g_strdup (new_display_name), _g_free0 (self->display_name), _tmp0_);
+#line 460 "track.vala"
+               g_signal_emit_by_name (self, "track-renamed", self);
+#line 2353 "track.c"
+       }
+}
+
+
+#line 464 "track.vala"
+void model_track_set_selected (ModelTrack* self, gboolean is_selected) {
+#line 464 "track.vala"
+       g_return_if_fail (MODEL_IS_TRACK (self));
+#line 465 "track.vala"
+       if (self->priv->is_selected != is_selected) {
+#line 466 "track.vala"
+               self->priv->is_selected = is_selected;
+#line 467 "track.vala"
+               g_signal_emit_by_name (self, "track-selection-changed", self);
+#line 2368 "track.c"
+       }
+}
+
+
+#line 471 "track.vala"
+gboolean model_track_get_is_selected (ModelTrack* self) {
+#line 2375 "track.c"
+       gboolean result = FALSE;
+#line 471 "track.vala"
+       g_return_val_if_fail (MODEL_IS_TRACK (self), FALSE);
+#line 2379 "track.c"
+       result = self->priv->is_selected;
+#line 472 "track.vala"
+       return result;
+#line 2383 "track.c"
+}
+
+
+static void model_track_class_init (ModelTrackClass * klass) {
+       model_track_parent_class = g_type_class_peek_parent (klass);
+       g_type_class_add_private (klass, sizeof (ModelTrackPrivate));
+       MODEL_TRACK_CLASS (klass)->name = model_track_real_name;
+       MODEL_TRACK_CLASS (klass)->media_type = model_track_real_media_type;
+       MODEL_TRACK_CLASS (klass)->check = model_track_real_check;
+       MODEL_TRACK_CLASS (klass)->on_clip_updated = model_track_real_on_clip_updated;
+       MODEL_TRACK_CLASS (klass)->write_attributes = model_track_real_write_attributes;
+       G_OBJECT_CLASS (klass)->finalize = model_track_finalize;
+       g_signal_new ("clip_added", MODEL_TYPE_TRACK, G_SIGNAL_RUN_LAST, 0, NULL, NULL, g_cclosure_user_marshal_VOID__OBJECT_BOOLEAN, G_TYPE_NONE, 2, MODEL_TYPE_CLIP, G_TYPE_BOOLEAN);
+       g_signal_new ("clip_removed", MODEL_TYPE_TRACK, G_SIGNAL_RUN_LAST, 0, NULL, NULL, g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, MODEL_TYPE_CLIP);
+       g_signal_new ("track_renamed", MODEL_TYPE_TRACK, G_SIGNAL_RUN_LAST, 0, NULL, NULL, g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, MODEL_TYPE_TRACK);
+       g_signal_new ("track_selection_changed", MODEL_TYPE_TRACK, G_SIGNAL_RUN_LAST, 0, NULL, NULL, g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, MODEL_TYPE_TRACK);
+       g_signal_new ("track_hidden", MODEL_TYPE_TRACK, G_SIGNAL_RUN_LAST, 0, NULL, NULL, g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, MODEL_TYPE_TRACK);
+       g_signal_new ("track_removed", MODEL_TYPE_TRACK, G_SIGNAL_RUN_LAST, 0, NULL, NULL, g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, MODEL_TYPE_TRACK);
+       g_signal_new ("error_occurred", MODEL_TYPE_TRACK, G_SIGNAL_RUN_LAST, 0, NULL, NULL, g_cclosure_user_marshal_VOID__STRING_STRING, G_TYPE_NONE, 2, G_TYPE_STRING, G_TYPE_STRING);
+}
+
+
+static void model_track_instance_init (ModelTrack * self) {
+       self->priv = MODEL_TRACK_GET_PRIVATE (self);
+       self->clips = gee_array_list_new (MODEL_TYPE_CLIP, (GBoxedCopyFunc) g_object_ref, g_object_unref, NULL);
+}
+
+
+static void model_track_finalize (GObject* obj) {
+       ModelTrack * self;
+       self = MODEL_TRACK (obj);
+       _g_object_unref0 (self->clips);
+       _g_free0 (self->display_name);
+       G_OBJECT_CLASS (model_track_parent_class)->finalize (obj);
+}
+
+
+GType model_track_get_type (void) {
+       static volatile gsize model_track_type_id__volatile = 0;
+       if (g_once_init_enter (&model_track_type_id__volatile)) {
+               static const GTypeInfo g_define_type_info = { sizeof (ModelTrackClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) model_track_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (ModelTrack), 0, (GInstanceInitFunc) model_track_instance_init, NULL };
+               GType model_track_type_id;
+               model_track_type_id = g_type_register_static (G_TYPE_OBJECT, "ModelTrack", &g_define_type_info, G_TYPE_FLAG_ABSTRACT);
+               g_once_init_leave (&model_track_type_id__volatile, model_track_type_id);
+       }
+       return model_track_type_id__volatile;
+}
+
+
+#line 487 "track.vala"
+ModelAudioTrack* model_audio_track_construct (GType object_type, ModelProject* project, const char* display_name) {
+#line 2435 "track.c"
+       ModelAudioTrack * self;
+#line 487 "track.vala"
+       g_return_val_if_fail (MODEL_IS_PROJECT (project), NULL);
+#line 487 "track.vala"
+       g_return_val_if_fail (display_name != NULL, NULL);
+#line 488 "track.vala"
+       self = (ModelAudioTrack*) model_track_construct (object_type, project, display_name);
+#line 490 "track.vala"
+       model_audio_track_set_default_num_channels (self, MODEL_AUDIO_TRACK_INVALID_CHANNEL_COUNT);
+#line 491 "track.vala"
+       _model_audio_track_set_pan (self, (double) 0);
+#line 492 "track.vala"
+       _model_audio_track_set_volume (self, 1.0);
+#line 2449 "track.c"
+       return self;
+}
+
+
+#line 487 "track.vala"
+ModelAudioTrack* model_audio_track_new (ModelProject* project, const char* display_name) {
+#line 487 "track.vala"
+       return model_audio_track_construct (MODEL_TYPE_AUDIO_TRACK, project, display_name);
+#line 2458 "track.c"
+}
+
+
+#line 495 "track.vala"
+static char* model_audio_track_real_name (ModelTrack* base) {
+#line 2464 "track.c"
+       ModelAudioTrack * self;
+       char* result = NULL;
+       self = MODEL_AUDIO_TRACK (base);
+       result = g_strdup ("audio");
+#line 495 "track.vala"
+       return result;
+#line 2471 "track.c"
+}
+
+
+#line 497 "track.vala"
+static ModelMediaType model_audio_track_real_media_type (ModelTrack* base) {
+#line 2477 "track.c"
+       ModelAudioTrack * self;
+       ModelMediaType result = 0;
+       self = MODEL_AUDIO_TRACK (base);
+       result = MODEL_MEDIA_TYPE_AUDIO;
+#line 498 "track.vala"
+       return result;
+#line 2484 "track.c"
+}
+
+
+#line 501 "track.vala"
+static void model_audio_track_real_write_attributes (ModelTrack* base, FILE* f) {
+#line 2490 "track.c"
+       ModelAudioTrack * self;
+       gint channels = 0;
+       gboolean _tmp0_ = FALSE;
+       self = MODEL_AUDIO_TRACK (base);
+#line 501 "track.vala"
+       g_return_if_fail (f != NULL);
+#line 502 "track.vala"
+       MODEL_TRACK_CLASS (model_audio_track_parent_class)->write_attributes (MODEL_TRACK (self), f);
+#line 503 "track.vala"
+       fprintf (f, "volume=\"%f\" panorama=\"%f\" ", model_audio_track_get_volume (self), model_audio_track_get_pan (self));
+#line 506 "track.vala"
+       if (model_audio_track_get_num_channels (self, &channels)) {
+#line 507 "track.vala"
+               _tmp0_ = channels != MODEL_AUDIO_TRACK_INVALID_CHANNEL_COUNT;
+#line 2505 "track.c"
+       } else {
+#line 506 "track.vala"
+               _tmp0_ = FALSE;
+#line 2509 "track.c"
+       }
+#line 506 "track.vala"
+       if (_tmp0_) {
+#line 508 "track.vala"
+               fprintf (f, "channels=\"%d\" ", channels);
+#line 2515 "track.c"
+       }
+}
+
+
+#line 511 "track.vala"
+void model_audio_track_set_pan (ModelAudioTrack* self, double new_value) {
+#line 2522 "track.c"
+       double old_value;
+#line 511 "track.vala"
+       g_return_if_fail (MODEL_IS_AUDIO_TRACK (self));
+#line 512 "track.vala"
+       old_value = model_audio_track_get_pan (self);
+#line 513 "track.vala"
+       if (!float_within (new_value - old_value, 0.05)) {
+#line 2530 "track.c"
+               ModelParameterCommand* parameter_command;
+#line 515 "track.vala"
+               parameter_command = model_parameter_command_new (self, MODEL_PARAMETER_PAN, new_value, old_value);
+#line 516 "track.vala"
+               model_project_do_command (MODEL_TRACK (self)->project, MODEL_COMMAND (parameter_command));
+#line 2536 "track.c"
+               _model_command_unref0 (parameter_command);
+       }
+}
+
+
+#line 520 "track.vala"
+void _model_audio_track_set_pan (ModelAudioTrack* self, double new_value) {
+#line 2544 "track.c"
+       double old_value;
+#line 520 "track.vala"
+       g_return_if_fail (MODEL_IS_AUDIO_TRACK (self));
+#line 521 "track.vala"
+       g_assert ((new_value <= 1.0) && (new_value >= (-1.0)));
+#line 522 "track.vala"
+       old_value = model_audio_track_get_pan (self);
+#line 523 "track.vala"
+       if (!float_within (old_value - new_value, 0.05)) {
+#line 524 "track.vala"
+               self->priv->pan = new_value;
+#line 525 "track.vala"
+               g_signal_emit_by_name (self, "parameter-changed", MODEL_PARAMETER_PAN, new_value);
+#line 2558 "track.c"
+       }
+}
+
+
+#line 529 "track.vala"
+double model_audio_track_get_pan (ModelAudioTrack* self) {
+#line 2565 "track.c"
+       double result = 0.0;
+#line 529 "track.vala"
+       g_return_val_if_fail (MODEL_IS_AUDIO_TRACK (self), 0.0);
+#line 2569 "track.c"
+       result = self->priv->pan;
+#line 530 "track.vala"
+       return result;
+#line 2573 "track.c"
+}
+
+
+#line 533 "track.vala"
+void model_audio_track_set_volume (ModelAudioTrack* self, double new_volume) {
+#line 2579 "track.c"
+       double old_volume;
+#line 533 "track.vala"
+       g_return_if_fail (MODEL_IS_AUDIO_TRACK (self));
+#line 534 "track.vala"
+       old_volume = model_audio_track_get_volume (self);
+#line 535 "track.vala"
+       if (!float_within (old_volume - new_volume, 0.005)) {
+#line 2587 "track.c"
+               ModelParameterCommand* parameter_command;
+#line 537 "track.vala"
+               parameter_command = model_parameter_command_new (self, MODEL_PARAMETER_VOLUME, new_volume, old_volume);
+#line 538 "track.vala"
+               model_project_do_command (MODEL_TRACK (self)->project, MODEL_COMMAND (parameter_command));
+#line 2593 "track.c"
+               _model_command_unref0 (parameter_command);
+       }
+}
+
+
+#line 542 "track.vala"
+void _model_audio_track_set_volume (ModelAudioTrack* self, double new_volume) {
+#line 2601 "track.c"
+       double old_volume;
+#line 542 "track.vala"
+       g_return_if_fail (MODEL_IS_AUDIO_TRACK (self));
+#line 543 "track.vala"
+       g_assert ((new_volume >= 0.0) && (new_volume <= 10.0));
+#line 544 "track.vala"
+       old_volume = model_audio_track_get_volume (self);
+#line 545 "track.vala"
+       if (!float_within (old_volume - new_volume, 0.005)) {
+#line 546 "track.vala"
+               self->priv->volume = new_volume;
+#line 547 "track.vala"
+               g_signal_emit_by_name (self, "parameter-changed", MODEL_PARAMETER_VOLUME, new_volume);
+#line 2615 "track.c"
+       }
+}
+
+
+#line 551 "track.vala"
+double model_audio_track_get_volume (ModelAudioTrack* self) {
+#line 2622 "track.c"
+       double result = 0.0;
+#line 551 "track.vala"
+       g_return_val_if_fail (MODEL_IS_AUDIO_TRACK (self), 0.0);
+#line 2626 "track.c"
+       result = self->priv->volume;
+#line 552 "track.vala"
+       return result;
+#line 2630 "track.c"
+}
+
+
+#line 555 "track.vala"
+void model_audio_track_set_default_num_channels (ModelAudioTrack* self, gint num) {
+#line 555 "track.vala"
+       g_return_if_fail (MODEL_IS_AUDIO_TRACK (self));
+#line 556 "track.vala"
+       self->priv->default_num_channels = num;
+#line 2640 "track.c"
+}
+
+
+#line 559 "track.vala"
+gboolean model_audio_track_get_num_channels (ModelAudioTrack* self, gint* num) {
+#line 2646 "track.c"
+       gboolean result = FALSE;
+#line 559 "track.vala"
+       g_return_val_if_fail (MODEL_IS_AUDIO_TRACK (self), FALSE);
+#line 560 "track.vala"
+       if (gee_collection_get_size (GEE_COLLECTION (MODEL_TRACK (self)->clips)) == 0) {
+#line 2652 "track.c"
+               result = FALSE;
+#line 561 "track.vala"
+               return result;
+#line 2656 "track.c"
+       }
+       {
+               GeeIterator* _c_it;
+               _c_it = gee_abstract_collection_iterator (GEE_ABSTRACT_COLLECTION (MODEL_TRACK (self)->clips));
+#line 563 "track.vala"
+               while (TRUE) {
+#line 2663 "track.c"
+                       ModelClip* c;
+#line 563 "track.vala"
+                       if (!gee_iterator_next (_c_it)) {
+#line 563 "track.vala"
+                               break;
+#line 2669 "track.c"
+                       }
+#line 563 "track.vala"
+                       c = (ModelClip*) gee_iterator_get (_c_it);
+#line 564 "track.vala"
+                       if (model_clip_file_is_online (c->clipfile)) {
+#line 2675 "track.c"
+                               gboolean can;
+#line 565 "track.vala"
+                               can = model_clip_file_get_num_channels (c->clipfile, num);
+#line 566 "track.vala"
+                               g_assert (can);
+#line 2681 "track.c"
+                               result = can;
+                               _g_object_unref0 (c);
+                               _g_object_unref0 (_c_it);
+#line 568 "track.vala"
+                               return result;
+#line 2687 "track.c"
+                       }
+                       _g_object_unref0 (c);
+               }
+               _g_object_unref0 (_c_it);
+       }
+#line 572 "track.vala"
+       if (self->priv->default_num_channels == MODEL_AUDIO_TRACK_INVALID_CHANNEL_COUNT) {
+#line 2695 "track.c"
+               result = FALSE;
+#line 573 "track.vala"
+               return result;
+#line 2699 "track.c"
+       }
+#line 575 "track.vala"
+       *num = self->priv->default_num_channels;
+#line 2703 "track.c"
+       result = TRUE;
+#line 576 "track.vala"
+       return result;
+#line 2707 "track.c"
+}
+
+
+#line 579 "track.vala"
+static gboolean model_audio_track_real_check (ModelTrack* base, ModelClip* clip) {
+#line 2713 "track.c"
+       ModelAudioTrack * self;
+       gboolean result = FALSE;
+       gboolean good;
+       gint number_of_channels = 0;
+       self = MODEL_AUDIO_TRACK (base);
+#line 579 "track.vala"
+       g_return_val_if_fail (MODEL_IS_CLIP (clip), FALSE);
+#line 580 "track.vala"
+       if (!model_clip_file_is_online (clip->clipfile)) {
+#line 2723 "track.c"
+               result = TRUE;
+#line 581 "track.vala"
+               return result;
+#line 2727 "track.c"
+       }
+#line 584 "track.vala"
+       if (gee_collection_get_size (GEE_COLLECTION (MODEL_TRACK (self)->clips)) == 0) {
+#line 2731 "track.c"
+               gint number_of_channels;
+#line 585 "track.vala"
+               number_of_channels = 0;
+#line 586 "track.vala"
+               if (model_clip_file_get_num_channels (clip->clipfile, &number_of_channels)) {
+#line 587 "track.vala"
+                       g_signal_emit_by_name (self, "channel-count-changed", number_of_channels);
+#line 2739 "track.c"
+               }
+               result = TRUE;
+#line 589 "track.vala"
+               return result;
+#line 2744 "track.c"
+       }
+#line 592 "track.vala"
+       good = FALSE;
+#line 594 "track.vala"
+       if (model_clip_file_get_num_channels (clip->clipfile, &number_of_channels)) {
+#line 2750 "track.c"
+               gint track_channel_count = 0;
+#line 596 "track.vala"
+               if (model_audio_track_get_num_channels (self, &track_channel_count)) {
+#line 597 "track.vala"
+                       good = track_channel_count == number_of_channels;
+#line 2756 "track.c"
+               }
+       }
+#line 601 "track.vala"
+       if (!good) {
+#line 2761 "track.c"
+               const char* _tmp0_;
+               char* sub_error;
+               _tmp0_ = NULL;
+#line 602 "track.vala"
+               if (number_of_channels == 1) {
+#line 603 "track.vala"
+                       _tmp0_ = "Mono clips cannot go on stereo tracks.";
+#line 2769 "track.c"
+               } else {
+#line 604 "track.vala"
+                       _tmp0_ = "Stereo clips cannot go on mono tracks.";
+#line 2773 "track.c"
+               }
+#line 602 "track.vala"
+               sub_error = g_strdup (_tmp0_);
+#line 605 "track.vala"
+               g_signal_emit_by_name (MODEL_TRACK (self), "error-occurred", "Cannot add clip to track", sub_error);
+#line 2779 "track.c"
+               _g_free0 (sub_error);
+       }
+       result = good;
+#line 607 "track.vala"
+       return result;
+#line 2785 "track.c"
+}
+
+
+#line 610 "track.vala"
+void model_audio_track_on_level_changed (ModelAudioTrack* self, double level_left, double level_right) {
+#line 610 "track.vala"
+       g_return_if_fail (MODEL_IS_AUDIO_TRACK (self));
+#line 611 "track.vala"
+       logging_emit (G_OBJECT (self), LOGGING_FACILITY_SIGNAL_HANDLERS, LOGGING_LEVEL_INFO, "on_level_changed");
+#line 612 "track.vala"
+       g_signal_emit_by_name (self, "level-changed", level_left, level_right);
+#line 2797 "track.c"
+}
+
+
+#line 615 "track.vala"
+static void model_audio_track_real_on_clip_updated (ModelTrack* base, ModelClip* clip) {
+#line 2803 "track.c"
+       ModelAudioTrack * self;
+       self = MODEL_AUDIO_TRACK (base);
+#line 615 "track.vala"
+       g_return_if_fail (MODEL_IS_CLIP (clip));
+#line 616 "track.vala"
+       if (model_clip_file_is_online (clip->clipfile)) {
+#line 2810 "track.c"
+               gint number_of_channels;
+#line 617 "track.vala"
+               number_of_channels = 0;
+#line 618 "track.vala"
+               if (model_audio_track_get_num_channels (self, &number_of_channels)) {
+#line 619 "track.vala"
+                       g_signal_emit_by_name (self, "channel-count-changed", number_of_channels);
+#line 2818 "track.c"
+               }
+       }
+}
+
+
+static void model_audio_track_class_init (ModelAudioTrackClass * klass) {
+       model_audio_track_parent_class = g_type_class_peek_parent (klass);
+       g_type_class_add_private (klass, sizeof (ModelAudioTrackPrivate));
+       MODEL_TRACK_CLASS (klass)->name = model_audio_track_real_name;
+       MODEL_TRACK_CLASS (klass)->media_type = model_audio_track_real_media_type;
+       MODEL_TRACK_CLASS (klass)->write_attributes = model_audio_track_real_write_attributes;
+       MODEL_TRACK_CLASS (klass)->check = model_audio_track_real_check;
+       MODEL_TRACK_CLASS (klass)->on_clip_updated = model_audio_track_real_on_clip_updated;
+       G_OBJECT_CLASS (klass)->finalize = model_audio_track_finalize;
+       g_signal_new ("parameter_changed", MODEL_TYPE_AUDIO_TRACK, G_SIGNAL_RUN_LAST, 0, NULL, NULL, g_cclosure_user_marshal_VOID__ENUM_DOUBLE, G_TYPE_NONE, 2, MODEL_TYPE_PARAMETER, G_TYPE_DOUBLE);
+       g_signal_new ("level_changed", MODEL_TYPE_AUDIO_TRACK, G_SIGNAL_RUN_LAST, 0, NULL, NULL, g_cclosure_user_marshal_VOID__DOUBLE_DOUBLE, G_TYPE_NONE, 2, G_TYPE_DOUBLE, G_TYPE_DOUBLE);
+       g_signal_new ("channel_count_changed", MODEL_TYPE_AUDIO_TRACK, G_SIGNAL_RUN_LAST, 0, NULL, NULL, g_cclosure_marshal_VOID__INT, G_TYPE_NONE, 1, G_TYPE_INT);
+}
+
+
+static void model_audio_track_instance_init (ModelAudioTrack * self) {
+       self->priv = MODEL_AUDIO_TRACK_GET_PRIVATE (self);
+}
+
+
+static void model_audio_track_finalize (GObject* obj) {
+       ModelAudioTrack * self;
+       self = MODEL_AUDIO_TRACK (obj);
+       G_OBJECT_CLASS (model_audio_track_parent_class)->finalize (obj);
+}
+
+
+GType model_audio_track_get_type (void) {
+       static volatile gsize model_audio_track_type_id__volatile = 0;
+       if (g_once_init_enter (&model_audio_track_type_id__volatile)) {
+               static const GTypeInfo g_define_type_info = { sizeof (ModelAudioTrackClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) model_audio_track_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (ModelAudioTrack), 0, (GInstanceInitFunc) model_audio_track_instance_init, NULL };
+               GType model_audio_track_type_id;
+               model_audio_track_type_id = g_type_register_static (MODEL_TYPE_TRACK, "ModelAudioTrack", &g_define_type_info, 0);
+               g_once_init_leave (&model_audio_track_type_id__volatile, model_audio_track_type_id);
+       }
+       return model_audio_track_type_id__volatile;
+}
+
+
+static int _vala_strcmp0 (const char * str1, const char * str2) {
+       if (str1 == NULL) {
+               return -(str1 != str2);
+       }
+       if (str2 == NULL) {
+               return str1 != str2;
+       }
+       return strcmp (str1, str2);
+}
+
+
+
+static void g_cclosure_user_marshal_VOID__OBJECT_BOOLEAN (GClosure * closure, GValue * return_value, guint n_param_values, const GValue * param_values, gpointer invocation_hint, gpointer marshal_data) {
+       typedef void (*GMarshalFunc_VOID__OBJECT_BOOLEAN) (gpointer data1, gpointer arg_1, gboolean arg_2, gpointer data2);
+       register GMarshalFunc_VOID__OBJECT_BOOLEAN callback;
+       register GCClosure * cc;
+       register gpointer data1, data2;
+       cc = (GCClosure *) closure;
+       g_return_if_fail (n_param_values == 3);
+       if (G_CCLOSURE_SWAP_DATA (closure)) {
+               data1 = closure->data;
+               data2 = param_values->data[0].v_pointer;
+       } else {
+               data1 = param_values->data[0].v_pointer;
+               data2 = closure->data;
+       }
+       callback = (GMarshalFunc_VOID__OBJECT_BOOLEAN) (marshal_data ? marshal_data : cc->callback);
+       callback (data1, g_value_get_object (param_values + 1), g_value_get_boolean (param_values + 2), data2);
+}
+
+
+static void g_cclosure_user_marshal_VOID__STRING_STRING (GClosure * closure, GValue * return_value, guint n_param_values, const GValue * param_values, gpointer invocation_hint, gpointer marshal_data) {
+       typedef void (*GMarshalFunc_VOID__STRING_STRING) (gpointer data1, const char* arg_1, const char* arg_2, gpointer data2);
+       register GMarshalFunc_VOID__STRING_STRING callback;
+       register GCClosure * cc;
+       register gpointer data1, data2;
+       cc = (GCClosure *) closure;
+       g_return_if_fail (n_param_values == 3);
+       if (G_CCLOSURE_SWAP_DATA (closure)) {
+               data1 = closure->data;
+               data2 = param_values->data[0].v_pointer;
+       } else {
+               data1 = param_values->data[0].v_pointer;
+               data2 = closure->data;
+       }
+       callback = (GMarshalFunc_VOID__STRING_STRING) (marshal_data ? marshal_data : cc->callback);
+       callback (data1, g_value_get_string (param_values + 1), g_value_get_string (param_values + 2), data2);
+}
+
+
+static void g_cclosure_user_marshal_VOID__ENUM_DOUBLE (GClosure * closure, GValue * return_value, guint n_param_values, const GValue * param_values, gpointer invocation_hint, gpointer marshal_data) {
+       typedef void (*GMarshalFunc_VOID__ENUM_DOUBLE) (gpointer data1, gint arg_1, double arg_2, gpointer data2);
+       register GMarshalFunc_VOID__ENUM_DOUBLE callback;
+       register GCClosure * cc;
+       register gpointer data1, data2;
+       cc = (GCClosure *) closure;
+       g_return_if_fail (n_param_values == 3);
+       if (G_CCLOSURE_SWAP_DATA (closure)) {
+               data1 = closure->data;
+               data2 = param_values->data[0].v_pointer;
+       } else {
+               data1 = param_values->data[0].v_pointer;
+               data2 = closure->data;
+       }
+       callback = (GMarshalFunc_VOID__ENUM_DOUBLE) (marshal_data ? marshal_data : cc->callback);
+       callback (data1, g_value_get_enum (param_values + 1), g_value_get_double (param_values + 2), data2);
+}
+
+
+static void g_cclosure_user_marshal_VOID__DOUBLE_DOUBLE (GClosure * closure, GValue * return_value, guint n_param_values, const GValue * param_values, gpointer invocation_hint, gpointer marshal_data) {
+       typedef void (*GMarshalFunc_VOID__DOUBLE_DOUBLE) (gpointer data1, double arg_1, double arg_2, gpointer data2);
+       register GMarshalFunc_VOID__DOUBLE_DOUBLE callback;
+       register GCClosure * cc;
+       register gpointer data1, data2;
+       cc = (GCClosure *) closure;
+       g_return_if_fail (n_param_values == 3);
+       if (G_CCLOSURE_SWAP_DATA (closure)) {
+               data1 = closure->data;
+               data2 = param_values->data[0].v_pointer;
+       } else {
+               data1 = param_values->data[0].v_pointer;
+               data2 = closure->data;
+       }
+       callback = (GMarshalFunc_VOID__DOUBLE_DOUBLE) (marshal_data ? marshal_data : cc->callback);
+       callback (data1, g_value_get_double (param_values + 1), g_value_get_double (param_values + 2), data2);
+}
+
+
+