Credit Andrew - fix vorbis audio which was scratchy and ensure aging plugin does...
[goodguy/cinelerra.git] / cinelerra-5.1 / cinelerra / indexfile.C
index aedbfbb8a12581ad21d7872c6ce0d12fc6ac5905..16175535e96a0f1e876a893ca07d2b66c5a347c5 100644 (file)
@@ -2,6 +2,7 @@
 /*
  * CINELERRA
  * Copyright (C) 1997-2014 Adam Williams <broadcast at earthling dot net>
+ * Copyright (C) 2003-2016 Cinelerra CV contributors
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
 
 #include <sys/types.h>
 #include <sys/stat.h>
+#ifdef HAVE_ISOFS
 #include <linux/iso_fs.h>
+#endif
+#if defined(__FreeBSD__)
+#include <isofs/cd9660/iso.h>
+#endif
 
 // check for isofs volume_id for dvd/cdrom
 
 static int udf_volume_id(const char *path, char *fname)
 {
+       int result = 1;
+#ifdef HAVE_ISOFS
        struct stat st;
        if( stat(path,&st) ) return 1;
        // search mounted devices
        FILE *fp = fopen("/proc/mounts","r");
        if( !fp ) return 1;
 
-       int result = 1;
        while( result && !feof(fp) && !ferror(fp) ) {
                char devpath[BCTEXTLEN], mpath[BCTEXTLEN];
                char options[BCTEXTLEN], line[BCTEXTLEN];
@@ -122,6 +129,7 @@ static int udf_volume_id(const char *path, char *fname)
        }
 
        fclose(fp);
+#endif
        return result;
 }
 
@@ -224,7 +232,7 @@ void IndexFile::delete_index(Preferences *preferences,
        char index_filename[BCTEXTLEN];
        char source_filename[BCTEXTLEN];
        const char *path = indexable->path;
-
+       if( !*path ) return;
        get_index_filename(source_filename,
                preferences->index_directory,
                index_filename, path, suffix);
@@ -232,6 +240,15 @@ void IndexFile::delete_index(Preferences *preferences,
        remove_file(index_filename);
 }
 
+void IndexFile::delete_index_files(Preferences *preferences,
+       Indexable *indexable)
+{
+       delete_index(preferences, indexable, ".toc");
+       delete_index(preferences, indexable, ".idx");
+       delete_index(preferences, indexable, ".mkr");
+}
+
+
 int IndexFile::open_file()
 {
        int result = 0;
@@ -328,11 +345,16 @@ int IndexFile::open_source()
                        FileSystem fs;
                        asset->index_state->index_bytes = fs.get_size(asset->path);
                        source_length = source->get_audio_length();
+                       int proxy_scale = asset->proxy_scale;
+                       if( proxy_scale > 0 ) {
+                               asset->width = asset->actual_width * proxy_scale;
+                               asset->height = asset->actual_height * proxy_scale;
+                       }
                }
        }
        else
        {
-               TransportCommand command;
+               TransportCommand command(mwindow->preferences);
                command.command = NORMAL_FWD;
                command.get_edl()->copy_all((EDL*)indexable);
                command.change_type = CHANGE_ALL;
@@ -356,9 +378,10 @@ void IndexFile::close_source()
 
        delete render_engine;
        render_engine = 0;
-
-       delete cache;
-       cache = 0;
+       if( cache ) {
+               cache->remove_user();
+               cache = 0;
+       }
 }
 
 int64_t IndexFile::get_required_scale()
@@ -689,10 +712,9 @@ SET_TRACE
 // Start and length of fragment to read from file in bytes.
        float *buffer = 0;
        int buffer_shared = 0;
-       int rect_audio = mwindow->preferences->rectify_audio;;
-       int center_pixel = !rect_audio ?
-               mwindow->edl->local_session->zoom_track / 2 :
-               mwindow->edl->local_session->zoom_track;
+       int rect_audio = mwindow->preferences->rectify_audio;
+       int data_h = edit->track->data_h;
+       int center_pixel = !rect_audio ? data_h/2 : data_h;
        if( edit->track->show_titles() )
                center_pixel += mwindow->theme->get_image("title_bg_data")->get_h();
 
@@ -729,9 +751,9 @@ SET_TRACE
        int prev_y1 = center_pixel;
        int prev_y2 = center_pixel;
        int first_frame = 1;
-       int zoom_y = !rect_audio ?
-               mwindow->edl->local_session->zoom_y / 2 :
-               mwindow->edl->local_session->zoom_y;
+       int zoom_y = mwindow->edl->local_session->zoom_y * data_h /
+                       mwindow->edl->local_session->zoom_atrack;
+       if( !rect_audio ) zoom_y /= 2;
        int max_y = center_pixel + zoom_y - 1;
        edit_position = (x + pixmap->pixmap_x - virtual_edit_x) * project_zoom;
        int64_t speed_position = edit->startsource;
@@ -772,7 +794,7 @@ SET_TRACE
 // A different algorithm has to be used if it's 1 sample per pixel and the
 // index is used.  Now the min and max values are equal so we join the max samples.
                if(mwindow->edl->local_session->zoom_sample == 1) {
-                       canvas->draw_line(x2 - 1, !rect_audio ? prev_y1 : center_pixel, x2, y1, pixmap);
+                       canvas->draw_bline(x2 - 1, !rect_audio ? prev_y1 : center_pixel, x2, y1, pixmap);
                }
                else {
 // Extend line height if it doesn't connect to previous line
@@ -783,7 +805,7 @@ SET_TRACE
                        else {
                                first_frame = 0;
                        }
-                       canvas->draw_line(x2, y1, x2, !rect_audio ? y2 : center_pixel, pixmap);
+                       canvas->draw_bline(x2, y1, x2, !rect_audio ? y2 : center_pixel, pixmap);
                }
                prev_y1 = next_y1;
                prev_y2 = next_y2;
@@ -841,7 +863,8 @@ int IndexFile::read_info(Indexable *test_indexable)
 
                data = new char[index_state->index_start];
                temp = fread(data, index_state->index_start - sizeof(int64_t), 1, fd);
-               if(!temp) return 1;
+               if(!temp) { delete [] data;
+               return 1;}
 
                data[index_state->index_start - sizeof(int64_t)] = 0;
                FileXML xml;