Update the Metronome, align to output
This commit is contained in:
parent
8139becb18
commit
519576c31f
@ -54,23 +54,27 @@ Session::add_click (samplepos_t pos, bool emphasis)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
Session::click (samplepos_t start, samplecnt_t nframes)
|
Session::click (samplepos_t cycle_start, samplecnt_t nframes)
|
||||||
{
|
{
|
||||||
vector<TempoMap::BBTPoint> points;
|
vector<TempoMap::BBTPoint> points; // TODO use mempool allocator
|
||||||
samplecnt_t click_distance;
|
|
||||||
|
|
||||||
if (_click_io == 0) {
|
if (_click_io == 0) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* transport_frame is audible-frame (what you hear,
|
||||||
|
* incl output latency). So internally we're ahead,
|
||||||
|
* we need to prepare frames that the user will hear
|
||||||
|
* in "output latency's" worth of time.
|
||||||
|
*/
|
||||||
|
samplecnt_t offset = _click_io->connected_latency (true);
|
||||||
|
|
||||||
Glib::Threads::RWLock::WriterLock clickm (click_lock, Glib::Threads::TRY_LOCK);
|
Glib::Threads::RWLock::WriterLock clickm (click_lock, Glib::Threads::TRY_LOCK);
|
||||||
|
|
||||||
/* how far have we moved since the last time the clicks got cleared
|
/* how far have we moved since the last time the clicks got cleared */
|
||||||
*/
|
const samplecnt_t click_distance = cycle_start + offset - _clicks_cleared;
|
||||||
|
|
||||||
click_distance = start - _clicks_cleared;
|
if (!clickm.locked() || !_clicking || click_data == 0 || ((click_distance + nframes) < 0)) {
|
||||||
|
|
||||||
if (!clickm.locked() || !_clicking || click_data == 0 || ((click_distance + nframes) < _worst_track_latency)) {
|
|
||||||
_click_io->silence (nframes);
|
_click_io->silence (nframes);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -79,18 +83,15 @@ Session::click (samplepos_t start, samplecnt_t nframes)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
start -= _worst_track_latency;
|
/* range to check for clicks */
|
||||||
#ifdef MIXBUS
|
samplepos_t start = cycle_start + offset;
|
||||||
if (_master_out) {
|
|
||||||
start -= _master_out->signal_latency (); // delay signal by mixbus' internal latency
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
/* start could be negative at this point */
|
|
||||||
const samplepos_t end = start + nframes;
|
const samplepos_t end = start + nframes;
|
||||||
/* correct start, potentially */
|
/* correct start, potentially */
|
||||||
start = max (start, (samplepos_t) 0);
|
start = max (start, (samplepos_t) 0);
|
||||||
|
|
||||||
_tempo_map->get_grid (points, start, end);
|
if (end > start) {
|
||||||
|
_tempo_map->get_grid (points, start, end);
|
||||||
|
}
|
||||||
|
|
||||||
if (distance (points.begin(), points.end()) == 0) {
|
if (distance (points.begin(), points.end()) == 0) {
|
||||||
goto run_clicks;
|
goto run_clicks;
|
||||||
@ -102,7 +103,7 @@ Session::click (samplepos_t start, samplecnt_t nframes)
|
|||||||
add_click ((*i).sample, true);
|
add_click ((*i).sample, true);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
if (click_emphasis_data == 0 || (Config->get_use_click_emphasis () == false) || (click_emphasis_data && (*i).beat != 1)) { // XXX why is this check needed ??
|
if (click_emphasis_data == 0 || (Config->get_use_click_emphasis () == false) || (click_emphasis_data && (*i).beat != 1)) { // XXX why is this check needed ?? (*i).beat !=1 must be true here
|
||||||
add_click ((*i).sample, false);
|
add_click ((*i).sample, false);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -111,7 +112,7 @@ Session::click (samplepos_t start, samplecnt_t nframes)
|
|||||||
|
|
||||||
run_clicks:
|
run_clicks:
|
||||||
clickm.release ();
|
clickm.release ();
|
||||||
run_click (start, nframes);
|
run_click (cycle_start, nframes);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -119,6 +120,9 @@ Session::run_click (samplepos_t start, samplepos_t nframes)
|
|||||||
{
|
{
|
||||||
Glib::Threads::RWLock::ReaderLock clickm (click_lock, Glib::Threads::TRY_LOCK);
|
Glib::Threads::RWLock::ReaderLock clickm (click_lock, Glib::Threads::TRY_LOCK);
|
||||||
|
|
||||||
|
/* align to output */
|
||||||
|
start += _click_io->connected_latency (true);
|
||||||
|
|
||||||
if (!clickm.locked() || click_data == 0) {
|
if (!clickm.locked() || click_data == 0) {
|
||||||
_click_io->silence (nframes);
|
_click_io->silence (nframes);
|
||||||
return;
|
return;
|
||||||
|
Loading…
Reference in New Issue
Block a user