triggerbox: fixed gated trigger behavior
This commit is contained in:
parent
edbafd9f5b
commit
7be493bc46
@ -189,8 +189,17 @@ Trigger::process_state_requests ()
|
|||||||
|
|
||||||
_unbang.fetch_sub (1);
|
_unbang.fetch_sub (1);
|
||||||
|
|
||||||
if (active() && launch_style() == Trigger::Gate) {
|
if (launch_style() == Trigger::Gate) {
|
||||||
_state = WaitingToStop;
|
switch (_state) {
|
||||||
|
case Running:
|
||||||
|
_state = WaitingToStop;
|
||||||
|
DEBUG_TRACE (DEBUG::Triggers, string_compose ("%1 unbanged, now in WaitingToStop\n", index()));
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
/* didn't even get started */
|
||||||
|
_state = Stopped;
|
||||||
|
DEBUG_TRACE (DEBUG::Triggers, string_compose ("%1 unbanged, never started, now stopped\n", index()));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -238,7 +247,7 @@ Trigger::maybe_compute_next_transition (Temporal::Beats const & start, Temporal:
|
|||||||
return RunAll;
|
return RunAll;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (_state == WaitingForRetrigger) {
|
if (_state == WaitingForRetrigger || _state == WaitingToStop) {
|
||||||
/* retrigger time has not been reached, just continue
|
/* retrigger time has not been reached, just continue
|
||||||
to play normally until then.
|
to play normally until then.
|
||||||
*/
|
*/
|
||||||
@ -479,6 +488,7 @@ int
|
|||||||
AudioTrigger::run (BufferSet& bufs, pframes_t nframes, pframes_t dest_offset, bool first)
|
AudioTrigger::run (BufferSet& bufs, pframes_t nframes, pframes_t dest_offset, bool first)
|
||||||
{
|
{
|
||||||
boost::shared_ptr<AudioRegion> ar = boost::dynamic_pointer_cast<AudioRegion>(_region);
|
boost::shared_ptr<AudioRegion> ar = boost::dynamic_pointer_cast<AudioRegion>(_region);
|
||||||
|
const bool long_enough_to_fade = (nframes >= 64);
|
||||||
|
|
||||||
assert (ar);
|
assert (ar);
|
||||||
assert (active());
|
assert (active());
|
||||||
@ -487,12 +497,15 @@ AudioTrigger::run (BufferSet& bufs, pframes_t nframes, pframes_t dest_offset, bo
|
|||||||
|
|
||||||
pframes_t this_read = (pframes_t) std::min ((samplecnt_t) nframes, (data_length - read_index));
|
pframes_t this_read = (pframes_t) std::min ((samplecnt_t) nframes, (data_length - read_index));
|
||||||
|
|
||||||
|
DEBUG_TRACE (DEBUG::Triggers, string_compose ("%1 grab %2 @ %3 dest offset %4\n", index(), this_read, read_index, dest_offset));
|
||||||
|
|
||||||
for (size_t chn = 0; chn < ar->n_channels(); ++chn) {
|
for (size_t chn = 0; chn < ar->n_channels(); ++chn) {
|
||||||
|
|
||||||
size_t channel = chn % data.size();
|
size_t channel = chn % data.size();
|
||||||
Sample* src = data[channel] + read_index;
|
Sample* src = data[channel] + read_index;
|
||||||
AudioBuffer& buf (bufs.get_audio (chn));
|
AudioBuffer& buf (bufs.get_audio (chn));
|
||||||
|
|
||||||
|
|
||||||
if (first) {
|
if (first) {
|
||||||
buf.read_from (src, this_read, dest_offset);
|
buf.read_from (src, this_read, dest_offset);
|
||||||
} else {
|
} else {
|
||||||
@ -534,6 +547,11 @@ AudioTrigger::run (BufferSet& bufs, pframes_t nframes, pframes_t dest_offset, bo
|
|||||||
nframes -= this_read;
|
nframes -= this_read;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (_state == Stopping && long_enough_to_fade) {
|
||||||
|
DEBUG_TRACE (DEBUG::Triggers, string_compose ("%1 was stopping, now stopped\n", index()));
|
||||||
|
_state = Stopped;
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user