summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2006-10-12 15:20:00 +0000
committerPaul Davis <paul@linuxaudiosystems.com>2006-10-12 15:20:00 +0000
commit833f33b0c95aadafa22f09a5d341805a86372281 (patch)
treeb0f97bfd786a8861286a2cb4c5f7b7370c589531
parentbd9d6a3254b6ccb9e891b78aea5da1b77c4d2275 (diff)
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
-rw-r--r--gtk2_ardour/ardour2_ui.rc1
-rw-r--r--gtk2_ardour/audio_streamview.cc27
-rw-r--r--gtk2_ardour/streamview.cc4
-rw-r--r--libs/ardour/ardour/audioengine.h6
-rw-r--r--libs/ardour/ardour/session.h1
-rw-r--r--libs/ardour/audioengine.cc28
-rw-r--r--libs/ardour/port.cc3
-rw-r--r--libs/gtkmm2ext/gtk_ui.cc3
8 files changed, 47 insertions, 26 deletions
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<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);
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<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;
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<void> 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
@@ -366,10 +363,20 @@ AudioEngine::jack_bufsize_callback (nframes_t nframes)
}
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