summaryrefslogtreecommitdiff
path: root/libs/ardour/diskstream.cc
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2006-01-08 05:19:38 +0000
committerPaul Davis <paul@linuxaudiosystems.com>2006-01-08 05:19:38 +0000
commitd20534e846dbbf3b039903e94741f38c9b238a9a (patch)
tree2985b07a49c91be044af0f26bb77ebd2ecceae85 /libs/ardour/diskstream.cc
parenta20f41ab39cc034740ccd564c1057d8737d763d5 (diff)
add destructive outlines, more action usage and state fixups in GUI
git-svn-id: svn://localhost/trunk/ardour2@247 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs/ardour/diskstream.cc')
-rw-r--r--libs/ardour/diskstream.cc39
1 files changed, 35 insertions, 4 deletions
diff --git a/libs/ardour/diskstream.cc b/libs/ardour/diskstream.cc
index d0b0415c8c..b19f25be72 100644
--- a/libs/ardour/diskstream.cc
+++ b/libs/ardour/diskstream.cc
@@ -42,6 +42,7 @@
#include <ardour/utils.h>
#include <ardour/configuration.h>
#include <ardour/filesource.h>
+#include <ardour/destructive_filesource.h>
#include <ardour/send.h>
#include <ardour/audioplaylist.h>
#include <ardour/cycle_timer.h>
@@ -99,7 +100,6 @@ DiskStream::init_channel (ChannelInfo &chan)
chan.capture_wrap_buffer = 0;
chan.speed_buffer = 0;
chan.peak_power = 0.0f;
- chan.fades_source = 0;
chan.write_source = 0;
chan.source = 0;
chan.current_capture_buffer = 0;
@@ -1060,8 +1060,12 @@ DiskStream::seek (jack_nframes_t frame, bool complete_refill)
for (n = 0, chan = channels.begin(); chan != channels.end(); ++chan, ++n) {
(*chan).playback_buf->reset ();
(*chan).capture_buf->reset ();
+ if (destructive()) {
+ DestructiveFileSource* dfs = dynamic_cast<DestructiveFileSource*> ((*chan).write_source);
+ dfs->seek (frame);
+ }
}
-
+
playback_sample = frame;
file_frame = frame;
@@ -1775,6 +1779,10 @@ DiskStream::get_state ()
char buf[64];
LocaleGuard lg (X_("POSIX"));
+ if (destructive()) {
+ node->add_property ("destructive", "true");
+ }
+
snprintf (buf, sizeof(buf), "%zd", channels.size());
node->add_property ("channels", buf);
@@ -1849,6 +1857,12 @@ DiskStream::set_state (const XMLNode& node)
_name = prop->value();
}
+ if ((prop = node.property ("destructive")) != 0) {
+ if (prop->value() == "true") {
+ _flags |= Destructive;
+ }
+ }
+
if (deprecated_io_node) {
if ((prop = deprecated_io_node->property ("id")) != 0) {
sscanf (prop->value().c_str(), "%" PRIu64, &_id);
@@ -1966,7 +1980,7 @@ DiskStream::use_new_write_source (uint32_t n)
}
try {
- if ((chan.write_source = _session.create_file_source (*this, n)) == 0) {
+ if ((chan.write_source = _session.create_file_source (*this, n, destructive())) == 0) {
throw failed_constructor();
}
}
@@ -1983,7 +1997,7 @@ DiskStream::use_new_write_source (uint32_t n)
}
void
-DiskStream::reset_write_sources (bool mark_write_complete)
+DiskStream::reset_write_sources (bool mark_write_complete, bool force)
{
ChannelList::iterator chan;
uint32_t n;
@@ -1991,6 +2005,10 @@ DiskStream::reset_write_sources (bool mark_write_complete)
if (!recordable()) {
return;
}
+
+ if (!force && destructive()) {
+ return;
+ }
capturing_sources.clear ();
@@ -2310,3 +2328,16 @@ DiskStream::set_roll_delay (jack_nframes_t nframes)
{
_roll_delay = nframes;
}
+
+void
+DiskStream::set_destructive (bool yn)
+{
+ if (yn != destructive()) {
+ reset_write_sources (true, true);
+ if (yn) {
+ _flags |= Destructive;
+ } else {
+ _flags &= ~Destructive;
+ }
+ }
+}