mirror of
https://github.com/Ardour/ardour.git
synced 2025-12-09 00:04:56 +01:00
Midi Busses? why yes!
This commit is contained in:
parent
c07bca3a62
commit
e7181c0cc4
6 changed files with 145 additions and 15 deletions
|
|
@ -77,7 +77,8 @@ AddRouteDialog::AddRouteDialog ()
|
||||||
track_bus_combo.append_text (_("Audio Tracks"));
|
track_bus_combo.append_text (_("Audio Tracks"));
|
||||||
track_bus_combo.append_text (_("MIDI Tracks"));
|
track_bus_combo.append_text (_("MIDI Tracks"));
|
||||||
track_bus_combo.append_text (_("Audio+MIDI Tracks"));
|
track_bus_combo.append_text (_("Audio+MIDI Tracks"));
|
||||||
track_bus_combo.append_text (_("Busses"));
|
track_bus_combo.append_text (_("Audio Busses"));
|
||||||
|
track_bus_combo.append_text (_("MIDI Busses"));
|
||||||
track_bus_combo.set_active (0);
|
track_bus_combo.set_active (0);
|
||||||
|
|
||||||
insert_at_combo.append_text (_("First"));
|
insert_at_combo.append_text (_("First"));
|
||||||
|
|
@ -198,8 +199,10 @@ AddRouteDialog::TypeWanted
|
||||||
AddRouteDialog::type_wanted() const
|
AddRouteDialog::type_wanted() const
|
||||||
{
|
{
|
||||||
std::string str = track_bus_combo.get_active_text();
|
std::string str = track_bus_combo.get_active_text();
|
||||||
if (str == _("Busses")) {
|
if (str == _("Audio Busses")) {
|
||||||
return AudioBus;
|
return AudioBus;
|
||||||
|
} else if (str == _("MIDI Busses")){
|
||||||
|
return MidiBus;
|
||||||
} else if (str == _("MIDI Tracks")){
|
} else if (str == _("MIDI Tracks")){
|
||||||
return MidiTrack;
|
return MidiTrack;
|
||||||
} else if (str == _("Audio+MIDI Tracks")) {
|
} else if (str == _("Audio+MIDI Tracks")) {
|
||||||
|
|
@ -232,6 +235,7 @@ AddRouteDialog::maybe_update_name_template_entry ()
|
||||||
name_template_entry.set_text (_("Audio+MIDI"));
|
name_template_entry.set_text (_("Audio+MIDI"));
|
||||||
break;
|
break;
|
||||||
case AudioBus:
|
case AudioBus:
|
||||||
|
case MidiBus:
|
||||||
name_template_entry.set_text (_("Bus"));
|
name_template_entry.set_text (_("Bus"));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
@ -280,6 +284,14 @@ AddRouteDialog::track_type_chosen ()
|
||||||
mode_label.set_sensitive (true);
|
mode_label.set_sensitive (true);
|
||||||
instrument_label.set_sensitive (false);
|
instrument_label.set_sensitive (false);
|
||||||
break;
|
break;
|
||||||
|
case MidiBus:
|
||||||
|
mode_combo.set_sensitive (false);
|
||||||
|
channel_combo.set_sensitive (false);
|
||||||
|
instrument_combo.set_sensitive (true);
|
||||||
|
configuration_label.set_sensitive (false);
|
||||||
|
mode_label.set_sensitive (true);
|
||||||
|
instrument_label.set_sensitive (true);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
maybe_update_name_template_entry ();
|
maybe_update_name_template_entry ();
|
||||||
|
|
|
||||||
|
|
@ -53,7 +53,8 @@ class AddRouteDialog : public ArdourDialog
|
||||||
AudioTrack,
|
AudioTrack,
|
||||||
MidiTrack,
|
MidiTrack,
|
||||||
MixedTrack,
|
MixedTrack,
|
||||||
AudioBus
|
AudioBus,
|
||||||
|
MidiBus
|
||||||
};
|
};
|
||||||
TypeWanted type_wanted() const;
|
TypeWanted type_wanted() const;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1806,6 +1806,31 @@ restart with more ports."), PROGRAM_NAME));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
ARDOUR_UI::session_add_midi_bus (RouteGroup* route_group, uint32_t how_many, const string& name_template, PluginInfoPtr instrument)
|
||||||
|
{
|
||||||
|
|
||||||
|
if (_session == 0) {
|
||||||
|
warning << _("You cannot add a track without a session already loaded.") << endmsg;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
RouteList routes = _session->new_midi_route (route_group, how_many, name_template, instrument);
|
||||||
|
if (routes.size() != how_many) {
|
||||||
|
error << string_compose(P_("could not create %1 new Midi Bus", "could not create %1 new Midi Busses", how_many), how_many) << endmsg;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
catch (...) {
|
||||||
|
MessageDialog msg (_main_window,
|
||||||
|
string_compose (_("There are insufficient ports available\n\
|
||||||
|
to create a new track or bus.\n\
|
||||||
|
You should save %1, exit and\n\
|
||||||
|
restart with more ports."), PROGRAM_NAME));
|
||||||
|
msg.run ();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
ARDOUR_UI::session_add_midi_route (bool disk, RouteGroup* route_group, uint32_t how_many, const string& name_template, PluginInfoPtr instrument)
|
ARDOUR_UI::session_add_midi_route (bool disk, RouteGroup* route_group, uint32_t how_many, const string& name_template, PluginInfoPtr instrument)
|
||||||
|
|
@ -1815,6 +1840,8 @@ ARDOUR_UI::session_add_midi_route (bool disk, RouteGroup* route_group, uint32_t
|
||||||
|
|
||||||
if (disk) {
|
if (disk) {
|
||||||
session_add_mixed_track (one_midi_channel, one_midi_channel, route_group, how_many, name_template, instrument);
|
session_add_mixed_track (one_midi_channel, one_midi_channel, route_group, how_many, name_template, instrument);
|
||||||
|
} else {
|
||||||
|
session_add_midi_bus (route_group, how_many, name_template, instrument);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -3939,6 +3966,9 @@ ARDOUR_UI::add_route (Gtk::Window* /* ignored */)
|
||||||
case AddRouteDialog::AudioBus:
|
case AddRouteDialog::AudioBus:
|
||||||
session_add_audio_bus (input_chan.n_audio(), output_chan.n_audio(), route_group, count, name_template);
|
session_add_audio_bus (input_chan.n_audio(), output_chan.n_audio(), route_group, count, name_template);
|
||||||
break;
|
break;
|
||||||
|
case AddRouteDialog::MidiBus:
|
||||||
|
session_add_midi_bus (route_group, count, name_template, instrument);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -289,6 +289,7 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr
|
||||||
session_add_audio_route (false, input_channels, output_channels, ARDOUR::Normal, route_group, how_many, name_template);
|
session_add_audio_route (false, input_channels, output_channels, ARDOUR::Normal, route_group, how_many, name_template);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void session_add_midi_track (ARDOUR::RouteGroup* route_group, uint32_t how_many, std::string const & name_template,
|
void session_add_midi_track (ARDOUR::RouteGroup* route_group, uint32_t how_many, std::string const & name_template,
|
||||||
ARDOUR::PluginInfoPtr instrument) {
|
ARDOUR::PluginInfoPtr instrument) {
|
||||||
session_add_midi_route (true, route_group, how_many, name_template, instrument);
|
session_add_midi_route (true, route_group, how_many, name_template, instrument);
|
||||||
|
|
@ -297,9 +298,7 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr
|
||||||
void session_add_mixed_track (const ARDOUR::ChanCount& input, const ARDOUR::ChanCount& output, ARDOUR::RouteGroup* route_group, uint32_t how_many, std::string const & name_template,
|
void session_add_mixed_track (const ARDOUR::ChanCount& input, const ARDOUR::ChanCount& output, ARDOUR::RouteGroup* route_group, uint32_t how_many, std::string const & name_template,
|
||||||
ARDOUR::PluginInfoPtr instrument);
|
ARDOUR::PluginInfoPtr instrument);
|
||||||
|
|
||||||
/*void session_add_midi_bus () {
|
void session_add_midi_bus (ARDOUR::RouteGroup* route_group, uint32_t how_many, std::string const & name_template, ARDOUR::PluginInfoPtr instrument);
|
||||||
session_add_midi_route (false);
|
|
||||||
}*/
|
|
||||||
|
|
||||||
void attach_to_engine ();
|
void attach_to_engine ();
|
||||||
void post_engine ();
|
void post_engine ();
|
||||||
|
|
|
||||||
|
|
@ -585,6 +585,8 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
|
||||||
RouteGroup* route_group = 0, uint32_t how_many = 1, std::string name_template = ""
|
RouteGroup* route_group = 0, uint32_t how_many = 1, std::string name_template = ""
|
||||||
);
|
);
|
||||||
|
|
||||||
|
RouteList new_midi_route (RouteGroup* route_group, uint32_t how_many, std::string name_template = "", boost::shared_ptr<PluginInfo> instrument = boost::shared_ptr<PluginInfo>());
|
||||||
|
|
||||||
void remove_routes (boost::shared_ptr<RouteList>);
|
void remove_routes (boost::shared_ptr<RouteList>);
|
||||||
void remove_route (boost::shared_ptr<Route>);
|
void remove_route (boost::shared_ptr<Route>);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -2435,6 +2435,92 @@ Session::new_midi_track (const ChanCount& input, const ChanCount& output, boost:
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
RouteList
|
||||||
|
Session::new_midi_route (RouteGroup* route_group, uint32_t how_many, string name_template, boost::shared_ptr<PluginInfo> instrument)
|
||||||
|
{
|
||||||
|
string bus_name;
|
||||||
|
uint32_t bus_id = 0;
|
||||||
|
string port;
|
||||||
|
RouteList ret;
|
||||||
|
|
||||||
|
bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("Midi Bus");
|
||||||
|
|
||||||
|
while (how_many) {
|
||||||
|
if (!find_route_name (name_template.empty () ? _("Midi Bus") : name_template, ++bus_id, bus_name, use_number)) {
|
||||||
|
error << "cannot find name for new midi bus" << endmsg;
|
||||||
|
goto failure;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
boost::shared_ptr<Route> bus (new Route (*this, bus_name, Route::Flag(0), DataType::AUDIO)); // XXX Editor::add_routes is not ready for ARDOUR::DataType::MIDI
|
||||||
|
|
||||||
|
if (bus->init ()) {
|
||||||
|
goto failure;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
|
||||||
|
// boost_debug_shared_ptr_mark_interesting (bus.get(), "Route");
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
|
||||||
|
|
||||||
|
if (bus->input()->ensure_io (ChanCount(DataType::MIDI, 1), false, this)) {
|
||||||
|
error << _("cannot configure new midi bus input") << endmsg;
|
||||||
|
goto failure;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (bus->output()->ensure_io (ChanCount(DataType::MIDI, 1), false, this)) {
|
||||||
|
error << _("cannot configure new midi bus output") << endmsg;
|
||||||
|
goto failure;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (route_group) {
|
||||||
|
route_group->add (bus);
|
||||||
|
}
|
||||||
|
if (Config->get_remote_model() == UserOrdered) {
|
||||||
|
bus->set_remote_control_id (next_control_id());
|
||||||
|
}
|
||||||
|
|
||||||
|
ret.push_back (bus);
|
||||||
|
RouteAddedOrRemoved (true); /* EMIT SIGNAL */
|
||||||
|
ARDOUR::GUIIdle ();
|
||||||
|
}
|
||||||
|
|
||||||
|
catch (failed_constructor &err) {
|
||||||
|
error << _("Session: could not create new audio route.") << endmsg;
|
||||||
|
goto failure;
|
||||||
|
}
|
||||||
|
|
||||||
|
catch (AudioEngine::PortRegistrationFailure& pfe) {
|
||||||
|
error << pfe.what() << endmsg;
|
||||||
|
goto failure;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
--how_many;
|
||||||
|
}
|
||||||
|
|
||||||
|
failure:
|
||||||
|
if (!ret.empty()) {
|
||||||
|
StateProtector sp (this);
|
||||||
|
add_routes (ret, false, false, false);
|
||||||
|
|
||||||
|
if (instrument) {
|
||||||
|
for (RouteList::iterator r = ret.begin(); r != ret.end(); ++r) {
|
||||||
|
PluginPtr plugin = instrument->load (*this);
|
||||||
|
boost::shared_ptr<Processor> p (new PluginInsert (*this, plugin));
|
||||||
|
(*r)->add_processor (p, PreFader);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
Session::midi_output_change_handler (IOChange change, void * /*src*/, boost::weak_ptr<Route> wmt)
|
Session::midi_output_change_handler (IOChange change, void * /*src*/, boost::weak_ptr<Route> wmt)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue