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:
|
||||
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_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,11 +1117,20 @@ TempoMap::get_points (nframes_t lower, nframes_t upper) const
|
||||
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 ();
|
||||
frames_per_bar = meter->frames_per_bar (*tempo, _frame_rate);
|
||||
beat_frames = tempo->frames_per_beat (_frame_rate);
|
||||
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;
|
||||
|
||||
do {
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user