Browse Source

Get time info before setting state and params

pull/6/head
falkTX 9 years ago
parent
commit
36e37ff095
1 changed files with 89 additions and 81 deletions
  1. +89
    -81
      distrho/src/DistrhoPluginLV2.cpp

+ 89
- 81
distrho/src/DistrhoPluginLV2.cpp View File

@@ -241,31 +241,12 @@ public:

void lv2_run(const uint32_t sampleCount)
{
// pre-roll
if (sampleCount == 0)
return updateParameterOutputs();

// Check for updated parameters
float curValue;

for (uint32_t i=0, count=fPlugin.getParameterCount(); i < count; ++i)
{
if (fPortControls[i] == nullptr)
continue;

curValue = *fPortControls[i];

if (fLastControlValues[i] != curValue && ! fPlugin.isParameterOutput(i))
{
fLastControlValues[i] = curValue;
fPlugin.setParameterValue(i, curValue);
}
}

#if DISTRHO_LV2_USE_EVENTS_IN
# if DISTRHO_PLUGIN_WANT_MIDI_INPUT
// cache midi input and time position first
#if DISTRHO_PLUGIN_WANT_MIDI_INPUT
uint32_t midiEventCount = 0;
# endif
#endif

#if DISTRHO_PLUGIN_WANT_MIDI_INPUT || DISTRHO_PLUGIN_WANT_TIMEPOS
LV2_ATOM_SEQUENCE_FOREACH(fPortEventsIn, event)
{
if (event == nullptr)
@@ -279,17 +260,22 @@ public:

const uint8_t* const data((const uint8_t*)(event + 1));

MidiEvent& midiEvent(fMidiEvents[midiEventCount]);
MidiEvent& midiEvent(fMidiEvents[midiEventCount++]);

midiEvent.frame = event->time.frames;
midiEvent.size = event->body.size;

if (midiEvent.size > MidiEvent::kDataSize)
{
midiEvent.dataExt = data;
std::memset(midiEvent.data, 0, MidiEvent::kDataSize);
}
else
{
midiEvent.dataExt = nullptr;
std::memcpy(midiEvent.data, data, midiEvent.size);
}

++midiEventCount;
continue;
}
# endif
@@ -475,10 +461,21 @@ public:
fLastPositionData.beatUnit > 0 &&
fLastPositionData.beatsPerBar > 0.0f);

fPlugin.setTimePosition(fTimePosition);

continue;
}
# endif
# if (DISTRHO_PLUGIN_WANT_STATE && DISTRHO_PLUGIN_HAS_UI)
}
#endif

// check for messages from UI
#if DISTRHO_PLUGIN_WANT_STATE && DISTRHO_PLUGIN_HAS_UI
LV2_ATOM_SEQUENCE_FOREACH(fPortEventsIn, event)
{
if (event == nullptr)
break;

if (event->body.type == fURIDs.distrhoState && fWorker != nullptr)
{
const void* const data((const void*)(event + 1));
@@ -494,92 +491,104 @@ public:
{
fWorker->schedule_work(fWorker->handle, event->body.size, data);
}

continue;
}
# endif
}
#endif

# if DISTRHO_PLUGIN_WANT_TIMEPOS
fPlugin.setTimePosition(fTimePosition);
# endif
// Check for updated parameters
float curValue;

for (uint32_t i=0, count=fPlugin.getParameterCount(); i < count; ++i)
{
if (fPortControls[i] == nullptr)
continue;

curValue = *fPortControls[i];

if (fLastControlValues[i] != curValue && ! fPlugin.isParameterOutput(i))
{
fLastControlValues[i] = curValue;
fPlugin.setParameterValue(i, curValue);
}
}

// Run plugin
if (sampleCount != 0)
{
#if DISTRHO_PLUGIN_WANT_MIDI_INPUT
fPlugin.run(fPortAudioIns, fPortAudioOuts, sampleCount, fMidiEvents, midiEventCount);
fPlugin.run(fPortAudioIns, fPortAudioOuts, sampleCount, fMidiEvents, midiEventCount);
#else
fPlugin.run(fPortAudioIns, fPortAudioOuts, sampleCount);
fPlugin.run(fPortAudioIns, fPortAudioOuts, sampleCount);
#endif

# if DISTRHO_PLUGIN_WANT_TIMEPOS
// update timePos for next callback
if (d_isNotZero(fLastPositionData.speed))
{
if (fLastPositionData.speed > 0.0)
{
// playing forwards
fLastPositionData.frame += sampleCount;
}
else
#if DISTRHO_PLUGIN_WANT_TIMEPOS
// update timePos for next callback
if (d_isNotZero(fLastPositionData.speed))
{
// playing backwards
fLastPositionData.frame -= sampleCount;

if (fLastPositionData.frame < 0)
fLastPositionData.frame = 0;
}
if (fLastPositionData.speed > 0.0)
{
// playing forwards
fLastPositionData.frame += sampleCount;
}
else
{
// playing backwards
fLastPositionData.frame -= sampleCount;

fTimePosition.frame = fLastPositionData.frame;
if (fLastPositionData.frame < 0)
fLastPositionData.frame = 0;
}

if (fTimePosition.bbt.valid)
{
const double beatsPerMinute = fLastPositionData.beatsPerMinute * fLastPositionData.speed;
const double framesPerBeat = 60.0 * fSampleRate / beatsPerMinute;
const double addedBarBeats = double(sampleCount) / framesPerBeat;
fTimePosition.frame = fLastPositionData.frame;

if (fLastPositionData.barBeat >= 0.0f)
if (fTimePosition.bbt.valid)
{
fLastPositionData.barBeat = std::fmod(fLastPositionData.barBeat+addedBarBeats,
fLastPositionData.beatsPerBar);

const double rest = std::fmod(fLastPositionData.barBeat, 1.0);
fTimePosition.bbt.beat = fLastPositionData.barBeat-rest+1.0;
fTimePosition.bbt.tick = rest*fTimePosition.bbt.ticksPerBeat+0.5;
const double beatsPerMinute = fLastPositionData.beatsPerMinute * fLastPositionData.speed;
const double framesPerBeat = 60.0 * fSampleRate / beatsPerMinute;
const double addedBarBeats = double(sampleCount) / framesPerBeat;

if (fLastPositionData.bar >= 0)
if (fLastPositionData.barBeat >= 0.0f)
{
fLastPositionData.bar += std::floor((fLastPositionData.barBeat+addedBarBeats)/
fLastPositionData.barBeat = std::fmod(fLastPositionData.barBeat+addedBarBeats,
fLastPositionData.beatsPerBar);

const double rest = std::fmod(fLastPositionData.barBeat, 1.0);
fTimePosition.bbt.beat = fLastPositionData.barBeat-rest+1.0;
fTimePosition.bbt.tick = rest*fTimePosition.bbt.ticksPerBeat+0.5;

if (fLastPositionData.bar >= 0)
{
fLastPositionData.bar += std::floor((fLastPositionData.barBeat+addedBarBeats)/
fLastPositionData.beatsPerBar);

if (fLastPositionData.bar < 0)
fLastPositionData.bar = 0;
if (fLastPositionData.bar < 0)
fLastPositionData.bar = 0;

fTimePosition.bbt.bar = fLastPositionData.bar + 1;
fTimePosition.bbt.bar = fLastPositionData.bar + 1;

fTimePosition.bbt.barStartTick = fTimePosition.bbt.ticksPerBeat*
fTimePosition.bbt.beatsPerBar*
(fTimePosition.bbt.bar-1);
fTimePosition.bbt.barStartTick = fTimePosition.bbt.ticksPerBeat*
fTimePosition.bbt.beatsPerBar*
(fTimePosition.bbt.bar-1);
}
}
}

fTimePosition.bbt.beatsPerMinute = std::abs(beatsPerMinute);
fTimePosition.bbt.beatsPerMinute = std::abs(beatsPerMinute);
}
}
#endif
}
# endif

updateParameterOutputs();

#if DISTRHO_LV2_USE_EVENTS_OUT
#if DISTRHO_PLUGIN_WANT_STATE && DISTRHO_PLUGIN_HAS_UI
const uint32_t capacity = fPortEventsOut->atom.size;

bool needsInit = true;
uint32_t size, offset = 0;
LV2_Atom_Event* aev;

# if DISTRHO_PLUGIN_WANT_MIDI_OUTPUT
// TODO
# endif
# if (DISTRHO_PLUGIN_WANT_STATE && DISTRHO_PLUGIN_HAS_UI)
// TODO - MIDI Output

for (uint32_t i=0, count=fPlugin.getStateCount(); i < count; ++i)
{
if (! fNeededUiSends[i])
@@ -634,7 +643,6 @@ public:
break;
}
}
# endif
#endif
}



Loading…
Cancel
Save