From 6ef5c8da56800bbce1c23a9ea51c9a1646d5887f Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Thu, 19 Jan 2006 05:01:43 +0000 Subject: [PATCH] add GUI support to create tape/destructive tracks git-svn-id: svn://localhost/trunk/ardour2@278 d708f5d6-7413-0410-9779-e7cbd77b26cf --- gtk2_ardour/add_route_dialog.cc | 82 ++++++++++++++++++++++++++++++-- gtk2_ardour/add_route_dialog.h | 6 ++- gtk2_ardour/ardour_ui.cc | 21 ++------ gtk2_ardour/ardour_ui.h | 8 ++-- gtk2_ardour/ardour_ui_ed.cc | 2 +- gtk2_ardour/utils.cc | 17 ------- gtk2_ardour/utils.h | 1 - libs/ardour/ardour/audio_track.h | 9 ++-- libs/ardour/ardour/session.h | 2 +- libs/ardour/ardour/types.h | 5 ++ libs/ardour/audio_track.cc | 44 +++++++++++++---- libs/ardour/session.cc | 4 +- 12 files changed, 141 insertions(+), 60 deletions(-) diff --git a/gtk2_ardour/add_route_dialog.cc b/gtk2_ardour/add_route_dialog.cc index 9020b6c74d..85408ca692 100644 --- a/gtk2_ardour/add_route_dialog.cc +++ b/gtk2_ardour/add_route_dialog.cc @@ -22,7 +22,8 @@ #include #include - +#include +#include #include #include "utils.h" @@ -34,7 +35,26 @@ using namespace Gtkmm2ext; using namespace sigc; using namespace std; -extern std::vector channel_combo_strings; +static const char* channel_setup_names[] = { + "mono", + "stereo", + "3 channels", + "4 channels", + "5 channels", + "8 channels", + "manual setup", + 0 +}; + +static const char* track_mode_names[] = { + "normal", + "tape", + 0 +}; + +static vector channel_combo_strings; +static vector track_mode_strings; + AddRouteDialog::AddRouteDialog () : Dialog (_("ardour: add track/bus")), @@ -43,6 +63,15 @@ AddRouteDialog::AddRouteDialog () routes_adjustment (1, 1, 32, 1, 4), routes_spinner (routes_adjustment) { + if (channel_combo_strings.empty()) { + channel_combo_strings = internationalize (channel_setup_names); + } + + if (track_mode_strings.empty()) { + track_mode_strings = internationalize (track_mode_names); + } + + set_name ("AddRouteDialog"); set_wmclass (X_("ardour_add_track_bus"), "Ardour"); set_position (Gtk::WIN_POS_MOUSE); @@ -65,8 +94,15 @@ AddRouteDialog::AddRouteDialog () hbrb->pack_start (bus_button, false, false); set_popdown_strings (channel_combo, channel_combo_strings); + set_popdown_strings (track_mode_combo, track_mode_strings); channel_combo.set_active_text (channel_combo_strings.front()); channel_combo.set_name (X_("ChannelCountSelector")); + + track_button.signal_clicked().connect (mem_fun (*this, &AddRouteDialog::track_type_chosen)); + bus_button.signal_clicked().connect (mem_fun (*this, &AddRouteDialog::track_type_chosen)); + + track_mode_combo.set_active_text (track_mode_strings.front()); + track_mode_combo.set_name (X_("ChannelCountSelector")); #if NOT_USEFUL_YET HBox *hbnt = manage (new HBox); @@ -78,6 +114,7 @@ AddRouteDialog::AddRouteDialog () get_vbox()->pack_start (*hbrb, false, false); get_vbox()->pack_start (*(manage (new Label ("Channel configuration"))), false, false); get_vbox()->pack_start (channel_combo, false, false); + get_vbox()->pack_start (track_mode_combo, false, false, 10); #if NOT_USEFUL_YET get_vbox()->pack_start (*hbnt, false, false); #endif @@ -92,6 +129,16 @@ AddRouteDialog::~AddRouteDialog () { } +void +AddRouteDialog::track_type_chosen () +{ + if (track_button.get_active()) { + track_mode_combo.set_sensitive (true); + } else { + track_mode_combo.set_sensitive (true); + } +} + bool AddRouteDialog::track () { @@ -110,8 +157,37 @@ AddRouteDialog::count () return (int) floor (routes_adjustment.get_value ()); } +ARDOUR::TrackMode +AddRouteDialog::mode () +{ + Glib::ustring str = track_mode_combo.get_active_text(); + if (str == _("normal")) { + return ARDOUR::Normal; + } else if (str == _("tape")) { + return ARDOUR::Destructive; + } else { + fatal << string_compose (X_("programming error: unknown track mode in add route dialog combo = %1"), str) + << endmsg; + /*NOTREACHED*/ + } + /* keep gcc happy */ + return ARDOUR::Normal; +} + int AddRouteDialog::channels () { - return channel_combo_get_channel_count (channel_combo); + string str = channel_combo.get_active_text(); + int chns; + + if (str == _("mono")) { + return 1; + } else if (str == _("stereo")) { + return 2; + } else if ((chns = atoi (str)) != 0) { + return chns; + } else { + return 0; + } } + diff --git a/gtk2_ardour/add_route_dialog.h b/gtk2_ardour/add_route_dialog.h index 76481fe025..759f3208b3 100644 --- a/gtk2_ardour/add_route_dialog.h +++ b/gtk2_ardour/add_route_dialog.h @@ -11,7 +11,7 @@ #include #include -#include +#include class AddRouteDialog : public Gtk::Dialog { @@ -23,6 +23,7 @@ class AddRouteDialog : public Gtk::Dialog std::string name_template (); int channels (); int count (); + ARDOUR::TrackMode mode(); private: Gtk::Entry name_template_entry; @@ -31,6 +32,9 @@ class AddRouteDialog : public Gtk::Dialog Gtk::Adjustment routes_adjustment; Gtk::SpinButton routes_spinner; Gtk::ComboBoxText channel_combo; + Gtk::ComboBoxText track_mode_combo; + + void track_type_chosen (); }; #endif /* __gtk_ardour_add_route_dialog_h__ */ diff --git a/gtk2_ardour/ardour_ui.cc b/gtk2_ardour/ardour_ui.cc index 686652c4eb..eb084fb5ea 100644 --- a/gtk2_ardour/ardour_ui.cc +++ b/gtk2_ardour/ardour_ui.cc @@ -87,19 +87,6 @@ sigc::signal ARDOUR_UI::RapidScreenUpdate; sigc::signal ARDOUR_UI::SuperRapidScreenUpdate; sigc::signal ARDOUR_UI::Clock; -static const char* channel_setup_names[] = { - "mono", - "stereo", - "3 channels", - "4 channels", - "5 channels", - "8 channels", - "manual setup", - 0 -}; - -vector channel_combo_strings; - ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], string rcfile) : Gtkmm2ext::UI ("ardour", argcp, argvp, rcfile), @@ -203,8 +190,6 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], string rcfile) ARDOUR::Session::AskAboutPendingState.connect (mem_fun(*this, &ARDOUR_UI::pending_state_dialog)); - channel_combo_strings = internationalize (channel_setup_names); - /* have to wait for AudioEngine and Configuration before proceeding */ } @@ -903,7 +888,7 @@ ARDOUR_UI::session_add_midi_track () } void -ARDOUR_UI::session_add_audio_route (bool disk, int32_t input_channels, int32_t output_channels) +ARDOUR_UI::session_add_audio_route (bool disk, int32_t input_channels, int32_t output_channels, ARDOUR::TrackMode mode) { Route* route; @@ -914,7 +899,7 @@ ARDOUR_UI::session_add_audio_route (bool disk, int32_t input_channels, int32_t o try { if (disk) { - if ((route = session->new_audio_track (input_channels, output_channels)) == 0) { + if ((route = session->new_audio_track (input_channels, output_channels, mode)) == 0) { error << _("could not create new audio track") << endmsg; } } else { @@ -2086,7 +2071,7 @@ ARDOUR_UI::add_route () while (count) { if (track) { - session_add_audio_track (input_chan, output_chan); + session_add_audio_track (input_chan, output_chan, add_route_dialog->mode()); } else { session_add_audio_bus (input_chan, output_chan); } diff --git a/gtk2_ardour/ardour_ui.h b/gtk2_ardour/ardour_ui.h index f0637ad535..3b1ebd47d7 100644 --- a/gtk2_ardour/ardour_ui.h +++ b/gtk2_ardour/ardour_ui.h @@ -188,12 +188,12 @@ class ARDOUR_UI : public Gtkmm2ext::UI void add_route (); - void session_add_audio_track (int input_channels, int32_t output_channels) { - session_add_audio_route (true, input_channels, output_channels); + void session_add_audio_track (int input_channels, int32_t output_channels, ARDOUR::TrackMode mode) { + session_add_audio_route (true, input_channels, output_channels, mode); } void session_add_audio_bus (int input_channels, int32_t output_channels) { - session_add_audio_route (false, input_channels, output_channels); + session_add_audio_route (false, input_channels, output_channels, ARDOUR::Normal); } void session_add_midi_track (); @@ -523,7 +523,7 @@ class ARDOUR_UI : public Gtkmm2ext::UI void save_template (); - void session_add_audio_route (bool disk, int32_t input_channels, int32_t output_channels); + void session_add_audio_route (bool disk, int32_t input_channels, int32_t output_channels, ARDOUR::TrackMode mode); void add_diskstream_to_menu (ARDOUR::DiskStream&); void diskstream_selected (gint32); diff --git a/gtk2_ardour/ardour_ui_ed.cc b/gtk2_ardour/ardour_ui_ed.cc index b065f55a06..d2f6ea153e 100644 --- a/gtk2_ardour/ardour_ui_ed.cc +++ b/gtk2_ardour/ardour_ui_ed.cc @@ -176,7 +176,7 @@ ARDOUR_UI::install_actions () ActionManager::session_sensitive_actions.push_back (act); ActionManager::register_action (common_actions, X_("About"), _("About"), mem_fun(*this, &ARDOUR_UI::show_splash)); - act = ActionManager::register_action (common_actions, X_("AddAudioTrack"), _("add audio track"), bind (mem_fun(*this, &ARDOUR_UI::session_add_audio_track), 1, 1)); + act = ActionManager::register_action (common_actions, X_("AddAudioTrack"), _("add audio track"), bind (mem_fun(*this, &ARDOUR_UI::session_add_audio_track), 1, 1, ARDOUR::Normal)); ActionManager::session_sensitive_actions.push_back (act); act = ActionManager::register_action (common_actions, X_("AddAudioBus"), _("add audio bus"), bind (mem_fun(*this, &ARDOUR_UI::session_add_audio_bus), 1, 1)); ActionManager::session_sensitive_actions.push_back (act); diff --git a/gtk2_ardour/utils.cc b/gtk2_ardour/utils.cc index acc9574a18..e609d0e33b 100644 --- a/gtk2_ardour/utils.cc +++ b/gtk2_ardour/utils.cc @@ -291,23 +291,6 @@ get_canvas_points (string who, uint32_t npoints) return new ArdourCanvas::Points (npoints); } -int -channel_combo_get_channel_count (Gtk::ComboBoxText& combo) -{ - string str = combo.get_active_text(); - int chns; - - if (str == _("mono")) { - return 1; - } else if (str == _("stereo")) { - return 2; - } else if ((chns = atoi (str)) != 0) { - return chns; - } else { - return 0; - } -} - static int32_t int_from_hex (char hic, char loc) { diff --git a/gtk2_ardour/utils.h b/gtk2_ardour/utils.h index b6f3e0563a..b607ebdb64 100644 --- a/gtk2_ardour/utils.h +++ b/gtk2_ardour/utils.h @@ -64,7 +64,6 @@ unsigned char* xpm2rgba (const char** xpm, uint32_t& w, uint32_t& h); ArdourCanvas::Points* get_canvas_points (std::string who, uint32_t npoints); -int channel_combo_get_channel_count (Gtk::ComboBoxText& combo); Pango::FontDescription get_font_for_style (std::string widgetname); gint pane_handler (GdkEventButton*, Gtk::Paned*); diff --git a/libs/ardour/ardour/audio_track.h b/libs/ardour/ardour/audio_track.h index 81ca8834b3..030dd17a6b 100644 --- a/libs/ardour/ardour/audio_track.h +++ b/libs/ardour/ardour/audio_track.h @@ -32,7 +32,7 @@ class AudioPlaylist; class AudioTrack : public Route { public: - AudioTrack (Session&, string name, Route::Flag f = Route::Flag (0)); + AudioTrack (Session&, string name, Route::Flag f = Route::Flag (0), TrackMode m = Normal); AudioTrack (Session&, const XMLNode&); ~AudioTrack (); @@ -56,9 +56,9 @@ class AudioTrack : public Route int use_diskstream (string name); int use_diskstream (id_t id); - bool destructive() const { return _destructive; } - void set_destructive (bool yn); - sigc::signal DestructiveChanged; + TrackMode mode() const { return _mode; } + void set_mode (TrackMode m); + sigc::signal ModeChanged; jack_nframes_t update_total_latency(); void set_latency_delay (jack_nframes_t); @@ -99,6 +99,7 @@ class AudioTrack : public Route protected: DiskStream *diskstream; MeterPoint _saved_meter_point; + TrackMode _mode; void passthru_silence (jack_nframes_t start_frame, jack_nframes_t end_frame, jack_nframes_t nframes, jack_nframes_t offset, int declick, diff --git a/libs/ardour/ardour/session.h b/libs/ardour/ardour/session.h index 297ce0d94a..a2a62703e4 100644 --- a/libs/ardour/ardour/session.h +++ b/libs/ardour/ardour/session.h @@ -526,7 +526,7 @@ class Session : public sigc::trackable, public Stateful /* fundamental operations. duh. */ - AudioTrack *new_audio_track (int input_channels, int output_channels); + AudioTrack *new_audio_track (int input_channels, int output_channels, TrackMode mode = Normal); Route *new_audio_route (int input_channels, int output_channels); diff --git a/libs/ardour/ardour/types.h b/libs/ardour/ardour/types.h index a77a02c95b..c7e5faa21e 100644 --- a/libs/ardour/ardour/types.h +++ b/libs/ardour/ardour/types.h @@ -92,6 +92,11 @@ namespace ARDOUR { MeterPostFader }; + enum TrackMode { + Normal, + Destructive + }; + enum smpte_wrap_t { smpte_wrap_none = 0, smpte_wrap_frames, diff --git a/libs/ardour/audio_track.cc b/libs/ardour/audio_track.cc index 402ef7bfd9..e93e411868 100644 --- a/libs/ardour/audio_track.cc +++ b/libs/ardour/audio_track.cc @@ -41,7 +41,7 @@ using namespace std; //using namespace sigc; using namespace ARDOUR; -AudioTrack::AudioTrack (Session& sess, string name, Route::Flag flag) +AudioTrack::AudioTrack (Session& sess, string name, Route::Flag flag, TrackMode mode) : Route (sess, name, 1, -1, -1, -1, flag), diskstream (0), _midi_rec_enable_control (*this, _session.midi_port()) @@ -54,13 +54,18 @@ AudioTrack::AudioTrack (Session& sess, string name, Route::Flag flag) dflags = DiskStream::Flag (dflags | DiskStream::Recordable); } + if (mode == Destructive) { + dflags = DiskStream::Flag (dflags | DiskStream::Destructive); + } + DiskStream* ds = new DiskStream (_session, name, dflags); - set_diskstream (*ds, this); - _declickable = true; _freeze_record.state = NoFreeze; _saved_meter_point = _meter_point; + _mode = mode; + + set_diskstream (*ds, this); // we do this even though Route already did it in it's init reset_midi_control (_session.midi_port(), _session.get_midi_control()); @@ -149,6 +154,7 @@ AudioTrack::set_diskstream (DiskStream& ds, void *src) diskstream = &ds.ref(); diskstream->set_io (*this); + diskstream->set_destructive (_mode == Destructive); if (diskstream->deprecated_io_node) { @@ -269,6 +275,19 @@ AudioTrack::set_state (const XMLNode& node) return -1; } + if ((prop = node.property (X_("mode"))) != 0) { + if (prop->value() == X_("normal")) { + _mode = Normal; + } else if (prop->value() == X_("destructive")) { + _mode = Destructive; + } else { + warning << string_compose ("unknown audio track mode \"%1\" seen and ignored", prop->value()) << endmsg; + _mode = Normal; + } + } else { + _mode = Normal; + } + midi_kids = node.children ("MIDI"); for (iter = midi_kids.begin(); iter != midi_kids.end(); ++iter) { @@ -416,6 +435,15 @@ AudioTrack::get_state() remote_control_node->add_property (X_("id"), buf); root.add_child_nocopy (*remote_control_node); + switch (_mode) { + case Normal: + root.add_property (X_("mode"), X_("normal")); + break; + case Destructive: + root.add_property (X_("mode"), X_("destructive")); + break; + } + return root; } @@ -1098,13 +1126,13 @@ AudioTrack::MIDIRecEnableControl::write_feedback (MIDI::byte* buf, int32_t& bufs } void -AudioTrack::set_destructive (bool yn) +AudioTrack::set_mode (TrackMode m) { if (diskstream) { - if (_destructive != yn) { - diskstream->set_destructive (yn); - _destructive = yn; - DestructiveChanged(); + if (_mode != m) { + _mode = m; + diskstream->set_destructive (m == Destructive); + ModeChanged(); } } } diff --git a/libs/ardour/session.cc b/libs/ardour/session.cc index 90458fa2fd..1a79b9f81e 100644 --- a/libs/ardour/session.cc +++ b/libs/ardour/session.cc @@ -1623,7 +1623,7 @@ Session::resort_routes (void* src) } AudioTrack* -Session::new_audio_track (int input_channels, int output_channels) +Session::new_audio_track (int input_channels, int output_channels, TrackMode mode) { AudioTrack *track; char track_name[32]; @@ -1675,7 +1675,7 @@ Session::new_audio_track (int input_channels, int output_channels) } try { - track = new AudioTrack (*this, track_name); + track = new AudioTrack (*this, track_name, Route::Flag (0), mode); if (track->ensure_io (input_channels, output_channels, false, this)) { error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"), -- 2.30.2