#include <sigc++/bind.h>
#include <gtkmm/stock.h>
+#include <gtkmm/messagedialog.h>
#include <gtkmm/separator.h>
#include <gtkmm/table.h>
using namespace std;
using namespace PBD;
using namespace ARDOUR;
+using namespace ARDOUR_UI_UTILS;
std::vector<std::string> AddRouteDialog::channel_combo_strings;
-AddRouteDialog::AddRouteDialog (Session* s)
+AddRouteDialog::AddRouteDialog ()
: ArdourDialog (_("Add Track or Bus"))
, routes_adjustment (1, 1, 128, 1, 4)
, routes_spinner (routes_adjustment)
, configuration_label (_("Configuration:"))
, mode_label (_("Track mode:"))
, instrument_label (_("Instrument:"))
+ , reasonable_synth_id(0)
{
- set_session (s);
-
set_name ("AddRouteDialog");
- set_position (Gtk::WIN_POS_MOUSE);
set_modal (true);
set_skip_taskbar_hint (true);
set_resizable (false);
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);
build_instrument_list ();
instrument_combo.set_model (instrument_list);
instrument_combo.pack_start (instrument_list_columns.name);
- instrument_combo.set_active (0);
+ instrument_combo.set_active (reasonable_synth_id);
instrument_combo.set_button_sensitivity (Gtk::SENSITIVITY_AUTO);
VBox* vbox = manage (new VBox);
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 ()
{
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:
+ {
+ MessageDialog msg (_("Audio+MIDI tracks are intended for use <b>ONLY</b> with plugins that use both audio and MIDI input data\n\n"
+ "If you do not plan to use such a plugin, then use a normal audio or MIDI track instead."),
+ true, MESSAGE_INFO, BUTTONS_OK, true);
+ msg.set_position (WIN_POS_MOUSE);
+ msg.run ();
+ }
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 ()
+
+string
+AddRouteDialog::name_template () const
{
- return track_bus_combo.get_active_row_number () == 0;
+ return name_template_entry.get_text ();
}
bool
-AddRouteDialog::midi_tracks_wanted ()
+AddRouteDialog::name_template_is_default() const
{
- return track_bus_combo.get_active_row_number () == 1;
-}
+ string n = name_template();
-string
-AddRouteDialog::name_template ()
-{
- return name_template_entry.get_text ();
+ if (n == _("Audio") ||
+ n == _("MIDI") ||
+ n == _("Audio+MIDI") ||
+ n == _("Bus")) {
+ return true;
+ }
+
+ return false;
}
int
} else {
fatal << string_compose (X_("programming error: unknown track mode in add route dialog combo = %1"), str)
<< endmsg;
- /*NOTREACHED*/
+ abort(); /*NOTREACHED*/
}
/* keep gcc happy */
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
RouteGroup*
AddRouteDialog::route_group ()
{
- if (route_group_combo.get_active_row_number () == 2) {
+ if (!_session || route_group_combo.get_active_row_number () == 2) {
return 0;
}
route_group_combo.append_text (_("No Group"));
- _session->foreach_route_group (sigc::mem_fun (*this, &AddRouteDialog::add_route_group));
+ if (_session) {
+ _session->foreach_route_group (sigc::mem_fun (*this, &AddRouteDialog::add_route_group));
+ }
route_group_combo.set_active (2);
}
delete g;
route_group_combo.set_active (2);
} else {
- _session->add_route_group (g);
+ if (_session) {
+ _session->add_route_group (g);
+ }
add_route_group (g);
route_group_combo.set_active (3);
}
row[instrument_list_columns.info_ptr] = PluginInfoPtr ();
row[instrument_list_columns.name] = _("-none-");
+ uint32_t n = 1;
for (PluginInfoList::const_iterator i = all_plugs.begin(); i != all_plugs.end(); ++i) {
if (manager.get_status (*i) == PluginManager::Hidden) continue;
- string category = (*i)->category;
-
- /* XXX more finesse is possible here. VST plugins have a
- a specific "instrument" flag, for example.
- */
-
- if ((*i)->n_inputs.n_midi() != 0 && (*i)->n_outputs.n_audio() > 0) {
+ if ((*i)->is_instrument()) {
row = *(instrument_list->append());
row[instrument_list_columns.name] = (*i)->name;
row[instrument_list_columns.info_ptr] = *i;
+ if ((*i)->unique_id == "https://community.ardour.org/node/7596") {
+ reasonable_synth_id = n;
+ }
+ n++;
}
}
}