--- /dev/null
+
+/*
+ * CINELERRA
+ * Copyright (C) 2008 Adam Williams <broadcast at earthling dot net>
+ *
+ * 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
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#include "asset.h"
+#include "batch.h"
+#include "channel.h"
+#include "condition.h"
+#include "edl.h"
+#include "edlsession.h"
+#include "mwindow.h"
+#include "question.h"
+#include "record.h"
+#include "recordgui.h"
+#include "recordthread.h"
+
+
+RecordThread::RecordThread(MWindow *mwindow, Record *record)
+ : Thread(1, 0, 0)
+{
+ this->mwindow = mwindow;
+ this->record = record;
+ batch_timed_lock = new Condition(0,"RecordThread::batch_timed_lock");
+
+ done = 0;
+ cron_active = 0;
+}
+
+RecordThread::~RecordThread()
+{
+ if( Thread::running() ) {
+ done = 1;
+ batch_timed_lock->unlock();
+ Thread::cancel();
+ }
+ Thread::join();
+ delete batch_timed_lock;
+}
+
+int RecordThread::cron(Batch *batch)
+{
+ while( !done ) {
+ batch->update_times();
+ time_t t; time(&t);
+ int delay = (int)(batch->time_start - t);
+ int duration = (int)(batch->time_end - t);
+ if( delay <= 1 ) {
+ if( duration < 1 ) return -1;
+ batch->record_duration = duration+1;
+ return 1;
+ }
+ if( delay < 0 || delay > 60 ) delay = 60;
+ else if( (delay -= 3) < 0 ) delay = 1;
+ delay *= 1000000;
+ Thread::enable_cancel();
+ batch_timed_lock->timed_lock(delay, "RecordThread::cron");
+ Thread::disable_cancel();
+ }
+ return 0;
+}
+
+void RecordThread::run()
+{
+ int batch_no = record->get_next_batch(0);
+ done = batch_no >= 0 ? 0 : 1;
+ if( done ) {
+ QuestionWindow *qwindow = new QuestionWindow(mwindow);
+ qwindow->create_objects(_("Re-enable batches and restart?"),1);
+ int result = qwindow->run_window();
+ delete qwindow;
+ if( result == 2 ) {
+ int n = record->record_batches.total();
+ for( int i=0; i<n; ++i )
+ record->record_batches[i]->enabled = 1;
+ record->activate_batch(batch_no = 0);
+ record->record_gui->update_batches();
+ done = 0;
+ }
+ }
+
+ while( !done ) {
+ batch_timed_lock->reset();
+ Batch *batch = record->get_current_batch();
+ Channel *current_channel = record->get_current_channel();
+ Channel *batch_channel = batch->get_current_channel();
+//printf("RecordThread::current channel %s\n",current_channel ? current_channel->title : "None");
+//printf("RecordThread::batch channel %s\n",batch_channel ? batch_channel->title : "None");
+ if( *current_channel != *batch_channel ) {
+ if( batch_channel ) {
+ current_channel = batch_channel;
+//printf("RecordThread::set channel %s\n",batch_channel->title);
+ record->set_channel(batch_channel);
+ record->has_signal();
+ }
+ }
+ int result = cron(batch);
+ if( result > 0 ) {
+ cron_active = 1;
+ batch->recorded = 0;
+ record->pause_input_threads();
+ record->record_gui->reset_audio();
+ record->record_gui->reset_video();
+ record->update_position();
+ record->start_writing_file();
+ record->resume_input_threads();
+printf("RecordThread::Started\n");
+ batch_timed_lock->lock("RecordThread::run");
+printf("RecordThread::Done\n");
+ record->stop_writing();
+ cron_active = 0;
+ }
+ if( result ) {
+ batch_no = record->get_next_batch();
+ if( batch_no < 0 ) { done = -1; batch_no = 0; }
+ record->activate_batch(batch_no);
+ }
+ }
+
+ record->record_gui->update_cron_status(_("Done"));
+ record->record_gui->enable_batch_buttons();
+ if( record->power_off && done < 0 )
+ {
+ mwindow->save_defaults();
+ sleep(2); sync();
+ pid_t pid = vfork();
+ if( pid == 0 ) {
+ const char poweroff[] = "poweroff";
+ char *const argv[] = { (char*)poweroff, 0 };
+ execvp(poweroff ,&argv[0]);
+ perror(_("execvp poweroff failed"));
+ exit(1);
+ }
+ if( pid > 0 )
+ fprintf(stderr,_("poweroff imminent!!!\n"));
+ else
+ perror(_("cant vfork poweroff process"));
+ }
+ cron_active = -1;
+}
+
+