diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2006-01-19 05:01:43 +0000 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2006-01-19 05:01:43 +0000 |
commit | 6ef5c8da56800bbce1c23a9ea51c9a1646d5887f (patch) | |
tree | 71e115b6543f58802329fa2b9c337fddcd5f7f1c /libs/ardour | |
parent | cd87dceb0fda44d7c8fcc2b7844f65def25edb23 (diff) |
add GUI support to create tape/destructive tracks
git-svn-id: svn://localhost/trunk/ardour2@278 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs/ardour')
-rw-r--r-- | libs/ardour/ardour/audio_track.h | 9 | ||||
-rw-r--r-- | libs/ardour/ardour/session.h | 2 | ||||
-rw-r--r-- | libs/ardour/ardour/types.h | 5 | ||||
-rw-r--r-- | libs/ardour/audio_track.cc | 44 | ||||
-rw-r--r-- | libs/ardour/session.cc | 4 |
5 files changed, 49 insertions, 15 deletions
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<void> DestructiveChanged; + TrackMode mode() const { return _mode; } + void set_mode (TrackMode m); + sigc::signal<void> 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"), |