00001 #include "asset.h"
00002 #include "bcsignals.h"
00003 #include "bchash.h"
00004 #include "edl.h"
00005 #include "file.h"
00006 #include "filesystem.h"
00007 #include "indexfile.h"
00008 #include "condition.h"
00009 #include "language.h"
00010 #include "loadfile.h"
00011 #include "guicast.h"
00012 #include "mainindexes.h"
00013 #include "mainprogress.h"
00014 #include "mutex.h"
00015 #include "mwindow.h"
00016 #include "mwindowgui.h"
00017 #include "preferences.h"
00018
00019 #include <string.h>
00020
00021
00022 MainIndexes::MainIndexes(MWindow *mwindow)
00023 : Thread()
00024 {
00025 set_synchronous(1);
00026 this->mwindow = mwindow;
00027 input_lock = new Condition(0, "MainIndexes::input_lock");
00028 next_lock = new Mutex("MainIndexes::next_lock");
00029 interrupt_lock = new Condition(1, "MainIndexes::interrupt_lock");
00030 interrupt_flag = 0;
00031 done = 0;
00032 indexfile = new IndexFile(mwindow);
00033 }
00034
00035 MainIndexes::~MainIndexes()
00036 {
00037 mwindow->mainprogress->cancelled = 1;
00038 stop_loop();
00039 delete indexfile;
00040 delete next_lock;
00041 delete input_lock;
00042 delete interrupt_lock;
00043 }
00044
00045 void MainIndexes::add_next_asset(File *file, Asset *asset)
00046 {
00047 next_lock->lock("MainIndexes::add_next_asset");
00048
00049
00050 IndexFile indexfile(mwindow);
00051
00052 int got_it = 0;
00053
00054 if(!indexfile.open_index(asset))
00055 {
00056 asset->index_status = INDEX_READY;
00057 indexfile.close_index();
00058 got_it = 1;
00059 }
00060
00061 if(!got_it)
00062 {
00063 File *this_file = file;
00064
00065 if(!file)
00066 {
00067 this_file = new File;
00068 this_file->open_file(mwindow->preferences,
00069 asset,
00070 1,
00071 0,
00072 0,
00073 0);
00074 }
00075
00076 char index_filename[BCTEXTLEN];
00077 char source_filename[BCTEXTLEN];
00078 IndexFile::get_index_filename(source_filename,
00079 mwindow->preferences->index_directory,
00080 index_filename,
00081 asset->path);
00082 if(!this_file->get_index(index_filename))
00083 {
00084 if(!indexfile.open_index(asset))
00085 {
00086 indexfile.close_index();
00087 asset->index_status = INDEX_READY;
00088 got_it = 1;
00089 }
00090 }
00091 if(!file) delete this_file;
00092 }
00093
00094
00095
00096 if(!got_it)
00097 {
00098
00099 Asset *new_asset = new Asset;
00100 *new_asset = *asset;
00101
00102 new_asset->index_status = INDEX_NOTTESTED;
00103 next_assets.append(new_asset);
00104 }
00105
00106 next_lock->unlock();
00107 }
00108
00109 void MainIndexes::delete_current_assets()
00110 {
00111 for(int i = 0; i < current_assets.total; i++)
00112 Garbage::delete_object(current_assets.values[i]);
00113 current_assets.remove_all();
00114 }
00115
00116 void MainIndexes::start_loop()
00117 {
00118 interrupt_flag = 0;
00119 Thread::start();
00120 }
00121
00122 void MainIndexes::stop_loop()
00123 {
00124 interrupt_flag = 1;
00125 done = 1;
00126 input_lock->unlock();
00127 interrupt_lock->unlock();
00128 Thread::join();
00129 }
00130
00131
00132 void MainIndexes::start_build()
00133 {
00134
00135 interrupt_flag = 0;
00136
00137
00138
00139 input_lock->unlock();
00140 }
00141
00142 void MainIndexes::interrupt_build()
00143 {
00144
00145 interrupt_flag = 1;
00146 indexfile->interrupt_index();
00147
00148 interrupt_lock->lock("MainIndexes::interrupt_build");
00149
00150 interrupt_lock->unlock();
00151
00152 }
00153
00154 void MainIndexes::load_next_assets()
00155 {
00156 delete_current_assets();
00157
00158
00159 next_lock->lock("MainIndexes::load_next_assets");
00160 for(int i = 0; i < next_assets.total; i++)
00161 current_assets.append(next_assets.values[i]);
00162
00163
00164 next_assets.remove_all();
00165 next_lock->unlock();
00166 }
00167
00168
00169 void MainIndexes::run()
00170 {
00171 while(!done)
00172 {
00173
00174 input_lock->lock("MainIndexes::run 1");
00175 if(done) return;
00176 interrupt_lock->lock("MainIndexes::run 2");
00177 load_next_assets();
00178 interrupt_flag = 0;
00179
00180
00181
00182
00183
00184
00185
00186 MainProgressBar *progress = 0;
00187 for(int i = 0; i < current_assets.total && !interrupt_flag; i++)
00188 {
00189 Asset *current_asset = current_assets.values[i];
00190
00191
00192 if(current_asset->index_status == INDEX_NOTTESTED &&
00193 current_asset->audio_data)
00194 {
00195
00196
00197
00198
00199
00200
00201 if(indexfile->open_index(current_asset))
00202 {
00203
00204 if(!progress)
00205 {
00206 if(mwindow->gui) mwindow->gui->lock_window("MainIndexes::run 1");
00207 progress = mwindow->mainprogress->start_progress(_("Building Indexes..."), 1);
00208 if(mwindow->gui) mwindow->gui->unlock_window();
00209 }
00210
00211
00212
00213 indexfile->create_index(current_asset, progress);
00214
00215 if(progress->is_cancelled()) interrupt_flag = 1;
00216
00217 }
00218 else
00219
00220 {
00221
00222 if(current_asset->index_status == INDEX_NOTTESTED)
00223 {
00224 current_asset->index_status = INDEX_READY;
00225 if(mwindow->gui) mwindow->gui->lock_window("MainIndexes::run 2");
00226 mwindow->edl->set_index_file(current_asset);
00227 if(mwindow->gui) mwindow->gui->unlock_window();
00228 }
00229 indexfile->close_index();
00230 }
00231
00232
00233
00234 }
00235
00236 }
00237
00238 if(progress)
00239 {
00240 if(mwindow->gui) mwindow->gui->lock_window("MainIndexes::run 3");
00241 progress->stop_progress();
00242 delete progress;
00243 if(mwindow->gui) mwindow->gui->unlock_window();
00244 progress = 0;
00245 }
00246
00247
00248
00249
00250
00251
00252 interrupt_lock->unlock();
00253 }
00254 }
00255