#include <boost/scoped_array.hpp>
-#include "pbd/boost_debug.h"
#include "pbd/enumwriter.h"
#include "pbd/error.h"
#include "ardour/audio_diskstream.h"
#include "ardour/audio_track.h"
#include "ardour/audioplaylist.h"
+#include "ardour/boost_debug.h"
#include "ardour/buffer_set.h"
#include "ardour/delivery.h"
#include "ardour/meter.h"
AudioTrack::~AudioTrack ()
{
+ if (_freeze_record.playlist && !_session.deletion_in_progress()) {
+ _freeze_record.playlist->release();
+ }
}
boost::shared_ptr<Diskstream>
return 0;
}
- const XMLProperty* prop;
+ XMLProperty const * prop;
XMLNode& node (*diskstream->deprecated_io_node);
/* don't do this more than once. */
diskstream->deprecated_io_node = 0;
if ((prop = node.property ("gain")) != 0) {
- _amp->set_gain (atof (prop->value().c_str()), this);
+ _amp->gain_control()->set_value (atof (prop->value().c_str()), PBD::Controllable::NoGroup);
}
if ((prop = node.property ("input-connection")) != 0) {
int
AudioTrack::set_state (const XMLNode& node, int version)
{
- const XMLProperty *prop;
+ XMLProperty const * prop;
if ((prop = node.property (X_("mode"))) != 0) {
_mode = TrackMode (string_2_enum (prop->value(), _mode));
AudioTrack::set_state_part_two ()
{
XMLNode* fnode;
- XMLProperty* prop;
- LocaleGuard lg (X_("C"));
+ XMLProperty const * prop;
+ LocaleGuard lg;
/* This is called after all session state has been restored but before
have been made ports and connections are established.
boost::shared_ptr<Playlist> pl = _session.playlists->by_name (prop->value());
if (pl) {
_freeze_record.playlist = boost::dynamic_pointer_cast<AudioPlaylist> (pl);
+ _freeze_record.playlist->use();
} else {
_freeze_record.playlist.reset ();
_freeze_record.state = NoFreeze;
int dret;
framecnt_t playback_distance;
-
+
if ((nframes = check_initial_delay (nframes, transport_frame)) == 0) {
/* need to do this so that the diskstream sets its
bool valid = false;
const float mute = _mute_control->list()->rt_safe_eval(transport_frame, valid);
if (mute >= 0.5 && !muted()) {
- _mute_control->set_value(1.0); // mute
+ _mute_control->set_value_unchecked(1.0); // mute
} else if (mute < 0.5 && muted()) {
- _mute_control->set_value(0.0); // unmute
+ _mute_control->set_value_unchecked(0.0); // unmute
}
}
BufferSet& bufs = _session.get_route_buffers (n_process_buffers ());
fill_buffers_with_input (bufs, _input, nframes);
-
+
if (_meter_point == MeterInput && (_monitoring & MonitorInput || _diskstream->record_enabled())) {
_meter->run (bufs, start_frame, end_frame, nframes, true);
}
/* does the output from the last considered processor match the
* input to this one?
*/
-
+
if (naudio != (*r)->input_streams().n_audio()) {
return false;
}
- /* we're including the endpoint - if we just hit it,
+ /* we're including the endpoint - if we just hit it,
then stop.
*/
return true;
}
- /* save outputs of this processor to test against inputs
+ /* save outputs of this processor to test against inputs
of the next one.
*/
(*r)->deactivate ();
}
}
-
+
_session.set_dirty ();
}
}
diskstream->use_playlist (boost::dynamic_pointer_cast<AudioPlaylist>(new_playlist));
diskstream->set_record_enabled (false);
+ _freeze_record.playlist->use(); // prevent deletion
+
/* reset stuff that has already been accounted for in the freeze process */
- set_gain (GAIN_COEFF_UNITY, this);
+ set_gain (GAIN_COEFF_UNITY, Controllable::NoGroup);
_amp->gain_control()->set_automation_state (Off);
/* XXX need to use _main_outs _panner->set_automation_state (Off); */
AudioTrack::unfreeze ()
{
if (_freeze_record.playlist) {
+ _freeze_record.playlist->release();
audio_diskstream()->use_playlist (_freeze_record.playlist);
{