13
0

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
This commit is contained in:
Paul Davis 2006-10-12 15:20:00 +00:00
parent bd9d6a3254
commit 833f33b0c9
8 changed files with 47 additions and 26 deletions

View 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 }
}

View 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);

View 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;

View 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

View 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;

View 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

View 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)
{

View 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