jack: fix BBT calculations

Bars + beats are stored in the integral part of the bar field, ticks
in the fractional part.
This commit is contained in:
Wim Taymans 2019-08-29 16:13:02 +02:00
parent 52afbcf077
commit 6dfceccae2

View file

@ -721,7 +721,8 @@ static inline void jack_to_position(jack_position_t *s, struct spa_io_position *
d->bar.signature_num = s->beats_per_bar; d->bar.signature_num = s->beats_per_bar;
d->bar.signature_denom = s->beat_type; d->bar.signature_denom = s->beat_type;
d->bar.bpm = s->beats_per_minute; d->bar.bpm = s->beats_per_minute;
d->bar.beat = (s->bar - 1) * s->beats_per_bar + (s->beat - 1); d->bar.beat = (s->bar - 1) * s->beats_per_bar + (s->beat - 1) +
(s->tick / s->ticks_per_beat);
} }
} }
@ -764,8 +765,8 @@ static inline jack_transport_state_t position_to_jack(struct spa_io_position *s,
d->valid = 0; d->valid = 0;
if (seg->valid & SPA_IO_SEGMENT_VALID_BAR) { if (seg->valid & SPA_IO_SEGMENT_VALID_BAR) {
double min; double abs_beat;
long abs_tick, abs_beat; long beats;
d->valid |= JackPositionBBT; d->valid |= JackPositionBBT;
@ -778,16 +779,16 @@ static inline jack_transport_state_t position_to_jack(struct spa_io_position *s,
d->ticks_per_beat = 1920.0f; d->ticks_per_beat = 1920.0f;
d->beats_per_minute = seg->bar.bpm; d->beats_per_minute = seg->bar.bpm;
min = d->frame / ((double) d->frame_rate * 60.0);
abs_tick = min * d->beats_per_minute * d->ticks_per_beat;
abs_beat = seg->bar.beat; abs_beat = seg->bar.beat;
d->bar = abs_beat / d->beats_per_bar; d->bar = abs_beat / d->beats_per_bar;
d->beat = abs_beat - (d->bar * d->beats_per_bar) + 1; beats = d->bar * d->beats_per_bar;
d->tick = abs_tick - (abs_beat * d->ticks_per_beat); d->bar_start_tick = beats * d->ticks_per_beat;
d->bar_start_tick = d->bar * d->beats_per_bar * d->beat = abs_beat - beats;
d->ticks_per_beat; beats += d->beat;
d->tick = (abs_beat - beats) * d->ticks_per_beat;
d->bar++; d->bar++;
d->beat++;
} }
d->unique_2 = d->unique_1; d->unique_2 = d->unique_1;
return state; return state;