triggerbox: change bang/unbang semantics. UnBang != Stop
'unbang' is better described as a mouse-up or button-release event * if launch-style is Gate or Repeat, then UnBang will stop the playing clip * in other launch-styles, UnBang is ignored some prior code using UnBang will change to stop_quantized() or request_stop()
This commit is contained in:
parent
2829f4385f
commit
29dc388bbc
|
@ -256,9 +256,8 @@ class LIBARDOUR_API Trigger : public PBD::Stateful {
|
||||||
*/
|
*/
|
||||||
void bang ();
|
void bang ();
|
||||||
|
|
||||||
/* Calling ::unbang() will cause a running Trigger to begin the process
|
/* Calling ::unbang() is equivalent to a mouse-up or note-off
|
||||||
of stopping. If the Trigger is not running, it will move it to a
|
... it MIGHT cause a clip to stop, but more likely has no effect, depending on the slot's launch-style.
|
||||||
full Stopped state.
|
|
||||||
*/
|
*/
|
||||||
void unbang ();
|
void unbang ();
|
||||||
|
|
||||||
|
@ -267,6 +266,10 @@ class LIBARDOUR_API Trigger : public PBD::Stateful {
|
||||||
*/
|
*/
|
||||||
void request_stop ();
|
void request_stop ();
|
||||||
|
|
||||||
|
/* Call ::stop_quantized() to stop a Trigger at the next quantization point.
|
||||||
|
*/
|
||||||
|
void stop_quantized ();
|
||||||
|
|
||||||
virtual void tempo_map_changed() {}
|
virtual void tempo_map_changed() {}
|
||||||
|
|
||||||
virtual pframes_t run (BufferSet&, samplepos_t start_sample, samplepos_t end_sample,
|
virtual pframes_t run (BufferSet&, samplepos_t start_sample, samplepos_t end_sample,
|
||||||
|
|
|
@ -781,6 +781,10 @@ Trigger::jump_stop (BufferSet& bufs, pframes_t dest_offset)
|
||||||
void
|
void
|
||||||
Trigger::begin_stop (bool explicit_stop)
|
Trigger::begin_stop (bool explicit_stop)
|
||||||
{
|
{
|
||||||
|
if (_state == Stopped) {
|
||||||
|
return; /* nothing to do */
|
||||||
|
}
|
||||||
|
|
||||||
/* this is used when we start a tell a currently playing trigger to
|
/* this is used when we start a tell a currently playing trigger to
|
||||||
stop, but wait for quantization first.
|
stop, but wait for quantization first.
|
||||||
*/
|
*/
|
||||||
|
@ -790,6 +794,12 @@ Trigger::begin_stop (bool explicit_stop)
|
||||||
send_property_change (ARDOUR::Properties::running);
|
send_property_change (ARDOUR::Properties::running);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
Trigger::stop_quantized ()
|
||||||
|
{
|
||||||
|
begin_stop(true);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
Trigger::begin_switch (TriggerPtr nxt)
|
Trigger::begin_switch (TriggerPtr nxt)
|
||||||
{
|
{
|
||||||
|
@ -845,14 +855,16 @@ Trigger::process_state_requests (BufferSet& bufs, pframes_t dest_offset)
|
||||||
_state = WaitingForRetrigger;
|
_state = WaitingForRetrigger;
|
||||||
send_property_change (ARDOUR::Properties::running);
|
send_property_change (ARDOUR::Properties::running);
|
||||||
break;
|
break;
|
||||||
case Gate:
|
|
||||||
case Toggle:
|
case Toggle:
|
||||||
|
stop_quantized ();
|
||||||
|
break;
|
||||||
|
case Gate:
|
||||||
case Repeat:
|
case Repeat:
|
||||||
if (_box.active_scene() >= 0) {
|
if (_box.active_scene() >= 0) {
|
||||||
std::cerr << "should not happen, cue launching but launch_style() said " << enum_2_string (launch_style()) << std::endl;
|
std::cerr << "should not happen, cue launching but launch_style() said " << enum_2_string (launch_style()) << std::endl;
|
||||||
} else {
|
} else {
|
||||||
DEBUG_TRACE (DEBUG::Triggers, string_compose ("%1 %2 gate/toggle/repeat => %3\n", index(), enum_2_string (Running), enum_2_string (WaitingToStop)));
|
DEBUG_TRACE (DEBUG::Triggers, string_compose ("%1 %2 gate/repeat => %3\n", index(), enum_2_string (Running), enum_2_string (WaitingToStop)));
|
||||||
begin_stop (true);
|
stop_quantized ();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -880,8 +892,19 @@ Trigger::process_state_requests (BufferSet& bufs, pframes_t dest_offset)
|
||||||
|
|
||||||
switch (_state) {
|
switch (_state) {
|
||||||
case Running:
|
case Running:
|
||||||
begin_stop (true);
|
switch (launch_style()) {
|
||||||
DEBUG_TRACE (DEBUG::Triggers, string_compose ("%1 unbanged, now in WaitingToStop\n", index()));
|
case OneShot:
|
||||||
|
case ReTrigger:
|
||||||
|
case Toggle:
|
||||||
|
/* unbang does nothing, just let it keep playing */
|
||||||
|
break;
|
||||||
|
case Gate:
|
||||||
|
request_stop (); /* stop now */
|
||||||
|
break;
|
||||||
|
case Repeat:
|
||||||
|
stop_quantized ();
|
||||||
|
break;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case Stopped:
|
case Stopped:
|
||||||
|
@ -3435,7 +3458,7 @@ TriggerBox::queue_explict (uint32_t n)
|
||||||
DEBUG_TRACE (DEBUG::Triggers, string_compose ("explicit queue %1, EQ = %2\n", n, explicit_queue.read_space()));
|
DEBUG_TRACE (DEBUG::Triggers, string_compose ("explicit queue %1, EQ = %2\n", n, explicit_queue.read_space()));
|
||||||
|
|
||||||
if (_currently_playing) {
|
if (_currently_playing) {
|
||||||
_currently_playing->unbang ();
|
_currently_playing->begin_stop (false); /* @paul is this necessary/desired? the current clip should stop (only) when the new one starts */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3664,7 +3687,7 @@ void
|
||||||
TriggerBox::stop_all_quantized ()
|
TriggerBox::stop_all_quantized ()
|
||||||
{
|
{
|
||||||
for (uint32_t n = 0; n < all_triggers.size(); ++n) {
|
for (uint32_t n = 0; n < all_triggers.size(); ++n) {
|
||||||
all_triggers[n]->unbang ();
|
all_triggers[n]->stop_quantized ();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3672,7 +3695,7 @@ void
|
||||||
TriggerBox::bang_trigger_at (Triggers::size_type row)
|
TriggerBox::bang_trigger_at (Triggers::size_type row)
|
||||||
{
|
{
|
||||||
TriggerPtr t = trigger(row);
|
TriggerPtr t = trigger(row);
|
||||||
if (t) {
|
if (t && t->region()) {
|
||||||
t->bang();
|
t->bang();
|
||||||
} else {
|
} else {
|
||||||
/* by convention, an empty slot is effectively a STOP button */
|
/* by convention, an empty slot is effectively a STOP button */
|
||||||
|
@ -3684,11 +3707,11 @@ void
|
||||||
TriggerBox::unbang_trigger_at (Triggers::size_type row)
|
TriggerBox::unbang_trigger_at (Triggers::size_type row)
|
||||||
{
|
{
|
||||||
TriggerPtr t = trigger(row);
|
TriggerPtr t = trigger(row);
|
||||||
if (t) {
|
if (t && t->region()) {
|
||||||
t->unbang();
|
t->unbang();
|
||||||
} else {
|
} else {
|
||||||
/* by convention, an empty slot is effectively a STOP button */
|
/* you shouldn't be able to unbang an empty slot; but if this somehow happens we'll just treat it as a */
|
||||||
/* ...but you shouldn't be able to unbang an empty slot; so if this occurs, let's just ignore it */
|
stop_all_quantized();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4005,7 +4028,7 @@ TriggerBox::run (BufferSet& bufs, samplepos_t start_sample, samplepos_t end_samp
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (_currently_playing) {
|
if (_currently_playing) {
|
||||||
_currently_playing->unbang ();
|
_currently_playing->stop_quantized ();
|
||||||
}
|
}
|
||||||
|
|
||||||
_locate_armed = false;
|
_locate_armed = false;
|
||||||
|
|
Loading…
Reference in New Issue