summaryrefslogtreecommitdiff
path: root/libs/ardour
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2006-01-19 05:01:43 +0000
committerPaul Davis <paul@linuxaudiosystems.com>2006-01-19 05:01:43 +0000
commit6ef5c8da56800bbce1c23a9ea51c9a1646d5887f (patch)
tree71e115b6543f58802329fa2b9c337fddcd5f7f1c /libs/ardour
parentcd87dceb0fda44d7c8fcc2b7844f65def25edb23 (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.h9
-rw-r--r--libs/ardour/ardour/session.h2
-rw-r--r--libs/ardour/ardour/types.h5
-rw-r--r--libs/ardour/audio_track.cc44
-rw-r--r--libs/ardour/session.cc4
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"),