diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2012-06-22 01:45:16 +0000 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2012-06-22 01:45:16 +0000 |
commit | d70429a066dfd33cca0b6f64be7014649a9910ca (patch) | |
tree | b5a1df98535bd30d2485778c699f6d7dd758b649 | |
parent | 774e55bcc03139089105a20809d9557d38452486 (diff) |
provide an easier way to add mixed (audio+MIDI) tracks to a session, to facilitate the use of plugins like Reaktor which accept both audio & MIDI data. there's probably still a paradigm shift waiting to happen here but its likely post-3.0.
git-svn-id: svn://localhost/ardour2/branches/3.0@12816 d708f5d6-7413-0410-9779-e7cbd77b26cf
-rw-r--r-- | gtk2_ardour/add_route_dialog.cc | 107 | ||||
-rw-r--r-- | gtk2_ardour/add_route_dialog.h | 12 | ||||
-rw-r--r-- | gtk2_ardour/ardour_ui.cc | 59 | ||||
-rw-r--r-- | gtk2_ardour/ardour_ui.h | 3 | ||||
-rw-r--r-- | gtk2_ardour/editor_audio_import.cc | 5 | ||||
-rw-r--r-- | libs/ardour/ardour/session.h | 1 | ||||
-rw-r--r-- | libs/ardour/session.cc | 13 |
7 files changed, 142 insertions, 58 deletions
diff --git a/gtk2_ardour/add_route_dialog.cc b/gtk2_ardour/add_route_dialog.cc index a3fc0ba730..e267e5496d 100644 --- a/gtk2_ardour/add_route_dialog.cc +++ b/gtk2_ardour/add_route_dialog.cc @@ -77,6 +77,7 @@ AddRouteDialog::AddRouteDialog (Session* s) track_bus_combo.append_text (_("Audio Tracks")); track_bus_combo.append_text (_("MIDI Tracks")); + track_bus_combo.append_text (_("Audio+MIDI Tracks")); track_bus_combo.append_text (_("Busses")); track_bus_combo.set_active (0); @@ -191,6 +192,23 @@ AddRouteDialog::channel_combo_changed () refill_track_modes (); } +AddRouteDialog::TypeWanted +AddRouteDialog::type_wanted() const +{ + switch (track_bus_combo.get_active_row_number ()) { + case 0: + return AudioTrack; + case 1: + return MidiTrack; + case 2: + return MixedTrack; + default: + break; + } + + return AudioBus; +} + void AddRouteDialog::maybe_update_name_template_entry () { @@ -198,59 +216,68 @@ AddRouteDialog::maybe_update_name_template_entry () name_template_entry.get_text() != "" && name_template_entry.get_text() != _("Audio") && name_template_entry.get_text() != _("MIDI") && + name_template_entry.get_text() != _("Audio+MIDI") && name_template_entry.get_text() != _("Bus")) { return; } - if (audio_tracks_wanted ()) { + switch (type_wanted()) { + case AudioTrack: name_template_entry.set_text (_("Audio")); - } else if (midi_tracks_wanted()) { + break; + case MidiTrack: name_template_entry.set_text (_("MIDI")); - } else { + break; + case MixedTrack: + name_template_entry.set_text (_("Audio+MIDI")); + break; + case AudioBus: name_template_entry.set_text (_("Bus")); + break; } } void AddRouteDialog::track_type_chosen () { - if (midi_tracks_wanted()) { + switch (type_wanted()) { + case AudioTrack: + mode_combo.set_sensitive (true); + channel_combo.set_sensitive (true); + instrument_combo.set_sensitive (false); + configuration_label.set_sensitive (true); + mode_label.set_sensitive (true); + instrument_label.set_sensitive (false); + break; + case MidiTrack: channel_combo.set_sensitive (false); mode_combo.set_sensitive (false); instrument_combo.set_sensitive (true); configuration_label.set_sensitive (false); mode_label.set_sensitive (false); instrument_label.set_sensitive (true); - } else if (audio_tracks_wanted()) { - mode_combo.set_sensitive (true); + break; + case MixedTrack: channel_combo.set_sensitive (true); - instrument_combo.set_sensitive (false); + mode_combo.set_sensitive (true); + instrument_combo.set_sensitive (true); configuration_label.set_sensitive (true); mode_label.set_sensitive (true); - instrument_label.set_sensitive (false); - } else { + instrument_label.set_sensitive (true); + break; + case AudioBus: mode_combo.set_sensitive (false); channel_combo.set_sensitive (true); instrument_combo.set_sensitive (false); configuration_label.set_sensitive (true); mode_label.set_sensitive (true); instrument_label.set_sensitive (false); + break; } maybe_update_name_template_entry (); } -bool -AddRouteDialog::audio_tracks_wanted () -{ - return track_bus_combo.get_active_row_number () == 0; -} - -bool -AddRouteDialog::midi_tracks_wanted () -{ - return track_bus_combo.get_active_row_number () == 1; -} string AddRouteDialog::name_template () @@ -303,18 +330,42 @@ AddRouteDialog::mode () return ARDOUR::Normal; } -int +ChanCount AddRouteDialog::channels () { - string str = channel_combo.get_active_text(); - - for (ChannelSetups::iterator i = channel_setups.begin(); i != channel_setups.end(); ++i) { - if (str == (*i).name) { - return (*i).channels; + ChanCount ret; + string str; + switch (type_wanted()) { + case AudioTrack: + case AudioBus: + str = channel_combo.get_active_text(); + for (ChannelSetups::iterator i = channel_setups.begin(); i != channel_setups.end(); ++i) { + if (str == (*i).name) { + ret.set (DataType::AUDIO, (*i).channels); + break; + } + } + ret.set (DataType::MIDI, 0); + break; + + case MidiTrack: + ret.set (DataType::AUDIO, 0); + ret.set (DataType::MIDI, 1); + break; + + case MixedTrack: + str = channel_combo.get_active_text(); + for (ChannelSetups::iterator i = channel_setups.begin(); i != channel_setups.end(); ++i) { + if (str == (*i).name) { + ret.set (DataType::AUDIO, (*i).channels); + break; + } } + ret.set (DataType::MIDI, 1); + break; } - - return 0; + + return ret; } string diff --git a/gtk2_ardour/add_route_dialog.h b/gtk2_ardour/add_route_dialog.h index a39c1ff8b9..f2e2168f14 100644 --- a/gtk2_ardour/add_route_dialog.h +++ b/gtk2_ardour/add_route_dialog.h @@ -48,9 +48,15 @@ class AddRouteDialog : public ArdourDialog AddRouteDialog (ARDOUR::Session*); ~AddRouteDialog (); - bool audio_tracks_wanted (); - bool midi_tracks_wanted (); - int channels (); + enum TypeWanted { + AudioTrack, + MidiTrack, + MixedTrack, + AudioBus + }; + TypeWanted type_wanted() const; + + ARDOUR::ChanCount channels (); int count (); std::string name_template (); diff --git a/gtk2_ardour/ardour_ui.cc b/gtk2_ardour/ardour_ui.cc index e41f712351..b3976f581d 100644 --- a/gtk2_ardour/ardour_ui.cc +++ b/gtk2_ardour/ardour_ui.cc @@ -753,7 +753,6 @@ void ARDOUR_UI::finish() { if (_session) { - int tries = 0; if (_session->dirty()) { vector<string> actions; @@ -1361,7 +1360,8 @@ ARDOUR_UI::open_session () 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_mixed_track (const ChanCount& input, const ChanCount& output, RouteGroup* route_group, + uint32_t how_many, const string& name_template, PluginInfoPtr instrument) { list<boost::shared_ptr<MidiTrack> > tracks; @@ -1371,18 +1371,14 @@ ARDOUR_UI::session_add_midi_route (bool disk, RouteGroup* route_group, uint32_t } try { - if (disk) { - - tracks = _session->new_midi_track (instrument, ARDOUR::Normal, route_group, how_many, name_template); - - if (tracks.size() != how_many) { - if (how_many == 1) { - error << _("could not create a new midi track") << endmsg; - } else { - error << string_compose (_("could not create %1 new midi tracks"), how_many) << endmsg; - } + tracks = _session->new_midi_track (input, output, instrument, ARDOUR::Normal, route_group, how_many, name_template); + + if (tracks.size() != how_many) { + if (how_many == 1) { + error << _("could not create a new mixed track") << endmsg; + } else { + error << string_compose (_("could not create %1 new mixed tracks"), how_many) << endmsg; } - } } @@ -1395,7 +1391,18 @@ restart JACK with more ports."), PROGRAM_NAME)); msg.run (); } } + +void +ARDOUR_UI::session_add_midi_route (bool disk, RouteGroup* route_group, uint32_t how_many, const string& name_template, PluginInfoPtr instrument) +{ + ChanCount one_midi_channel; + one_midi_channel.set (DataType::MIDI, 1); + + if (disk) { + session_add_mixed_track (one_midi_channel, one_midi_channel, route_group, how_many, name_template, instrument); + } +} void ARDOUR_UI::session_add_audio_route ( @@ -3120,8 +3127,8 @@ ARDOUR_UI::add_route (Gtk::Window* float_window) return; } - uint32_t input_chan = add_route_dialog->channels (); - uint32_t output_chan; + ChanCount input_chan= add_route_dialog->channels (); + ChanCount output_chan; string name_template = add_route_dialog->name_template (); PluginInfoPtr instrument = add_route_dialog->requested_instrument (); RouteGroup* route_group = add_route_dialog->route_group (); @@ -3129,19 +3136,29 @@ ARDOUR_UI::add_route (Gtk::Window* float_window) AutoConnectOption oac = Config->get_output_auto_connect(); if (oac & AutoConnectMaster) { - output_chan = (_session->master_out() ? _session->master_out()->n_inputs().n_audio() : input_chan); + output_chan.set (DataType::AUDIO, (_session->master_out() ? _session->master_out()->n_inputs().n_audio() : input_chan.n_audio())); + output_chan.set (DataType::MIDI, 0); } else { output_chan = input_chan; } + cerr << "ARD said " << input_chan << " and " << output_chan << endl; + /* XXX do something with name template */ - if (add_route_dialog->midi_tracks_wanted()) { + switch (add_route_dialog->type_wanted()) { + case AddRouteDialog::AudioTrack: + session_add_audio_track (input_chan.n_audio(), output_chan.n_audio(), add_route_dialog->mode(), route_group, count, name_template); + break; + case AddRouteDialog::MidiTrack: session_add_midi_track (route_group, count, name_template, instrument); - } else if (add_route_dialog->audio_tracks_wanted()) { - session_add_audio_track (input_chan, output_chan, add_route_dialog->mode(), route_group, count, name_template); - } else { - session_add_audio_bus (input_chan, output_chan, route_group, count, name_template); + break; + case AddRouteDialog::MixedTrack: + session_add_mixed_track (input_chan, output_chan, route_group, count, name_template, instrument); + break; + case AddRouteDialog::AudioBus: + session_add_audio_bus (input_chan.n_audio(), output_chan.n_audio(), route_group, count, name_template); + break; } } diff --git a/gtk2_ardour/ardour_ui.h b/gtk2_ardour/ardour_ui.h index 7b4ffb9f0e..4d6f3391fc 100644 --- a/gtk2_ardour/ardour_ui.h +++ b/gtk2_ardour/ardour_ui.h @@ -231,6 +231,9 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr session_add_midi_route (true, route_group, how_many, name_template, instrument); } + 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); + /*void session_add_midi_bus () { session_add_midi_route (false); }*/ diff --git a/gtk2_ardour/editor_audio_import.cc b/gtk2_ardour/editor_audio_import.cc index 8a7e09df2c..a19084e69d 100644 --- a/gtk2_ardour/editor_audio_import.cc +++ b/gtk2_ardour/editor_audio_import.cc @@ -934,7 +934,10 @@ Editor::finish_bringing_in_material (boost::shared_ptr<Region> region, uint32_t existing_track = at.front(); } else if (mr) { - list<boost::shared_ptr<MidiTrack> > mt (_session->new_midi_track (boost::shared_ptr<PluginInfo>(), Normal, 0, 1)); + list<boost::shared_ptr<MidiTrack> > mt (_session->new_midi_track (ChanCount (DataType::MIDI, 1), + ChanCount (DataType::MIDI, 1), + boost::shared_ptr<PluginInfo>(), + Normal, 0, 1)); if (mt.empty()) { return -1; diff --git a/libs/ardour/ardour/session.h b/libs/ardour/ardour/session.h index e75c7aa206..204474d611 100644 --- a/libs/ardour/ardour/session.h +++ b/libs/ardour/ardour/session.h @@ -454,6 +454,7 @@ class Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionLi ); std::list<boost::shared_ptr<MidiTrack> > new_midi_track ( + const ChanCount& input, const ChanCount& output, boost::shared_ptr<PluginInfo> instrument = boost::shared_ptr<PluginInfo>(), TrackMode mode = Normal, RouteGroup* route_group = 0, uint32_t how_many = 1, std::string name_template = "" diff --git a/libs/ardour/session.cc b/libs/ardour/session.cc index 5758130092..be84ed4e53 100644 --- a/libs/ardour/session.cc +++ b/libs/ardour/session.cc @@ -1595,7 +1595,8 @@ Session::count_existing_track_channels (ChanCount& in, ChanCount& out) * @param instrument plugin info for the instrument to insert pre-fader, if any */ list<boost::shared_ptr<MidiTrack> > -Session::new_midi_track (boost::shared_ptr<PluginInfo> instrument, TrackMode mode, RouteGroup* route_group, uint32_t how_many, string name_template) +Session::new_midi_track (const ChanCount& input, const ChanCount& output, boost::shared_ptr<PluginInfo> instrument, + TrackMode mode, RouteGroup* route_group, uint32_t how_many, string name_template) { char track_name[32]; uint32_t track_id = 0; @@ -1604,6 +1605,8 @@ Session::new_midi_track (boost::shared_ptr<PluginInfo> instrument, TrackMode mod list<boost::shared_ptr<MidiTrack> > ret; uint32_t control_id; + cerr << "Adding MIDI track with in = " << input << " out = " << output << endl; + control_id = next_control_id (); bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("MIDI"); @@ -1630,13 +1633,13 @@ Session::new_midi_track (boost::shared_ptr<PluginInfo> instrument, TrackMode mod #endif { Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ()); - if (track->input()->ensure_io (ChanCount(DataType::MIDI, 1), false, this)) { - error << "cannot configure 1 in/1 out configuration for new midi track" << endmsg; + if (track->input()->ensure_io (input, false, this)) { + error << "cannot configure " << input << " out configuration for new midi track" << endmsg; goto failed; } - if (track->output()->ensure_io (ChanCount(DataType::MIDI, 1), false, this)) { - error << "cannot configure 1 in/1 out configuration for new midi track" << endmsg; + if (track->output()->ensure_io (output, false, this)) { + error << "cannot configure " << output << " out configuration for new midi track" << endmsg; goto failed; } } |