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:
parent
bd9d6a3254
commit
833f33b0c9
@ -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 }
|
||||
}
|
||||
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user