destructive track work: regions now display offset by bwf timeline reference, cannot rec-enable before session start
git-svn-id: svn://localhost/ardour2/trunk@681 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
@@ -439,6 +439,8 @@ class AudioDiskstream : public Stateful, public sigc::trackable
|
||||
void set_align_style_from_io();
|
||||
void setup_destructive_playlist ();
|
||||
void use_destructive_playlist ();
|
||||
void engage_record_enable (void* src);
|
||||
void disengage_record_enable (void* src);
|
||||
};
|
||||
|
||||
}; /* namespace ARDOUR */
|
||||
|
||||
@@ -51,6 +51,13 @@ class AudioSource : public Source
|
||||
AudioSource (const XMLNode&);
|
||||
virtual ~AudioSource ();
|
||||
|
||||
/* one could argue that this should belong to Source, but other data types
|
||||
generally do not come with a model of "offset along an audio timeline"
|
||||
so its here in AudioSource for now.
|
||||
*/
|
||||
|
||||
virtual jack_nframes_t natural_position() const { return 0; }
|
||||
|
||||
/* returns the number of items in this `audio_source' */
|
||||
|
||||
virtual jack_nframes_t length() const {
|
||||
|
||||
@@ -51,6 +51,8 @@ class SndFileSource : public AudioFileSource {
|
||||
int update_header (jack_nframes_t when, struct tm&, time_t);
|
||||
int flush_header ();
|
||||
|
||||
jack_nframes_t natural_position () const;
|
||||
|
||||
protected:
|
||||
void set_header_timeline_position ();
|
||||
|
||||
|
||||
@@ -457,8 +457,10 @@ AudioDiskstream::setup_destructive_playlist ()
|
||||
|
||||
/* a single full-sized region */
|
||||
|
||||
cerr << "setup DS using " << srcs.front()->natural_position () << endl;
|
||||
|
||||
AudioRegion* region = new AudioRegion (srcs, 0, max_frames, _name);
|
||||
_playlist->add_region (*region, 0);
|
||||
_playlist->add_region (*region, srcs.front()->natural_position());
|
||||
}
|
||||
|
||||
void
|
||||
@@ -1151,6 +1153,12 @@ AudioDiskstream::seek (jack_nframes_t frame, bool complete_refill)
|
||||
(*chan).capture_buf->reset ();
|
||||
}
|
||||
|
||||
/* can't rec-enable in destructive mode if transport is before start */
|
||||
|
||||
if (destructive() && record_enabled() && frame < _session.current_start_frame()) {
|
||||
disengage_record_enable (this);
|
||||
}
|
||||
|
||||
playback_sample = frame;
|
||||
file_frame = frame;
|
||||
|
||||
@@ -1562,7 +1570,6 @@ AudioDiskstream::do_flush (char * workbuf, bool force_flush)
|
||||
|
||||
to_write = min (disk_io_chunk_frames, (jack_nframes_t) vector.len[0]);
|
||||
|
||||
|
||||
// check the transition buffer when recording destructive
|
||||
// important that we get this after the capture buf
|
||||
|
||||
@@ -1899,15 +1906,15 @@ AudioDiskstream::finish_capture (bool rec_monitors_input)
|
||||
void
|
||||
AudioDiskstream::set_record_enabled (bool yn, void* src)
|
||||
{
|
||||
bool rolling = _session.transport_speed() != 0.0f;
|
||||
|
||||
if (!recordable() || !_session.record_enabling_legal()) {
|
||||
return;
|
||||
}
|
||||
|
||||
/* if we're turning on rec-enable, there needs to be an
|
||||
input connection.
|
||||
*/
|
||||
|
||||
/* can't rec-enable in destructive mode if transport is before start */
|
||||
|
||||
if (destructive() && yn && _session.transport_frame() < _session.current_start_frame()) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (yn && channels[0].source == 0) {
|
||||
|
||||
@@ -1924,37 +1931,52 @@ AudioDiskstream::set_record_enabled (bool yn, void* src)
|
||||
|
||||
if (record_enabled() != yn) {
|
||||
if (yn) {
|
||||
g_atomic_int_set (&_record_enabled, 1);
|
||||
capturing_sources.clear ();
|
||||
if (Config->get_use_hardware_monitoring()) {
|
||||
for (ChannelList::iterator chan = channels.begin(); chan != channels.end(); ++chan) {
|
||||
if ((*chan).source) {
|
||||
(*chan).source->request_monitor_input (!(_session.get_auto_input() && rolling));
|
||||
}
|
||||
capturing_sources.push_back ((*chan).write_source);
|
||||
}
|
||||
} else {
|
||||
for (ChannelList::iterator chan = channels.begin(); chan != channels.end(); ++chan) {
|
||||
capturing_sources.push_back ((*chan).write_source);
|
||||
}
|
||||
}
|
||||
|
||||
engage_record_enable (src);
|
||||
} else {
|
||||
g_atomic_int_set (&_record_enabled, 0);
|
||||
if (Config->get_use_hardware_monitoring()) {
|
||||
for (ChannelList::iterator chan = channels.begin(); chan != channels.end(); ++chan) {
|
||||
if ((*chan).source) {
|
||||
(*chan).source->request_monitor_input (false);
|
||||
}
|
||||
}
|
||||
}
|
||||
capturing_sources.clear ();
|
||||
disengage_record_enable (src);
|
||||
}
|
||||
|
||||
record_enable_changed (src); /* EMIT SIGNAL */
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
AudioDiskstream::engage_record_enable (void* src)
|
||||
{
|
||||
bool rolling = _session.transport_speed() != 0.0f;
|
||||
|
||||
g_atomic_int_set (&_record_enabled, 1);
|
||||
capturing_sources.clear ();
|
||||
if (Config->get_use_hardware_monitoring()) {
|
||||
for (ChannelList::iterator chan = channels.begin(); chan != channels.end(); ++chan) {
|
||||
if ((*chan).source) {
|
||||
(*chan).source->request_monitor_input (!(_session.get_auto_input() && rolling));
|
||||
}
|
||||
capturing_sources.push_back ((*chan).write_source);
|
||||
}
|
||||
} else {
|
||||
for (ChannelList::iterator chan = channels.begin(); chan != channels.end(); ++chan) {
|
||||
capturing_sources.push_back ((*chan).write_source);
|
||||
}
|
||||
}
|
||||
|
||||
record_enable_changed (src); /* EMIT SIGNAL */
|
||||
}
|
||||
|
||||
void
|
||||
AudioDiskstream::disengage_record_enable (void* src)
|
||||
{
|
||||
g_atomic_int_set (&_record_enabled, 0);
|
||||
if (Config->get_use_hardware_monitoring()) {
|
||||
for (ChannelList::iterator chan = channels.begin(); chan != channels.end(); ++chan) {
|
||||
if ((*chan).source) {
|
||||
(*chan).source->request_monitor_input (false);
|
||||
}
|
||||
}
|
||||
}
|
||||
capturing_sources.clear ();
|
||||
record_enable_changed (src); /* EMIT SIGNAL */
|
||||
}
|
||||
|
||||
|
||||
XMLNode&
|
||||
AudioDiskstream::get_state ()
|
||||
{
|
||||
|
||||
@@ -594,7 +594,7 @@ void
|
||||
AudioFileSource::set_header_position_offset (jack_nframes_t offset)
|
||||
{
|
||||
header_position_offset = offset;
|
||||
|
||||
cerr << "hpo set to " << offset << endl;
|
||||
HeaderPositionOffsetChanged ();
|
||||
}
|
||||
|
||||
|
||||
@@ -130,8 +130,12 @@ DestructiveFileSource::setup_standard_crossfades (jack_nframes_t rate)
|
||||
void
|
||||
DestructiveFileSource::mark_capture_start (jack_nframes_t pos)
|
||||
{
|
||||
_capture_start = true;
|
||||
capture_start_frame = pos;
|
||||
if (pos < timeline_position) {
|
||||
_capture_start = false;
|
||||
} else {
|
||||
_capture_start = true;
|
||||
capture_start_frame = pos;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
@@ -271,6 +275,11 @@ DestructiveFileSource::write_unlocked (Sample* data, jack_nframes_t cnt, char *
|
||||
}
|
||||
|
||||
if (_capture_start && _capture_end) {
|
||||
|
||||
/* start and end of capture both occur within the data we are writing,
|
||||
so do both crossfades.
|
||||
*/
|
||||
|
||||
_capture_start = false;
|
||||
_capture_end = false;
|
||||
|
||||
@@ -296,8 +305,12 @@ DestructiveFileSource::write_unlocked (Sample* data, jack_nframes_t cnt, char *
|
||||
}
|
||||
|
||||
file_pos = ofilepos; // adjusted below
|
||||
}
|
||||
else if (_capture_start) {
|
||||
|
||||
} else if (_capture_start) {
|
||||
|
||||
/* start of capture both occur within the data we are writing,
|
||||
so do the fade in
|
||||
*/
|
||||
|
||||
_capture_start = false;
|
||||
_capture_end = false;
|
||||
@@ -311,6 +324,10 @@ DestructiveFileSource::write_unlocked (Sample* data, jack_nframes_t cnt, char *
|
||||
|
||||
} else if (_capture_end) {
|
||||
|
||||
/* end of capture both occur within the data we are writing,
|
||||
so do the fade out
|
||||
*/
|
||||
|
||||
_capture_start = false;
|
||||
_capture_end = false;
|
||||
|
||||
@@ -320,6 +337,8 @@ DestructiveFileSource::write_unlocked (Sample* data, jack_nframes_t cnt, char *
|
||||
|
||||
} else {
|
||||
|
||||
/* in the middle of recording */
|
||||
|
||||
if (write_float (data, file_pos, cnt) != cnt) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -45,6 +45,10 @@ Location::Location (const Location& other)
|
||||
_end (other._end),
|
||||
_flags (other._flags)
|
||||
{
|
||||
/* start and end flags can never be copied, because there can only ever be one of each */
|
||||
|
||||
_flags = Flags (_flags & ~IsStart);
|
||||
_flags = Flags (_flags & ~IsEnd);
|
||||
}
|
||||
|
||||
Location*
|
||||
|
||||
@@ -249,14 +249,14 @@ SndFileSource::open ()
|
||||
_flags = Flag (_flags & ~Broadcast);
|
||||
}
|
||||
|
||||
set_timeline_position (0);
|
||||
set_timeline_position (header_position_offset);
|
||||
|
||||
} else {
|
||||
|
||||
/* XXX 64 bit alert: when JACK switches to a 64 bit frame count, this needs to use the high bits
|
||||
of the time reference.
|
||||
*/
|
||||
|
||||
|
||||
set_timeline_position ( _broadcast_info->time_reference_low );
|
||||
}
|
||||
|
||||
@@ -525,3 +525,9 @@ SndFileSource::write_float (Sample* data, jack_nframes_t frame_pos, jack_nframes
|
||||
|
||||
return cnt;
|
||||
}
|
||||
|
||||
jack_nframes_t
|
||||
SndFileSource::natural_position() const
|
||||
{
|
||||
return timeline_position;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user