From: Paul Davis Date: Thu, 12 Oct 2006 15:20:00 +0000 (+0000) Subject: fixes for meter thread using free'd member of AudioEngine, audiostreamview accessing... X-Git-Tag: 2.0beta6~23 X-Git-Url: https://git.carlh.net/gitweb/?a=commitdiff_plain;h=833f33b0c95aadafa22f09a5d341805a86372281;p=ardour.git fixes for meter thread using free'd member of AudioEngine, audiostreamview accessing deleted crossfades, and mute button now has sensible text color when active git-svn-id: svn://localhost/ardour2/trunk@982 d708f5d6-7413-0410-9779-e7cbd77b26cf --- diff --git a/gtk2_ardour/ardour2_ui.rc b/gtk2_ardour/ardour2_ui.rc index 5422a63b8b..f0a09778d1 100644 --- a/gtk2_ardour/ardour2_ui.rc +++ b/gtk2_ardour/ardour2_ui.rc @@ -217,6 +217,7 @@ style "mute_button" = "small_button" bg[ACTIVE] = { 1.0, 0.98, 0.53 } fg[PRELIGHT] = { 0, 0, 0 } + fg[ACTIVE] = { 0, 0, 0 } } diff --git a/gtk2_ardour/audio_streamview.cc b/gtk2_ardour/audio_streamview.cc index 222c920709..c24d393f53 100644 --- a/gtk2_ardour/audio_streamview.cc +++ b/gtk2_ardour/audio_streamview.cc @@ -185,19 +185,22 @@ AudioStreamView::remove_region_view (boost::weak_ptr weak_r) return; } - for (list::iterator i = crossfade_views.begin(); i != crossfade_views.end();) { - list::iterator tmp; - - tmp = i; - ++tmp; - - boost::shared_ptr ar = boost::dynamic_pointer_cast(r); - if (ar && (*i)->crossfade.involves (ar)) { - delete *i; - crossfade_views.erase (i); + if (!_trackview.session().deletion_in_progress()) { + + for (list::iterator i = crossfade_views.begin(); i != crossfade_views.end();) { + list::iterator tmp; + + tmp = i; + ++tmp; + + boost::shared_ptr ar = boost::dynamic_pointer_cast(r); + if (ar && (*i)->crossfade.involves (ar)) { + delete *i; + crossfade_views.erase (i); + } + + i = tmp; } - - i = tmp; } StreamView::remove_region_view(r); diff --git a/gtk2_ardour/streamview.cc b/gtk2_ardour/streamview.cc index 0a35709538..10d409a9b0 100644 --- a/gtk2_ardour/streamview.cc +++ b/gtk2_ardour/streamview.cc @@ -170,6 +170,10 @@ StreamView::remove_region_view (boost::weak_ptr weak_r) boost::shared_ptr r (weak_r.lock()); + if (!r) { + return; + } + for (list::iterator i = region_views.begin(); i != region_views.end(); ++i) { if (((*i)->region()) == r) { delete *i; diff --git a/libs/ardour/ardour/audioengine.h b/libs/ardour/ardour/audioengine.h index e53eb8a85e..7f42aff40c 100644 --- a/libs/ardour/ardour/audioengine.h +++ b/libs/ardour/ardour/audioengine.h @@ -247,8 +247,10 @@ class AudioEngine : public sigc::trackable void meter_thread (); void start_metering_thread (); - Glib::Thread* m_meter_thread; - mutable gint m_meter_exit; + void stop_metering_thread (); + + Glib::Thread* m_meter_thread; + static gint m_meter_exit; }; } // namespace ARDOUR diff --git a/libs/ardour/ardour/session.h b/libs/ardour/ardour/session.h index 2453f30cbf..0cbc168329 100644 --- a/libs/ardour/ardour/session.h +++ b/libs/ardour/ardour/session.h @@ -243,6 +243,7 @@ class Session : public PBD::StatefulDestructible void set_dirty (); void set_clean (); bool dirty() const { return _state_of_the_state & Dirty; } + bool deletion_in_progress() const { return _state_of_the_state & Deletion; } sigc::signal DirtyChanged; std::string sound_dir (bool with_path = true) const; diff --git a/libs/ardour/audioengine.cc b/libs/ardour/audioengine.cc index 2268411aca..4ea9cd66f8 100644 --- a/libs/ardour/audioengine.cc +++ b/libs/ardour/audioengine.cc @@ -43,8 +43,7 @@ using namespace std; using namespace ARDOUR; using namespace PBD; -nframes_t Port::_short_over_length = 2; -nframes_t Port::_long_over_length = 10; +gint AudioEngine::m_meter_exit; AudioEngine::AudioEngine (string client_name) : ports (new Ports) @@ -65,7 +64,7 @@ AudioEngine::AudioEngine (string client_name) _freewheel_thread_registered = false; m_meter_thread = 0; - m_meter_exit = false; + g_atomic_int_set (&m_meter_exit, 0); if (connect_to_jack (client_name)) { throw NoBackendAvailable (); @@ -81,9 +80,7 @@ AudioEngine::~AudioEngine () jack_client_close (_jack); } - if(m_meter_thread) { - g_atomic_int_inc(&m_meter_exit); - } + stop_metering_thread (); } void @@ -365,11 +362,21 @@ AudioEngine::jack_bufsize_callback (nframes_t nframes) return 0; } +void +AudioEngine::stop_metering_thread () +{ + if (m_meter_thread) { + g_atomic_int_set (&m_meter_exit, 1); + } + m_meter_thread->join (); + m_meter_thread = 0; +} + void AudioEngine::start_metering_thread () { - if(m_meter_thread == 0) { - m_meter_thread = Glib::Thread::create (sigc::mem_fun(this, &AudioEngine::meter_thread), false); + if (m_meter_thread == 0) { + m_meter_thread = Glib::Thread::create (sigc::mem_fun(this, &AudioEngine::meter_thread), true); } } @@ -377,10 +384,9 @@ void AudioEngine::meter_thread () { while (g_atomic_int_get(&m_meter_exit) != true) { - Glib::usleep (10000); /* 1/100th sec interval */ - IO::update_meters (); + Glib::usleep (10000); /* 1/100th sec interval */ + IO::update_meters (); } - return; } void diff --git a/libs/ardour/port.cc b/libs/ardour/port.cc index 7ec0d5a05a..6f3a8f858a 100644 --- a/libs/ardour/port.cc +++ b/libs/ardour/port.cc @@ -23,6 +23,9 @@ using namespace ARDOUR; using namespace std; +nframes_t Port::_short_over_length = 2; +nframes_t Port::_long_over_length = 10; + Port::Port (jack_port_t *p) : _port (p) { diff --git a/libs/gtkmm2ext/gtk_ui.cc b/libs/gtkmm2ext/gtk_ui.cc index 55a6bebb02..8dcbbd15f6 100644 --- a/libs/gtkmm2ext/gtk_ui.cc +++ b/libs/gtkmm2ext/gtk_ui.cc @@ -253,7 +253,8 @@ static bool idle_quit () void UI::do_quit () { - Glib::signal_idle().connect (sigc::ptr_fun (idle_quit)); + Main::quit (); + // Glib::signal_idle().connect (sigc::ptr_fun (idle_quit)); } void