fixed gross inefficiency with tempo map most noticable when using the click at large frame positions. also fixed minor memory leak in click code.
git-svn-id: svn://localhost/ardour2/trunk@1006 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
parent
f9812be639
commit
1b39adc4ce
@ -85,6 +85,8 @@ Session::click (nframes_t start, nframes_t nframes, nframes_t offset)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
delete points;
|
||||||
|
|
||||||
run_clicks:
|
run_clicks:
|
||||||
memset (buf, 0, sizeof (Sample) * nframes);
|
memset (buf, 0, sizeof (Sample) * nframes);
|
||||||
|
|
||||||
|
@ -1071,6 +1071,9 @@ TempoMap::get_points (nframes_t lower, nframes_t upper) const
|
|||||||
double beat_frame;
|
double beat_frame;
|
||||||
double beat_frames;
|
double beat_frames;
|
||||||
double frames_per_bar;
|
double frames_per_bar;
|
||||||
|
double delta_bars;
|
||||||
|
double delta_beats;
|
||||||
|
double dummy;
|
||||||
nframes_t limit;
|
nframes_t limit;
|
||||||
|
|
||||||
meter = &first_meter ();
|
meter = &first_meter ();
|
||||||
@ -1100,6 +1103,10 @@ TempoMap::get_points (nframes_t lower, nframes_t upper) const
|
|||||||
Now start generating points.
|
Now start generating points.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
beats_per_bar = meter->beats_per_bar ();
|
||||||
|
frames_per_bar = meter->frames_per_bar (*tempo, _frame_rate);
|
||||||
|
beat_frames = tempo->frames_per_beat (_frame_rate);
|
||||||
|
|
||||||
if (meter->frame() > tempo->frame()) {
|
if (meter->frame() > tempo->frame()) {
|
||||||
bar = meter->start().bars;
|
bar = meter->start().bars;
|
||||||
beat = meter->start().beats;
|
beat = meter->start().beats;
|
||||||
@ -1110,11 +1117,20 @@ TempoMap::get_points (nframes_t lower, nframes_t upper) const
|
|||||||
current = tempo->frame();
|
current = tempo->frame();
|
||||||
}
|
}
|
||||||
|
|
||||||
points = new BBTPointList;
|
/* initialize current to point to the bar/beat just prior to the
|
||||||
|
lower frame bound passed in. assumes that current is initialized
|
||||||
|
above to be on a beat.
|
||||||
|
*/
|
||||||
|
|
||||||
beats_per_bar = meter->beats_per_bar ();
|
delta_bars = (lower-current) / frames_per_bar;
|
||||||
frames_per_bar = meter->frames_per_bar (*tempo, _frame_rate);
|
delta_beats = modf(delta_bars, &dummy) * beats_per_bar;
|
||||||
beat_frames = tempo->frames_per_beat (_frame_rate);
|
current += (floor(delta_bars) * frames_per_bar) + (floor(delta_beats) * beat_frames);
|
||||||
|
|
||||||
|
// adjust bars and beats too
|
||||||
|
bar += (uint32_t) (floor(delta_bars));
|
||||||
|
beat += (uint32_t) (floor(delta_beats));
|
||||||
|
|
||||||
|
points = new BBTPointList;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
|
|
||||||
@ -1197,6 +1213,10 @@ TempoMap::get_points (nframes_t lower, nframes_t upper) const
|
|||||||
beat = 1;
|
beat = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
beats_per_bar = meter->beats_per_bar ();
|
||||||
|
frames_per_bar = meter->frames_per_bar (*tempo, _frame_rate);
|
||||||
|
beat_frames = tempo->frames_per_beat (_frame_rate);
|
||||||
|
|
||||||
++i;
|
++i;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user