13
0

Merge branch 'master' into cairocanvas

This commit is contained in:
Paul Davis 2014-01-15 16:10:09 -05:00
commit a882e96db1
2 changed files with 57 additions and 23 deletions

View File

@ -250,27 +250,26 @@ struct _AEffect
typedef struct _AEffect AEffect; typedef struct _AEffect AEffect;
struct _VstTimeInfo typedef struct _VstTimeInfo
{ {
// 00 /* info from online documentation of VST provided by Steinberg */
double samplePos; double samplePos;
// 08
double sampleRate; double sampleRate;
// unconfirmed 10 18 double nanoSeconds;
char empty1[8 + 8]; double ppqPos;
// 20?
double tempo; double tempo;
// unconfirmed 28 30 38 double barStartPos;
char empty2[8 + 8 + 8]; double cycleStartPos;
// 40? double cycleEndPos;
int timeSigNumerator; int32_t timeSigNumerator;
// 44? int32_t timeSigDenominator;
int timeSigDenominator; int32_t smpteOffset;
// unconfirmed 48 4c 50 int32_t smpteFrameRate;
char empty3[4 + 4 + 4]; int32_t samplesToNextClock;
// 54 int32_t flags;
int flags;
}; } VstTimeInfo;
typedef struct _VstTimeInfo VstTimeInfo; typedef struct _VstTimeInfo VstTimeInfo;

View File

@ -131,21 +131,56 @@ intptr_t Session::vst_callback (
// conversions // conversions
memset(&_timeInfo, 0, sizeof(_timeInfo)); memset(&_timeInfo, 0, sizeof(_timeInfo));
if (session) { if (session) {
_timeInfo.samplePos = session->transport_frame(); framepos_t now = session->transport_frame();
_timeInfo.samplePos = now;
_timeInfo.sampleRate = session->frame_rate(); _timeInfo.sampleRate = session->frame_rate();
_timeInfo.flags = 0; _timeInfo.flags = 0;
const TempoMetric& tm (session->tempo_map().metric_at (now));
if (value & (kVstTempoValid)) { if (value & (kVstTempoValid)) {
const Tempo& t (session->tempo_map().tempo_at (session->transport_frame())); const Tempo& t (tm.tempo());
_timeInfo.tempo = t.beats_per_minute (); _timeInfo.tempo = t.beats_per_minute ();
_timeInfo.flags |= (kVstTempoValid); _timeInfo.flags |= (kVstTempoValid);
} }
if (value & (kVstBarsValid)) { if (value & (kVstBarsValid)) {
const Meter& m (session->tempo_map().meter_at (session->transport_frame())); const Meter& m (tm.meter());
_timeInfo.timeSigNumerator = m.divisions_per_bar (); _timeInfo.timeSigNumerator = m.divisions_per_bar ();
_timeInfo.timeSigDenominator = m.note_divisor (); _timeInfo.timeSigDenominator = m.note_divisor ();
_timeInfo.flags |= (kVstBarsValid); _timeInfo.flags |= (kVstBarsValid);
} }
if (value & (kVstPpqPosValid)) {
Timecode::BBT_Time bbt;
try {
session->tempo_map().bbt_time_rt (now, bbt);
/* Note that this assumes constant
meter/tempo throughout the session. We
can do better than this, because
progressive rock fans demand it.
*/
double ppqBar = double(bbt.bars - 1) * tm.meter().divisions_per_bar();
double ppqBeat = double(bbt.beats - 1);
double ppqTick = double(bbt.ticks) / Timecode::BBT_Time::ticks_per_beat;
// PPQ Pos
_timeInfo.ppqPos = ppqBar + ppqBeat + ppqTick;
_timeInfo.flags |= (kVstPpqPosValid);
} catch (...) {
/* relax */
}
}
_timeInfo.tempo = tm.tempo().beats_per_minute();
_timeInfo.flags |= kVstTempoValid;
// Bars
// _timeInfo.barStartPos = ppqBar;
// _timeInfo.flags |= kVstBarsValid;
// Time Signature
_timeInfo.timeSigNumerator = tm.meter().divisions_per_bar();
_timeInfo.timeSigDenominator = tm.meter().note_divisor();
_timeInfo.flags |= kVstTimeSigValid;
if (session->transport_speed() != 0.0f) { if (session->transport_speed() != 0.0f) {
_timeInfo.flags |= kVstTransportPlaying; _timeInfo.flags |= kVstTransportPlaying;