The "Stop" button results in ExportHandlerPtr being destroyed.
This must not happen while it's in use -- in particular during
ExportHandler::start_timespan() and ExportHandler::finish_timespan()
/* Status info */
volatile bool stop;
- volatile bool running;
void abort (bool error_occurred = false);
bool aborted () const { return _aborted; }
bool errors () const { return _errors; }
+ bool running () const { return _running; }
+
+ void set_running (bool r) {
+ assert (!_run_lock.trylock()); // must hold lock
+ _running = r;
+ }
+ Glib::Threads::Mutex& lock () { return _run_lock; }
PBD::Signal0<void> Finished;
void finish ();
- bool finished () const { return _finished; }
- void cleanup ();
+ void cleanup ();
/* Progress info */
private:
volatile bool _aborted;
volatile bool _errors;
- volatile bool _finished;
+ volatile bool _running;
+ Glib::Threads::Mutex _run_lock;
};
} // namespace ARDOUR
/* Start export */
+ Glib::Threads::Mutex::Lock l (export_status->lock());
start_timespan ();
}
if (config_map.empty()) {
// freewheeling has to be stopped from outside the process cycle
- export_status->running = false;
+ export_status->set_running (false);
return;
}
int
ExportHandler::process (framecnt_t frames)
{
- if (!export_status->running) {
+ if (!export_status->running ()) {
return 0;
} else if (normalizing) {
+ Glib::Threads::Mutex::Lock l (export_status->lock());
return process_normalize ();
} else {
+ Glib::Threads::Mutex::Lock l (export_status->lock());
return process_timespan (frames);
}
}
void
ExportStatus::init ()
{
+ Glib::Threads::Mutex::Lock l (_run_lock);
stop = false;
- running = false;
+ _running = false;
_aborted = false;
- _finished = false;
_errors = false;
active_job = Exporting;
void
ExportStatus::abort (bool error_occurred)
{
+ Glib::Threads::Mutex::Lock l (_run_lock);
_aborted = true;
- _finished = true;
_errors = _errors || error_occurred;
- running = false;
+ _running = false;
}
void
ExportStatus::finish ()
{
- _finished = true;
- running = false;
+ Glib::Threads::Mutex::Lock l (_run_lock);
+ set_running (false);
Finished(); /* EMIT SIGNAL */
}
config.set_external_sync (false);
_exporting = true;
- export_status->running = true;
+ export_status->set_running (true);
export_status->Finished.connect_same_thread (*this, boost::bind (&Session::finalize_audio_export, this));
/* disable MMC output early */