Compare commits
7 Commits
d9ebc8e09f
...
c6dade9484
Author | SHA1 | Date |
---|---|---|
Ben Loftis | c6dade9484 | |
Ben Loftis | bdf9cedb0e | |
Ben Loftis | 0851d230cd | |
Ben Loftis | 4f5106ae82 | |
Ben Loftis | 756e0beb1b | |
Ben Loftis | c23210aae8 | |
Ben Loftis | e74a412bcb |
|
@ -73,12 +73,12 @@ VCAMasterStrip::VCAMasterStrip (Session* s, boost::shared_ptr<VCA> v)
|
||||||
_vca->gain_control());
|
_vca->gain_control());
|
||||||
|
|
||||||
solo_button.set_name ("solo button");
|
solo_button.set_name ("solo button");
|
||||||
set_tooltip (solo_button, _("Solo slaves"));
|
set_tooltip (solo_button, _("Solo assigned channels"));
|
||||||
solo_button.signal_button_release_event().connect (sigc::mem_fun (*this, &VCAMasterStrip::solo_release), false);
|
solo_button.signal_button_release_event().connect (sigc::mem_fun (*this, &VCAMasterStrip::solo_release), false);
|
||||||
|
|
||||||
mute_button.set_name ("mute button");
|
mute_button.set_name ("mute button");
|
||||||
mute_button.set_text (_("M"));
|
mute_button.set_text (_("M"));
|
||||||
set_tooltip (mute_button, _("Mute slaves"));
|
set_tooltip (mute_button, _("Mute assigned channels"));
|
||||||
mute_button.signal_button_release_event().connect (sigc::mem_fun (*this, &VCAMasterStrip::mute_release), false);
|
mute_button.signal_button_release_event().connect (sigc::mem_fun (*this, &VCAMasterStrip::mute_release), false);
|
||||||
|
|
||||||
hide_button.set_icon (ArdourIcon::HideEye);
|
hide_button.set_icon (ArdourIcon::HideEye);
|
||||||
|
@ -112,7 +112,7 @@ VCAMasterStrip::VCAMasterStrip (Session* s, boost::shared_ptr<VCA> v)
|
||||||
vertical_button.signal_button_release_event().connect (sigc::mem_fun (*this, &VCAMasterStrip::vertical_button_press));
|
vertical_button.signal_button_release_event().connect (sigc::mem_fun (*this, &VCAMasterStrip::vertical_button_press));
|
||||||
vertical_button.set_fallthrough_to_parent (true);
|
vertical_button.set_fallthrough_to_parent (true);
|
||||||
vertical_button.set_active_color (_vca->presentation_info().color ());
|
vertical_button.set_active_color (_vca->presentation_info().color ());
|
||||||
set_tooltip (vertical_button, _("Click to show slaves only")); /* tooltip updated dynamically */
|
set_tooltip (vertical_button, _("Click to show assigned channels only")); /* tooltip updated dynamically */
|
||||||
|
|
||||||
global_vpacker.set_border_width (0);
|
global_vpacker.set_border_width (0);
|
||||||
global_vpacker.set_spacing (0);
|
global_vpacker.set_spacing (0);
|
||||||
|
|
|
@ -56,19 +56,19 @@ VCATimeAxisView::VCATimeAxisView (PublicEditor& ed, Session* s, ArdourCanvas::Ca
|
||||||
controls_base_unselected_name = X_("ControlMasterBaseUnselected");
|
controls_base_unselected_name = X_("ControlMasterBaseUnselected");
|
||||||
|
|
||||||
solo_button.set_name ("solo button");
|
solo_button.set_name ("solo button");
|
||||||
set_tooltip (solo_button, _("Solo slaves"));
|
set_tooltip (solo_button, _("Solo assigned channels"));
|
||||||
solo_button.signal_button_release_event().connect (sigc::mem_fun (*this, &VCATimeAxisView::solo_release), false);
|
solo_button.signal_button_release_event().connect (sigc::mem_fun (*this, &VCATimeAxisView::solo_release), false);
|
||||||
solo_button.set_can_focus (false);
|
solo_button.set_can_focus (false);
|
||||||
|
|
||||||
mute_button.set_name ("mute button");
|
mute_button.set_name ("mute button");
|
||||||
mute_button.set_text (S_("Mute|M"));
|
mute_button.set_text (S_("Mute|M"));
|
||||||
set_tooltip (mute_button, _("Mute slaves"));
|
set_tooltip (mute_button, _("Mute assigned channels"));
|
||||||
mute_button.signal_button_release_event().connect (sigc::mem_fun (*this, &VCATimeAxisView::mute_release), false);
|
mute_button.signal_button_release_event().connect (sigc::mem_fun (*this, &VCATimeAxisView::mute_release), false);
|
||||||
mute_button.set_can_focus (false);
|
mute_button.set_can_focus (false);
|
||||||
|
|
||||||
drop_button.set_name ("mute button");
|
drop_button.set_name ("mute button");
|
||||||
drop_button.set_text (S_("VCA|D"));
|
drop_button.set_text (S_("VCA|D"));
|
||||||
set_tooltip (drop_button, _("Unassign all slaves"));
|
set_tooltip (drop_button, _("Unassign all channels"));
|
||||||
drop_button.signal_button_release_event().connect (sigc::mem_fun (*this, &VCATimeAxisView::drop_release), false);
|
drop_button.signal_button_release_event().connect (sigc::mem_fun (*this, &VCATimeAxisView::drop_release), false);
|
||||||
drop_button.set_can_focus (false);
|
drop_button.set_can_focus (false);
|
||||||
|
|
||||||
|
@ -461,7 +461,7 @@ VCATimeAxisView::build_display_menu ()
|
||||||
items.push_back (MenuElem (_("Automation"), *automation_action_menu));
|
items.push_back (MenuElem (_("Automation"), *automation_action_menu));
|
||||||
|
|
||||||
items.push_back (SeparatorElem());
|
items.push_back (SeparatorElem());
|
||||||
items.push_back (MenuElem (_("Drop All Slaves"), sigc::mem_fun (*this, &VCATimeAxisView::drop_all_slaves)));
|
items.push_back (MenuElem (_("Drop All Assigned Channels"), sigc::mem_fun (*this, &VCATimeAxisView::drop_all_slaves)));
|
||||||
items.push_back (SeparatorElem());
|
items.push_back (SeparatorElem());
|
||||||
items.push_back (MenuElem (_("Remove"), sigc::mem_fun(_editor, &PublicEditor::remove_tracks)));
|
items.push_back (MenuElem (_("Remove"), sigc::mem_fun(_editor, &PublicEditor::remove_tracks)));
|
||||||
}
|
}
|
||||||
|
|
|
@ -1375,6 +1375,9 @@ public:
|
||||||
void trigger_cue_row (int32_t);
|
void trigger_cue_row (int32_t);
|
||||||
CueEvents const & cue_events() const { return _cue_events; }
|
CueEvents const & cue_events() const { return _cue_events; }
|
||||||
|
|
||||||
|
int num_triggerboxes () const;
|
||||||
|
boost::shared_ptr<TriggerBox> triggerbox_at (int32_t route_index) const;
|
||||||
|
TriggerPtr trigger_at (int32_t route_index, int32_t row_index) const;
|
||||||
bool bang_trigger_at(int32_t route_index, int32_t row_index);
|
bool bang_trigger_at(int32_t route_index, int32_t row_index);
|
||||||
bool unbang_trigger_at(int32_t route_index, int32_t row_index);
|
bool unbang_trigger_at(int32_t route_index, int32_t row_index);
|
||||||
|
|
||||||
|
|
|
@ -1782,6 +1782,60 @@ Session::unbang_trigger_at (int32_t route_index, int32_t row_index)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
boost::shared_ptr<TriggerBox>
|
||||||
|
Session::triggerbox_at (int32_t route_index) const
|
||||||
|
{
|
||||||
|
int index = 0;
|
||||||
|
StripableList sl;
|
||||||
|
get_stripables (sl);
|
||||||
|
sl.sort (Stripable::Sorter ());
|
||||||
|
for (StripableList::iterator s = sl.begin (); s != sl.end (); ++s) {
|
||||||
|
boost::shared_ptr<Route> r = boost::dynamic_pointer_cast<Route> (*s);
|
||||||
|
if (!r || !r->triggerbox ()) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
/* we're only interested in Trigger Tracks */
|
||||||
|
if (!(r->presentation_info ().trigger_track ())) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (index == route_index) {
|
||||||
|
return r->triggerbox();
|
||||||
|
}
|
||||||
|
index++;
|
||||||
|
}
|
||||||
|
return boost::shared_ptr<TriggerBox>();
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
Session::num_triggerboxes () const
|
||||||
|
{
|
||||||
|
int count = 0;
|
||||||
|
StripableList sl;
|
||||||
|
get_stripables (sl);
|
||||||
|
for (StripableList::iterator s = sl.begin (); s != sl.end (); ++s) {
|
||||||
|
boost::shared_ptr<Route> r = boost::dynamic_pointer_cast<Route> (*s);
|
||||||
|
if (!r || !r->triggerbox ()) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
/* we're only interested in Trigger Tracks */
|
||||||
|
if (!(r->presentation_info ().trigger_track ())) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
||||||
|
TriggerPtr
|
||||||
|
Session::trigger_at (int32_t route_index, int32_t trigger_index) const
|
||||||
|
{
|
||||||
|
boost::shared_ptr<TriggerBox> tb = triggerbox_at(route_index);
|
||||||
|
if (tb) {
|
||||||
|
return tb->trigger(trigger_index);
|
||||||
|
}
|
||||||
|
return TriggerPtr();
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
Session::maybe_find_pending_cue ()
|
Session::maybe_find_pending_cue ()
|
||||||
{
|
{
|
||||||
|
|
|
@ -44,7 +44,11 @@ using namespace Temporal;
|
||||||
PBD::Signal2<void,std::string,std::string> BasicUI::AccessAction;
|
PBD::Signal2<void,std::string,std::string> BasicUI::AccessAction;
|
||||||
|
|
||||||
BasicUI::BasicUI (Session& s)
|
BasicUI::BasicUI (Session& s)
|
||||||
: session (&s)
|
: session (&s),
|
||||||
|
_tbank_route_width (8),
|
||||||
|
_tbank_row_height (8),
|
||||||
|
_tbank_start_route (0),
|
||||||
|
_tbank_start_row (0)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -163,29 +167,7 @@ BasicUI::add_marker (const std::string& markername)
|
||||||
void
|
void
|
||||||
BasicUI::remove_marker_at_playhead ()
|
BasicUI::remove_marker_at_playhead ()
|
||||||
{
|
{
|
||||||
if (session) {
|
access_action("Common/remove-location-from-playhead");
|
||||||
//set up for undo
|
|
||||||
XMLNode &before = session->locations()->get_state();
|
|
||||||
bool removed = false;
|
|
||||||
|
|
||||||
//find location(s) at this time
|
|
||||||
Locations::LocationList locs;
|
|
||||||
session->locations()->find_all_between (timepos_t (session->audible_sample()), timepos_t (session->audible_sample()+1), locs, Location::Flags(0));
|
|
||||||
for (Locations::LocationList::iterator i = locs.begin(); i != locs.end(); ++i) {
|
|
||||||
if ((*i)->is_mark()) {
|
|
||||||
session->locations()->remove (*i);
|
|
||||||
removed = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//store undo
|
|
||||||
if (removed) {
|
|
||||||
session->begin_reversible_command (_("remove marker"));
|
|
||||||
XMLNode &after = session->locations()->get_state();
|
|
||||||
session->add_command(new MementoCommand<Locations>(*(session->locations()), &before, &after));
|
|
||||||
session->commit_reversible_command ();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -423,30 +405,19 @@ BasicUI::save_state ()
|
||||||
void
|
void
|
||||||
BasicUI::prev_marker ()
|
BasicUI::prev_marker ()
|
||||||
{
|
{
|
||||||
timepos_t pos = session->locations()->first_mark_before (timepos_t (session->transport_sample()));
|
access_action("Common/jump-backward-to-mark");
|
||||||
|
|
||||||
if (pos >= 0) {
|
|
||||||
session->request_locate (pos.samples());
|
|
||||||
} else {
|
|
||||||
session->goto_start ();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
BasicUI::next_marker ()
|
BasicUI::next_marker ()
|
||||||
{
|
{
|
||||||
timepos_t pos = session->locations()->first_mark_after (timepos_t (session->transport_sample()));
|
access_action("Common/jump-forward-to-mark");
|
||||||
|
|
||||||
if (pos >= 0) {
|
|
||||||
session->request_locate (pos.samples());
|
|
||||||
} else {
|
|
||||||
session->goto_end();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
BasicUI::set_transport_speed (double speed)
|
BasicUI::set_transport_speed (double speed)
|
||||||
{
|
{
|
||||||
|
session->request_roll (TRS_UI);
|
||||||
session->request_transport_speed (speed);
|
session->request_transport_speed (speed);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -474,6 +445,37 @@ BasicUI::trigger_cue_row (int cue_idx)
|
||||||
session->trigger_cue_row (cue_idx);
|
session->trigger_cue_row (cue_idx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
BasicUI::tbank_set_size (int width, int height)
|
||||||
|
{
|
||||||
|
_tbank_route_width = width;
|
||||||
|
_tbank_row_height = height;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
BasicUI::tbank_step_routes (int step_size)
|
||||||
|
{
|
||||||
|
_tbank_start_route += step_size;
|
||||||
|
if (_tbank_start_route + _tbank_route_width > session->num_triggerboxes() ) {
|
||||||
|
_tbank_start_route=session->num_triggerboxes() - _tbank_route_width;
|
||||||
|
}
|
||||||
|
if (_tbank_start_route < 0) {
|
||||||
|
_tbank_start_route=0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
BasicUI::tbank_step_rows (int step_size)
|
||||||
|
{
|
||||||
|
_tbank_start_row += step_size;
|
||||||
|
if (_tbank_start_row + _tbank_row_height > TriggerBox::default_triggers_per_box ) {
|
||||||
|
_tbank_start_row=TriggerBox::default_triggers_per_box - _tbank_row_height;
|
||||||
|
}
|
||||||
|
if (_tbank_start_row < 0) {
|
||||||
|
_tbank_start_row=0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
BasicUI::undo ()
|
BasicUI::undo ()
|
||||||
{
|
{
|
||||||
|
@ -563,10 +565,12 @@ BasicUI::jump_by_bars (int bars, LocateTransportDisposition ltd)
|
||||||
TempoMap::SharedPtr tmap (TempoMap::fetch());
|
TempoMap::SharedPtr tmap (TempoMap::fetch());
|
||||||
Temporal::BBT_Time bbt (tmap->bbt_at (timepos_t (session->transport_sample())));
|
Temporal::BBT_Time bbt (tmap->bbt_at (timepos_t (session->transport_sample())));
|
||||||
|
|
||||||
bbt.bars += bbt.bars;
|
bbt.bars += bars;
|
||||||
if (bbt.bars < 0) {
|
if (bbt.bars < 0) {
|
||||||
bbt.bars = 1;
|
bbt.bars = 1;
|
||||||
}
|
}
|
||||||
|
bbt.beats = 1;
|
||||||
|
bbt.ticks = 0;
|
||||||
|
|
||||||
session->request_locate (tmap->sample_at (bbt), false, ltd);
|
session->request_locate (tmap->sample_at (bbt), false, ltd);
|
||||||
}
|
}
|
||||||
|
@ -835,16 +839,51 @@ BasicUI::find_trigger (int x, int y)
|
||||||
return tp;
|
return tp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
float
|
||||||
|
BasicUI::trigger_progress_at (int x)
|
||||||
|
{
|
||||||
|
boost::shared_ptr<TriggerBox> tb = session->triggerbox_at (_tbank_start_route + x);
|
||||||
|
if (tb) {
|
||||||
|
ARDOUR::TriggerPtr trigger = tb->currently_playing ();
|
||||||
|
if (trigger) {
|
||||||
|
return trigger->position_as_fraction ();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
BasicUI::TriggerDisplay
|
||||||
|
BasicUI::trigger_display_at (int x, int y)
|
||||||
|
{
|
||||||
|
TriggerDisplay disp;
|
||||||
|
|
||||||
|
boost::shared_ptr<TriggerBox> tb = session->triggerbox_at (_tbank_start_route + x);
|
||||||
|
if (tb) {
|
||||||
|
ARDOUR::TriggerPtr current = tb->currently_playing ();
|
||||||
|
TriggerPtr tp = tb->trigger (_tbank_start_row + y);
|
||||||
|
if (tp) {
|
||||||
|
if (!tp->region()) {
|
||||||
|
disp.state = -1;
|
||||||
|
} else if (tp == current) {
|
||||||
|
disp.state = 1;
|
||||||
|
} else {
|
||||||
|
disp.state = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return disp;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
BasicUI::bang_trigger_at (int x, int y)
|
BasicUI::bang_trigger_at (int x, int y)
|
||||||
{
|
{
|
||||||
session->bang_trigger_at (x, y);
|
session->bang_trigger_at (_tbank_start_route + x, _tbank_start_row + y);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
BasicUI::unbang_trigger_at (int x, int y)
|
BasicUI::unbang_trigger_at (int x, int y)
|
||||||
{
|
{
|
||||||
session->unbang_trigger_at (x, y);
|
session->unbang_trigger_at (_tbank_start_route + x, _tbank_start_row + y);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -167,6 +167,25 @@ class LIBCONTROLCP_API BasicUI {
|
||||||
bool rewind_button_onoff() const;
|
bool rewind_button_onoff() const;
|
||||||
bool loop_button_onoff() const;
|
bool loop_button_onoff() const;
|
||||||
|
|
||||||
|
/* These functions access Triggers in the order they are displayed on the Cue page, WITH an optional bank offset
|
||||||
|
Use this for a launchpad-style NxM (route x row) matrix that maps directly to the Cue page layout.
|
||||||
|
Trigger banking is separate from 'route' banking implemented by a fader surface.
|
||||||
|
To match a fader/mute/solo to the Trigger banking, the tentative plan is:
|
||||||
|
request trigger-tracks-only to be displayed on the surface
|
||||||
|
bank the faders using the offset reported here
|
||||||
|
*/
|
||||||
|
void tbank_set_size (int route_width, int row_height);
|
||||||
|
void tbank_step_routes (int step_size);
|
||||||
|
void tbank_step_rows (int step_size);
|
||||||
|
float trigger_progress_at (int x); /* 0..1 or -1 for not playing; */
|
||||||
|
struct TriggerDisplay {
|
||||||
|
int state;
|
||||||
|
TriggerDisplay () {
|
||||||
|
state = -1; /* -1=empty; 0=stopped; 1=playing */ /*potentially extend to include */
|
||||||
|
//potentially name, color, launch style, follow action(s) etc
|
||||||
|
}
|
||||||
|
};
|
||||||
|
TriggerDisplay trigger_display_at (int x, int y);
|
||||||
void bang_trigger_at (int x, int y);
|
void bang_trigger_at (int x, int y);
|
||||||
void unbang_trigger_at (int x, int y);
|
void unbang_trigger_at (int x, int y);
|
||||||
|
|
||||||
|
@ -176,6 +195,9 @@ class LIBCONTROLCP_API BasicUI {
|
||||||
protected:
|
protected:
|
||||||
BasicUI ();
|
BasicUI ();
|
||||||
ARDOUR::Session* session;
|
ARDOUR::Session* session;
|
||||||
|
|
||||||
|
int _tbank_route_width, _tbank_row_height;
|
||||||
|
int _tbank_start_route, _tbank_start_row;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* __ardour_basic_ui_h__ */
|
#endif /* __ardour_basic_ui_h__ */
|
||||||
|
|
|
@ -117,6 +117,7 @@ OSC::OSC (Session& s, uint32_t port)
|
||||||
, default_send_size (0)
|
, default_send_size (0)
|
||||||
, default_plugin_size (0)
|
, default_plugin_size (0)
|
||||||
, tick (true)
|
, tick (true)
|
||||||
|
, global_init (true)
|
||||||
, bank_dirty (false)
|
, bank_dirty (false)
|
||||||
, observer_busy (true)
|
, observer_busy (true)
|
||||||
, scrub_speed (0)
|
, scrub_speed (0)
|
||||||
|
@ -466,6 +467,9 @@ OSC::register_callbacks()
|
||||||
REGISTER_CALLBACK (serv, X_("/trigger_bang"), "ii", trigger_bang); //Route num (position on the Cue page), Trigger index
|
REGISTER_CALLBACK (serv, X_("/trigger_bang"), "ii", trigger_bang); //Route num (position on the Cue page), Trigger index
|
||||||
REGISTER_CALLBACK (serv, X_("/trigger_unbang"), "ii", trigger_unbang); //Route num (position on the Cue page), Trigger index
|
REGISTER_CALLBACK (serv, X_("/trigger_unbang"), "ii", trigger_unbang); //Route num (position on the Cue page), Trigger index
|
||||||
|
|
||||||
|
REGISTER_CALLBACK (serv, X_("/tbank_step_route"), "i", osc_tbank_step_routes);
|
||||||
|
REGISTER_CALLBACK (serv, X_("/tbank_step_row"), "i", osc_tbank_step_rows);
|
||||||
|
|
||||||
REGISTER_CALLBACK (serv, X_("/save_state"), "", save_state);
|
REGISTER_CALLBACK (serv, X_("/save_state"), "", save_state);
|
||||||
REGISTER_CALLBACK (serv, X_("/save_state"), "f", save_state);
|
REGISTER_CALLBACK (serv, X_("/save_state"), "f", save_state);
|
||||||
REGISTER_CALLBACK (serv, X_("/prev_marker"), "", prev_marker);
|
REGISTER_CALLBACK (serv, X_("/prev_marker"), "", prev_marker);
|
||||||
|
@ -1176,6 +1180,8 @@ OSC::get_surfaces ()
|
||||||
PBD::info << string_compose (" Expanded flag %1 Track: %2 Jogmode: %3\n", sur->expand_enable, sur->expand, sur->jogmode);
|
PBD::info << string_compose (" Expanded flag %1 Track: %2 Jogmode: %3\n", sur->expand_enable, sur->expand, sur->jogmode);
|
||||||
PBD::info << string_compose (" Personal monitor flag %1, Aux master: %2, Number of sends: %3\n", sur->cue, sur->aux, sur->sends.size());
|
PBD::info << string_compose (" Personal monitor flag %1, Aux master: %2, Number of sends: %3\n", sur->cue, sur->aux, sur->sends.size());
|
||||||
PBD::info << string_compose (" Linkset: %1 Device Id: %2\n", sur->linkset, sur->linkid);
|
PBD::info << string_compose (" Linkset: %1 Device Id: %2\n", sur->linkset, sur->linkid);
|
||||||
|
|
||||||
|
PBD::info << string_compose (" Global Observer: %1\n", sur->global_obs != NULL ? "yes" : "NO");
|
||||||
}
|
}
|
||||||
PBD::info << string_compose ("\nList of LinkSets (%1):\n", link_sets.size());
|
PBD::info << string_compose ("\nList of LinkSets (%1):\n", link_sets.size());
|
||||||
std::map<uint32_t, LinkSet>::iterator it;
|
std::map<uint32_t, LinkSet>::iterator it;
|
||||||
|
@ -1305,6 +1311,22 @@ OSC::osc_toggle_roll (bool ret2strt)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
OSC::osc_tbank_step_routes (int step, lo_message msg)
|
||||||
|
{
|
||||||
|
tbank_step_routes(step);
|
||||||
|
trigger_bank_state(get_address(msg));
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
OSC::osc_tbank_step_rows (int step, lo_message msg)
|
||||||
|
{
|
||||||
|
tbank_step_rows(step);
|
||||||
|
trigger_bank_state(get_address(msg));
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
lo_address
|
lo_address
|
||||||
OSC::get_address (lo_message msg)
|
OSC::get_address (lo_message msg)
|
||||||
{
|
{
|
||||||
|
@ -1927,6 +1949,7 @@ OSC::set_surface_feedback (uint32_t fb, lo_message msg)
|
||||||
|
|
||||||
strip_feedback (s, true);
|
strip_feedback (s, true);
|
||||||
global_feedback (s);
|
global_feedback (s);
|
||||||
|
|
||||||
_strip_select (boost::shared_ptr<ARDOUR::Stripable>(), get_address (msg));
|
_strip_select (boost::shared_ptr<ARDOUR::Stripable>(), get_address (msg));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -2085,12 +2108,10 @@ OSC::global_feedback (OSCSurface* sur)
|
||||||
delete o;
|
delete o;
|
||||||
sur->global_obs = 0;
|
sur->global_obs = 0;
|
||||||
}
|
}
|
||||||
if (sur->feedback[4] || sur->feedback[3] || sur->feedback[5] || sur->feedback[6]) {
|
if (sur->feedback[4] || sur->feedback[3] || sur->feedback[5] || sur->feedback[6] || sur->feedback[15]) {
|
||||||
|
|
||||||
// create a new Global Observer for this surface
|
// create a new Global Observer for this surface
|
||||||
OSCGlobalObserver* o = new OSCGlobalObserver (*this, *session, sur);
|
sur->global_obs = new OSCGlobalObserver (*this, *session, sur);
|
||||||
sur->global_obs = o;
|
sur->global_obs->jog_mode (sur->jogmode);
|
||||||
o->jog_mode (sur->jogmode);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3104,6 +3125,39 @@ OSC::jog_mode (float mode, lo_message msg)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
OSC::trigger_bank_state (lo_address addr)
|
||||||
|
{
|
||||||
|
if (!session) return -1;
|
||||||
|
|
||||||
|
lo_message bank_msg = lo_message_new ();
|
||||||
|
lo_message_add_int32 (bank_msg, session->num_triggerboxes()); //total avail routes (with triggers)
|
||||||
|
lo_message_add_int32 (bank_msg, _tbank_start_route); //route start offs
|
||||||
|
lo_message_add_int32 (bank_msg, TriggerBox::default_triggers_per_box); //total avail triggers
|
||||||
|
lo_message_add_int32 (bank_msg, _tbank_start_row); //trigger start offs
|
||||||
|
lo_send_message (addr, X_("/trigger_grid/bank"), bank_msg);
|
||||||
|
lo_message_free (bank_msg);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
OSC::trigger_grid_state (lo_address addr, bool zero_it)
|
||||||
|
{
|
||||||
|
if (!session) return -1;
|
||||||
|
|
||||||
|
for (int rt = 0; rt < 8; rt++) { //TODO: route bank size
|
||||||
|
lo_message trig_msg = lo_message_new ();
|
||||||
|
lo_message_add_float (trig_msg, zero_it ? -1 : trigger_progress_at(rt)); //progress
|
||||||
|
for (int row = 0; row < 8; row++) { //ToDo: trigger bank size
|
||||||
|
lo_message_add_int32 (trig_msg, zero_it ? -1 : trigger_display_at(rt, row).state); // -1 = empty; 0 stopped; 1 playing
|
||||||
|
}
|
||||||
|
lo_send_message (addr, string_compose(X_("/trigger_grid/%1/state"), rt).c_str(), trig_msg);
|
||||||
|
lo_message_free (trig_msg);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
// two structs to help with going to markers
|
// two structs to help with going to markers
|
||||||
struct LocationMarker {
|
struct LocationMarker {
|
||||||
LocationMarker (const std::string& l, samplepos_t w)
|
LocationMarker (const std::string& l, samplepos_t w)
|
||||||
|
@ -5962,9 +6016,8 @@ OSC::periodic (void)
|
||||||
if ((co = dynamic_cast<OSCCueObserver*>(sur->cue_obs)) != 0) {
|
if ((co = dynamic_cast<OSCCueObserver*>(sur->cue_obs)) != 0) {
|
||||||
co->tick ();
|
co->tick ();
|
||||||
}
|
}
|
||||||
OSCGlobalObserver* go;
|
if (sur->global_obs) {
|
||||||
if ((go = dynamic_cast<OSCGlobalObserver*>(sur->global_obs)) != 0) {
|
sur->global_obs->tick ();
|
||||||
go->tick ();
|
|
||||||
}
|
}
|
||||||
for (uint32_t i = 0; i < sur->observers.size(); i++) {
|
for (uint32_t i = 0; i < sur->observers.size(); i++) {
|
||||||
OSCRouteObserver* ro;
|
OSCRouteObserver* ro;
|
||||||
|
@ -5972,7 +6025,6 @@ OSC::periodic (void)
|
||||||
ro->tick ();
|
ro->tick ();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
for (FakeTouchMap::iterator x = _touch_timeout.begin(); x != _touch_timeout.end();) {
|
for (FakeTouchMap::iterator x = _touch_timeout.begin(); x != _touch_timeout.end();) {
|
||||||
_touch_timeout[(*x).first] = (*x).second - 1;
|
_touch_timeout[(*x).first] = (*x).second - 1;
|
||||||
|
|
|
@ -189,6 +189,7 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI<OSCUIRequest>
|
||||||
* [12] - Send Playhead position like primary/secondary GUI clocks
|
* [12] - Send Playhead position like primary/secondary GUI clocks
|
||||||
* [13] - Send well known feedback (for /select/command
|
* [13] - Send well known feedback (for /select/command
|
||||||
* [14] - use OSC 1.0 only (#reply -> /reply)
|
* [14] - use OSC 1.0 only (#reply -> /reply)
|
||||||
|
* [15] - report 8x8 trigger grid status
|
||||||
*
|
*
|
||||||
* Strip_type bits:
|
* Strip_type bits:
|
||||||
* [0] - Audio Tracks
|
* [0] - Audio Tracks
|
||||||
|
@ -264,6 +265,9 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI<OSCUIRequest>
|
||||||
|
|
||||||
CONTROL_PROTOCOL_THREADS_NEED_TEMPO_MAP_DECL();
|
CONTROL_PROTOCOL_THREADS_NEED_TEMPO_MAP_DECL();
|
||||||
|
|
||||||
|
int trigger_bank_state (lo_address addr);
|
||||||
|
int trigger_grid_state (lo_address addr, bool zero_it = false);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void thread_init ();
|
void thread_init ();
|
||||||
void do_request (OSCUIRequest*);
|
void do_request (OSCUIRequest*);
|
||||||
|
@ -521,6 +525,9 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI<OSCUIRequest>
|
||||||
return 0; \
|
return 0; \
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PATH_CALLBACK1_MSG(osc_tbank_step_routes,i);
|
||||||
|
PATH_CALLBACK1_MSG(osc_tbank_step_rows,i);
|
||||||
|
|
||||||
PATH_CALLBACK1_MSG(scrub,f);
|
PATH_CALLBACK1_MSG(scrub,f);
|
||||||
PATH_CALLBACK1_MSG(jog,f);
|
PATH_CALLBACK1_MSG(jog,f);
|
||||||
PATH_CALLBACK1_MSG(jog_mode,f);
|
PATH_CALLBACK1_MSG(jog_mode,f);
|
||||||
|
@ -632,6 +639,9 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI<OSCUIRequest>
|
||||||
PATH_CALLBACK1_MSG(route_plugin_list,i);
|
PATH_CALLBACK1_MSG(route_plugin_list,i);
|
||||||
PATH_CALLBACK2_MSG(route_plugin_descriptor,i,i);
|
PATH_CALLBACK2_MSG(route_plugin_descriptor,i,i);
|
||||||
PATH_CALLBACK2_MSG(route_plugin_reset,i,i);
|
PATH_CALLBACK2_MSG(route_plugin_reset,i,i);
|
||||||
|
|
||||||
|
PATH_CALLBACK2(tbank_set_size,i,i);
|
||||||
|
|
||||||
PATH_CALLBACK2_MSG(trigger_bang,i,i);
|
PATH_CALLBACK2_MSG(trigger_bang,i,i);
|
||||||
PATH_CALLBACK2_MSG(trigger_unbang,i,i);
|
PATH_CALLBACK2_MSG(trigger_unbang,i,i);
|
||||||
PATH_CALLBACK2_MSG(trigger_stop,i,i); /* second arg is 'stop now' */
|
PATH_CALLBACK2_MSG(trigger_stop,i,i); /* second arg is 'stop now' */
|
||||||
|
@ -740,6 +750,9 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI<OSCUIRequest>
|
||||||
void notify_routes_added (ARDOUR::RouteList &);
|
void notify_routes_added (ARDOUR::RouteList &);
|
||||||
void notify_vca_added (ARDOUR::VCAList &);
|
void notify_vca_added (ARDOUR::VCAList &);
|
||||||
|
|
||||||
|
int osc_tbank_step_routes (int step, lo_message msg);
|
||||||
|
int osc_tbank_step_rows (int step, lo_message msg);
|
||||||
|
|
||||||
int cancel_all_solos ();
|
int cancel_all_solos ();
|
||||||
int osc_toggle_roll (bool ret2strt);
|
int osc_toggle_roll (bool ret2strt);
|
||||||
bool periodic (void);
|
bool periodic (void);
|
||||||
|
|
|
@ -173,6 +173,9 @@ OSCGlobalObserver::clear_observer ()
|
||||||
if (feedback[11]) { // minutes/seconds enabled
|
if (feedback[11]) { // minutes/seconds enabled
|
||||||
_osc.text_message (X_("/position/time"), " ", addr);
|
_osc.text_message (X_("/position/time"), " ", addr);
|
||||||
}
|
}
|
||||||
|
if (feedback[15]) { // trigger grid status
|
||||||
|
_osc.trigger_grid_state(addr, true); //zero it out
|
||||||
|
}
|
||||||
if (feedback[10]) { // samples
|
if (feedback[10]) { // samples
|
||||||
_osc.text_message (X_("/position/samples"), " ", addr);
|
_osc.text_message (X_("/position/samples"), " ", addr);
|
||||||
}
|
}
|
||||||
|
@ -226,6 +229,14 @@ OSCGlobalObserver::tick ()
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
samplepos_t now_sample = session->transport_sample();
|
samplepos_t now_sample = session->transport_sample();
|
||||||
|
if (feedback[15]) { // trigger grid status
|
||||||
|
if (_heartbeat == 0) {
|
||||||
|
_osc.trigger_grid_state(addr);
|
||||||
|
_osc.trigger_bank_state(addr);
|
||||||
|
} else if (now_sample != _last_sample) {
|
||||||
|
_osc.trigger_grid_state(addr);
|
||||||
|
}
|
||||||
|
}
|
||||||
if (now_sample != _last_sample) {
|
if (now_sample != _last_sample) {
|
||||||
if (feedback[6]) { // timecode enabled
|
if (feedback[6]) { // timecode enabled
|
||||||
Timecode::Time timecode;
|
Timecode::Time timecode;
|
||||||
|
|
|
@ -395,6 +395,12 @@ OSC_GUI::OSC_GUI (OSC& p)
|
||||||
fbtable->attach (use_osc10, 1, 2, fn, fn+1, AttachOptions(FILL|EXPAND), AttachOptions(0), 0, 0);
|
fbtable->attach (use_osc10, 1, 2, fn, fn+1, AttachOptions(FILL|EXPAND), AttachOptions(0), 0, 0);
|
||||||
++fn;
|
++fn;
|
||||||
|
|
||||||
|
label = manage (new Gtk::Label(_("Report 8x8 Trigger Grid status:")));
|
||||||
|
label->set_alignment(1, .5);
|
||||||
|
fbtable->attach (*label, 0, 1, fn, fn+1, AttachOptions(FILL|EXPAND), AttachOptions(0));
|
||||||
|
fbtable->attach (trigger_status, 1, 2, fn, fn+1, AttachOptions(FILL|EXPAND), AttachOptions(0), 0, 0);
|
||||||
|
++fn;
|
||||||
|
|
||||||
fbtable->show_all ();
|
fbtable->show_all ();
|
||||||
append_page (*fbtable, _("Default Feedback"));
|
append_page (*fbtable, _("Default Feedback"));
|
||||||
// set strips and feedback from loaded default values
|
// set strips and feedback from loaded default values
|
||||||
|
@ -426,6 +432,7 @@ OSC_GUI::OSC_GUI (OSC& p)
|
||||||
hp_gui.signal_clicked().connect (sigc::mem_fun (*this, &OSC_GUI::set_bitsets));
|
hp_gui.signal_clicked().connect (sigc::mem_fun (*this, &OSC_GUI::set_bitsets));
|
||||||
select_fb.signal_clicked().connect (sigc::mem_fun (*this, &OSC_GUI::set_bitsets));
|
select_fb.signal_clicked().connect (sigc::mem_fun (*this, &OSC_GUI::set_bitsets));
|
||||||
use_osc10.signal_clicked().connect (sigc::mem_fun (*this, &OSC_GUI::set_bitsets));
|
use_osc10.signal_clicked().connect (sigc::mem_fun (*this, &OSC_GUI::set_bitsets));
|
||||||
|
trigger_status.signal_clicked().connect (sigc::mem_fun (*this, &OSC_GUI::set_bitsets));
|
||||||
preset_busy = false;
|
preset_busy = false;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -680,6 +687,7 @@ OSC_GUI::reshow_values ()
|
||||||
//hp_gui.set_active (false); // we don't have this yet (Mixbus wants)
|
//hp_gui.set_active (false); // we don't have this yet (Mixbus wants)
|
||||||
select_fb.set_active(def_feedback & 8192);
|
select_fb.set_active(def_feedback & 8192);
|
||||||
use_osc10.set_active(def_feedback & 16384);
|
use_osc10.set_active(def_feedback & 16384);
|
||||||
|
trigger_status.set_active(def_feedback & 32768);
|
||||||
|
|
||||||
calculate_strip_types ();
|
calculate_strip_types ();
|
||||||
calculate_feedback ();
|
calculate_feedback ();
|
||||||
|
@ -734,6 +742,9 @@ OSC_GUI::calculate_feedback ()
|
||||||
if (use_osc10.get_active()) {
|
if (use_osc10.get_active()) {
|
||||||
fbvalue += 16384;
|
fbvalue += 16384;
|
||||||
}
|
}
|
||||||
|
if (trigger_status.get_active()) {
|
||||||
|
fbvalue += 32768;
|
||||||
|
}
|
||||||
|
|
||||||
current_feedback.set_text(string_compose("%1", fbvalue));
|
current_feedback.set_text(string_compose("%1", fbvalue));
|
||||||
}
|
}
|
||||||
|
|
|
@ -113,6 +113,7 @@ private:
|
||||||
Gtk::CheckButton hp_gui;
|
Gtk::CheckButton hp_gui;
|
||||||
Gtk::CheckButton select_fb;
|
Gtk::CheckButton select_fb;
|
||||||
Gtk::CheckButton use_osc10;
|
Gtk::CheckButton use_osc10;
|
||||||
|
Gtk::CheckButton trigger_status;
|
||||||
int fbvalue;
|
int fbvalue;
|
||||||
void set_bitsets ();
|
void set_bitsets ();
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue