fix crash at session close/exit if a midi-control-surface is used
[ardour.git] / libs / ardour / track.cc
index 5c95de0c4118fbdd97a87385a9cc1e49eb67c2a2..d463be598f22fdc0021b7a3b3bdcb9e0beaca80a 100644 (file)
@@ -68,8 +68,10 @@ Track::init ()
        /* don't add rec_enable_control to controls because we don't want it to
         * appear as an automatable parameter
         */
+       track_number_changed.connect_same_thread (*this, boost::bind (&Track::resync_track_name, this));
+       _session.config.ParameterChanged.connect_same_thread (*this, boost::bind (&Track::parameter_changed, this, _1));
 
-        return 0;
+       return 0;
 }
 
 void
@@ -284,6 +286,28 @@ Track::set_record_enabled (bool yn, void *src)
        _rec_enable_control->Changed ();
 }
 
+void
+Track::parameter_changed (string const & p)
+{
+       if (p == "track-name-number") {
+               resync_track_name ();
+       }
+       else if (p == "track-name-take") {
+               resync_track_name ();
+       }
+       else if (p == "take-name") {
+               if (_session.config.get_track_name_take()) {
+                       resync_track_name ();
+               }
+       }
+}
+
+void
+Track::resync_track_name ()
+{
+       set_name(name());
+}
+
 bool
 Track::set_name (const string& str)
 {
@@ -294,6 +318,29 @@ Track::set_name (const string& str)
                return false;
        }
 
+       string diskstream_name = "";
+       if (_session.config.get_track_name_take () && !_session.config.get_take_name ().empty()) {
+               // Note: any text is fine, legalize_for_path() fixes this later
+               diskstream_name += _session.config.get_take_name ();
+               diskstream_name += "_";
+       }
+       const int64_t tracknumber = track_number();
+       if (tracknumber > 0 && _session.config.get_track_name_number()) {
+               char num[64], fmt[10];
+               snprintf(fmt, sizeof(fmt), "%%0%d" PRId64, _session.track_number_decimals());
+               snprintf(num, sizeof(num), fmt, tracknumber);
+               diskstream_name += num;
+               diskstream_name += "_";
+       }
+       diskstream_name += str;
+
+       if (diskstream_name == _diskstream_name) {
+               return true;
+       }
+       _diskstream_name = diskstream_name;
+
+       _diskstream->set_write_source_name (diskstream_name);
+
        boost::shared_ptr<Track> me = boost::dynamic_pointer_cast<Track> (shared_from_this ());
        if (_diskstream->playlist()->all_regions_empty () && _session.playlists->playlists_for_track (me).size() == 1) {
                /* Only rename the diskstream (and therefore the playlist) if