X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;ds=sidebyside;f=libs%2Fardour%2Faudio_track.cc;h=579b0064bc2b09d18485ee6dabe138d634566e22;hb=c7ff67004a51ae3f0453531c3d64bd9876f1df3b;hp=40cbded61fa875369986ab126df560fb93b1da8c;hpb=2524115992801e67ac91d510eaae482ed9e97b88;p=ardour.git diff --git a/libs/ardour/audio_track.cc b/libs/ardour/audio_track.cc index 40cbded61f..579b0064bc 100644 --- a/libs/ardour/audio_track.cc +++ b/libs/ardour/audio_track.cc @@ -19,7 +19,6 @@ #include -#include "pbd/boost_debug.h" #include "pbd/enumwriter.h" #include "pbd/error.h" @@ -30,6 +29,7 @@ #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" @@ -56,6 +56,9 @@ AudioTrack::AudioTrack (Session& sess, string name, Route::Flag flag, TrackMode AudioTrack::~AudioTrack () { + if (_freeze_record.playlist && !_session.deletion_in_progress()) { + _freeze_record.playlist->release(); + } } boost::shared_ptr @@ -155,7 +158,7 @@ AudioTrack::deprecated_use_diskstream_connections () return 0; } - const XMLProperty* prop; + XMLProperty const * prop; XMLNode& node (*diskstream->deprecated_io_node); /* don't do this more than once. */ @@ -163,7 +166,7 @@ AudioTrack::deprecated_use_diskstream_connections () 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) { @@ -197,7 +200,7 @@ AudioTrack::deprecated_use_diskstream_connections () 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)); @@ -263,8 +266,8 @@ void 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. @@ -287,6 +290,7 @@ AudioTrack::set_state_part_two () boost::shared_ptr pl = _session.playlists->by_name (prop->value()); if (pl) { _freeze_record.playlist = boost::dynamic_pointer_cast (pl); + _freeze_record.playlist->use(); } else { _freeze_record.playlist.reset (); _freeze_record.state = NoFreeze; @@ -355,7 +359,7 @@ AudioTrack::roll (pframes_t nframes, framepos_t start_frame, framepos_t end_fram 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 @@ -374,9 +378,9 @@ AudioTrack::roll (pframes_t nframes, framepos_t start_frame, framepos_t end_fram 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 } } @@ -386,7 +390,7 @@ AudioTrack::roll (pframes_t nframes, framepos_t start_frame, framepos_t end_fram 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); } @@ -486,12 +490,12 @@ AudioTrack::bounceable (boost::shared_ptr endpoint, bool include_endp /* 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. */ @@ -499,7 +503,7 @@ AudioTrack::bounceable (boost::shared_ptr endpoint, bool include_endp return true; } - /* save outputs of this processor to test against inputs + /* save outputs of this processor to test against inputs of the next one. */ @@ -591,7 +595,7 @@ AudioTrack::freeze_me (InterThreadInfo& itt) (*r)->deactivate (); } } - + _session.set_dirty (); } } @@ -621,9 +625,11 @@ AudioTrack::freeze_me (InterThreadInfo& itt) diskstream->use_playlist (boost::dynamic_pointer_cast(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); */ @@ -635,6 +641,7 @@ void AudioTrack::unfreeze () { if (_freeze_record.playlist) { + _freeze_record.playlist->release(); audio_diskstream()->use_playlist (_freeze_record.playlist); {