13
0

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:
Jesse Chappell 2006-10-24 20:08:23 +00:00
parent f9812be639
commit 1b39adc4ce
2 changed files with 26 additions and 4 deletions

View File

@ -85,6 +85,8 @@ Session::click (nframes_t start, nframes_t nframes, nframes_t offset)
}
}
delete points;
run_clicks:
memset (buf, 0, sizeof (Sample) * nframes);

View File

@ -1071,6 +1071,9 @@ TempoMap::get_points (nframes_t lower, nframes_t upper) const
double beat_frame;
double beat_frames;
double frames_per_bar;
double delta_bars;
double delta_beats;
double dummy;
nframes_t limit;
meter = &first_meter ();
@ -1100,6 +1103,10 @@ TempoMap::get_points (nframes_t lower, nframes_t upper) const
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()) {
bar = meter->start().bars;
beat = meter->start().beats;
@ -1110,12 +1117,21 @@ TempoMap::get_points (nframes_t lower, nframes_t upper) const
current = tempo->frame();
}
/* 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.
*/
delta_bars = (lower-current) / frames_per_bar;
delta_beats = modf(delta_bars, &dummy) * beats_per_bar;
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;
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);
do {
if (i == metrics->end()) {
@ -1197,6 +1213,10 @@ TempoMap::get_points (nframes_t lower, nframes_t upper) const
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;
}