fixes for meter thread using free'd member of AudioEngine, audiostreamview accessing...
authorPaul Davis <paul@linuxaudiosystems.com>
Thu, 12 Oct 2006 15:20:00 +0000 (15:20 +0000)
committerPaul Davis <paul@linuxaudiosystems.com>
Thu, 12 Oct 2006 15:20:00 +0000 (15:20 +0000)
git-svn-id: svn://localhost/ardour2/trunk@982 d708f5d6-7413-0410-9779-e7cbd77b26cf

gtk2_ardour/ardour2_ui.rc
gtk2_ardour/audio_streamview.cc
gtk2_ardour/streamview.cc
libs/ardour/ardour/audioengine.h
libs/ardour/ardour/session.h
libs/ardour/audioengine.cc
libs/ardour/port.cc
libs/gtkmm2ext/gtk_ui.cc

index 5422a63b8bc37dc1e5ee5c0b9b68509fe18f5da0..f0a09778d19ec14e0e7e207057093c670ada7f1d 100644 (file)
@@ -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 }
 }
 
 
index 222c920709c7cfdf7e44986cac47e19eae25640b..c24d393f533176c6ad14ccfece277f7ae0b7b940 100644 (file)
@@ -185,19 +185,22 @@ AudioStreamView::remove_region_view (boost::weak_ptr<Region> weak_r)
                return;
        }
 
-       for (list<CrossfadeView *>::iterator i = crossfade_views.begin(); i != crossfade_views.end();) {
-               list<CrossfadeView*>::iterator tmp;
-               
-               tmp = i;
-               ++tmp;
-               
-               boost::shared_ptr<AudioRegion> ar = boost::dynamic_pointer_cast<AudioRegion>(r);
-               if (ar && (*i)->crossfade.involves (ar)) {
-                       delete *i;
-                       crossfade_views.erase (i);
+       if (!_trackview.session().deletion_in_progress()) {
+
+               for (list<CrossfadeView *>::iterator i = crossfade_views.begin(); i != crossfade_views.end();) {
+                       list<CrossfadeView*>::iterator tmp;
+                       
+                       tmp = i;
+                       ++tmp;
+                       
+                       boost::shared_ptr<AudioRegion> ar = boost::dynamic_pointer_cast<AudioRegion>(r);
+                       if (ar && (*i)->crossfade.involves (ar)) {
+                               delete *i;
+                               crossfade_views.erase (i);
+                       }
+                       
+                       i = tmp;
                }
-               
-               i = tmp;
        }
 
        StreamView::remove_region_view(r);
index 0a357095383894c0034303e162e3229121d091d4..10d409a9b0d9700a4d54ce6637ad151569174ea6 100644 (file)
@@ -170,6 +170,10 @@ StreamView::remove_region_view (boost::weak_ptr<Region> weak_r)
 
        boost::shared_ptr<Region> r (weak_r.lock());
 
+       if (!r) {
+               return;
+       }
+
        for (list<RegionView *>::iterator i = region_views.begin(); i != region_views.end(); ++i) {
                if (((*i)->region()) == r) {
                        delete *i;
index e53eb8a85e3b7e7770f6ca3abcdbf640fe47e519..7f42aff40cfade02a2a0dc84e28a9b7605d889ca 100644 (file)
@@ -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
index 2453f30cbf80bac19713eaf24771cc5dea68d93b..0cbc1683290b503f9f8982478bcf796a3840d04a 100644 (file)
@@ -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<void> DirtyChanged;
 
        std::string sound_dir (bool with_path = true) const;
index 2268411aca6cac499625623ab75e120fabbb3c8a..4ea9cd66f8effc6bb91e3360508e62229236dc54 100644 (file)
@@ -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 
index 7ec0d5a05ab2824827b29b965ca30ff16dbada79..6f3a8f858a8f9b9033edd6b330cab11097bac95b 100644 (file)
@@ -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)
 {
index 55a6bebb02ba1313a48543054f118e9b39bbe730..8dcbbd15f6a3c7a49107578dd401e2a806df62fe 100644 (file)
@@ -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