triggerbox: somewhat working mechanism for "clear" slot
This commit is contained in:
parent
885f8eb5d1
commit
844bb85d12
@ -945,10 +945,8 @@ TriggerBoxUI::toggle_trigger_isolated (uint64_t n)
|
|||||||
void
|
void
|
||||||
TriggerBoxUI::clear_trigger (uint64_t n)
|
TriggerBoxUI::clear_trigger (uint64_t n)
|
||||||
{
|
{
|
||||||
#if 0 // XXX
|
|
||||||
TriggerPtr trigger = _triggerbox.trigger (n);
|
TriggerPtr trigger = _triggerbox.trigger (n);
|
||||||
trigger->clear_trigger();
|
trigger->set_region (boost::shared_ptr<Region>());
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -177,7 +177,7 @@ class LIBARDOUR_API Trigger : public PBD::Stateful {
|
|||||||
void set_follow_action (FollowAction, uint32_t n);
|
void set_follow_action (FollowAction, uint32_t n);
|
||||||
|
|
||||||
void set_region (boost::shared_ptr<Region>);
|
void set_region (boost::shared_ptr<Region>);
|
||||||
void clear ();
|
void clear_region ();
|
||||||
virtual int set_region_threaded (boost::shared_ptr<Region>) = 0;
|
virtual int set_region_threaded (boost::shared_ptr<Region>) = 0;
|
||||||
boost::shared_ptr<Region> region() const { return _region; }
|
boost::shared_ptr<Region> region() const { return _region; }
|
||||||
|
|
||||||
@ -238,6 +238,8 @@ class LIBARDOUR_API Trigger : public PBD::Stateful {
|
|||||||
void set_pending (Trigger*);
|
void set_pending (Trigger*);
|
||||||
Trigger* swap_pending (Trigger*);
|
Trigger* swap_pending (Trigger*);
|
||||||
|
|
||||||
|
static const Trigger* MagicClearPointerValue;
|
||||||
|
|
||||||
virtual SegmentDescriptor get_segment_descriptor () const = 0;
|
virtual SegmentDescriptor get_segment_descriptor () const = 0;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
@ -65,6 +65,8 @@ namespace ARDOUR {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const Trigger* Trigger::MagicClearPointerValue = (Trigger*) 0xfeedface;
|
||||||
|
|
||||||
Trigger::Trigger (uint32_t n, TriggerBox& b)
|
Trigger::Trigger (uint32_t n, TriggerBox& b)
|
||||||
: _box (b)
|
: _box (b)
|
||||||
, _state (Stopped)
|
, _state (Stopped)
|
||||||
@ -112,7 +114,7 @@ void
|
|||||||
Trigger::set_pending (Trigger* t)
|
Trigger::set_pending (Trigger* t)
|
||||||
{
|
{
|
||||||
Trigger* old = _pending.exchange (t);
|
Trigger* old = _pending.exchange (t);
|
||||||
if (old) {
|
if (old && old != MagicClearPointerValue) {
|
||||||
/* new pending trigger set before existing pending trigger was used */
|
/* new pending trigger set before existing pending trigger was used */
|
||||||
delete old;
|
delete old;
|
||||||
}
|
}
|
||||||
@ -291,9 +293,14 @@ Trigger::set_quantization (Temporal::BBT_Offset const & q)
|
|||||||
void
|
void
|
||||||
Trigger::set_region (boost::shared_ptr<Region> r)
|
Trigger::set_region (boost::shared_ptr<Region> r)
|
||||||
{
|
{
|
||||||
|
/* Called from (G)UI thread */
|
||||||
|
|
||||||
|
std::cerr << "set region to " << r << std::endl;
|
||||||
|
|
||||||
if (!r) {
|
if (!r) {
|
||||||
/* clear operation, no need to talk to the worker thread */
|
/* clear operation, no need to talk to the worker thread */
|
||||||
set_pending ((Trigger*) 0);
|
std::cerr << "set pending to " << Trigger::MagicClearPointerValue << std::endl;
|
||||||
|
set_pending ((Trigger*) Trigger::MagicClearPointerValue);
|
||||||
request_stop ();
|
request_stop ();
|
||||||
} else {
|
} else {
|
||||||
/* load data, do analysis in another thread */
|
/* load data, do analysis in another thread */
|
||||||
@ -301,6 +308,15 @@ Trigger::set_region (boost::shared_ptr<Region> r)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
Trigger::clear_region ()
|
||||||
|
{
|
||||||
|
/* Called from RT process thread */
|
||||||
|
|
||||||
|
std::cerr << "trigger " << index() << " clearing own region\n";
|
||||||
|
_region.reset ();
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
Trigger::set_region_internal (boost::shared_ptr<Region> r)
|
Trigger::set_region_internal (boost::shared_ptr<Region> r)
|
||||||
{
|
{
|
||||||
@ -1752,19 +1768,29 @@ TriggerBox::set_pending (uint32_t slot, Trigger* t)
|
|||||||
void
|
void
|
||||||
TriggerBox::maybe_swap_pending (uint32_t slot)
|
TriggerBox::maybe_swap_pending (uint32_t slot)
|
||||||
{
|
{
|
||||||
|
/* This is called synchronously with process() (i.e. in an RT process
|
||||||
|
thread) and so it is impossible for any Triggers in this TriggerBox
|
||||||
|
to be invoked while this executes.
|
||||||
|
*/
|
||||||
|
|
||||||
Trigger* p = 0;
|
Trigger* p = 0;
|
||||||
|
|
||||||
p = all_triggers[slot]->swap_pending (p);
|
p = all_triggers[slot]->swap_pending (p);
|
||||||
|
|
||||||
if (p) {
|
if (p) {
|
||||||
std::cerr << " box " << order() << " slot " << slot << " pending discovered, switching\n";
|
std::cerr << " box " << order() << " slot " << slot << " pending discovered, switching to " << p << std::endl;
|
||||||
|
|
||||||
if (all_triggers[slot]) {
|
if (p == Trigger::MagicClearPointerValue) {
|
||||||
// _deletion_queue....;
|
all_triggers[slot]->clear_region ();
|
||||||
|
} else {
|
||||||
|
if (all_triggers[slot]) {
|
||||||
|
/* Put existing Trigger for this slot in the deletion queue */
|
||||||
|
// XXX _deletion_queue....;
|
||||||
|
}
|
||||||
|
|
||||||
|
all_triggers[slot].reset (p);
|
||||||
|
TriggerSwapped (slot); /* EMIT SIGNAL */
|
||||||
}
|
}
|
||||||
|
|
||||||
all_triggers[slot].reset (p);
|
|
||||||
TriggerSwapped (slot); /* EMIT SIGNAL */
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2156,12 +2182,6 @@ TriggerBox::run (BufferSet& bufs, samplepos_t start_sample, samplepos_t end_samp
|
|||||||
|
|
||||||
process_midi_trigger_requests (bufs);
|
process_midi_trigger_requests (bufs);
|
||||||
|
|
||||||
for (uint32_t n = 0; n < all_triggers.size(); ++n) {
|
|
||||||
if (all_triggers[n] != _currently_playing) {
|
|
||||||
maybe_swap_pending (n);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* STEP SIX: if at this point there is an active cue, make it trigger
|
/* STEP SIX: if at this point there is an active cue, make it trigger
|
||||||
* our corresponding slot
|
* our corresponding slot
|
||||||
*/
|
*/
|
||||||
@ -2184,6 +2204,16 @@ TriggerBox::run (BufferSet& bufs, samplepos_t start_sample, samplepos_t end_samp
|
|||||||
all_triggers[n]->process_state_requests ();
|
all_triggers[n]->process_state_requests ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (_currently_playing && _currently_playing->state() == Trigger::Stopped) {
|
||||||
|
_currently_playing = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (uint32_t n = 0; n < all_triggers.size(); ++n) {
|
||||||
|
if (all_triggers[n] != _currently_playing) {
|
||||||
|
maybe_swap_pending (n);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* STEP EIGHT: if there is no active slot, see if there any queued up
|
/* STEP EIGHT: if there is no active slot, see if there any queued up
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@ -2323,7 +2353,7 @@ TriggerBox::run (BufferSet& bufs, samplepos_t start_sample, samplepos_t end_samp
|
|||||||
|
|
||||||
if (_currently_playing->use_follow()) {
|
if (_currently_playing->use_follow()) {
|
||||||
int n = determine_next_trigger (_currently_playing->index());
|
int n = determine_next_trigger (_currently_playing->index());
|
||||||
|
std::cerr << "dnt = " << n << endl;
|
||||||
if (n < 0) {
|
if (n < 0) {
|
||||||
DEBUG_TRACE (DEBUG::Triggers, string_compose ("%1 finished, no next trigger\n", _currently_playing->name()));
|
DEBUG_TRACE (DEBUG::Triggers, string_compose ("%1 finished, no next trigger\n", _currently_playing->name()));
|
||||||
_currently_playing = 0;
|
_currently_playing = 0;
|
||||||
@ -2418,6 +2448,10 @@ TriggerBox::determine_next_trigger (uint32_t current)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (runnable == 0 || !all_triggers[current]->region()) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
/* decide which of the two follow actions we're going to use (based on
|
/* decide which of the two follow actions we're going to use (based on
|
||||||
* random number and the probability setting)
|
* random number and the probability setting)
|
||||||
*/
|
*/
|
||||||
|
Loading…
Reference in New Issue
Block a user