#include "ardour/types.h"
#include "ardour/utils.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
#include <locale.h>
using namespace std;
newname = Playlist::bump_name (_playlist->name(), _session);
if ((playlist = boost::dynamic_pointer_cast<AudioPlaylist>(PlaylistFactory::create (audio_playlist(), newname))) != 0) {
+ playlist->reset_shares();
return use_playlist (playlist);
} else {
return -1;
boost::shared_ptr<Region> rp;
{
- const RegionList& rl (_playlist->region_list().rlist());
+ const RegionList& rl (_playlist->region_list_property().rlist());
if (rl.size() > 0) {
+ /* this can happen when dragging a region onto a tape track */
assert((rl.size() == 1));
rp = rl.front();
}
throw failed_constructor();
}
- /* be sure to stretch the region out to the maximum length */
+ /* be sure to stretch the region out to the maximum length (non-musical)*/
- region->set_length (max_framepos - region->position());
+ region->set_length (max_framepos - region->position(), 0);
uint32_t n;
ChannelList::iterator chan;
/* this might be false if we switched modes, so force it */
+#ifdef XXX_OLD_DESTRUCTIVE_API_XXX
(*chan)->write_source->set_destructive (true);
+#else
+ // should be set when creating the source or loading the state
+ assert ((*chan)->write_source->destructive());
+#endif
}
/* the source list will never be reset for a destructive track */
_playlist->set_capture_insertion_in_progress (true);
_playlist->freeze ();
+ const framepos_t preroll_off = _session.preroll_record_trim_len ();
for (buffer_position = c->front()->write_source->last_capture_start_frame(), ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
string region_name;
boost::shared_ptr<Region> rx (RegionFactory::create (srcs, plist));
region = boost::dynamic_pointer_cast<AudioRegion> (rx);
+ if (preroll_off > 0) {
+ region->trim_front (buffer_position + preroll_off);
+ }
}
catch (failed_constructor& err) {
i_am_the_modifier++;
- _playlist->add_region (region, (*ci)->start, 1, non_layered());
+ _playlist->add_region (region, (*ci)->start + preroll_off, 1, non_layered());
_playlist->set_layer (region, DBL_MAX);
i_am_the_modifier--;
AudioDiskstream::get_state ()
{
XMLNode& node (Diskstream::get_state());
- char buf[64] = "";
- LocaleGuard lg ();
+ LocaleGuard lg;
boost::shared_ptr<ChannelList> c = channels.reader();
- snprintf (buf, sizeof(buf), "%u", (unsigned int) c->size());
- node.add_property ("channels", buf);
+ node.set_property ("channels", (uint32_t)c->size());
if (!capturing_sources.empty() && _session.get_record_enabled()) {
for (vector<boost::shared_ptr<AudioFileSource> >::iterator i = capturing_sources.begin(); i != capturing_sources.end(); ++i) {
cs_grandchild = new XMLNode (X_("file"));
- cs_grandchild->add_property (X_("path"), (*i)->path());
+ cs_grandchild->set_property (X_("path"), (*i)->path());
cs_child->add_child_nocopy (*cs_grandchild);
}
Location* pi;
- if (_session.config.get_punch_in() && ((pi = _session.locations()->auto_punch_location()) != 0)) {
- snprintf (buf, sizeof (buf), "%" PRId64, pi->start());
+ if (_session.preroll_record_punch_enabled ()) {
+ cs_child->set_property (X_("at"), _session.preroll_record_punch_pos());
+ } else if (_session.config.get_punch_in() && ((pi = _session.locations()->auto_punch_location()) != 0)) {
+ cs_child->set_property (X_("at"), pi->start());
} else {
- snprintf (buf, sizeof (buf), "%" PRId64, _session.transport_frame());
+ cs_child->set_property (X_("at"), _session.transport_frame());
}
- cs_child->add_property (X_("at"), buf);
node.add_child_nocopy (*cs_child);
}
int
AudioDiskstream::set_state (const XMLNode& node, int version)
{
- XMLProperty const * prop;
XMLNodeList nlist = node.children();
XMLNodeIterator niter;
- uint32_t nchans = 1;
XMLNode* capture_pending_node = 0;
- LocaleGuard lg ();
+ LocaleGuard lg;
/* prevent write sources from being created */
return -1;
}
- if ((prop = node.property ("channels")) != 0) {
- nchans = atoi (prop->value().c_str());
- }
+ uint32_t nchans = 1;
+ node.get_property ("channels", nchans);
// create necessary extra channels
// we are always constructed with one and we always need one
remove_channel (_n_channels.n_audio() - nchans);
}
-
-
if (!destructive() && capture_pending_node) {
/* destructive streams have one and only one source per channel,
and so they never end up in pending capture in any useful
}
}
+#ifdef MIXBUS
+ // compensate for latency when bouncing from master or mixbus.
+ // we need to use "ExistingMaterial" to pick up the master bus' latency
+ // see also Route::direct_feeds_according_to_reality
+ IOVector ios;
+ ios.push_back (_io);
+ if (_session.master_out() && ios.fed_by (_session.master_out()->output())) {
+ have_physical = true;
+ }
+ for (uint32_t n = 0; n < NUM_MIXBUSES && !have_physical; ++n) {
+ if (_session.get_mixbus (n) && ios.fed_by (_session.get_mixbus(n)->output())) {
+ have_physical = true;
+ }
+ }
+#endif
+
if (have_physical) {
set_align_style (ExistingMaterial);
} else {
return 0;
}
+#ifdef XXX_OLD_DESTRUCTIVE_API_XXX
int
AudioDiskstream::set_non_layered (bool yn)
{
boost::shared_ptr<Region> first;
{
- const RegionList& rl (_playlist->region_list().rlist());
+ const RegionList& rl (_playlist->region_list_property().rlist());
assert((rl.size() == 1));
first = rl.front();
requires_bounce = false;
return true;
}
+#endif
void
AudioDiskstream::adjust_playback_buffering ()