X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fsession_click.cc;h=38cc27be0bcf7d189ba65a92b0a451a8b9a755d3;hb=1bd4c5b3a212460eed1773f6b049d18c89625565;hp=6bf62bb272e87927dbcbec1c9649e867aaf68a78;hpb=8af0757b61990767f2a85e68f535a5af9976fd79;p=ardour.git diff --git a/libs/ardour/session_click.cc b/libs/ardour/session_click.cc index 6bf62bb272..38cc27be0b 100644 --- a/libs/ardour/session_click.cc +++ b/libs/ardour/session_click.cc @@ -32,22 +32,25 @@ using namespace std; using namespace ARDOUR; +using namespace PBD; Pool Session::Click::pool ("click", sizeof (Click), 128); void -Session::click (jack_nframes_t start, jack_nframes_t nframes, jack_nframes_t offset) +Session::click (nframes_t start, nframes_t nframes, nframes_t offset) { TempoMap::BBTPointList *points; - jack_nframes_t end; + nframes_t end; Sample *buf; vector bufs; if (_click_io == 0) { return; } + + Glib::RWLock::WriterLock clickm (click_lock, Glib::TRY_LOCK); - if (_transport_speed != 1.0 || !_clicking || click_data == 0) { + if (!clickm.locked() || _transport_speed != 1.0 || !_clicking || click_data == 0) { _click_io->silence (nframes, offset); return; } @@ -61,49 +64,57 @@ Session::click (jack_nframes_t start, jack_nframes_t nframes, jack_nframes_t off goto run_clicks; } - if (points->empty()) { - delete points; - goto run_clicks; - } - - for (TempoMap::BBTPointList::iterator i = points->begin(); i != points->end(); ++i) { - switch ((*i).type) { - case TempoMap::Beat: - if (click_emphasis_data == 0 || (click_emphasis_data && (*i).beat != 1)) { - clicks.push_back (new Click ((*i).frame, click_length, click_data)); + if (!points->empty()) { + + for (TempoMap::BBTPointList::iterator i = points->begin(); i != points->end(); ++i) { + switch ((*i).type) { + case TempoMap::Beat: + if (click_emphasis_data == 0 || (click_emphasis_data && (*i).beat != 1)) { + clicks.push_back (new Click ((*i).frame, click_length, click_data)); + } + break; + + case TempoMap::Bar: + if (click_emphasis_data) { + clicks.push_back (new Click ((*i).frame, click_emphasis_length, click_emphasis_data)); + } + break; } - break; - - case TempoMap::Bar: - if (click_emphasis_data) { - clicks.push_back (new Click ((*i).frame, click_emphasis_length, click_emphasis_data)); - } - break; } } - + + delete points; + run_clicks: + memset (buf, 0, sizeof (Sample) * nframes); for (list::iterator i = clicks.begin(); i != clicks.end(); ) { - jack_nframes_t copy; - jack_nframes_t internal_offset; + nframes_t copy; + nframes_t internal_offset; Click *clk; list::iterator next; clk = *i; next = i; ++next; - + if (clk->start < start) { internal_offset = 0; } else { internal_offset = clk->start - start; } + if (nframes < internal_offset) { + /* we've just located or something.. + effectively going backwards. + lets get the flock out of here */ + break; + } + copy = min (clk->duration - clk->offset, nframes - internal_offset); - + memcpy (buf + internal_offset, &clk->data[clk->offset], copy * sizeof (Sample)); clk->offset += copy; @@ -135,17 +146,19 @@ Session::setup_click_sounds (int which) click_data = 0; } - if (click_sound.length() == 0) { + string path = Config->get_click_emphasis_sound(); + + if (path.empty()) { click_data = const_cast (default_click); click_length = default_click_length; } else { - if ((sndfile = sf_open (click_sound.c_str(), SFM_READ, &info)) == 0) { + if ((sndfile = sf_open (path.c_str(), SFM_READ, &info)) == 0) { char errbuf[256]; sf_error_str (0, errbuf, sizeof (errbuf) - 1); - warning << compose (_("cannot open click soundfile %1 (%2)"), click_sound, errbuf) << endmsg; + warning << string_compose (_("cannot open click soundfile %1 (%2)"), path, errbuf) << endmsg; _clicking = false; return; } @@ -172,14 +185,16 @@ Session::setup_click_sounds (int which) click_emphasis_data = 0; } - if (click_emphasis_sound.length() == 0) { + string path = Config->get_click_emphasis_sound(); + + if (path.empty()) { click_emphasis_data = const_cast (default_click_emphasis); click_emphasis_length = default_click_emphasis_length; } else { - if ((sndfile = sf_open (click_emphasis_sound.c_str(), SFM_READ, &info)) == 0) { + if ((sndfile = sf_open (path.c_str(), SFM_READ, &info)) == 0) { char errbuf[256]; sf_error_str (0, errbuf, sizeof (errbuf) - 1); - warning << compose (_("cannot open click emphasis soundfile %1 (%2)"), click_emphasis_sound, errbuf) << endmsg; + warning << string_compose (_("cannot open click emphasis soundfile %1 (%2)"), path, errbuf) << endmsg; return; } @@ -200,7 +215,7 @@ Session::setup_click_sounds (int which) void Session::clear_clicks () { - LockMonitor lm (route_lock, __LINE__, __FILE__); + Glib::RWLock::WriterLock lm (click_lock); for (Clicks::iterator i = clicks.begin(); i != clicks.end(); ++i) { delete *i; @@ -208,46 +223,3 @@ Session::clear_clicks () clicks.clear (); } - -void -Session::set_click_sound (string path) -{ - if (path != click_sound) { - click_sound = path; - setup_click_sounds (1); - } -} - -void -Session::set_click_emphasis_sound (string path) -{ - if (path != click_emphasis_sound) { - click_emphasis_sound = path; - setup_click_sounds (-1); - } -} - -void -Session::set_clicking (bool yn) -{ - if (click_requested != yn) { - click_requested = yn; - - if (yn) { - if (_click_io && click_data) { - _clicking = true; - } - } else { - _clicking = false; - } - - ControlChanged (Clicking); /* EMIT SIGNAL */ - } -} - -bool -Session::get_clicking () const -{ - return click_requested; -} -