fix implementation of Session::get_remote_nth_stripable()
[ardour.git] / libs / ardour / session.cc
1 /*
2     Copyright (C) 1999-2010 Paul Davis
3
4     This program is free software; you can redistribute it and/or modify
5     it under the terms of the GNU General Public License as published by
6     the Free Software Foundation; either version 2 of the License, or
7     (at your option) any later version.
8
9     This program is distributed in the hope that it will be useful,
10     but WITHOUT ANY WARRANTY; without even the implied warranty of
11     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12     GNU General Public License for more details.
13
14     You should have received a copy of the GNU General Public License
15     along with this program; if not, write to the Free Software
16     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17
18 */
19
20 #include <stdint.h>
21
22 #include <algorithm>
23 #include <string>
24 #include <vector>
25 #include <sstream>
26 #include <cstdio> /* sprintf(3) ... grrr */
27 #include <cmath>
28 #include <cerrno>
29 #include <unistd.h>
30 #include <limits.h>
31
32 #include <glibmm/threads.h>
33 #include <glibmm/miscutils.h>
34 #include <glibmm/fileutils.h>
35
36 #include <boost/algorithm/string/erase.hpp>
37
38 #include "pbd/basename.h"
39 #include "pbd/convert.h"
40 #include "pbd/convert.h"
41 #include "pbd/error.h"
42 #include "pbd/file_utils.h"
43 #include "pbd/md5.h"
44 #include "pbd/pthread_utils.h"
45 #include "pbd/search_path.h"
46 #include "pbd/stacktrace.h"
47 #include "pbd/stl_delete.h"
48 #include "pbd/replace_all.h"
49 #include "pbd/unwind.h"
50
51 #include "ardour/amp.h"
52 #include "ardour/analyser.h"
53 #include "ardour/async_midi_port.h"
54 #include "ardour/audio_buffer.h"
55 #include "ardour/audio_diskstream.h"
56 #include "ardour/audio_port.h"
57 #include "ardour/audio_track.h"
58 #include "ardour/audioengine.h"
59 #include "ardour/audiofilesource.h"
60 #include "ardour/auditioner.h"
61 #include "ardour/boost_debug.h"
62 #include "ardour/buffer_manager.h"
63 #include "ardour/buffer_set.h"
64 #include "ardour/bundle.h"
65 #include "ardour/butler.h"
66 #include "ardour/click.h"
67 #include "ardour/control_protocol_manager.h"
68 #include "ardour/data_type.h"
69 #include "ardour/debug.h"
70 #include "ardour/directory_names.h"
71 #ifdef USE_TRACKS_CODE_FEATURES
72 #include "ardour/engine_state_controller.h"
73 #endif
74 #include "ardour/filename_extensions.h"
75 #include "ardour/gain_control.h"
76 #include "ardour/graph.h"
77 #include "ardour/luabindings.h"
78 #include "ardour/midiport_manager.h"
79 #include "ardour/scene_changer.h"
80 #include "ardour/midi_patch_manager.h"
81 #include "ardour/midi_track.h"
82 #include "ardour/midi_ui.h"
83 #include "ardour/operations.h"
84 #include "ardour/playlist.h"
85 #include "ardour/plugin.h"
86 #include "ardour/plugin_insert.h"
87 #include "ardour/process_thread.h"
88 #include "ardour/profile.h"
89 #include "ardour/rc_configuration.h"
90 #include "ardour/recent_sessions.h"
91 #include "ardour/region.h"
92 #include "ardour/region_factory.h"
93 #include "ardour/route_graph.h"
94 #include "ardour/route_group.h"
95 #include "ardour/send.h"
96 #include "ardour/session.h"
97 #include "ardour/session_directory.h"
98 #include "ardour/session_playlists.h"
99 #include "ardour/smf_source.h"
100 #include "ardour/solo_isolate_control.h"
101 #include "ardour/source_factory.h"
102 #include "ardour/speakers.h"
103 #include "ardour/tempo.h"
104 #include "ardour/ticker.h"
105 #include "ardour/track.h"
106 #include "ardour/user_bundle.h"
107 #include "ardour/utils.h"
108 #include "ardour/vca_manager.h"
109 #include "ardour/vca.h"
110
111 #include "midi++/port.h"
112 #include "midi++/mmc.h"
113
114 #include "LuaBridge/LuaBridge.h"
115
116 #include "i18n.h"
117
118 #include <glibmm/checksum.h>
119
120 namespace ARDOUR {
121 class MidiSource;
122 class Processor;
123 class Speakers;
124 }
125
126 using namespace std;
127 using namespace ARDOUR;
128 using namespace PBD;
129
130 bool Session::_disable_all_loaded_plugins = false;
131 bool Session::_bypass_all_loaded_plugins = false;
132 guint Session::_name_id_counter = 0;
133
134 PBD::Signal1<int,uint32_t> Session::AudioEngineSetupRequired;
135 PBD::Signal1<void,std::string> Session::Dialog;
136 PBD::Signal0<int> Session::AskAboutPendingState;
137 PBD::Signal2<int, framecnt_t, framecnt_t> Session::AskAboutSampleRateMismatch;
138 PBD::Signal2<void, framecnt_t, framecnt_t> Session::NotifyAboutSampleRateMismatch;
139 PBD::Signal0<void> Session::SendFeedback;
140 PBD::Signal3<int,Session*,std::string,DataType> Session::MissingFile;
141
142 PBD::Signal1<void, framepos_t> Session::StartTimeChanged;
143 PBD::Signal1<void, framepos_t> Session::EndTimeChanged;
144 PBD::Signal2<void,std::string, std::string> Session::Exported;
145 PBD::Signal1<int,boost::shared_ptr<Playlist> > Session::AskAboutPlaylistDeletion;
146 PBD::Signal0<void> Session::Quit;
147 PBD::Signal0<void> Session::FeedbackDetected;
148 PBD::Signal0<void> Session::SuccessfulGraphSort;
149 PBD::Signal2<void,std::string,std::string> Session::VersionMismatch;
150
151 const framecnt_t Session::bounce_chunk_size = 8192;
152 static void clean_up_session_event (SessionEvent* ev) { delete ev; }
153 const SessionEvent::RTeventCallback Session::rt_cleanup (clean_up_session_event);
154
155 // seconds should be added after the region exceeds end marker
156 #ifdef USE_TRACKS_CODE_FEATURES
157 const uint32_t Session::session_end_shift = 5;
158 #else
159 const uint32_t Session::session_end_shift = 0;
160 #endif
161
162 /** @param snapshot_name Snapshot name, without .ardour suffix */
163 Session::Session (AudioEngine &eng,
164                   const string& fullpath,
165                   const string& snapshot_name,
166                   BusProfile* bus_profile,
167                   string mix_template)
168         : playlists (new SessionPlaylists)
169         , _engine (eng)
170         , process_function (&Session::process_with_events)
171         , _bounce_processing_active (false)
172         , waiting_for_sync_offset (false)
173         , _base_frame_rate (0)
174         , _nominal_frame_rate (0)
175         , _current_frame_rate (0)
176         , transport_sub_state (0)
177         , _record_status (Disabled)
178         , _transport_frame (0)
179         , _session_range_location (0)
180         , _slave (0)
181         , _silent (false)
182         , _transport_speed (0)
183         , _default_transport_speed (1.0)
184         , _last_transport_speed (0)
185         , _target_transport_speed (0.0)
186         , auto_play_legal (false)
187         , _last_slave_transport_frame (0)
188         , maximum_output_latency (0)
189         , _requested_return_frame (-1)
190         , current_block_size (0)
191         , _worst_output_latency (0)
192         , _worst_input_latency (0)
193         , _worst_track_latency (0)
194         , _have_captured (false)
195         , _non_soloed_outs_muted (false)
196         , _listening (false)
197         , _listen_cnt (0)
198         , _solo_isolated_cnt (0)
199         , _writable (false)
200         , _was_seamless (Config->get_seamless_loop ())
201         , _under_nsm_control (false)
202         , _xrun_count (0)
203         , delta_accumulator_cnt (0)
204         , average_slave_delta (1800) // !!! why 1800 ???
205         , average_dir (0)
206         , have_first_delta_accumulator (false)
207         , _slave_state (Stopped)
208         , _mtc_active (false)
209         , _ltc_active (false)
210         , post_export_sync (false)
211         , post_export_position (0)
212         , _exporting (false)
213         , _export_rolling (false)
214         , _export_preroll (0)
215         , _pre_export_mmc_enabled (false)
216         , _name (snapshot_name)
217         , _is_new (true)
218         , _send_qf_mtc (false)
219         , _pframes_since_last_mtc (0)
220         , session_midi_feedback (0)
221         , play_loop (false)
222         , loop_changing (false)
223         , last_loopend (0)
224         , _session_dir (new SessionDirectory (fullpath))
225         , _current_snapshot_name (snapshot_name)
226         , state_tree (0)
227         , state_was_pending (false)
228         , _state_of_the_state (StateOfTheState(CannotSave|InitialConnecting|Loading))
229         , _suspend_save (0)
230         , _save_queued (false)
231         , _last_roll_location (0)
232         , _last_roll_or_reversal_location (0)
233         , _last_record_location (0)
234         , pending_locate_roll (false)
235         , pending_locate_frame (0)
236         , pending_locate_flush (false)
237         , pending_abort (false)
238         , pending_auto_loop (false)
239         , _mempool ("Session", 1048576)
240         , lua (lua_newstate (&PBD::ReallocPool::lalloc, &_mempool))
241         , _n_lua_scripts (0)
242         , _butler (new Butler (*this))
243         , _post_transport_work (0)
244         ,  cumulative_rf_motion (0)
245         , rf_scale (1.0)
246         , _locations (new Locations (*this))
247         , _ignore_skips_updates (false)
248         , _rt_thread_active (false)
249         , _rt_emit_pending (false)
250         , _ac_thread_active (false)
251         , step_speed (0)
252         , outbound_mtc_timecode_frame (0)
253         , next_quarter_frame_to_send (-1)
254         , _frames_per_timecode_frame (0)
255         , _frames_per_hour (0)
256         , _timecode_frames_per_hour (0)
257         , last_timecode_valid (false)
258         , last_timecode_when (0)
259         , _send_timecode_update (false)
260         , ltc_encoder (0)
261         , ltc_enc_buf(0)
262         , ltc_buf_off (0)
263         , ltc_buf_len (0)
264         , ltc_speed (0)
265         , ltc_enc_byte (0)
266         , ltc_enc_pos (0)
267         , ltc_enc_cnt (0)
268         , ltc_enc_off (0)
269         , restarting (false)
270         , ltc_prev_cycle (0)
271         , ltc_timecode_offset (0)
272         , ltc_timecode_negative_offset (false)
273         , midi_control_ui (0)
274         , _tempo_map (0)
275         , _all_route_group (new RouteGroup (*this, "all"))
276         , routes (new RouteList)
277         , _adding_routes_in_progress (false)
278         , _reconnecting_routes_in_progress (false)
279         , _route_deletion_in_progress (false)
280         , destructive_index (0)
281         , _track_number_decimals(1)
282         , default_fade_steepness (0)
283         , default_fade_msecs (0)
284         , _total_free_4k_blocks (0)
285         , _total_free_4k_blocks_uncertain (false)
286         , no_questions_about_missing_files (false)
287         , _playback_load (0)
288         , _capture_load (0)
289         , _bundles (new BundleList)
290         , _bundle_xml_node (0)
291         , _current_trans (0)
292         , _clicking (false)
293         , click_data (0)
294         , click_emphasis_data (0)
295         , click_length (0)
296         , click_emphasis_length (0)
297         , _clicks_cleared (0)
298         , _play_range (false)
299         , _range_selection (-1,-1)
300         , _object_selection (-1,-1)
301         , main_outs (0)
302         , first_file_data_format_reset (true)
303         , first_file_header_format_reset (true)
304         , have_looped (false)
305         , _have_rec_enabled_track (false)
306         , _have_rec_disabled_track (true)
307         , _step_editors (0)
308         , _suspend_timecode_transmission (0)
309         ,  _speakers (new Speakers)
310         , ignore_route_processor_changes (false)
311         , midi_clock (0)
312         , _scene_changer (0)
313         , _midi_ports (0)
314         , _mmc (0)
315         , _vca_manager (new VCAManager (*this))
316 {
317         uint32_t sr = 0;
318
319         pthread_mutex_init (&_rt_emit_mutex, 0);
320         pthread_cond_init (&_rt_emit_cond, 0);
321
322         pthread_mutex_init (&_auto_connect_mutex, 0);
323         pthread_cond_init (&_auto_connect_cond, 0);
324
325         init_name_id_counter (1); // reset for new sessions, start at 1
326         VCA::set_next_vca_number (1); // reset for new sessions, start at 1
327
328         pre_engine_init (fullpath);
329
330         setup_lua ();
331
332         if (_is_new) {
333
334                 Stateful::loading_state_version = CURRENT_SESSION_FILE_VERSION;
335
336 #ifdef USE_TRACKS_CODE_FEATURES
337                 sr = EngineStateController::instance()->get_current_sample_rate();
338 #endif
339                 if (ensure_engine (sr, true)) {
340                         destroy ();
341                         throw SessionException (_("Cannot connect to audio/midi engine"));
342                 }
343
344                 // set samplerate for plugins added early
345                 // e.g from templates or MB channelstrip
346                 set_block_size (_engine.samples_per_cycle());
347                 set_frame_rate (_engine.sample_rate());
348
349                 if (create (mix_template, bus_profile)) {
350                         destroy ();
351                         throw SessionException (_("Session initialization failed"));
352                 }
353
354                 /* if a mix template was provided, then ::create() will
355                  * have copied it into the session and we need to load it
356                  * so that we have the state ready for ::set_state()
357                  * after the engine is started.
358                  *
359                  * Note that we do NOT try to get the sample rate from
360                  * the template at this time, though doing so would
361                  * be easy if we decided this was an appropriate part
362                  * of a template.
363                  */
364
365                 if (!mix_template.empty()) {
366                         if (load_state (_current_snapshot_name)) {
367                                 throw SessionException (_("Failed to load template/snapshot state"));
368                         }
369                         store_recent_templates (mix_template);
370                 }
371
372                 /* load default session properties - if any */
373                 config.load_state();
374
375         } else {
376
377                 if (load_state (_current_snapshot_name)) {
378                         throw SessionException (_("Failed to load state"));
379                 }
380
381                 /* try to get sample rate from XML state so that we
382                  * can influence the SR if we set up the audio
383                  * engine.
384                  */
385
386                 if (state_tree) {
387                         XMLProperty const * prop;
388                         XMLNode const * root (state_tree->root());
389                         if ((prop = root->property (X_("sample-rate"))) != 0) {
390                                 sr = atoi (prop->value());
391                         }
392                 }
393
394                 if (ensure_engine (sr, false)) {
395                         destroy ();
396                         throw SessionException (_("Cannot connect to audio/midi engine"));
397                 }
398         }
399
400         if (post_engine_init ()) {
401                 destroy ();
402                 throw SessionException (_("Cannot configure audio/midi engine with session parameters"));
403         }
404
405         store_recent_sessions (_name, _path);
406
407         bool was_dirty = dirty();
408
409         _state_of_the_state = StateOfTheState (_state_of_the_state & ~Dirty);
410
411         Config->ParameterChanged.connect_same_thread (*this, boost::bind (&Session::config_changed, this, _1, false));
412         config.ParameterChanged.connect_same_thread (*this, boost::bind (&Session::config_changed, this, _1, true));
413
414         if (was_dirty) {
415                 DirtyChanged (); /* EMIT SIGNAL */
416         }
417
418         StartTimeChanged.connect_same_thread (*this, boost::bind (&Session::start_time_changed, this, _1));
419         EndTimeChanged.connect_same_thread (*this, boost::bind (&Session::end_time_changed, this, _1));
420
421         emit_thread_start ();
422         auto_connect_thread_start ();
423
424         /* hook us up to the engine since we are now completely constructed */
425
426         BootMessage (_("Connect to engine"));
427
428         _engine.set_session (this);
429         _engine.reset_timebase ();
430
431 #ifdef USE_TRACKS_CODE_FEATURES
432
433         EngineStateController::instance()->set_session(this);
434
435         if (_is_new ) {
436                 if ( ARDOUR::Profile->get_trx () ) {
437
438                         /* Waves Tracks: fill session with tracks basing on the amount of inputs.
439                          * each available input must have corresponding track when session starts.
440                          */
441
442                         uint32_t how_many (0);
443
444                         std::vector<std::string> inputs;
445                         EngineStateController::instance()->get_physical_audio_inputs(inputs);
446
447                         how_many = inputs.size();
448
449                         list<boost::shared_ptr<AudioTrack> > tracks;
450
451                         // Track names after driver
452                         if (Config->get_tracks_auto_naming() == NameAfterDriver) {
453                                 string track_name = "";
454                                 for (std::vector<string>::size_type i = 0; i < inputs.size(); ++i) {
455                                         string track_name;
456                                         track_name = inputs[i];
457                                         replace_all (track_name, "system:capture", "");
458
459                                         list<boost::shared_ptr<AudioTrack> > single_track = new_audio_track (1, 1, Normal, 0, 1, track_name);
460                                         tracks.insert(tracks.begin(), single_track.front());
461                                 }
462                         } else { // Default track names
463                                 tracks = new_audio_track (1, 1, Normal, 0, how_many, string());
464                         }
465
466                         if (tracks.size() != how_many) {
467                                 destroy ();
468                                 throw failed_constructor ();
469                         }
470                 }
471         }
472 #endif
473
474         _is_new = false;
475         session_loaded ();
476
477         BootMessage (_("Session loading complete"));
478 }
479
480 Session::~Session ()
481 {
482 #ifdef PT_TIMING
483         ST.dump ("ST.dump");
484 #endif
485         destroy ();
486 }
487
488 unsigned int
489 Session::next_name_id ()
490 {
491         return g_atomic_int_add (&_name_id_counter, 1);
492 }
493
494 unsigned int
495 Session::name_id_counter ()
496 {
497         return g_atomic_int_get (&_name_id_counter);
498 }
499
500 void
501 Session::init_name_id_counter (guint n)
502 {
503         g_atomic_int_set (&_name_id_counter, n);
504 }
505
506 int
507 Session::ensure_engine (uint32_t desired_sample_rate, bool isnew)
508 {
509         if (_engine.current_backend() == 0) {
510                 /* backend is unknown ... */
511                 boost::optional<int> r = AudioEngineSetupRequired (desired_sample_rate);
512                 if (r.get_value_or (-1) != 0) {
513                         return -1;
514                 }
515         } else if (!isnew && _engine.running() && _engine.sample_rate () == desired_sample_rate) {
516                 /* keep engine */
517         } else if (_engine.setup_required()) {
518                 /* backend is known, but setup is needed */
519                 boost::optional<int> r = AudioEngineSetupRequired (desired_sample_rate);
520                 if (r.get_value_or (-1) != 0) {
521                         return -1;
522                 }
523         } else if (!_engine.running()) {
524                 if (_engine.start()) {
525                         return -1;
526                 }
527         }
528
529         /* at this point the engine should be running */
530
531         if (!_engine.running()) {
532                 return -1;
533         }
534
535         return immediately_post_engine ();
536
537 }
538
539 int
540 Session::immediately_post_engine ()
541 {
542         /* Do various initializations that should take place directly after we
543          * know that the engine is running, but before we either create a
544          * session or set state for an existing one.
545          */
546
547         if (how_many_dsp_threads () > 1) {
548                 /* For now, only create the graph if we are using >1 DSP threads, as
549                    it is a bit slower than the old code with 1 thread.
550                 */
551                 _process_graph.reset (new Graph (*this));
552         }
553
554         /* every time we reconnect, recompute worst case output latencies */
555
556         _engine.Running.connect_same_thread (*this, boost::bind (&Session::initialize_latencies, this));
557
558         if (synced_to_engine()) {
559                 _engine.transport_stop ();
560         }
561
562         if (config.get_jack_time_master()) {
563                 _engine.transport_locate (_transport_frame);
564         }
565
566         try {
567                 LocaleGuard lg;
568                 BootMessage (_("Set up LTC"));
569                 setup_ltc ();
570                 BootMessage (_("Set up Click"));
571                 setup_click ();
572                 BootMessage (_("Set up standard connections"));
573                 setup_bundles ();
574         }
575
576         catch (failed_constructor& err) {
577                 return -1;
578         }
579
580         /* TODO, connect in different thread. (PortRegisteredOrUnregistered may be in RT context)
581          * can we do that? */
582          _engine.PortRegisteredOrUnregistered.connect_same_thread (*this, boost::bind (&Session::setup_bundles, this));
583
584         return 0;
585 }
586
587 void
588 Session::destroy ()
589 {
590         vector<void*> debug_pointers;
591
592         /* if we got to here, leaving pending capture state around
593            is a mistake.
594         */
595
596         remove_pending_capture_state ();
597
598         Analyser::flush ();
599
600         _state_of_the_state = StateOfTheState (CannotSave|Deletion);
601
602         /* stop autoconnecting */
603         auto_connect_thread_terminate ();
604
605         /* disconnect from any and all signals that we are connected to */
606
607         Port::PortSignalDrop (); /* EMIT SIGNAL */
608         drop_connections ();
609
610         /* shutdown control surface protocols while we still have ports
611            and the engine to move data to any devices.
612         */
613
614         ControlProtocolManager::instance().drop_protocols ();
615
616         MIDI::Name::MidiPatchManager::instance().remove_search_path(session_directory().midi_patch_path());
617
618         _engine.remove_session ();
619
620 #ifdef USE_TRACKS_CODE_FEATURES
621         EngineStateController::instance()->remove_session();
622 #endif
623
624         /* deregister all ports - there will be no process or any other
625          * callbacks from the engine any more.
626          */
627
628         Port::PortDrop (); /* EMIT SIGNAL */
629
630         ltc_tx_cleanup();
631
632         /* clear history so that no references to objects are held any more */
633
634         _history.clear ();
635
636         /* clear state tree so that no references to objects are held any more */
637
638         delete state_tree;
639         state_tree = 0;
640
641         // unregister all lua functions, drop held references (if any)
642         (*_lua_cleanup)();
643         lua.do_command ("Session = nil");
644         delete _lua_run;
645         delete _lua_add;
646         delete _lua_del;
647         delete _lua_list;
648         delete _lua_save;
649         delete _lua_load;
650         delete _lua_cleanup;
651         lua.collect_garbage ();
652
653         /* reset dynamic state version back to default */
654         Stateful::loading_state_version = 0;
655
656         _butler->drop_references ();
657         delete _butler;
658         _butler = 0;
659
660         delete _all_route_group;
661
662         DEBUG_TRACE (DEBUG::Destruction, "delete route groups\n");
663         for (list<RouteGroup *>::iterator i = _route_groups.begin(); i != _route_groups.end(); ++i) {
664                 delete *i;
665         }
666
667         if (click_data != default_click) {
668                 delete [] click_data;
669         }
670
671         if (click_emphasis_data != default_click_emphasis) {
672                 delete [] click_emphasis_data;
673         }
674
675         clear_clicks ();
676
677         /* need to remove auditioner before monitoring section
678          * otherwise it is re-connected */
679         auditioner.reset ();
680
681         /* drop references to routes held by the monitoring section
682          * specifically _monitor_out aux/listen references */
683         remove_monitor_section();
684
685         /* clear out any pending dead wood from RCU managed objects */
686
687         routes.flush ();
688         _bundles.flush ();
689
690         AudioDiskstream::free_working_buffers();
691
692         /* tell everyone who is still standing that we're about to die */
693         drop_references ();
694
695         /* tell everyone to drop references and delete objects as we go */
696
697         DEBUG_TRACE (DEBUG::Destruction, "delete regions\n");
698         RegionFactory::delete_all_regions ();
699
700         /* Do this early so that VCAs no longer hold references to routes */
701
702         DEBUG_TRACE (DEBUG::Destruction, "delete vcas\n");
703         delete _vca_manager;
704
705         DEBUG_TRACE (DEBUG::Destruction, "delete routes\n");
706
707         /* reset these three references to special routes before we do the usual route delete thing */
708
709         _master_out.reset ();
710         _monitor_out.reset ();
711
712         {
713                 RCUWriter<RouteList> writer (routes);
714                 boost::shared_ptr<RouteList> r = writer.get_copy ();
715
716                 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
717                         DEBUG_TRACE(DEBUG::Destruction, string_compose ("Dropping for route %1 ; pre-ref = %2\n", (*i)->name(), (*i).use_count()));
718                         (*i)->drop_references ();
719                 }
720
721                 r->clear ();
722                 /* writer goes out of scope and updates master */
723         }
724         routes.flush ();
725
726         {
727                 DEBUG_TRACE (DEBUG::Destruction, "delete sources\n");
728                 Glib::Threads::Mutex::Lock lm (source_lock);
729                 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
730                         DEBUG_TRACE(DEBUG::Destruction, string_compose ("Dropping for source %1 ; pre-ref = %2\n", i->second->name(), i->second.use_count()));
731                         i->second->drop_references ();
732                 }
733
734                 sources.clear ();
735         }
736
737         /* not strictly necessary, but doing it here allows the shared_ptr debugging to work */
738         playlists.reset ();
739
740         emit_thread_terminate ();
741
742         pthread_cond_destroy (&_rt_emit_cond);
743         pthread_mutex_destroy (&_rt_emit_mutex);
744
745         pthread_cond_destroy (&_auto_connect_cond);
746         pthread_mutex_destroy (&_auto_connect_mutex);
747
748         delete _scene_changer; _scene_changer = 0;
749         delete midi_control_ui; midi_control_ui = 0;
750
751         delete _mmc; _mmc = 0;
752         delete _midi_ports; _midi_ports = 0;
753         delete _locations; _locations = 0;
754
755         delete midi_clock;
756         delete _tempo_map;
757
758         /* clear event queue, the session is gone, nobody is interested in
759          * those anymore, but they do leak memory if not removed
760          */
761         while (!immediate_events.empty ()) {
762                 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
763                 SessionEvent *ev = immediate_events.front ();
764                 DEBUG_TRACE (DEBUG::SessionEvents, string_compose ("Drop event: %1\n", enum_2_string (ev->type)));
765                 immediate_events.pop_front ();
766                 bool remove = true;
767                 bool del = true;
768                 switch (ev->type) {
769                         case SessionEvent::AutoLoop:
770                         case SessionEvent::AutoLoopDeclick:
771                         case SessionEvent::Skip:
772                         case SessionEvent::PunchIn:
773                         case SessionEvent::PunchOut:
774                         case SessionEvent::StopOnce:
775                         case SessionEvent::RangeStop:
776                         case SessionEvent::RangeLocate:
777                                 remove = false;
778                                 del = false;
779                                 break;
780                         case SessionEvent::RealTimeOperation:
781                                 process_rtop (ev);
782                                 del = false;
783                         default:
784                                 break;
785                 }
786                 if (remove) {
787                         del = del && !_remove_event (ev);
788                 }
789                 if (del) {
790                         delete ev;
791                 }
792         }
793
794         DEBUG_TRACE (DEBUG::Destruction, "Session::destroy() done\n");
795
796         BOOST_SHOW_POINTERS ();
797 }
798
799 void
800 Session::setup_ltc ()
801 {
802         XMLNode* child = 0;
803
804         _ltc_input.reset (new IO (*this, X_("LTC In"), IO::Input));
805         _ltc_output.reset (new IO (*this, X_("LTC Out"), IO::Output));
806
807         if (state_tree && (child = find_named_node (*state_tree->root(), X_("LTC In"))) != 0) {
808                 _ltc_input->set_state (*(child->children().front()), Stateful::loading_state_version);
809         } else {
810                 {
811                         Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
812                         _ltc_input->ensure_io (ChanCount (DataType::AUDIO, 1), true, this);
813                 }
814                 reconnect_ltc_input ();
815         }
816
817         if (state_tree && (child = find_named_node (*state_tree->root(), X_("LTC Out"))) != 0) {
818                 _ltc_output->set_state (*(child->children().front()), Stateful::loading_state_version);
819         } else {
820                 {
821                         Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
822                         _ltc_output->ensure_io (ChanCount (DataType::AUDIO, 1), true, this);
823                 }
824                 reconnect_ltc_output ();
825         }
826
827         /* fix up names of LTC ports because we don't want the normal
828          * IO style of NAME/TYPE-{in,out}N
829          */
830
831         _ltc_input->nth (0)->set_name (X_("LTC-in"));
832         _ltc_output->nth (0)->set_name (X_("LTC-out"));
833 }
834
835 void
836 Session::setup_click ()
837 {
838         _clicking = false;
839
840         boost::shared_ptr<AutomationList> gl (new AutomationList (Evoral::Parameter (GainAutomation)));
841         boost::shared_ptr<GainControl> gain_control = boost::shared_ptr<GainControl> (new GainControl (*this, Evoral::Parameter(GainAutomation), gl));
842
843         _click_io.reset (new ClickIO (*this, X_("Click")));
844         _click_gain.reset (new Amp (*this, _("Fader"), gain_control, true));
845         _click_gain->activate ();
846         if (state_tree) {
847                 setup_click_state (state_tree->root());
848         } else {
849                 setup_click_state (0);
850         }
851 }
852
853 void
854 Session::setup_click_state (const XMLNode* node)
855 {
856         const XMLNode* child = 0;
857
858         if (node && (child = find_named_node (*node, "Click")) != 0) {
859
860                 /* existing state for Click */
861                 int c = 0;
862
863                 if (Stateful::loading_state_version < 3000) {
864                         c = _click_io->set_state_2X (*child->children().front(), Stateful::loading_state_version, false);
865                 } else {
866                         const XMLNodeList& children (child->children());
867                         XMLNodeList::const_iterator i = children.begin();
868                         if ((c = _click_io->set_state (**i, Stateful::loading_state_version)) == 0) {
869                                 ++i;
870                                 if (i != children.end()) {
871                                         c = _click_gain->set_state (**i, Stateful::loading_state_version);
872                                 }
873                         }
874                 }
875
876                 if (c == 0) {
877                         _clicking = Config->get_clicking ();
878
879                 } else {
880
881                         error << _("could not setup Click I/O") << endmsg;
882                         _clicking = false;
883                 }
884
885
886         } else {
887
888                 /* default state for Click: dual-mono to first 2 physical outputs */
889
890                 vector<string> outs;
891                 _engine.get_physical_outputs (DataType::AUDIO, outs);
892
893                 for (uint32_t physport = 0; physport < 2; ++physport) {
894                         if (outs.size() > physport) {
895                                 if (_click_io->add_port (outs[physport], this)) {
896                                         // relax, even though its an error
897                                 }
898                         }
899                 }
900
901                 if (_click_io->n_ports () > ChanCount::ZERO) {
902                         _clicking = Config->get_clicking ();
903                 }
904         }
905 }
906
907 void
908 Session::setup_bundles ()
909 {
910
911         {
912                 RCUWriter<BundleList> writer (_bundles);
913                 boost::shared_ptr<BundleList> b = writer.get_copy ();
914                 for (BundleList::iterator i = b->begin(); i != b->end();) {
915                         if (boost::dynamic_pointer_cast<UserBundle>(*i)) {
916                                 ++i;
917                                 continue;
918                         }
919                         i = b->erase(i);
920                 }
921         }
922
923         vector<string> inputs[DataType::num_types];
924         vector<string> outputs[DataType::num_types];
925         for (uint32_t i = 0; i < DataType::num_types; ++i) {
926                 _engine.get_physical_inputs (DataType (DataType::Symbol (i)), inputs[i]);
927                 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
928         }
929
930         /* Create a set of Bundle objects that map
931            to the physical I/O currently available.  We create both
932            mono and stereo bundles, so that the common cases of mono
933            and stereo tracks get bundles to put in their mixer strip
934            in / out menus.  There may be a nicer way of achieving that;
935            it doesn't really scale that well to higher channel counts
936         */
937
938         /* mono output bundles */
939
940         for (uint32_t np = 0; np < outputs[DataType::AUDIO].size(); ++np) {
941                 char buf[64];
942                 std::string pn = _engine.get_pretty_name_by_name (outputs[DataType::AUDIO][np]);
943                 if (!pn.empty()) {
944                         snprintf (buf, sizeof (buf), _("out %s"), pn.c_str());
945                 } else {
946                         snprintf (buf, sizeof (buf), _("out %" PRIu32), np+1);
947                 }
948
949                 boost::shared_ptr<Bundle> c (new Bundle (buf, true));
950                 c->add_channel (_("mono"), DataType::AUDIO);
951                 c->set_port (0, outputs[DataType::AUDIO][np]);
952
953                 add_bundle (c, false);
954         }
955
956         /* stereo output bundles */
957
958         for (uint32_t np = 0; np < outputs[DataType::AUDIO].size(); np += 2) {
959                 if (np + 1 < outputs[DataType::AUDIO].size()) {
960                         char buf[32];
961                         snprintf (buf, sizeof(buf), _("out %" PRIu32 "+%" PRIu32), np + 1, np + 2);
962                         boost::shared_ptr<Bundle> c (new Bundle (buf, true));
963                         c->add_channel (_("L"), DataType::AUDIO);
964                         c->set_port (0, outputs[DataType::AUDIO][np]);
965                         c->add_channel (_("R"), DataType::AUDIO);
966                         c->set_port (1, outputs[DataType::AUDIO][np + 1]);
967
968                         add_bundle (c, false);
969                 }
970         }
971
972         /* mono input bundles */
973
974         for (uint32_t np = 0; np < inputs[DataType::AUDIO].size(); ++np) {
975                 char buf[64];
976                 std::string pn = _engine.get_pretty_name_by_name (inputs[DataType::AUDIO][np]);
977                 if (!pn.empty()) {
978                         snprintf (buf, sizeof (buf), _("in %s"), pn.c_str());
979                 } else {
980                         snprintf (buf, sizeof (buf), _("in %" PRIu32), np+1);
981                 }
982
983                 boost::shared_ptr<Bundle> c (new Bundle (buf, false));
984                 c->add_channel (_("mono"), DataType::AUDIO);
985                 c->set_port (0, inputs[DataType::AUDIO][np]);
986
987                 add_bundle (c, false);
988         }
989
990         /* stereo input bundles */
991
992         for (uint32_t np = 0; np < inputs[DataType::AUDIO].size(); np += 2) {
993                 if (np + 1 < inputs[DataType::AUDIO].size()) {
994                         char buf[32];
995                         snprintf (buf, sizeof(buf), _("in %" PRIu32 "+%" PRIu32), np + 1, np + 2);
996
997                         boost::shared_ptr<Bundle> c (new Bundle (buf, false));
998                         c->add_channel (_("L"), DataType::AUDIO);
999                         c->set_port (0, inputs[DataType::AUDIO][np]);
1000                         c->add_channel (_("R"), DataType::AUDIO);
1001                         c->set_port (1, inputs[DataType::AUDIO][np + 1]);
1002
1003                         add_bundle (c, false);
1004                 }
1005         }
1006
1007         /* MIDI input bundles */
1008
1009         for (uint32_t np = 0; np < inputs[DataType::MIDI].size(); ++np) {
1010                 string n = inputs[DataType::MIDI][np];
1011                 std::string pn = _engine.get_pretty_name_by_name (n);
1012                 if (!pn.empty()) {
1013                         n = pn;
1014                 } else {
1015                         boost::erase_first (n, X_("alsa_pcm:"));
1016                 }
1017                 boost::shared_ptr<Bundle> c (new Bundle (n, false));
1018                 c->add_channel ("", DataType::MIDI);
1019                 c->set_port (0, inputs[DataType::MIDI][np]);
1020                 add_bundle (c, false);
1021         }
1022
1023         /* MIDI output bundles */
1024
1025         for (uint32_t np = 0; np < outputs[DataType::MIDI].size(); ++np) {
1026                 string n = outputs[DataType::MIDI][np];
1027                 std::string pn = _engine.get_pretty_name_by_name (n);
1028                 if (!pn.empty()) {
1029                         n = pn;
1030                 } else {
1031                         boost::erase_first (n, X_("alsa_pcm:"));
1032                 }
1033                 boost::shared_ptr<Bundle> c (new Bundle (n, true));
1034                 c->add_channel ("", DataType::MIDI);
1035                 c->set_port (0, outputs[DataType::MIDI][np]);
1036                 add_bundle (c, false);
1037         }
1038
1039         // we trust the backend to only calls us if there's a change
1040         BundleAddedOrRemoved (); /* EMIT SIGNAL */
1041 }
1042
1043 void
1044 Session::auto_connect_master_bus ()
1045 {
1046         if (!_master_out || !Config->get_auto_connect_standard_busses() || _monitor_out) {
1047                 return;
1048         }
1049
1050         // Waves Tracks: Do not connect master bas for Tracks if AutoConnectMaster option is not set
1051         // In this case it means "Multi Out" output mode
1052         if (ARDOUR::Profile->get_trx() && !(Config->get_output_auto_connect() & AutoConnectMaster) ) {
1053                 return;
1054         }
1055
1056         /* if requested auto-connect the outputs to the first N physical ports.
1057          */
1058
1059         uint32_t limit = _master_out->n_outputs().n_total();
1060         vector<string> outputs[DataType::num_types];
1061
1062         for (uint32_t i = 0; i < DataType::num_types; ++i) {
1063                 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
1064         }
1065
1066         for (uint32_t n = 0; n < limit; ++n) {
1067                 boost::shared_ptr<Port> p = _master_out->output()->nth (n);
1068                 string connect_to;
1069                 if (outputs[p->type()].size() > n) {
1070                         connect_to = outputs[p->type()][n];
1071                 }
1072
1073                 if (!connect_to.empty() && p->connected_to (connect_to) == false) {
1074                         if (_master_out->output()->connect (p, connect_to, this)) {
1075                                 error << string_compose (_("cannot connect master output %1 to %2"), n, connect_to)
1076                                       << endmsg;
1077                                 break;
1078                         }
1079                 }
1080         }
1081 }
1082
1083 void
1084 Session::remove_monitor_section ()
1085 {
1086         if (!_monitor_out || Profile->get_trx()) {
1087                 return;
1088         }
1089
1090         /* force reversion to Solo-In-Place */
1091         Config->set_solo_control_is_listen_control (false);
1092
1093         /* if we are auditioning, cancel it ... this is a workaround
1094            to a problem (auditioning does not execute the process graph,
1095            which is needed to remove routes when using >1 core for processing)
1096         */
1097         cancel_audition ();
1098
1099         {
1100                 /* Hold process lock while doing this so that we don't hear bits and
1101                  * pieces of audio as we work on each route.
1102                  */
1103
1104                 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1105
1106                 /* Connect tracks to monitor section. Note that in an
1107                    existing session, the internal sends will already exist, but we want the
1108                    routes to notice that they connect to the control out specifically.
1109                 */
1110
1111
1112                 boost::shared_ptr<RouteList> r = routes.reader ();
1113                 PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
1114
1115                 for (RouteList::iterator x = r->begin(); x != r->end(); ++x) {
1116
1117                         if ((*x)->is_monitor()) {
1118                                 /* relax */
1119                         } else if ((*x)->is_master()) {
1120                                 /* relax */
1121                         } else {
1122                                 (*x)->remove_aux_or_listen (_monitor_out);
1123                         }
1124                 }
1125         }
1126
1127         remove_route (_monitor_out);
1128         if (_state_of_the_state & Deletion) {
1129                 return;
1130         }
1131
1132         auto_connect_master_bus ();
1133
1134         if (auditioner) {
1135                 auditioner->connect ();
1136         }
1137
1138         Config->ParameterChanged ("use-monitor-bus");
1139 }
1140
1141 void
1142 Session::add_monitor_section ()
1143 {
1144         RouteList rl;
1145
1146         if (_monitor_out || !_master_out || Profile->get_trx()) {
1147                 return;
1148         }
1149
1150         boost::shared_ptr<Route> r (new Route (*this, _("Monitor"), PresentationInfo::MonitorOut, DataType::AUDIO));
1151
1152         if (r->init ()) {
1153                 return;
1154         }
1155
1156         BOOST_MARK_ROUTE(r);
1157
1158         try {
1159                 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1160                 r->input()->ensure_io (_master_out->output()->n_ports(), false, this);
1161                 r->output()->ensure_io (_master_out->output()->n_ports(), false, this);
1162         } catch (...) {
1163                 error << _("Cannot create monitor section. 'Monitor' Port name is not unique.") << endmsg;
1164                 return;
1165         }
1166
1167         rl.push_back (r);
1168         add_routes (rl, false, false, false, 0);
1169
1170         assert (_monitor_out);
1171
1172         /* AUDIO ONLY as of june 29th 2009, because listen semantics for anything else
1173            are undefined, at best.
1174         */
1175
1176         uint32_t limit = _monitor_out->n_inputs().n_audio();
1177
1178         if (_master_out) {
1179
1180                 /* connect the inputs to the master bus outputs. this
1181                  * represents a separate data feed from the internal sends from
1182                  * each route. as of jan 2011, it allows the monitor section to
1183                  * conditionally ignore either the internal sends or the normal
1184                  * input feed, but we should really find a better way to do
1185                  * this, i think.
1186                  */
1187
1188                 _master_out->output()->disconnect (this);
1189
1190                 for (uint32_t n = 0; n < limit; ++n) {
1191                         boost::shared_ptr<AudioPort> p = _monitor_out->input()->ports().nth_audio_port (n);
1192                         boost::shared_ptr<AudioPort> o = _master_out->output()->ports().nth_audio_port (n);
1193
1194                         if (o) {
1195                                 string connect_to = o->name();
1196                                 if (_monitor_out->input()->connect (p, connect_to, this)) {
1197                                         error << string_compose (_("cannot connect control input %1 to %2"), n, connect_to)
1198                                               << endmsg;
1199                                         break;
1200                                 }
1201                         }
1202                 }
1203         }
1204
1205         /* if monitor section is not connected, connect it to physical outs
1206          */
1207
1208         if ((Config->get_auto_connect_standard_busses () || Profile->get_mixbus ()) && !_monitor_out->output()->connected ()) {
1209
1210                 if (!Config->get_monitor_bus_preferred_bundle().empty()) {
1211
1212                         boost::shared_ptr<Bundle> b = bundle_by_name (Config->get_monitor_bus_preferred_bundle());
1213
1214                         if (b) {
1215                                 _monitor_out->output()->connect_ports_to_bundle (b, true, this);
1216                         } else {
1217                                 warning << string_compose (_("The preferred I/O for the monitor bus (%1) cannot be found"),
1218                                                            Config->get_monitor_bus_preferred_bundle())
1219                                         << endmsg;
1220                         }
1221
1222                 } else {
1223
1224                         /* Monitor bus is audio only */
1225
1226                         vector<string> outputs[DataType::num_types];
1227
1228                         for (uint32_t i = 0; i < DataType::num_types; ++i) {
1229                                 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
1230                         }
1231
1232                         uint32_t mod = outputs[DataType::AUDIO].size();
1233                         uint32_t limit = _monitor_out->n_outputs().get (DataType::AUDIO);
1234
1235                         if (mod != 0) {
1236
1237                                 for (uint32_t n = 0; n < limit; ++n) {
1238
1239                                         boost::shared_ptr<Port> p = _monitor_out->output()->ports().port(DataType::AUDIO, n);
1240                                         string connect_to;
1241                                         if (outputs[DataType::AUDIO].size() > (n % mod)) {
1242                                                 connect_to = outputs[DataType::AUDIO][n % mod];
1243                                         }
1244
1245                                         if (!connect_to.empty()) {
1246                                                 if (_monitor_out->output()->connect (p, connect_to, this)) {
1247                                                         error << string_compose (
1248                                                                 _("cannot connect control output %1 to %2"),
1249                                                                 n, connect_to)
1250                                                               << endmsg;
1251                                                         break;
1252                                                 }
1253                                         }
1254                                 }
1255                         }
1256                 }
1257         }
1258
1259         /* Hold process lock while doing this so that we don't hear bits and
1260          * pieces of audio as we work on each route.
1261          */
1262
1263         Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1264
1265         /* Connect tracks to monitor section. Note that in an
1266            existing session, the internal sends will already exist, but we want the
1267            routes to notice that they connect to the control out specifically.
1268         */
1269
1270
1271         boost::shared_ptr<RouteList> rls = routes.reader ();
1272
1273         PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
1274
1275         for (RouteList::iterator x = rls->begin(); x != rls->end(); ++x) {
1276
1277                 if ((*x)->is_monitor()) {
1278                         /* relax */
1279                 } else if ((*x)->is_master()) {
1280                         /* relax */
1281                 } else {
1282                         (*x)->enable_monitor_send ();
1283                 }
1284         }
1285
1286         if (auditioner) {
1287                 auditioner->connect ();
1288         }
1289         Config->ParameterChanged ("use-monitor-bus");
1290 }
1291
1292 void
1293 Session::reset_monitor_section ()
1294 {
1295         /* Process lock should be held by the caller.*/
1296
1297         if (!_monitor_out || Profile->get_trx()) {
1298                 return;
1299         }
1300
1301         uint32_t limit = _master_out->n_outputs().n_audio();
1302
1303         /* connect the inputs to the master bus outputs. this
1304          * represents a separate data feed from the internal sends from
1305          * each route. as of jan 2011, it allows the monitor section to
1306          * conditionally ignore either the internal sends or the normal
1307          * input feed, but we should really find a better way to do
1308          * this, i think.
1309          */
1310
1311         _master_out->output()->disconnect (this);
1312         _monitor_out->output()->disconnect (this);
1313
1314         _monitor_out->input()->ensure_io (_master_out->output()->n_ports(), false, this);
1315         _monitor_out->output()->ensure_io (_master_out->output()->n_ports(), false, this);
1316
1317         for (uint32_t n = 0; n < limit; ++n) {
1318                 boost::shared_ptr<AudioPort> p = _monitor_out->input()->ports().nth_audio_port (n);
1319                 boost::shared_ptr<AudioPort> o = _master_out->output()->ports().nth_audio_port (n);
1320
1321                 if (o) {
1322                         string connect_to = o->name();
1323                         if (_monitor_out->input()->connect (p, connect_to, this)) {
1324                                 error << string_compose (_("cannot connect control input %1 to %2"), n, connect_to)
1325                                       << endmsg;
1326                                 break;
1327                         }
1328                 }
1329         }
1330
1331         /* connect monitor section to physical outs
1332          */
1333
1334         if (Config->get_auto_connect_standard_busses()) {
1335
1336                 if (!Config->get_monitor_bus_preferred_bundle().empty()) {
1337
1338                         boost::shared_ptr<Bundle> b = bundle_by_name (Config->get_monitor_bus_preferred_bundle());
1339
1340                         if (b) {
1341                                 _monitor_out->output()->connect_ports_to_bundle (b, true, this);
1342                         } else {
1343                                 warning << string_compose (_("The preferred I/O for the monitor bus (%1) cannot be found"),
1344                                                            Config->get_monitor_bus_preferred_bundle())
1345                                         << endmsg;
1346                         }
1347
1348                 } else {
1349
1350                         /* Monitor bus is audio only */
1351
1352                         vector<string> outputs[DataType::num_types];
1353
1354                         for (uint32_t i = 0; i < DataType::num_types; ++i) {
1355                                 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
1356                         }
1357
1358                         uint32_t mod = outputs[DataType::AUDIO].size();
1359                         uint32_t limit = _monitor_out->n_outputs().get (DataType::AUDIO);
1360
1361                         if (mod != 0) {
1362
1363                                 for (uint32_t n = 0; n < limit; ++n) {
1364
1365                                         boost::shared_ptr<Port> p = _monitor_out->output()->ports().port(DataType::AUDIO, n);
1366                                         string connect_to;
1367                                         if (outputs[DataType::AUDIO].size() > (n % mod)) {
1368                                                 connect_to = outputs[DataType::AUDIO][n % mod];
1369                                         }
1370
1371                                         if (!connect_to.empty()) {
1372                                                 if (_monitor_out->output()->connect (p, connect_to, this)) {
1373                                                         error << string_compose (
1374                                                                 _("cannot connect control output %1 to %2"),
1375                                                                 n, connect_to)
1376                                                               << endmsg;
1377                                                         break;
1378                                                 }
1379                                         }
1380                                 }
1381                         }
1382                 }
1383         }
1384
1385         /* Connect tracks to monitor section. Note that in an
1386            existing session, the internal sends will already exist, but we want the
1387            routes to notice that they connect to the control out specifically.
1388         */
1389
1390
1391         boost::shared_ptr<RouteList> rls = routes.reader ();
1392
1393         PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
1394
1395         for (RouteList::iterator x = rls->begin(); x != rls->end(); ++x) {
1396
1397                 if ((*x)->is_monitor()) {
1398                         /* relax */
1399                 } else if ((*x)->is_master()) {
1400                         /* relax */
1401                 } else {
1402                         (*x)->enable_monitor_send ();
1403                 }
1404         }
1405 }
1406
1407 void
1408 Session::hookup_io ()
1409 {
1410         /* stop graph reordering notifications from
1411            causing resorts, etc.
1412         */
1413
1414         _state_of_the_state = StateOfTheState (_state_of_the_state | InitialConnecting);
1415
1416         if (!auditioner) {
1417
1418                 /* we delay creating the auditioner till now because
1419                    it makes its own connections to ports.
1420                 */
1421
1422                 try {
1423                         boost::shared_ptr<Auditioner> a (new Auditioner (*this));
1424                         if (a->init()) {
1425                                 throw failed_constructor ();
1426                         }
1427                         a->use_new_diskstream ();
1428                         auditioner = a;
1429                 }
1430
1431                 catch (failed_constructor& err) {
1432                         warning << _("cannot create Auditioner: no auditioning of regions possible") << endmsg;
1433                 }
1434         }
1435
1436         /* load bundles, which we may have postponed earlier on */
1437         if (_bundle_xml_node) {
1438                 load_bundles (*_bundle_xml_node);
1439                 delete _bundle_xml_node;
1440         }
1441
1442         /* Tell all IO objects to connect themselves together */
1443
1444         IO::enable_connecting ();
1445
1446         /* Now tell all "floating" ports to connect to whatever
1447            they should be connected to.
1448         */
1449
1450         AudioEngine::instance()->reconnect_ports ();
1451
1452         /* Anyone who cares about input state, wake up and do something */
1453
1454         IOConnectionsComplete (); /* EMIT SIGNAL */
1455
1456         _state_of_the_state = StateOfTheState (_state_of_the_state & ~InitialConnecting);
1457
1458         /* now handle the whole enchilada as if it was one
1459            graph reorder event.
1460         */
1461
1462         graph_reordered ();
1463
1464         /* update the full solo state, which can't be
1465            correctly determined on a per-route basis, but
1466            needs the global overview that only the session
1467            has.
1468         */
1469
1470         update_route_solo_state ();
1471 }
1472
1473 void
1474 Session::track_playlist_changed (boost::weak_ptr<Track> wp)
1475 {
1476         boost::shared_ptr<Track> track = wp.lock ();
1477         if (!track) {
1478                 return;
1479         }
1480
1481         boost::shared_ptr<Playlist> playlist;
1482
1483         if ((playlist = track->playlist()) != 0) {
1484                 playlist->RegionAdded.connect_same_thread (*this, boost::bind (&Session::playlist_region_added, this, _1));
1485                 playlist->RangesMoved.connect_same_thread (*this, boost::bind (&Session::playlist_ranges_moved, this, _1));
1486                 playlist->RegionsExtended.connect_same_thread (*this, boost::bind (&Session::playlist_regions_extended, this, _1));
1487         }
1488 }
1489
1490 bool
1491 Session::record_enabling_legal () const
1492 {
1493         /* this used to be in here, but survey says.... we don't need to restrict it */
1494         // if (record_status() == Recording) {
1495         //      return false;
1496         // }
1497
1498         if (Config->get_all_safe()) {
1499                 return false;
1500         }
1501         return true;
1502 }
1503
1504 void
1505 Session::set_track_monitor_input_status (bool yn)
1506 {
1507         boost::shared_ptr<RouteList> rl = routes.reader ();
1508         for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1509                 boost::shared_ptr<AudioTrack> tr = boost::dynamic_pointer_cast<AudioTrack> (*i);
1510                 if (tr && tr->rec_enable_control()->get_value()) {
1511                         //cerr << "switching to input = " << !auto_input << __FILE__ << __LINE__ << endl << endl;
1512                         tr->request_input_monitoring (yn);
1513                 }
1514         }
1515 }
1516
1517 void
1518 Session::auto_punch_start_changed (Location* location)
1519 {
1520         replace_event (SessionEvent::PunchIn, location->start());
1521
1522         if (get_record_enabled() && config.get_punch_in()) {
1523                 /* capture start has been changed, so save new pending state */
1524                 save_state ("", true);
1525         }
1526 }
1527
1528 void
1529 Session::auto_punch_end_changed (Location* location)
1530 {
1531         framepos_t when_to_stop = location->end();
1532         // when_to_stop += _worst_output_latency + _worst_input_latency;
1533         replace_event (SessionEvent::PunchOut, when_to_stop);
1534 }
1535
1536 void
1537 Session::auto_punch_changed (Location* location)
1538 {
1539         framepos_t when_to_stop = location->end();
1540
1541         replace_event (SessionEvent::PunchIn, location->start());
1542         //when_to_stop += _worst_output_latency + _worst_input_latency;
1543         replace_event (SessionEvent::PunchOut, when_to_stop);
1544 }
1545
1546 /** @param loc A loop location.
1547  *  @param pos Filled in with the start time of the required fade-out (in session frames).
1548  *  @param length Filled in with the length of the required fade-out.
1549  */
1550 void
1551 Session::auto_loop_declick_range (Location* loc, framepos_t & pos, framepos_t & length)
1552 {
1553         pos = max (loc->start(), loc->end() - 64);
1554         length = loc->end() - pos;
1555 }
1556
1557 void
1558 Session::auto_loop_changed (Location* location)
1559 {
1560         replace_event (SessionEvent::AutoLoop, location->end(), location->start());
1561         framepos_t dcp;
1562         framecnt_t dcl;
1563         auto_loop_declick_range (location, dcp, dcl);
1564
1565         if (transport_rolling() && play_loop) {
1566
1567                 replace_event (SessionEvent::AutoLoopDeclick, dcp, dcl);
1568
1569                 // if (_transport_frame > location->end()) {
1570
1571                 if (_transport_frame < location->start() || _transport_frame > location->end()) {
1572                         // relocate to beginning of loop
1573                         clear_events (SessionEvent::LocateRoll);
1574
1575                         request_locate (location->start(), true);
1576
1577                 }
1578                 else if (Config->get_seamless_loop() && !loop_changing) {
1579
1580                         // schedule a locate-roll to refill the diskstreams at the
1581                         // previous loop end
1582                         loop_changing = true;
1583
1584                         if (location->end() > last_loopend) {
1585                                 clear_events (SessionEvent::LocateRoll);
1586                                 SessionEvent *ev = new SessionEvent (SessionEvent::LocateRoll, SessionEvent::Add, last_loopend, last_loopend, 0, true);
1587                                 queue_event (ev);
1588                         }
1589
1590                 }
1591         } else {
1592                 clear_events (SessionEvent::AutoLoopDeclick);
1593                 clear_events (SessionEvent::AutoLoop);
1594         }
1595
1596         /* possibly move playhead if not rolling; if we are rolling we'll move
1597            to the loop start on stop if that is appropriate.
1598          */
1599
1600         framepos_t pos;
1601
1602         if (!transport_rolling() && select_playhead_priority_target (pos)) {
1603                 if (pos == location->start()) {
1604                         request_locate (pos);
1605                 }
1606         }
1607
1608
1609         last_loopend = location->end();
1610         set_dirty ();
1611 }
1612
1613 void
1614 Session::set_auto_punch_location (Location* location)
1615 {
1616         Location* existing;
1617
1618         if ((existing = _locations->auto_punch_location()) != 0 && existing != location) {
1619                 punch_connections.drop_connections();
1620                 existing->set_auto_punch (false, this);
1621                 remove_event (existing->start(), SessionEvent::PunchIn);
1622                 clear_events (SessionEvent::PunchOut);
1623                 auto_punch_location_changed (0);
1624         }
1625
1626         set_dirty();
1627
1628         if (location == 0) {
1629                 return;
1630         }
1631
1632         if (location->end() <= location->start()) {
1633                 error << _("Session: you can't use that location for auto punch (start <= end)") << endmsg;
1634                 return;
1635         }
1636
1637         punch_connections.drop_connections ();
1638
1639         location->StartChanged.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_start_changed, this, location));
1640         location->EndChanged.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_end_changed, this, location));
1641         location->Changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_changed, this, location));
1642
1643         location->set_auto_punch (true, this);
1644
1645         auto_punch_changed (location);
1646
1647         auto_punch_location_changed (location);
1648 }
1649
1650 void
1651 Session::set_session_extents (framepos_t start, framepos_t end)
1652 {
1653         Location* existing;
1654         if ((existing = _locations->session_range_location()) == 0) {
1655                 //if there is no existing session, we need to make a new session location  (should never happen)
1656                 existing = new Location (*this, 0, 0, _("session"), Location::IsSessionRange);
1657         }
1658
1659         if (end <= start) {
1660                 error << _("Session: you can't use that location for session start/end)") << endmsg;
1661                 return;
1662         }
1663
1664         existing->set( start, end );
1665
1666         set_dirty();
1667 }
1668
1669 void
1670 Session::set_auto_loop_location (Location* location)
1671 {
1672         Location* existing;
1673
1674         if ((existing = _locations->auto_loop_location()) != 0 && existing != location) {
1675                 loop_connections.drop_connections ();
1676                 existing->set_auto_loop (false, this);
1677                 remove_event (existing->end(), SessionEvent::AutoLoop);
1678                 framepos_t dcp;
1679                 framecnt_t dcl;
1680                 auto_loop_declick_range (existing, dcp, dcl);
1681                 remove_event (dcp, SessionEvent::AutoLoopDeclick);
1682                 auto_loop_location_changed (0);
1683         }
1684
1685         set_dirty();
1686
1687         if (location == 0) {
1688                 return;
1689         }
1690
1691         if (location->end() <= location->start()) {
1692                 error << _("You cannot use this location for auto-loop because it has zero or negative length") << endmsg;
1693                 return;
1694         }
1695
1696         last_loopend = location->end();
1697
1698         loop_connections.drop_connections ();
1699
1700         location->StartChanged.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, location));
1701         location->EndChanged.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, location));
1702         location->Changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, location));
1703         location->FlagsChanged.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, location));
1704
1705         location->set_auto_loop (true, this);
1706
1707         if (Config->get_loop_is_mode() && play_loop && Config->get_seamless_loop()) {
1708                 // set all tracks to use internal looping
1709                 boost::shared_ptr<RouteList> rl = routes.reader ();
1710                 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1711                         boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
1712                         if (tr && !tr->hidden()) {
1713                                 tr->set_loop (location);
1714                         }
1715                 }
1716         }
1717
1718         /* take care of our stuff first */
1719
1720         auto_loop_changed (location);
1721
1722         /* now tell everyone else */
1723
1724         auto_loop_location_changed (location);
1725 }
1726
1727 void
1728 Session::update_marks (Location*)
1729 {
1730         set_dirty ();
1731 }
1732
1733 void
1734 Session::update_skips (Location* loc, bool consolidate)
1735 {
1736         if (_ignore_skips_updates) {
1737                 return;
1738         }
1739
1740         Locations::LocationList skips;
1741
1742         if (consolidate) {
1743                 PBD::Unwinder<bool> uw (_ignore_skips_updates, true);
1744                 consolidate_skips (loc);
1745         }
1746
1747         sync_locations_to_skips ();
1748
1749         set_dirty ();
1750 }
1751
1752 void
1753 Session::consolidate_skips (Location* loc)
1754 {
1755         Locations::LocationList all_locations = _locations->list ();
1756
1757         for (Locations::LocationList::iterator l = all_locations.begin(); l != all_locations.end(); ) {
1758
1759                 if (!(*l)->is_skip ()) {
1760                         ++l;
1761                         continue;
1762                 }
1763
1764                 /* don't test against self */
1765
1766                 if (*l == loc) {
1767                         ++l;
1768                         continue;
1769                 }
1770
1771                 switch (Evoral::coverage ((*l)->start(), (*l)->end(), loc->start(), loc->end())) {
1772                 case Evoral::OverlapInternal:
1773                 case Evoral::OverlapExternal:
1774                 case Evoral::OverlapStart:
1775                 case Evoral::OverlapEnd:
1776                         /* adjust new location to cover existing one */
1777                         loc->set_start (min (loc->start(), (*l)->start()));
1778                         loc->set_end (max (loc->end(), (*l)->end()));
1779                         /* we don't need this one any more */
1780                         _locations->remove (*l);
1781                         /* the location has been deleted, so remove reference to it in our local list */
1782                         l = all_locations.erase (l);
1783                         break;
1784
1785                 case Evoral::OverlapNone:
1786                         ++l;
1787                         break;
1788                 }
1789         }
1790 }
1791
1792 void
1793 Session::sync_locations_to_skips ()
1794 {
1795         /* This happens asynchronously (in the audioengine thread). After the clear is done, we will call
1796          * Session::_sync_locations_to_skips() from the audioengine thread.
1797          */
1798         clear_events (SessionEvent::Skip, boost::bind (&Session::_sync_locations_to_skips, this));
1799 }
1800
1801 void
1802 Session::_sync_locations_to_skips ()
1803 {
1804         /* called as a callback after existing Skip events have been cleared from a realtime audioengine thread */
1805
1806         Locations::LocationList const & locs (_locations->list());
1807
1808         for (Locations::LocationList::const_iterator i = locs.begin(); i != locs.end(); ++i) {
1809
1810                 Location* location = *i;
1811
1812                 if (location->is_skip() && location->is_skipping()) {
1813                         SessionEvent* ev = new SessionEvent (SessionEvent::Skip, SessionEvent::Add, location->start(), location->end(), 1.0);
1814                         queue_event (ev);
1815                 }
1816         }
1817 }
1818
1819
1820 void
1821 Session::location_added (Location *location)
1822 {
1823         if (location->is_auto_punch()) {
1824                 set_auto_punch_location (location);
1825         }
1826
1827         if (location->is_auto_loop()) {
1828                 set_auto_loop_location (location);
1829         }
1830
1831         if (location->is_session_range()) {
1832                 /* no need for any signal handling or event setting with the session range,
1833                    because we keep a direct reference to it and use its start/end directly.
1834                 */
1835                 _session_range_location = location;
1836         }
1837
1838         if (location->is_mark()) {
1839                 /* listen for per-location signals that require us to do any * global updates for marks */
1840
1841                 location->StartChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_marks, this, location));
1842                 location->EndChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_marks, this, location));
1843                 location->Changed.connect_same_thread (skip_update_connections, boost::bind (&Session::update_marks, this, location));
1844                 location->FlagsChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_marks, this, location));
1845         }
1846
1847         if (location->is_skip()) {
1848                 /* listen for per-location signals that require us to update skip-locate events */
1849
1850                 location->StartChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_skips, this, location, true));
1851                 location->EndChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_skips, this, location, true));
1852                 location->Changed.connect_same_thread (skip_update_connections, boost::bind (&Session::update_skips, this, location, true));
1853                 location->FlagsChanged.connect_same_thread (skip_update_connections, boost::bind (&Session::update_skips, this, location, false));
1854
1855                 update_skips (location, true);
1856         }
1857
1858         set_dirty ();
1859 }
1860
1861 void
1862 Session::location_removed (Location *location)
1863 {
1864         if (location->is_auto_loop()) {
1865                 set_auto_loop_location (0);
1866                 set_track_loop (false);
1867         }
1868
1869         if (location->is_auto_punch()) {
1870                 set_auto_punch_location (0);
1871         }
1872
1873         if (location->is_session_range()) {
1874                 /* this is never supposed to happen */
1875                 error << _("programming error: session range removed!") << endl;
1876         }
1877
1878         if (location->is_skip()) {
1879
1880                 update_skips (location, false);
1881         }
1882
1883         set_dirty ();
1884 }
1885
1886 void
1887 Session::locations_changed ()
1888 {
1889         _locations->apply (*this, &Session::_locations_changed);
1890 }
1891
1892 void
1893 Session::_locations_changed (const Locations::LocationList& locations)
1894 {
1895         /* There was some mass-change in the Locations object.
1896
1897            We might be re-adding a location here but it doesn't actually matter
1898            for all the locations that the Session takes an interest in.
1899         */
1900
1901         {
1902                 PBD::Unwinder<bool> protect_ignore_skip_updates (_ignore_skips_updates, true);
1903                 for (Locations::LocationList::const_iterator i = locations.begin(); i != locations.end(); ++i) {
1904                         location_added (*i);
1905                 }
1906         }
1907
1908         update_skips (NULL, false);
1909 }
1910
1911 void
1912 Session::enable_record ()
1913 {
1914         if (_transport_speed != 0.0 && _transport_speed != 1.0) {
1915                 /* no recording at anything except normal speed */
1916                 return;
1917         }
1918
1919         while (1) {
1920                 RecordState rs = (RecordState) g_atomic_int_get (&_record_status);
1921
1922                 if (rs == Recording) {
1923                         break;
1924                 }
1925
1926                 if (g_atomic_int_compare_and_exchange (&_record_status, rs, Recording)) {
1927
1928                         _last_record_location = _transport_frame;
1929                         send_immediate_mmc (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordStrobe));
1930
1931                         if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1932                                 set_track_monitor_input_status (true);
1933                         }
1934
1935                         RecordStateChanged ();
1936                         break;
1937                 }
1938         }
1939 }
1940
1941 void
1942 Session::set_all_tracks_record_enabled (bool enable )
1943 {
1944         boost::shared_ptr<RouteList> rl = routes.reader();
1945         set_controls (route_list_to_control_list (rl, &Track::rec_enable_control), enable, Controllable::NoGroup);
1946 }
1947
1948 void
1949 Session::disable_record (bool rt_context, bool force)
1950 {
1951         RecordState rs;
1952
1953         if ((rs = (RecordState) g_atomic_int_get (&_record_status)) != Disabled) {
1954
1955                 if (!Config->get_latched_record_enable () || force) {
1956                         g_atomic_int_set (&_record_status, Disabled);
1957                         send_immediate_mmc (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordExit));
1958                 } else {
1959                         if (rs == Recording) {
1960                                 g_atomic_int_set (&_record_status, Enabled);
1961                         }
1962                 }
1963
1964                 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1965                         set_track_monitor_input_status (false);
1966                 }
1967
1968                 RecordStateChanged (); /* emit signal */
1969
1970                 if (!rt_context) {
1971                         remove_pending_capture_state ();
1972                 }
1973         }
1974 }
1975
1976 void
1977 Session::step_back_from_record ()
1978 {
1979         if (g_atomic_int_compare_and_exchange (&_record_status, Recording, Enabled)) {
1980
1981                 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1982                         set_track_monitor_input_status (false);
1983                 }
1984
1985                 RecordStateChanged (); /* emit signal */
1986         }
1987 }
1988
1989 void
1990 Session::maybe_enable_record ()
1991 {
1992         if (_step_editors > 0) {
1993                 return;
1994         }
1995
1996         g_atomic_int_set (&_record_status, Enabled);
1997
1998         /* This function is currently called from somewhere other than an RT thread.
1999            This save_state() call therefore doesn't impact anything.  Doing it here
2000            means that we save pending state of which sources the next record will use,
2001            which gives us some chance of recovering from a crash during the record.
2002         */
2003
2004         save_state ("", true);
2005
2006         if (_transport_speed) {
2007                 if (!config.get_punch_in()) {
2008                         enable_record ();
2009                 }
2010         } else {
2011                 send_immediate_mmc (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordPause));
2012                 RecordStateChanged (); /* EMIT SIGNAL */
2013         }
2014
2015         set_dirty();
2016 }
2017
2018 framepos_t
2019 Session::audible_frame () const
2020 {
2021         framepos_t ret;
2022         framepos_t tf;
2023         framecnt_t offset;
2024
2025         offset = worst_playback_latency ();
2026
2027         if (synced_to_engine()) {
2028                 /* Note: this is basically just sync-to-JACK */
2029                 tf = _engine.transport_frame();
2030         } else {
2031                 tf = _transport_frame;
2032         }
2033
2034         ret = tf;
2035
2036         if (!non_realtime_work_pending()) {
2037
2038                 /* MOVING */
2039
2040                 /* Check to see if we have passed the first guaranteed
2041                    audible frame past our last start position. if not,
2042                    return that last start point because in terms
2043                    of audible frames, we have not moved yet.
2044
2045                    `Start position' in this context means the time we last
2046                    either started, located, or changed transport direction.
2047                 */
2048
2049                 if (_transport_speed > 0.0f) {
2050
2051                         if (!play_loop || !have_looped) {
2052                                 if (tf < _last_roll_or_reversal_location + offset) {
2053                                         return _last_roll_or_reversal_location;
2054                                 }
2055                         }
2056
2057
2058                         /* forwards */
2059                         ret -= offset;
2060
2061                 } else if (_transport_speed < 0.0f) {
2062
2063                         /* XXX wot? no backward looping? */
2064
2065                         if (tf > _last_roll_or_reversal_location - offset) {
2066                                 return _last_roll_or_reversal_location;
2067                         } else {
2068                                 /* backwards */
2069                                 ret += offset;
2070                         }
2071                 }
2072         }
2073
2074         return ret;
2075 }
2076
2077 void
2078 Session::set_frame_rate (framecnt_t frames_per_second)
2079 {
2080         /** \fn void Session::set_frame_size(framecnt_t)
2081                 the AudioEngine object that calls this guarantees
2082                 that it will not be called while we are also in
2083                 ::process(). Its fine to do things that block
2084                 here.
2085         */
2086
2087         if (_base_frame_rate == 0) {
2088                 _base_frame_rate = frames_per_second;
2089         }
2090         else if (_base_frame_rate != frames_per_second && frames_per_second != _nominal_frame_rate) {
2091                 NotifyAboutSampleRateMismatch (_base_frame_rate, frames_per_second);
2092         }
2093         _nominal_frame_rate = frames_per_second;
2094
2095         sync_time_vars();
2096
2097         clear_clicks ();
2098         reset_write_sources (false);
2099
2100         // XXX we need some equivalent to this, somehow
2101         // SndFileSource::setup_standard_crossfades (frames_per_second);
2102
2103         set_dirty();
2104
2105         /* XXX need to reset/reinstantiate all LADSPA plugins */
2106 }
2107
2108 void
2109 Session::set_block_size (pframes_t nframes)
2110 {
2111         /* the AudioEngine guarantees
2112            that it will not be called while we are also in
2113            ::process(). It is therefore fine to do things that block
2114            here.
2115         */
2116
2117         {
2118                 current_block_size = nframes;
2119
2120                 ensure_buffers ();
2121
2122                 boost::shared_ptr<RouteList> r = routes.reader ();
2123
2124                 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2125                         (*i)->set_block_size (nframes);
2126                 }
2127
2128                 boost::shared_ptr<RouteList> rl = routes.reader ();
2129                 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
2130                         boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
2131                         if (tr) {
2132                                 tr->set_block_size (nframes);
2133                         }
2134                 }
2135
2136                 set_worst_io_latencies ();
2137         }
2138 }
2139
2140
2141 static void
2142 trace_terminal (boost::shared_ptr<Route> r1, boost::shared_ptr<Route> rbase)
2143 {
2144         boost::shared_ptr<Route> r2;
2145
2146         if (r1->feeds (rbase) && rbase->feeds (r1)) {
2147                 info << string_compose(_("feedback loop setup between %1 and %2"), r1->name(), rbase->name()) << endmsg;
2148                 return;
2149         }
2150
2151         /* make a copy of the existing list of routes that feed r1 */
2152
2153         Route::FedBy existing (r1->fed_by());
2154
2155         /* for each route that feeds r1, recurse, marking it as feeding
2156            rbase as well.
2157         */
2158
2159         for (Route::FedBy::iterator i = existing.begin(); i != existing.end(); ++i) {
2160                 if (!(r2 = i->r.lock ())) {
2161                         /* (*i) went away, ignore it */
2162                         continue;
2163                 }
2164
2165                 /* r2 is a route that feeds r1 which somehow feeds base. mark
2166                    base as being fed by r2
2167                 */
2168
2169                 rbase->add_fed_by (r2, i->sends_only);
2170
2171                 if (r2 != rbase) {
2172
2173                         /* 2nd level feedback loop detection. if r1 feeds or is fed by r2,
2174                            stop here.
2175                         */
2176
2177                         if (r1->feeds (r2) && r2->feeds (r1)) {
2178                                 continue;
2179                         }
2180
2181                         /* now recurse, so that we can mark base as being fed by
2182                            all routes that feed r2
2183                         */
2184
2185                         trace_terminal (r2, rbase);
2186                 }
2187
2188         }
2189 }
2190
2191 void
2192 Session::resort_routes ()
2193 {
2194         /* don't do anything here with signals emitted
2195            by Routes during initial setup or while we
2196            are being destroyed.
2197         */
2198
2199         if (_state_of_the_state & (InitialConnecting | Deletion)) {
2200                 return;
2201         }
2202
2203         if (_route_deletion_in_progress) {
2204                 return;
2205         }
2206
2207         {
2208                 RCUWriter<RouteList> writer (routes);
2209                 boost::shared_ptr<RouteList> r = writer.get_copy ();
2210                 resort_routes_using (r);
2211                 /* writer goes out of scope and forces update */
2212         }
2213
2214 #ifndef NDEBUG
2215         if (DEBUG_ENABLED(DEBUG::Graph)) {
2216                 boost::shared_ptr<RouteList> rl = routes.reader ();
2217                 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
2218                         DEBUG_TRACE (DEBUG::Graph, string_compose ("%1 fed by ...\n", (*i)->name()));
2219
2220                         const Route::FedBy& fb ((*i)->fed_by());
2221
2222                         for (Route::FedBy::const_iterator f = fb.begin(); f != fb.end(); ++f) {
2223                                 boost::shared_ptr<Route> sf = f->r.lock();
2224                                 if (sf) {
2225                                         DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 (sends only ? %2)\n", sf->name(), f->sends_only));
2226                                 }
2227                         }
2228                 }
2229         }
2230 #endif
2231
2232 }
2233
2234 /** This is called whenever we need to rebuild the graph of how we will process
2235  *  routes.
2236  *  @param r List of routes, in any order.
2237  */
2238
2239 void
2240 Session::resort_routes_using (boost::shared_ptr<RouteList> r)
2241 {
2242         /* We are going to build a directed graph of our routes;
2243            this is where the edges of that graph are put.
2244         */
2245
2246         GraphEdges edges;
2247
2248         /* Go through all routes doing two things:
2249          *
2250          * 1. Collect the edges of the route graph.  Each of these edges
2251          *    is a pair of routes, one of which directly feeds the other
2252          *    either by a JACK connection or by an internal send.
2253          *
2254          * 2. Begin the process of making routes aware of which other
2255          *    routes directly or indirectly feed them.  This information
2256          *    is used by the solo code.
2257          */
2258
2259         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2260
2261                 /* Clear out the route's list of direct or indirect feeds */
2262                 (*i)->clear_fed_by ();
2263
2264                 for (RouteList::iterator j = r->begin(); j != r->end(); ++j) {
2265
2266                         bool via_sends_only;
2267
2268                         /* See if this *j feeds *i according to the current state of the JACK
2269                            connections and internal sends.
2270                         */
2271                         if ((*j)->direct_feeds_according_to_reality (*i, &via_sends_only)) {
2272                                 /* add the edge to the graph (part #1) */
2273                                 edges.add (*j, *i, via_sends_only);
2274                                 /* tell the route (for part #2) */
2275                                 (*i)->add_fed_by (*j, via_sends_only);
2276                         }
2277                 }
2278         }
2279
2280         /* Attempt a topological sort of the route graph */
2281         boost::shared_ptr<RouteList> sorted_routes = topological_sort (r, edges);
2282
2283         if (sorted_routes) {
2284                 /* We got a satisfactory topological sort, so there is no feedback;
2285                    use this new graph.
2286
2287                    Note: the process graph rechain does not require a
2288                    topologically-sorted list, but hey ho.
2289                 */
2290                 if (_process_graph) {
2291                         _process_graph->rechain (sorted_routes, edges);
2292                 }
2293
2294                 _current_route_graph = edges;
2295
2296                 /* Complete the building of the routes' lists of what directly
2297                    or indirectly feeds them.
2298                 */
2299                 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2300                         trace_terminal (*i, *i);
2301                 }
2302
2303                 *r = *sorted_routes;
2304
2305 #ifndef NDEBUG
2306                 DEBUG_TRACE (DEBUG::Graph, "Routes resorted, order follows:\n");
2307                 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2308                         DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 presentation order %2\n", (*i)->name(), (*i)->presentation_info().global_order()));
2309                 }
2310 #endif
2311
2312                 SuccessfulGraphSort (); /* EMIT SIGNAL */
2313
2314         } else {
2315                 /* The topological sort failed, so we have a problem.  Tell everyone
2316                    and stick to the old graph; this will continue to be processed, so
2317                    until the feedback is fixed, what is played back will not quite
2318                    reflect what is actually connected.  Note also that we do not
2319                    do trace_terminal here, as it would fail due to an endless recursion,
2320                    so the solo code will think that everything is still connected
2321                    as it was before.
2322                 */
2323
2324                 FeedbackDetected (); /* EMIT SIGNAL */
2325         }
2326
2327 }
2328
2329 /** Find a route name starting with \a base, maybe followed by the
2330  *  lowest \a id.  \a id will always be added if \a definitely_add_number
2331  *  is true on entry; otherwise it will only be added if required
2332  *  to make the name unique.
2333  *
2334  *  Names are constructed like e.g. "Audio 3" for base="Audio" and id=3.
2335  *  The available route name with the lowest ID will be used, and \a id
2336  *  will be set to the ID.
2337  *
2338  *  \return false if a route name could not be found, and \a track_name
2339  *  and \a id do not reflect a free route name.
2340  */
2341 bool
2342 Session::find_route_name (string const & base, uint32_t& id, string& name, bool definitely_add_number)
2343 {
2344         /* the base may conflict with ports that do not belong to existing
2345            routes, but hidden objects like the click track. So check port names
2346            before anything else.
2347         */
2348
2349         for (vector<string>::const_iterator reserved = reserved_io_names.begin(); reserved != reserved_io_names.end(); ++reserved) {
2350                 if (base == *reserved) {
2351                         /* Check if this reserved name already exists, and if
2352                            so, disallow it without a numeric suffix.
2353                         */
2354                         if (route_by_name (*reserved)) {
2355                                 definitely_add_number = true;
2356                                 if (id < 1) {
2357                                         id = 1;
2358                                 }
2359                         }
2360                         break;
2361                 }
2362         }
2363
2364         if (!definitely_add_number && route_by_name (base) == 0) {
2365                 /* juse use the base */
2366                 name = base;
2367                 return true;
2368         }
2369
2370         do {
2371                 name = string_compose ("%1 %2", base, id);
2372
2373                 if (route_by_name (name) == 0) {
2374                         return true;
2375                 }
2376
2377                 ++id;
2378
2379         } while (id < (UINT_MAX-1));
2380
2381         return false;
2382 }
2383
2384 /** Count the total ins and outs of all non-hidden tracks in the session and return them in in and out */
2385 void
2386 Session::count_existing_track_channels (ChanCount& in, ChanCount& out)
2387 {
2388         in  = ChanCount::ZERO;
2389         out = ChanCount::ZERO;
2390
2391         boost::shared_ptr<RouteList> r = routes.reader ();
2392
2393         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2394                 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
2395                 if (tr && !tr->is_auditioner()) {
2396                         in  += tr->n_inputs();
2397                         out += tr->n_outputs();
2398                 }
2399         }
2400 }
2401
2402 string
2403 Session::default_track_name_pattern (DataType t)
2404 {
2405         switch (t) {
2406         case DataType::AUDIO:
2407                 if (Profile->get_trx()) {
2408                         return _("Track ");
2409                 } else {
2410                         return _("Audio ");
2411                 }
2412                 break;
2413
2414         case DataType::MIDI:
2415                 return _("MIDI ");
2416         }
2417
2418         return "";
2419 }
2420
2421 /** Caller must not hold process lock
2422  *  @param name_template string to use for the start of the name, or "" to use "MIDI".
2423  *  @param instrument plugin info for the instrument to insert pre-fader, if any
2424  */
2425 list<boost::shared_ptr<MidiTrack> >
2426 Session::new_midi_track (const ChanCount& input, const ChanCount& output,
2427                          boost::shared_ptr<PluginInfo> instrument, Plugin::PresetRecord* pset,
2428                          RouteGroup* route_group, uint32_t how_many, string name_template, PresentationInfo::order_t order,
2429                          TrackMode mode)
2430 {
2431         string track_name;
2432         uint32_t track_id = 0;
2433         string port;
2434         RouteList new_routes;
2435         list<boost::shared_ptr<MidiTrack> > ret;
2436
2437         const string name_pattern = default_track_name_pattern (DataType::MIDI);
2438         bool const use_number = (how_many != 1) || name_template.empty () || (name_template == name_pattern);
2439
2440         while (how_many) {
2441                 if (!find_route_name (name_template.empty() ? _("MIDI") : name_template, ++track_id, track_name, use_number)) {
2442                         error << "cannot find name for new midi track" << endmsg;
2443                         goto failed;
2444                 }
2445
2446                 boost::shared_ptr<MidiTrack> track;
2447
2448                 try {
2449                         track.reset (new MidiTrack (*this, track_name, mode));
2450
2451                         if (track->init ()) {
2452                                 goto failed;
2453                         }
2454
2455                         if (Profile->get_mixbus ()) {
2456                                 track->set_strict_io (true);
2457                         }
2458
2459                         track->use_new_diskstream();
2460
2461                         BOOST_MARK_TRACK (track);
2462
2463                         {
2464                                 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2465                                 if (track->input()->ensure_io (input, false, this)) {
2466                                         error << "cannot configure " << input << " out configuration for new midi track" << endmsg;
2467                                         goto failed;
2468                                 }
2469
2470                                 if (track->output()->ensure_io (output, false, this)) {
2471                                         error << "cannot configure " << output << " out configuration for new midi track" << endmsg;
2472                                         goto failed;
2473                                 }
2474                         }
2475
2476                         track->non_realtime_input_change();
2477
2478                         if (route_group) {
2479                                 route_group->add (track);
2480                         }
2481
2482                         track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this));
2483
2484                         new_routes.push_back (track);
2485                         ret.push_back (track);
2486                 }
2487
2488                 catch (failed_constructor &err) {
2489                         error << _("Session: could not create new midi track.") << endmsg;
2490                         goto failed;
2491                 }
2492
2493                 catch (AudioEngine::PortRegistrationFailure& pfe) {
2494
2495                         error << string_compose (_("No more JACK ports are available. You will need to stop %1 and restart JACK with more ports if you need this many tracks."), PROGRAM_NAME) << endmsg;
2496                         goto failed;
2497                 }
2498
2499                 --how_many;
2500         }
2501
2502   failed:
2503         if (!new_routes.empty()) {
2504                 StateProtector sp (this);
2505                 if (Profile->get_trx()) {
2506                         add_routes (new_routes, false, false, false, order);
2507                 } else {
2508                         add_routes (new_routes, true, true, false, order);
2509                 }
2510
2511                 if (instrument) {
2512                         for (RouteList::iterator r = new_routes.begin(); r != new_routes.end(); ++r) {
2513                                 PluginPtr plugin = instrument->load (*this);
2514                                 if (pset) {
2515                                         plugin->load_preset (*pset);
2516                                 }
2517                                 boost::shared_ptr<Processor> p (new PluginInsert (*this, plugin));
2518                                 (*r)->add_processor (p, PreFader);
2519
2520                         }
2521                 }
2522         }
2523
2524         return ret;
2525 }
2526
2527 RouteList
2528 Session::new_midi_route (RouteGroup* route_group, uint32_t how_many, string name_template, boost::shared_ptr<PluginInfo> instrument, Plugin::PresetRecord* pset,
2529                          PresentationInfo::Flag flag, PresentationInfo::order_t order)
2530 {
2531         string bus_name;
2532         uint32_t bus_id = 0;
2533         string port;
2534         RouteList ret;
2535
2536         bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("Midi Bus");
2537
2538         while (how_many) {
2539                 if (!find_route_name (name_template.empty () ? _("Midi Bus") : name_template, ++bus_id, bus_name, use_number)) {
2540                         error << "cannot find name for new midi bus" << endmsg;
2541                         goto failure;
2542                 }
2543
2544                 try {
2545                         boost::shared_ptr<Route> bus (new Route (*this, bus_name, flag, DataType::AUDIO)); // XXX Editor::add_routes is not ready for ARDOUR::DataType::MIDI
2546
2547                         if (bus->init ()) {
2548                                 goto failure;
2549                         }
2550
2551                         if (Profile->get_mixbus ()) {
2552                                 bus->set_strict_io (true);
2553                         }
2554
2555                         BOOST_MARK_ROUTE(bus);
2556
2557                         {
2558                                 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2559
2560                                 if (bus->input()->ensure_io (ChanCount(DataType::MIDI, 1), false, this)) {
2561                                         error << _("cannot configure new midi bus input") << endmsg;
2562                                         goto failure;
2563                                 }
2564
2565
2566                                 if (bus->output()->ensure_io (ChanCount(DataType::MIDI, 1), false, this)) {
2567                                         error << _("cannot configure new midi bus output") << endmsg;
2568                                         goto failure;
2569                                 }
2570                         }
2571
2572                         if (route_group) {
2573                                 route_group->add (bus);
2574                         }
2575
2576                         ret.push_back (bus);
2577                 }
2578
2579                 catch (failed_constructor &err) {
2580                         error << _("Session: could not create new audio route.") << endmsg;
2581                         goto failure;
2582                 }
2583
2584                 catch (AudioEngine::PortRegistrationFailure& pfe) {
2585                         error << pfe.what() << endmsg;
2586                         goto failure;
2587                 }
2588
2589
2590                 --how_many;
2591         }
2592
2593   failure:
2594         if (!ret.empty()) {
2595                 StateProtector sp (this);
2596                 add_routes (ret, false, false, false, order);
2597
2598                 if (instrument) {
2599                         for (RouteList::iterator r = ret.begin(); r != ret.end(); ++r) {
2600                                 PluginPtr plugin = instrument->load (*this);
2601                                 if (pset) {
2602                                         plugin->load_preset (*pset);
2603                                 }
2604                                 boost::shared_ptr<Processor> p (new PluginInsert (*this, plugin));
2605                                 (*r)->add_processor (p, PreFader);
2606                         }
2607                 }
2608         }
2609
2610         return ret;
2611
2612 }
2613
2614
2615 void
2616 Session::midi_output_change_handler (IOChange change, void * /*src*/, boost::weak_ptr<Route> wmt)
2617 {
2618         boost::shared_ptr<Route> midi_track (wmt.lock());
2619
2620         if (!midi_track) {
2621                 return;
2622         }
2623
2624         if ((change.type & IOChange::ConfigurationChanged) && Config->get_output_auto_connect() != ManualConnect) {
2625
2626                 if (change.after.n_audio() <= change.before.n_audio()) {
2627                         return;
2628                 }
2629
2630                 /* new audio ports: make sure the audio goes somewhere useful,
2631                  * unless the user has no-auto-connect selected.
2632                  *
2633                  * The existing ChanCounts don't matter for this call as they are only
2634                  * to do with matching input and output indices, and we are only changing
2635                  * outputs here.
2636                  */
2637                 auto_connect_route (midi_track, false, ChanCount(), change.before);
2638         }
2639 }
2640
2641 #ifdef USE_TRACKS_CODE_FEATURES
2642
2643 static bool
2644 compare_routes_by_remote_id (const boost::shared_ptr<Route>& route1, const boost::shared_ptr<Route>& route2)
2645 {
2646         return route1->remote_control_id() < route2->remote_control_id();
2647 }
2648
2649 void
2650 Session::reconnect_existing_routes (bool withLock, bool reconnect_master, bool reconnect_inputs, bool reconnect_outputs)
2651 {
2652         // it is not allowed to perform connection
2653         if (!IO::connecting_legal) {
2654                 return;
2655         }
2656
2657         // if we are deleting routes we will call this once at the end
2658         if (_route_deletion_in_progress) {
2659                 return;
2660         }
2661
2662         Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock (), Glib::Threads::NOT_LOCK);
2663
2664         if (withLock) {
2665                 lm.acquire ();
2666         }
2667
2668         // We need to disconnect the route's inputs and outputs first
2669         // basing on autoconnect configuration
2670         bool reconnectIputs = !(Config->get_input_auto_connect() & ManualConnect) && reconnect_inputs;
2671         bool reconnectOutputs = !(Config->get_output_auto_connect() & ManualConnect) && reconnect_outputs;
2672
2673         ChanCount existing_inputs;
2674         ChanCount existing_outputs;
2675         count_existing_track_channels (existing_inputs, existing_outputs);
2676
2677         //ChanCount inputs = ChanCount::ZERO;
2678         //ChanCount outputs = ChanCount::ZERO;
2679
2680         RouteList existing_routes = *routes.reader ();
2681         existing_routes.sort (compare_routes_by_remote_id);
2682
2683         {
2684                 PBD::Unwinder<bool> protect_ignore_changes (_reconnecting_routes_in_progress, true);
2685
2686                 vector<string> physinputs;
2687                 vector<string> physoutputs;
2688
2689                 EngineStateController::instance()->get_physical_audio_outputs(physoutputs);
2690                 EngineStateController::instance()->get_physical_audio_inputs(physinputs);
2691
2692                 uint32_t input_n = 0;
2693                 uint32_t output_n = 0;
2694                 RouteList::iterator rIter = existing_routes.begin();
2695                 const AutoConnectOption current_input_auto_connection (Config->get_input_auto_connect());
2696                 const AutoConnectOption current_output_auto_connection (Config->get_output_auto_connect());
2697                 for (; rIter != existing_routes.end(); ++rIter) {
2698                         if (*rIter == _master_out || *rIter == _monitor_out ) {
2699                                 continue;
2700                         }
2701
2702                         if (current_output_auto_connection == AutoConnectPhysical) {
2703                                 (*rIter)->amp()->deactivate();
2704                         } else if (current_output_auto_connection == AutoConnectMaster) {
2705                                 (*rIter)->amp()->activate();
2706                         }
2707
2708                         if (reconnectIputs) {
2709                                 (*rIter)->input()->disconnect (this); //GZ: check this; could be heavy
2710
2711                                 for (uint32_t route_input_n = 0; route_input_n < (*rIter)->n_inputs().get(DataType::AUDIO); ++route_input_n) {
2712
2713                                         if (current_input_auto_connection & AutoConnectPhysical) {
2714
2715                                                 if ( input_n == physinputs.size() ) {
2716                                                         break;
2717                                                 }
2718
2719                                                 string port = physinputs[input_n];
2720
2721                                                 if (port.empty() ) {
2722                                                         error << "Physical Input number "<< input_n << " is unavailable and cannot be connected" << endmsg;
2723                                                 }
2724
2725                                                 //GZ: check this; could be heavy
2726                                                 (*rIter)->input()->connect ((*rIter)->input()->ports().port(DataType::AUDIO, route_input_n), port, this);
2727                                                 ++input_n;
2728                                         }
2729                                 }
2730                         }
2731
2732                         if (reconnectOutputs) {
2733
2734                                 //normalize route ouptuts: reduce the amount outputs to be equal to the amount of inputs
2735                                 if (current_output_auto_connection & AutoConnectPhysical) {
2736
2737                                         //GZ: check this; could be heavy
2738                                         (*rIter)->output()->disconnect (this);
2739                                         size_t route_inputs_count = (*rIter)->n_inputs().get(DataType::AUDIO);
2740
2741                                         //GZ: check this; could be heavy
2742                                         (*rIter)->output()->ensure_io(ChanCount(DataType::AUDIO, route_inputs_count), false, this );
2743
2744                                 } else if (current_output_auto_connection & AutoConnectMaster){
2745
2746                                         if (!reconnect_master) {
2747                                                 continue;
2748                                         }
2749
2750                                         //GZ: check this; could be heavy
2751                                         (*rIter)->output()->disconnect (this);
2752
2753                                         if (_master_out) {
2754                                                 uint32_t master_inputs_count = _master_out->n_inputs().get(DataType::AUDIO);
2755                                                 (*rIter)->output()->ensure_io(ChanCount(DataType::AUDIO, master_inputs_count), false, this );
2756                                         } else {
2757                                                 error << error << "Master bus is not available" << endmsg;
2758                                                 break;
2759                                         }
2760                                 }
2761
2762                                 for (uint32_t route_output_n = 0; route_output_n < (*rIter)->n_outputs().get(DataType::AUDIO); ++route_output_n) {
2763                                         if (current_output_auto_connection & AutoConnectPhysical) {
2764
2765                                                 if ( output_n == physoutputs.size() ) {
2766                                                         break;
2767                                                 }
2768
2769                                                 string port = physoutputs[output_n];
2770
2771                                                 if (port.empty() ) {
2772                                                         error << "Physical Output number "<< output_n << " is unavailable and cannot be connected" << endmsg;
2773                                                 }
2774
2775                                                 //GZ: check this; could be heavy
2776                                                 (*rIter)->output()->connect ((*rIter)->output()->ports().port(DataType::AUDIO, route_output_n), port, this);
2777                                                 ++output_n;
2778
2779                                         } else if (current_output_auto_connection & AutoConnectMaster) {
2780
2781                                                 if ( route_output_n == _master_out->n_inputs().get(DataType::AUDIO) ) {
2782                                                         break;
2783                                                 }
2784
2785                                                 // connect to master bus
2786                                                 string port = _master_out->input()->ports().port(DataType::AUDIO, route_output_n)->name();
2787
2788                                                 if (port.empty() ) {
2789                                                         error << "MasterBus Input number "<< route_output_n << " is unavailable and cannot be connected" << endmsg;
2790                                                 }
2791
2792
2793                                                 //GZ: check this; could be heavy
2794                                                 (*rIter)->output()->connect ((*rIter)->output()->ports().port(DataType::AUDIO, route_output_n), port, this);
2795
2796                                         }
2797                                 }
2798                         }
2799                 }
2800
2801                 _master_out->output()->disconnect (this);
2802                 auto_connect_master_bus ();
2803         }
2804
2805         graph_reordered ();
2806
2807         session_routes_reconnected (); /* EMIT SIGNAL */
2808 }
2809
2810 void
2811 Session::reconnect_midi_scene_ports(bool inputs)
2812 {
2813     if (inputs ) {
2814
2815         boost::shared_ptr<MidiPort> scene_in_ptr = scene_in();
2816         if (scene_in_ptr) {
2817             scene_in_ptr->disconnect_all ();
2818
2819             std::vector<EngineStateController::MidiPortState> midi_port_states;
2820             EngineStateController::instance()->get_physical_midi_input_states (midi_port_states);
2821
2822             std::vector<EngineStateController::MidiPortState>::iterator state_iter = midi_port_states.begin();
2823
2824             for (; state_iter != midi_port_states.end(); ++state_iter) {
2825                 if (state_iter->active && state_iter->available && state_iter->scene_connected) {
2826                     scene_in_ptr->connect (state_iter->name);
2827                 }
2828             }
2829         }
2830
2831     } else {
2832
2833         boost::shared_ptr<MidiPort> scene_out_ptr = scene_out();
2834
2835         if (scene_out_ptr ) {
2836             scene_out_ptr->disconnect_all ();
2837
2838             std::vector<EngineStateController::MidiPortState> midi_port_states;
2839             EngineStateController::instance()->get_physical_midi_output_states (midi_port_states);
2840
2841             std::vector<EngineStateController::MidiPortState>::iterator state_iter = midi_port_states.begin();
2842
2843             for (; state_iter != midi_port_states.end(); ++state_iter) {
2844                 if (state_iter->active && state_iter->available && state_iter->scene_connected) {
2845                     scene_out_ptr->connect (state_iter->name);
2846                 }
2847             }
2848         }
2849     }
2850 }
2851
2852 void
2853 Session::reconnect_mtc_ports ()
2854 {
2855         boost::shared_ptr<MidiPort> mtc_in_ptr = _midi_ports->mtc_input_port();
2856
2857         if (!mtc_in_ptr) {
2858                 return;
2859         }
2860
2861         mtc_in_ptr->disconnect_all ();
2862
2863         std::vector<EngineStateController::MidiPortState> midi_port_states;
2864         EngineStateController::instance()->get_physical_midi_input_states (midi_port_states);
2865
2866         std::vector<EngineStateController::MidiPortState>::iterator state_iter = midi_port_states.begin();
2867
2868         for (; state_iter != midi_port_states.end(); ++state_iter) {
2869                 if (state_iter->available && state_iter->mtc_in) {
2870                         mtc_in_ptr->connect (state_iter->name);
2871                 }
2872         }
2873
2874         if (!_midi_ports->mtc_input_port ()->connected () &&
2875             config.get_external_sync () &&
2876             (Config->get_sync_source () == MTC) ) {
2877                 config.set_external_sync (false);
2878         }
2879
2880         if ( ARDOUR::Profile->get_trx () ) {
2881                 // Tracks need this signal to update timecode_source_dropdown
2882                 MtcOrLtcInputPortChanged (); //emit signal
2883         }
2884 }
2885
2886 void
2887 Session::reconnect_mmc_ports(bool inputs)
2888 {
2889         if (inputs ) { // get all enabled midi input ports
2890
2891                 boost::shared_ptr<MidiPort> mmc_in_ptr = _midi_ports->mmc_in();
2892                 if (mmc_in_ptr) {
2893                         mmc_in_ptr->disconnect_all ();
2894                         std::vector<std::string> enabled_midi_inputs;
2895                         EngineStateController::instance()->get_physical_midi_inputs (enabled_midi_inputs);
2896
2897                         std::vector<std::string>::iterator port_iter = enabled_midi_inputs.begin();
2898
2899                         for (; port_iter != enabled_midi_inputs.end(); ++port_iter) {
2900                                 mmc_in_ptr->connect (*port_iter);
2901                         }
2902
2903                 }
2904         } else { // get all enabled midi output ports
2905
2906                 boost::shared_ptr<MidiPort> mmc_out_ptr = _midi_ports->mmc_out();
2907                 if (mmc_out_ptr ) {
2908                         mmc_out_ptr->disconnect_all ();
2909                         std::vector<std::string> enabled_midi_outputs;
2910                         EngineStateController::instance()->get_physical_midi_outputs (enabled_midi_outputs);
2911
2912                         std::vector<std::string>::iterator port_iter = enabled_midi_outputs.begin();
2913
2914                         for (; port_iter != enabled_midi_outputs.end(); ++port_iter) {
2915                                 mmc_out_ptr->connect (*port_iter);
2916                         }
2917                 }
2918         }
2919 }
2920
2921 #endif
2922
2923 void
2924 Session::ensure_presentation_info_gap (PresentationInfo::order_t first_new_order, uint32_t how_many)
2925 {
2926         if (first_new_order == PresentationInfo::max_order) {
2927                 /* adding at end, no worries */
2928                 return;
2929         }
2930
2931         /* create a gap in the existing route order keys to accomodate new routes.*/
2932         boost::shared_ptr <RouteList> rd = routes.reader();
2933         for (RouteList::iterator ri = rd->begin(); ri != rd->end(); ++ri) {
2934                 boost::shared_ptr<Route> rt (*ri);
2935
2936                 if (rt->presentation_info().special()) {
2937                         continue;
2938                 }
2939
2940                 if (rt->presentation_info().group_order () >= first_new_order) {
2941                         rt->set_presentation_group_order (rt->presentation_info().group_order () + how_many);
2942                 }
2943         }
2944 }
2945
2946 /** Caller must not hold process lock
2947  *  @param name_template string to use for the start of the name, or "" to use "Audio".
2948  */
2949 list< boost::shared_ptr<AudioTrack> >
2950 Session::new_audio_track (int input_channels, int output_channels, RouteGroup* route_group,
2951                           uint32_t how_many, string name_template, PresentationInfo::order_t order,
2952                           TrackMode mode)
2953 {
2954         string track_name;
2955         uint32_t track_id = 0;
2956         string port;
2957         RouteList new_routes;
2958         list<boost::shared_ptr<AudioTrack> > ret;
2959
2960         const string name_pattern = default_track_name_pattern (DataType::AUDIO);
2961         bool const use_number = (how_many != 1) || name_template.empty () || (name_template == name_pattern);
2962
2963         while (how_many) {
2964
2965                 if (!find_route_name (name_template.empty() ? _(name_pattern.c_str()) : name_template, ++track_id, track_name, use_number)) {
2966                         error << "cannot find name for new audio track" << endmsg;
2967                         goto failed;
2968                 }
2969
2970                 boost::shared_ptr<AudioTrack> track;
2971
2972                 try {
2973                         track.reset (new AudioTrack (*this, track_name, mode));
2974
2975                         if (track->init ()) {
2976                                 goto failed;
2977                         }
2978
2979                         if (Profile->get_mixbus ()) {
2980                                 track->set_strict_io (true);
2981                         }
2982
2983                         if (ARDOUR::Profile->get_trx ()) {
2984                                 // TRACKS considers it's not a USE CASE, it's
2985                                 // a piece of behavior of the session model:
2986                                 //
2987                                 // Gain for a newly created route depends on
2988                                 // the current output_auto_connect mode:
2989                                 //
2990                                 //  0 for Stereo Out mode
2991                                 //  0 Multi Out mode
2992                                 if (Config->get_output_auto_connect() & AutoConnectMaster) {
2993                                         track->gain_control()->set_value (dB_to_coefficient (0), Controllable::NoGroup);
2994                                 }
2995                         }
2996
2997                         track->use_new_diskstream();
2998
2999                         BOOST_MARK_TRACK (track);
3000
3001                         {
3002                                 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
3003
3004                                 if (track->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
3005                                         error << string_compose (
3006                                                 _("cannot configure %1 in/%2 out configuration for new audio track"),
3007                                                 input_channels, output_channels)
3008                                               << endmsg;
3009                                         goto failed;
3010                                 }
3011
3012                                 if (track->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
3013                                         error << string_compose (
3014                                                 _("cannot configure %1 in/%2 out configuration for new audio track"),
3015                                                 input_channels, output_channels)
3016                                               << endmsg;
3017                                         goto failed;
3018                                 }
3019                         }
3020
3021                         if (route_group) {
3022                                 route_group->add (track);
3023                         }
3024
3025                         track->non_realtime_input_change();
3026
3027                         track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this));
3028
3029                         new_routes.push_back (track);
3030                         ret.push_back (track);
3031                 }
3032
3033                 catch (failed_constructor &err) {
3034                         error << _("Session: could not create new audio track.") << endmsg;
3035                         goto failed;
3036                 }
3037
3038                 catch (AudioEngine::PortRegistrationFailure& pfe) {
3039
3040                         error << pfe.what() << endmsg;
3041                         goto failed;
3042                 }
3043
3044                 --how_many;
3045         }
3046
3047   failed:
3048         if (!new_routes.empty()) {
3049                 StateProtector sp (this);
3050                 if (Profile->get_trx()) {
3051                         add_routes (new_routes, false, false, false, order);
3052                 } else {
3053                         add_routes (new_routes, true, true, false, order);
3054                 }
3055         }
3056
3057         return ret;
3058 }
3059
3060 /** Caller must not hold process lock.
3061  *  @param name_template string to use for the start of the name, or "" to use "Bus".
3062  */
3063 RouteList
3064 Session::new_audio_route (int input_channels, int output_channels, RouteGroup* route_group, uint32_t how_many, string name_template,
3065                           PresentationInfo::Flag flags, PresentationInfo::order_t order)
3066 {
3067         string bus_name;
3068         uint32_t bus_id = 0;
3069         string port;
3070         RouteList ret;
3071
3072         bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("Bus");
3073
3074         ensure_presentation_info_gap (order, how_many);
3075
3076         while (how_many) {
3077                 if (!find_route_name (name_template.empty () ? _("Bus") : name_template, ++bus_id, bus_name, use_number)) {
3078                         error << "cannot find name for new audio bus" << endmsg;
3079                         goto failure;
3080                 }
3081
3082                 try {
3083                         boost::shared_ptr<Route> bus (new Route (*this, bus_name, flags, DataType::AUDIO));
3084
3085                         if (bus->init ()) {
3086                                 goto failure;
3087                         }
3088
3089                         if (Profile->get_mixbus ()) {
3090                                 bus->set_strict_io (true);
3091                         }
3092
3093                         BOOST_MARK_ROUTE(bus);
3094
3095                         {
3096                                 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
3097
3098                                 if (bus->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
3099                                         error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
3100                                                                  input_channels, output_channels)
3101                                               << endmsg;
3102                                         goto failure;
3103                                 }
3104
3105
3106                                 if (bus->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
3107                                         error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
3108                                                                  input_channels, output_channels)
3109                                               << endmsg;
3110                                         goto failure;
3111                                 }
3112                         }
3113
3114                         if (route_group) {
3115                                 route_group->add (bus);
3116                         }
3117
3118                         bus->add_internal_return ();
3119                         ret.push_back (bus);
3120                 }
3121
3122                 catch (failed_constructor &err) {
3123                         error << _("Session: could not create new audio route.") << endmsg;
3124                         goto failure;
3125                 }
3126
3127                 catch (AudioEngine::PortRegistrationFailure& pfe) {
3128                         error << pfe.what() << endmsg;
3129                         goto failure;
3130                 }
3131
3132
3133                 --how_many;
3134         }
3135
3136   failure:
3137         if (!ret.empty()) {
3138                 StateProtector sp (this);
3139                 if (Profile->get_trx()) {
3140                         add_routes (ret, false, false, false, order);
3141                 } else {
3142                         add_routes (ret, false, true, true, order); // autoconnect // outputs only
3143                 }
3144         }
3145
3146         return ret;
3147
3148 }
3149
3150 RouteList
3151 Session::new_route_from_template (uint32_t how_many, const std::string& template_path, const std::string& name_base, PlaylistDisposition pd)
3152 {
3153         XMLTree tree;
3154
3155         if (!tree.read (template_path.c_str())) {
3156                 return RouteList();
3157         }
3158
3159         return new_route_from_template (how_many, *tree.root(), name_base, pd);
3160 }
3161
3162 RouteList
3163 Session::new_route_from_template (uint32_t how_many, XMLNode& node, const std::string& name_base, PlaylistDisposition pd)
3164 {
3165         RouteList ret;
3166         uint32_t number = 0;
3167         const uint32_t being_added = how_many;
3168         /* This will prevent the use of any existing XML-provided PBD::ID
3169            values by Stateful.
3170         */
3171         Stateful::ForceIDRegeneration force_ids;
3172         IO::disable_connecting ();
3173
3174         while (how_many) {
3175
3176                 /* We're going to modify the node contents a bit so take a
3177                  * copy. The node may be re-used when duplicating more than once.
3178                  */
3179
3180                 XMLNode node_copy (node);
3181
3182                 try {
3183                         string name;
3184
3185                         if (!name_base.empty()) {
3186
3187                                 /* if we're adding more than one routes, force
3188                                  * all the names of the new routes to be
3189                                  * numbered, via the final parameter.
3190                                  */
3191
3192                                 if (!find_route_name (name_base.c_str(), ++number, name, (being_added > 1))) {
3193                                         fatal << _("Session: UINT_MAX routes? impossible!") << endmsg;
3194                                         /*NOTREACHDE*/
3195                                 }
3196
3197                         } else {
3198
3199                                 string const route_name  = node_copy.property(X_("name"))->value ();
3200
3201                                 /* generate a new name by adding a number to the end of the template name */
3202                                 if (!find_route_name (route_name.c_str(), ++number, name, true)) {
3203                                         fatal << _("Session: UINT_MAX routes? impossible!") << endmsg;
3204                                         abort(); /*NOTREACHED*/
3205                                 }
3206                         }
3207
3208                         /* set this name in the XML description that we are about to use */
3209
3210                         bool rename_playlist;
3211                         switch (pd) {
3212                         case NewPlaylist:
3213                                 rename_playlist = true;
3214                                 break;
3215                         default:
3216                         case CopyPlaylist:
3217                         case SharePlaylist:
3218                                 rename_playlist = false;
3219                         }
3220
3221                         Route::set_name_in_state (node_copy, name, rename_playlist);
3222
3223                         /* trim bitslots from listen sends so that new ones are used */
3224                         XMLNodeList children = node_copy.children ();
3225                         for (XMLNodeList::iterator i = children.begin(); i != children.end(); ++i) {
3226                                 if ((*i)->name() == X_("Processor")) {
3227                                         /* ForceIDRegeneration does not catch the following */
3228                                         XMLProperty const * role = (*i)->property (X_("role"));
3229                                         XMLProperty const * type = (*i)->property (X_("type"));
3230                                         if (role && role->value() == X_("Aux")) {
3231                                                 /* check if the target bus exists.
3232                                                  * we should not save aux-sends in templates.
3233                                                  */
3234                                                 XMLProperty const * target = (*i)->property (X_("target"));
3235                                                 if (!target) {
3236                                                         (*i)->add_property ("type", "dangling-aux-send");
3237                                                         continue;
3238                                                 }
3239                                                 boost::shared_ptr<Route> r = route_by_id (target->value());
3240                                                 if (!r || boost::dynamic_pointer_cast<Track>(r)) {
3241                                                         (*i)->add_property ("type", "dangling-aux-send");
3242                                                         continue;
3243                                                 }
3244                                         }
3245                                         if (role && role->value() == X_("Listen")) {
3246                                                 (*i)->remove_property (X_("bitslot"));
3247                                         }
3248                                         else if (role && (role->value() == X_("Send") || role->value() == X_("Aux"))) {
3249                                                 char buf[32];
3250                                                 Delivery::Role xrole;
3251                                                 uint32_t bitslot = 0;
3252                                                 xrole = Delivery::Role (string_2_enum (role->value(), xrole));
3253                                                 std::string name = Send::name_and_id_new_send(*this, xrole, bitslot, false);
3254                                                 snprintf (buf, sizeof (buf), "%" PRIu32, bitslot);
3255                                                 (*i)->remove_property (X_("bitslot"));
3256                                                 (*i)->remove_property (X_("name"));
3257                                                 (*i)->add_property ("bitslot", buf);
3258                                                 (*i)->add_property ("name", name);
3259                                         }
3260                                         else if (type && type->value() == X_("return")) {
3261                                                 // Return::set_state() generates a new one
3262                                                 (*i)->remove_property (X_("bitslot"));
3263                                         }
3264                                         else if (type && type->value() == X_("port")) {
3265                                                 // PortInsert::set_state() handles the bitslot
3266                                                 (*i)->remove_property (X_("bitslot"));
3267                                                 (*i)->add_property ("ignore-name", "1");
3268                                         }
3269                                 }
3270                         }
3271
3272                         boost::shared_ptr<Route> route (XMLRouteFactory (node_copy, 3000));
3273
3274                         if (route == 0) {
3275                                 error << _("Session: cannot create track/bus from template description") << endmsg;
3276                                 goto out;
3277                         }
3278
3279                         if (boost::dynamic_pointer_cast<Track>(route)) {
3280                                 /* force input/output change signals so that the new diskstream
3281                                    picks up the configuration of the route. During session
3282                                    loading this normally happens in a different way.
3283                                 */
3284
3285                                 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
3286
3287                                 IOChange change (IOChange::Type (IOChange::ConfigurationChanged | IOChange::ConnectionsChanged));
3288                                 change.after = route->input()->n_ports();
3289                                 route->input()->changed (change, this);
3290                                 change.after = route->output()->n_ports();
3291                                 route->output()->changed (change, this);
3292                         }
3293
3294                         boost::shared_ptr<Track> track;
3295
3296                         if ((track = boost::dynamic_pointer_cast<Track> (route))) {
3297                                 switch (pd) {
3298                                 case NewPlaylist:
3299                                         track->use_new_playlist ();
3300                                         break;
3301                                 case CopyPlaylist:
3302                                         track->use_copy_playlist ();
3303                                         break;
3304                                 case SharePlaylist:
3305                                         break;
3306                                 }
3307                         };
3308
3309                         ret.push_back (route);
3310                 }
3311
3312                 catch (failed_constructor &err) {
3313                         error << _("Session: could not create new route from template") << endmsg;
3314                         goto out;
3315                 }
3316
3317                 catch (AudioEngine::PortRegistrationFailure& pfe) {
3318                         error << pfe.what() << endmsg;
3319                         goto out;
3320                 }
3321
3322                 --how_many;
3323         }
3324
3325   out:
3326         if (!ret.empty()) {
3327                 StateProtector sp (this);
3328                 if (Profile->get_trx()) {
3329                         add_routes (ret, false, false, false, PresentationInfo::max_order);
3330                 } else {
3331                         add_routes (ret, true, true, false, PresentationInfo::max_order);
3332                 }
3333                 IO::enable_connecting ();
3334         }
3335
3336         return ret;
3337 }
3338
3339 void
3340 Session::add_routes (RouteList& new_routes, bool input_auto_connect, bool output_auto_connect, bool save, PresentationInfo::order_t order)
3341 {
3342         try {
3343                 PBD::Unwinder<bool> aip (_adding_routes_in_progress, true);
3344                 add_routes_inner (new_routes, input_auto_connect, output_auto_connect, order);
3345
3346         } catch (...) {
3347                 error << _("Adding new tracks/busses failed") << endmsg;
3348         }
3349
3350         graph_reordered ();
3351
3352         update_latency (true);
3353         update_latency (false);
3354
3355         set_dirty();
3356
3357         if (save) {
3358                 save_state (_current_snapshot_name);
3359         }
3360
3361         update_route_record_state ();
3362
3363         RouteAdded (new_routes); /* EMIT SIGNAL */
3364 }
3365
3366 void
3367 Session::add_routes_inner (RouteList& new_routes, bool input_auto_connect, bool output_auto_connect, PresentationInfo::order_t order)
3368 {
3369         ChanCount existing_inputs;
3370         ChanCount existing_outputs;
3371         uint32_t n_routes;
3372         uint32_t added = 0;
3373
3374         count_existing_track_channels (existing_inputs, existing_outputs);
3375
3376         {
3377                 RCUWriter<RouteList> writer (routes);
3378                 boost::shared_ptr<RouteList> r = writer.get_copy ();
3379                 r->insert (r->end(), new_routes.begin(), new_routes.end());
3380                 n_routes = r->size();
3381
3382                 /* if there is no control out and we're not in the middle of loading,
3383                  * resort the graph here. if there is a control out, we will resort
3384                  * toward the end of this method. if we are in the middle of loading,
3385                  * we will resort when done.
3386                  */
3387
3388                 if (!_monitor_out && IO::connecting_legal) {
3389                         resort_routes_using (r);
3390                 }
3391         }
3392
3393         DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("ensure order gap starting at %1 for %2\n", order, new_routes.size()));
3394         ensure_presentation_info_gap (order, new_routes.size());
3395
3396         for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x, ++added) {
3397
3398                 boost::weak_ptr<Route> wpr (*x);
3399                 boost::shared_ptr<Route> r (*x);
3400
3401                 r->solo_control()->Changed.connect_same_thread (*this, boost::bind (&Session::route_solo_changed, this, _1, _2,wpr));
3402                 r->solo_isolate_control()->Changed.connect_same_thread (*this, boost::bind (&Session::route_solo_isolated_changed, this, wpr));
3403                 r->mute_control()->Changed.connect_same_thread (*this, boost::bind (&Session::route_mute_changed, this));
3404
3405                 r->output()->changed.connect_same_thread (*this, boost::bind (&Session::set_worst_io_latencies_x, this, _1, _2));
3406                 r->processors_changed.connect_same_thread (*this, boost::bind (&Session::route_processors_changed, this, _1));
3407
3408                 if (r->is_master()) {
3409                         _master_out = r;
3410                 }
3411
3412                 if (r->is_monitor()) {
3413                         _monitor_out = r;
3414                 }
3415
3416                 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (r);
3417                 if (tr) {
3418                         tr->PlaylistChanged.connect_same_thread (*this, boost::bind (&Session::track_playlist_changed, this, boost::weak_ptr<Track> (tr)));
3419                         track_playlist_changed (boost::weak_ptr<Track> (tr));
3420                         tr->rec_enable_control()->Changed.connect_same_thread (*this, boost::bind (&Session::update_route_record_state, this));
3421
3422                         boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (tr);
3423                         if (mt) {
3424                                 mt->StepEditStatusChange.connect_same_thread (*this, boost::bind (&Session::step_edit_status_change, this, _1));
3425                                 mt->output()->changed.connect_same_thread (*this, boost::bind (&Session::midi_output_change_handler, this, _1, _2, boost::weak_ptr<Route>(mt)));
3426                         }
3427                 }
3428
3429                 if (!r->presentation_info().special()) {
3430
3431                         DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("checking PI state for %1\n", r->name()));
3432
3433                         /* presentation info order may already have been set from XML */
3434
3435                         if (r->presentation_info().unordered()) {
3436
3437                                 if (order == PresentationInfo::max_order) {
3438                                         /* just add to the end */
3439                                         r->set_presentation_group_order_explicit (n_routes + added);
3440                                         DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("group order not set, set to NR %1 + %2 = %3\n", n_routes, added, n_routes + added));
3441                                 } else {
3442                                         r->set_presentation_group_order_explicit (order + added);
3443                                         DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("group order not set, set to %1 + %2 = %3\n", order, added, order + added));
3444                                 }
3445                         } else {
3446                                 DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("group order already set to %1\n", r->presentation_info().group_order()));
3447                         }
3448                 }
3449
3450                 DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("added route %1, group order %2 global order %3 type %4 (summary: %5)\n",
3451                                                                r->name(),
3452                                                                r->presentation_info().group_order(),
3453                                                                r->presentation_info().global_order(),
3454                                                                enum_2_string (r->presentation_info().flags()),
3455                                                                r->presentation_info().to_string()));
3456
3457
3458                 if (input_auto_connect || output_auto_connect) {
3459                         auto_connect_route (r, input_auto_connect, ChanCount (), ChanCount (), existing_inputs, existing_outputs);
3460                         existing_inputs += r->n_inputs();
3461                         existing_outputs += r->n_outputs();
3462                 }
3463
3464                 ARDOUR::GUIIdle ();
3465         }
3466
3467         if (_monitor_out && IO::connecting_legal) {
3468                 Glib::Threads::Mutex::Lock lm (_engine.process_lock());
3469
3470                 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) {
3471                         if ((*x)->is_monitor()) {
3472                                 /* relax */
3473                         } else if ((*x)->is_master()) {
3474                                 /* relax */
3475                         } else {
3476                                 (*x)->enable_monitor_send ();
3477                         }
3478                 }
3479         }
3480
3481         reassign_track_numbers ();
3482 }
3483
3484 void
3485 Session::globally_set_send_gains_to_zero (boost::shared_ptr<Route> dest)
3486 {
3487         boost::shared_ptr<RouteList> r = routes.reader ();
3488         boost::shared_ptr<Send> s;
3489
3490         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3491                 if ((s = (*i)->internal_send_for (dest)) != 0) {
3492                         s->amp()->gain_control()->set_value (GAIN_COEFF_ZERO, Controllable::NoGroup);
3493                 }
3494         }
3495 }
3496
3497 void
3498 Session::globally_set_send_gains_to_unity (boost::shared_ptr<Route> dest)
3499 {
3500         boost::shared_ptr<RouteList> r = routes.reader ();
3501         boost::shared_ptr<Send> s;
3502
3503         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3504                 if ((s = (*i)->internal_send_for (dest)) != 0) {
3505                         s->amp()->gain_control()->set_value (GAIN_COEFF_UNITY, Controllable::NoGroup);
3506                 }
3507         }
3508 }
3509
3510 void
3511 Session::globally_set_send_gains_from_track(boost::shared_ptr<Route> dest)
3512 {
3513         boost::shared_ptr<RouteList> r = routes.reader ();
3514         boost::shared_ptr<Send> s;
3515
3516         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3517                 if ((s = (*i)->internal_send_for (dest)) != 0) {
3518                         s->amp()->gain_control()->set_value ((*i)->gain_control()->get_value(), Controllable::NoGroup);
3519                 }
3520         }
3521 }
3522
3523 /** @param include_buses true to add sends to buses and tracks, false for just tracks */
3524 void
3525 Session::globally_add_internal_sends (boost::shared_ptr<Route> dest, Placement p, bool include_buses)
3526 {
3527         boost::shared_ptr<RouteList> r = routes.reader ();
3528         boost::shared_ptr<RouteList> t (new RouteList);
3529
3530         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3531                 /* no MIDI sends because there are no MIDI busses yet */
3532                 if (include_buses || boost::dynamic_pointer_cast<AudioTrack>(*i)) {
3533                         t->push_back (*i);
3534                 }
3535         }
3536
3537         add_internal_sends (dest, p, t);
3538 }
3539
3540 void
3541 Session::add_internal_sends (boost::shared_ptr<Route> dest, Placement p, boost::shared_ptr<RouteList> senders)
3542 {
3543         for (RouteList::iterator i = senders->begin(); i != senders->end(); ++i) {
3544                 add_internal_send (dest, (*i)->before_processor_for_placement (p), *i);
3545         }
3546 }
3547
3548 void
3549 Session::add_internal_send (boost::shared_ptr<Route> dest, int index, boost::shared_ptr<Route> sender)
3550 {
3551         add_internal_send (dest, sender->before_processor_for_index (index), sender);
3552 }
3553
3554 void
3555 Session::add_internal_send (boost::shared_ptr<Route> dest, boost::shared_ptr<Processor> before, boost::shared_ptr<Route> sender)
3556 {
3557         if (sender->is_monitor() || sender->is_master() || sender == dest || dest->is_monitor() || dest->is_master()) {
3558                 return;
3559         }
3560
3561         if (!dest->internal_return()) {
3562                 dest->add_internal_return ();
3563         }
3564
3565         sender->add_aux_send (dest, before);
3566
3567         graph_reordered ();
3568 }
3569
3570 void
3571 Session::remove_routes (boost::shared_ptr<RouteList> routes_to_remove)
3572 {
3573         { // RCU Writer scope
3574                 PBD::Unwinder<bool> uw_flag (_route_deletion_in_progress, true);
3575                 RCUWriter<RouteList> writer (routes);
3576                 boost::shared_ptr<RouteList> rs = writer.get_copy ();
3577
3578
3579                 for (RouteList::iterator iter = routes_to_remove->begin(); iter != routes_to_remove->end(); ++iter) {
3580
3581                         if (*iter == _master_out) {
3582                                 continue;
3583                         }
3584
3585                         (*iter)->solo_control()->set_value (0.0, Controllable::NoGroup);
3586
3587                         rs->remove (*iter);
3588
3589                         /* deleting the master out seems like a dumb
3590                            idea, but its more of a UI policy issue
3591                            than our concern.
3592                         */
3593
3594                         if (*iter == _master_out) {
3595                                 _master_out = boost::shared_ptr<Route> ();
3596                         }
3597
3598                         if (*iter == _monitor_out) {
3599                                 _monitor_out.reset ();
3600                         }
3601
3602                         // We need to disconnect the route's inputs and outputs
3603
3604                         (*iter)->input()->disconnect (0);
3605                         (*iter)->output()->disconnect (0);
3606
3607                         /* if the route had internal sends sending to it, remove them */
3608                         if ((*iter)->internal_return()) {
3609
3610                                 boost::shared_ptr<RouteList> r = routes.reader ();
3611                                 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3612                                         boost::shared_ptr<Send> s = (*i)->internal_send_for (*iter);
3613                                         if (s) {
3614                                                 (*i)->remove_processor (s);
3615                                         }
3616                                 }
3617                         }
3618
3619                         /* if the monitoring section had a pointer to this route, remove it */
3620                         if (_monitor_out && !(*iter)->is_master() && !(*iter)->is_monitor()) {
3621                                 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
3622                                 PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
3623                                 (*iter)->remove_aux_or_listen (_monitor_out);
3624                         }
3625
3626                         boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*iter);
3627                         if (mt && mt->step_editing()) {
3628                                 if (_step_editors > 0) {
3629                                         _step_editors--;
3630                                 }
3631                         }
3632                 }
3633
3634                 /* writer goes out of scope, forces route list update */
3635
3636         } // end of RCU Writer scope
3637
3638         update_route_solo_state ();
3639         update_latency_compensation ();
3640         set_dirty();
3641
3642         /* Re-sort routes to remove the graph's current references to the one that is
3643          * going away, then flush old references out of the graph.
3644          * Wave Tracks: reconnect routes
3645          */
3646
3647 #ifdef USE_TRACKS_CODE_FEATURES
3648                 reconnect_existing_routes(true, false);
3649 #else
3650                 routes.flush (); // maybe unsafe, see below.
3651                 resort_routes ();
3652 #endif
3653
3654         if (_process_graph && !(_state_of_the_state & Deletion)) {
3655                 _process_graph->clear_other_chain ();
3656         }
3657
3658         /* get rid of it from the dead wood collection in the route list manager */
3659         /* XXX i think this is unsafe as it currently stands, but i am not sure. (pd, october 2nd, 2006) */
3660
3661         routes.flush ();
3662
3663         /* try to cause everyone to drop their references
3664          * and unregister ports from the backend
3665          */
3666
3667         for (RouteList::iterator iter = routes_to_remove->begin(); iter != routes_to_remove->end(); ++iter) {
3668                 (*iter)->drop_references ();
3669         }
3670
3671         if (_state_of_the_state & Deletion) {
3672                 return;
3673         }
3674
3675         Stripable::PresentationInfoChange(); /* EMIT SIGNAL */
3676
3677         /* save the new state of the world */
3678
3679         if (save_state (_current_snapshot_name)) {
3680                 save_history (_current_snapshot_name);
3681         }
3682
3683         update_route_record_state ();
3684 }
3685
3686 void
3687 Session::remove_route (boost::shared_ptr<Route> route)
3688 {
3689         boost::shared_ptr<RouteList> rl (new RouteList);
3690         rl->push_back (route);
3691         remove_routes (rl);
3692 }
3693
3694 void
3695 Session::route_mute_changed ()
3696 {
3697         set_dirty ();
3698 }
3699
3700 void
3701 Session::route_listen_changed (Controllable::GroupControlDisposition group_override, boost::weak_ptr<Route> wpr)
3702 {
3703         boost::shared_ptr<Route> route (wpr.lock());
3704
3705         if (!route) {
3706                 return;
3707         }
3708
3709         assert (Config->get_solo_control_is_listen_control());
3710
3711         if (route->solo_control()->soloed_by_self_or_masters()) {
3712
3713                 if (Config->get_exclusive_solo()) {
3714
3715                         RouteGroup* rg = route->route_group ();
3716                         const bool group_already_accounted_for = (group_override == Controllable::ForGroup);
3717
3718                         boost::shared_ptr<RouteList> r = routes.reader ();
3719
3720                         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3721                                 if ((*i) == route) {
3722                                         /* already changed */
3723                                         continue;
3724                                 }
3725
3726                                 if ((*i)->solo_isolate_control()->solo_isolated() || !(*i)->can_solo()) {
3727                                         /* route does not get solo propagated to it */
3728                                         continue;
3729                                 }
3730
3731                                 if ((group_already_accounted_for && (*i)->route_group() && (*i)->route_group() == rg)) {
3732                                         /* this route is a part of the same solo group as the route
3733                                          * that was changed. Changing that route did change or will
3734                                          * change all group members appropriately, so we can ignore it
3735                                          * here
3736                                          */
3737                                         continue;
3738                                 }
3739                                 (*i)->solo_control()->set_value (0.0, Controllable::NoGroup);
3740                         }
3741                 }
3742
3743                 _listen_cnt++;
3744
3745         } else if (_listen_cnt > 0) {
3746
3747                 _listen_cnt--;
3748         }
3749
3750         update_route_solo_state ();
3751 }
3752
3753 void
3754 Session::route_solo_isolated_changed (boost::weak_ptr<Route> wpr)
3755 {
3756         boost::shared_ptr<Route> route (wpr.lock());
3757
3758         if (!route) {
3759                 return;
3760         }
3761
3762         bool send_changed = false;
3763
3764         if (route->solo_isolate_control()->solo_isolated()) {
3765                 if (_solo_isolated_cnt == 0) {
3766                         send_changed = true;
3767                 }
3768                 _solo_isolated_cnt++;
3769         } else if (_solo_isolated_cnt > 0) {
3770                 _solo_isolated_cnt--;
3771                 if (_solo_isolated_cnt == 0) {
3772                         send_changed = true;
3773                 }
3774         }
3775
3776         if (send_changed) {
3777                 IsolatedChanged (); /* EMIT SIGNAL */
3778         }
3779 }
3780
3781 void
3782 Session::route_solo_changed (bool self_solo_changed, Controllable::GroupControlDisposition group_override,  boost::weak_ptr<Route> wpr)
3783 {
3784         DEBUG_TRACE (DEBUG::Solo, string_compose ("route solo change, self = %1\n", self_solo_changed));
3785
3786         boost::shared_ptr<Route> route (wpr.lock());
3787
3788         if (!route) {
3789                 return;
3790         }
3791
3792         if (Config->get_solo_control_is_listen_control()) {
3793                 route_listen_changed (group_override, wpr);
3794                 return;
3795         }
3796
3797         DEBUG_TRACE (DEBUG::Solo, string_compose ("%1: self %2 masters %3 transition %4\n", route->name(), route->self_soloed(), route->solo_control()->get_masters_value(), route->solo_control()->transitioned_into_solo()));
3798
3799         if (route->solo_control()->transitioned_into_solo() == 0) {
3800                 /* route solo changed by upstream/downstream; not interesting
3801                    to Session.
3802                 */
3803                 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 not self-soloed nor soloed by master (%2), ignoring\n", route->name(), route->solo_control()->get_masters_value()));
3804                 return;
3805         }
3806
3807         if (route->solo_control()->transitioned_into_solo() == 0) {
3808                 /* reason for being soloed changed (e.g. master went away, we
3809                  * took over the master state), but actual status did
3810                  * not. nothing to do.
3811                  */
3812                 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1: solo change was change in reason, not status\n", route->name()));
3813         }
3814
3815         boost::shared_ptr<RouteList> r = routes.reader ();
3816         int32_t delta = route->solo_control()->transitioned_into_solo ();
3817
3818         /* the route may be a member of a group that has shared-solo
3819          * semantics. If so, then all members of that group should follow the
3820          * solo of the changed route. But ... this is optional, controlled by a
3821          * Controllable::GroupControlDisposition.
3822          *
3823          * The first argument to the signal that this method is connected to is the
3824          * GroupControlDisposition value that was used to change solo.
3825          *
3826          * If the solo change was done with group semantics (either InverseGroup
3827          * (force the entire group to change even if the group shared solo is
3828          * disabled) or UseGroup (use the group, which may or may not have the
3829          * shared solo property enabled)) then as we propagate the change to
3830          * the entire session we should IGNORE THE GROUP that the changed route
3831          * belongs to.
3832          */
3833
3834         RouteGroup* rg = route->route_group ();
3835         const bool group_already_accounted_for = (group_override == Controllable::ForGroup);
3836
3837         if (delta == 1 && Config->get_exclusive_solo()) {
3838
3839                 /* new solo: disable all other solos, but not the group if its solo-enabled */
3840
3841                 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3842
3843                         if ((*i) == route) {
3844                                 /* already changed */
3845                                 continue;
3846                         }
3847
3848                         if ((*i)->solo_isolate_control()->solo_isolated() || !(*i)->can_solo()) {
3849                                 /* route does not get solo propagated to it */
3850                                 continue;
3851                         }
3852
3853                         if ((group_already_accounted_for && (*i)->route_group() && (*i)->route_group() == rg)) {
3854                                 /* this route is a part of the same solo group as the route
3855                                  * that was changed. Changing that route did change or will
3856                                  * change all group members appropriately, so we can ignore it
3857                                  * here
3858                                  */
3859                                 continue;
3860                         }
3861
3862                         (*i)->solo_control()->set_value (0.0, group_override);
3863                 }
3864         }
3865
3866         DEBUG_TRACE (DEBUG::Solo, string_compose ("propagate solo change, delta = %1\n", delta));
3867
3868         RouteList uninvolved;
3869
3870         DEBUG_TRACE (DEBUG::Solo, string_compose ("%1\n", route->name()));
3871
3872         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3873                 bool via_sends_only;
3874                 bool in_signal_flow;
3875
3876                 if ((*i) == route) {
3877                         /* already changed */
3878                         continue;
3879                 }
3880
3881                 if ((*i)->solo_isolate_control()->solo_isolated() || !(*i)->can_solo()) {
3882                         /* route does not get solo propagated to it */
3883                         continue;
3884                 }
3885
3886                 if ((group_already_accounted_for && (*i)->route_group() && (*i)->route_group() == rg)) {
3887                         /* this route is a part of the same solo group as the route
3888                          * that was changed. Changing that route did change or will
3889                          * change all group members appropriately, so we can ignore it
3890                          * here
3891                          */
3892                         continue;
3893                 }
3894
3895                 in_signal_flow = false;
3896
3897                 DEBUG_TRACE (DEBUG::Solo, string_compose ("check feed from %1\n", (*i)->name()));
3898
3899                 if ((*i)->feeds (route, &via_sends_only)) {
3900                         DEBUG_TRACE (DEBUG::Solo, string_compose ("\tthere is a feed from %1\n", (*i)->name()));
3901                         if (!via_sends_only) {
3902                                 if (!route->soloed_by_others_upstream()) {
3903                                         (*i)->solo_control()->mod_solo_by_others_downstream (delta);
3904                                 } else {
3905                                         DEBUG_TRACE (DEBUG::Solo, "\talready soloed by others upstream\n");
3906                                 }
3907                         } else {
3908                                 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tthere is a send-only feed from %1\n", (*i)->name()));
3909                         }
3910                         in_signal_flow = true;
3911                 } else {
3912                         DEBUG_TRACE (DEBUG::Solo, string_compose ("\tno feed from %1\n", (*i)->name()));
3913                 }
3914
3915                 DEBUG_TRACE (DEBUG::Solo, string_compose ("check feed to %1\n", (*i)->name()));
3916
3917                 if (route->feeds (*i, &via_sends_only)) {
3918                         /* propagate solo upstream only if routing other than
3919                            sends is involved, but do consider the other route
3920                            (*i) to be part of the signal flow even if only
3921                            sends are involved.
3922                         */
3923                         DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 feeds %2 via sends only %3 sboD %4 sboU %5\n",
3924                                                                   route->name(),
3925                                                                   (*i)->name(),
3926                                                                   via_sends_only,
3927                                                                   route->soloed_by_others_downstream(),
3928                                                                   route->soloed_by_others_upstream()));
3929                         if (!via_sends_only) {
3930                                 //NB. Triggers Invert Push, which handles soloed by downstream
3931                                 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tmod %1 by %2\n", (*i)->name(), delta));
3932                                 (*i)->solo_control()->mod_solo_by_others_upstream (delta);
3933                         } else {
3934                                 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tfeed to %1 ignored, sends-only\n", (*i)->name()));
3935                         }
3936                         in_signal_flow = true;
3937                 } else {
3938                         DEBUG_TRACE (DEBUG::Solo, "\tno feed to\n");
3939                 }
3940
3941                 if (!in_signal_flow) {
3942                         uninvolved.push_back (*i);
3943                 }
3944         }
3945
3946         DEBUG_TRACE (DEBUG::Solo, "propagation complete\n");
3947
3948         update_route_solo_state (r);
3949
3950         /* now notify that the mute state of the routes not involved in the signal
3951            pathway of the just-solo-changed route may have altered.
3952         */
3953
3954         for (RouteList::iterator i = uninvolved.begin(); i != uninvolved.end(); ++i) {
3955                 DEBUG_TRACE (DEBUG::Solo, string_compose ("mute change for %1, which neither feeds or is fed by %2\n", (*i)->name(), route->name()));
3956                 (*i)->act_on_mute ();
3957                 (*i)->mute_control()->Changed (false, Controllable::NoGroup);
3958         }
3959
3960         SoloChanged (); /* EMIT SIGNAL */
3961         set_dirty();
3962 }
3963
3964 void
3965 Session::update_route_solo_state (boost::shared_ptr<RouteList> r)
3966 {
3967         /* now figure out if anything that matters is soloed (or is "listening")*/
3968
3969         bool something_soloed = false;
3970         bool something_listening = false;
3971         uint32_t listeners = 0;
3972         uint32_t isolated = 0;
3973
3974         if (!r) {
3975                 r = routes.reader();
3976         }
3977
3978         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3979                 if ((*i)->can_solo()) {
3980                         if (Config->get_solo_control_is_listen_control()) {
3981                                 if ((*i)->self_soloed() || (*i)->solo_control()->get_masters_value()) {
3982                                         listeners++;
3983                                         something_listening = true;
3984                                 }
3985                         } else {
3986                                 (*i)->set_listen (false);
3987                                 if ((*i)->can_solo() && ((*i)->self_soloed() || (*i)->solo_control()->get_masters_value())) {
3988                                         something_soloed = true;
3989                                 }
3990                         }
3991                 }
3992
3993                 if ((*i)->solo_isolate_control()->solo_isolated()) {
3994                         isolated++;
3995                 }
3996         }
3997
3998         if (something_soloed != _non_soloed_outs_muted) {
3999                 _non_soloed_outs_muted = something_soloed;
4000                 SoloActive (_non_soloed_outs_muted); /* EMIT SIGNAL */
4001         }
4002
4003         if (something_listening != _listening) {
4004                 _listening = something_listening;
4005                 SoloActive (_listening);
4006         }
4007
4008         _listen_cnt = listeners;
4009
4010         if (isolated != _solo_isolated_cnt) {
4011                 _solo_isolated_cnt = isolated;
4012                 IsolatedChanged (); /* EMIT SIGNAL */
4013         }
4014
4015         DEBUG_TRACE (DEBUG::Solo, string_compose ("solo state updated by session, soloed? %1 listeners %2 isolated %3\n",
4016                                                   something_soloed, listeners, isolated));
4017 }
4018
4019 void
4020 Session::get_stripables (StripableList& sl) const
4021 {
4022         boost::shared_ptr<RouteList> r = routes.reader ();
4023         sl.insert (sl.end(), r->begin(), r->end());
4024
4025         VCAList v = _vca_manager->vcas ();
4026         sl.insert (sl.end(), v.begin(), v.end());
4027 }
4028
4029 boost::shared_ptr<RouteList>
4030 Session::get_routes_with_internal_returns() const
4031 {
4032         boost::shared_ptr<RouteList> r = routes.reader ();
4033         boost::shared_ptr<RouteList> rl (new RouteList);
4034
4035         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4036                 if ((*i)->internal_return ()) {
4037                         rl->push_back (*i);
4038                 }
4039         }
4040         return rl;
4041 }
4042
4043 bool
4044 Session::io_name_is_legal (const std::string& name) const
4045 {
4046         boost::shared_ptr<RouteList> r = routes.reader ();
4047
4048         for (vector<string>::const_iterator reserved = reserved_io_names.begin(); reserved != reserved_io_names.end(); ++reserved) {
4049                 if (name == *reserved) {
4050                         if (!route_by_name (*reserved)) {
4051                                 /* first instance of a reserved name is allowed */
4052                                 return true;
4053                         }
4054                         /* all other instances of a reserved name are not allowed */
4055                         return false;
4056                 }
4057         }
4058
4059         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4060                 if ((*i)->name() == name) {
4061                         return false;
4062                 }
4063
4064                 if ((*i)->has_io_processor_named (name)) {
4065                         return false;
4066                 }
4067         }
4068
4069         return true;
4070 }
4071
4072 void
4073 Session::set_exclusive_input_active (boost::shared_ptr<RouteList> rl, bool onoff, bool flip_others)
4074 {
4075         RouteList rl2;
4076         vector<string> connections;
4077
4078         /* if we are passed only a single route and we're not told to turn
4079          * others off, then just do the simple thing.
4080          */
4081
4082         if (flip_others == false && rl->size() == 1) {
4083                 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (rl->front());
4084                 if (mt) {
4085                         mt->set_input_active (onoff);
4086                         return;
4087                 }
4088         }
4089
4090         for (RouteList::iterator rt = rl->begin(); rt != rl->end(); ++rt) {
4091
4092                 PortSet& ps ((*rt)->input()->ports());
4093
4094                 for (PortSet::iterator p = ps.begin(); p != ps.end(); ++p) {
4095                         p->get_connections (connections);
4096                 }
4097
4098                 for (vector<string>::iterator s = connections.begin(); s != connections.end(); ++s) {
4099                         routes_using_input_from (*s, rl2);
4100                 }
4101
4102                 /* scan all relevant routes to see if others are on or off */
4103
4104                 bool others_are_already_on = false;
4105
4106                 for (RouteList::iterator r = rl2.begin(); r != rl2.end(); ++r) {
4107
4108                         boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*r);
4109
4110                         if (!mt) {
4111                                 continue;
4112                         }
4113
4114                         if ((*r) != (*rt)) {
4115                                 if (mt->input_active()) {
4116                                         others_are_already_on = true;
4117                                 }
4118                         } else {
4119                                 /* this one needs changing */
4120                                 mt->set_input_active (onoff);
4121                         }
4122                 }
4123
4124                 if (flip_others) {
4125
4126                         /* globally reverse other routes */
4127
4128                         for (RouteList::iterator r = rl2.begin(); r != rl2.end(); ++r) {
4129                                 if ((*r) != (*rt)) {
4130                                         boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*r);
4131                                         if (mt) {
4132                                                 mt->set_input_active (!others_are_already_on);
4133                                         }
4134                                 }
4135                         }
4136                 }
4137         }
4138 }
4139
4140 void
4141 Session::routes_using_input_from (const string& str, RouteList& rl)
4142 {
4143         boost::shared_ptr<RouteList> r = routes.reader();
4144
4145         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4146                 if ((*i)->input()->connected_to (str)) {
4147                         rl.push_back (*i);
4148                 }
4149         }
4150 }
4151
4152 boost::shared_ptr<Route>
4153 Session::route_by_name (string name) const
4154 {
4155         boost::shared_ptr<RouteList> r = routes.reader ();
4156
4157         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4158                 if ((*i)->name() == name) {
4159                         return *i;
4160                 }
4161         }
4162
4163         return boost::shared_ptr<Route> ((Route*) 0);
4164 }
4165
4166 boost::shared_ptr<Route>
4167 Session::route_by_id (PBD::ID id) const
4168 {
4169         boost::shared_ptr<RouteList> r = routes.reader ();
4170
4171         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4172                 if ((*i)->id() == id) {
4173                         return *i;
4174                 }
4175         }
4176
4177         return boost::shared_ptr<Route> ((Route*) 0);
4178 }
4179
4180 boost::shared_ptr<Processor>
4181 Session::processor_by_id (PBD::ID id) const
4182 {
4183         boost::shared_ptr<RouteList> r = routes.reader ();
4184
4185         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4186                 boost::shared_ptr<Processor> p = (*i)->Route::processor_by_id (id);
4187                 if (p) {
4188                         return p;
4189                 }
4190         }
4191
4192         return boost::shared_ptr<Processor> ();
4193 }
4194
4195 boost::shared_ptr<Track>
4196 Session::track_by_diskstream_id (PBD::ID id) const
4197 {
4198         boost::shared_ptr<RouteList> r = routes.reader ();
4199
4200         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4201                 boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> (*i);
4202                 if (t && t->using_diskstream_id (id)) {
4203                         return t;
4204                 }
4205         }
4206
4207         return boost::shared_ptr<Track> ();
4208 }
4209
4210 boost::shared_ptr<Route>
4211 Session::get_remote_nth_route (uint16_t n) const
4212 {
4213         return boost::dynamic_pointer_cast<Route> (get_remote_nth_stripable (n, PresentationInfo::Route));
4214 }
4215
4216 struct GlobalPresentationOrderSorter {
4217         bool operator() (boost::shared_ptr<Stripable> a, boost::shared_ptr<Stripable> b) {
4218                 return a->presentation_info() < b->presentation_info();
4219         }
4220 };
4221
4222 boost::shared_ptr<Stripable>
4223 Session::get_remote_nth_stripable (uint16_t n, PresentationInfo::Flag flags) const
4224 {
4225         StripableList sl;
4226         uint32_t match_cnt = 0;
4227
4228         /* API is one-based, so adjust n */
4229
4230         if (n) {
4231                 --n;
4232         }
4233
4234         get_stripables (sl);
4235         GlobalPresentationOrderSorter cmp;
4236         sl.sort (cmp);
4237
4238         for (StripableList::const_iterator s = sl.begin(); s != sl.end(); ++s) {
4239                 if ((*s)->presentation_info().flag_match (flags)) {
4240                         cerr << '\t' << (*s)->name() << " matches " << enum_2_string (flags) << endl;
4241                         if (match_cnt++ == n) {
4242                                 return *s;
4243                         }
4244                 }
4245         }
4246
4247         /* there is no nth stripable that matches the given flags */
4248         return boost::shared_ptr<Stripable>();
4249 }
4250
4251 boost::shared_ptr<Route>
4252 Session::route_by_selected_count (uint32_t id) const
4253 {
4254         boost::shared_ptr<RouteList> r = routes.reader ();
4255
4256         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4257                 /* NOT IMPLEMENTED */
4258         }
4259
4260         return boost::shared_ptr<Route> ((Route*) 0);
4261 }
4262
4263 struct PresentationOrderSorter {
4264         bool operator() (boost::shared_ptr<Stripable> a, boost::shared_ptr<Stripable> b) {
4265                 if (a->presentation_info().special() && !b->presentation_info().special()) {
4266                         /* a is not ordered, b is; b comes before a */
4267                         return false;
4268                 } else if (b->presentation_info().unordered() && !a->presentation_info().unordered()) {
4269                         /* b is not ordered, a is; a comes before b */
4270                         return true;
4271                 } else {
4272                         return a->presentation_info().global_order() < b->presentation_info().global_order();
4273                 }
4274         }
4275 };
4276
4277 void
4278 Session::reassign_track_numbers ()
4279 {
4280         int64_t tn = 0;
4281         int64_t bn = 0;
4282         RouteList r (*(routes.reader ()));
4283         PresentationOrderSorter sorter;
4284         r.sort (sorter);
4285
4286         StateProtector sp (this);
4287
4288         for (RouteList::iterator i = r.begin(); i != r.end(); ++i) {
4289                 if (boost::dynamic_pointer_cast<Track> (*i)) {
4290                         (*i)->set_track_number(++tn);
4291                 }
4292                 else if (!(*i)->is_master() && !(*i)->is_monitor() && !(*i)->is_auditioner()) {
4293                         (*i)->set_track_number(--bn);
4294                 }
4295         }
4296         const uint32_t decimals = ceilf (log10f (tn + 1));
4297         const bool decimals_changed = _track_number_decimals != decimals;
4298         _track_number_decimals = decimals;
4299
4300         if (decimals_changed && config.get_track_name_number ()) {
4301                 for (RouteList::iterator i = r.begin(); i != r.end(); ++i) {
4302                         boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> (*i);
4303                         if (t) {
4304                                 t->resync_track_name();
4305                         }
4306                 }
4307                 // trigger GUI re-layout
4308                 config.ParameterChanged("track-name-number");
4309         }
4310
4311 #ifndef NDEBUG
4312         if (DEBUG_ENABLED(DEBUG::OrderKeys)) {
4313                 boost::shared_ptr<RouteList> rl = routes.reader ();
4314                 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
4315                         DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("%1 numbered %2\n", (*i)->name(), (*i)->track_number()));
4316                 }
4317         }
4318 #endif /* NDEBUG */
4319
4320 }
4321
4322 void
4323 Session::playlist_region_added (boost::weak_ptr<Region> w)
4324 {
4325         boost::shared_ptr<Region> r = w.lock ();
4326         if (!r) {
4327                 return;
4328         }
4329
4330         /* These are the operations that are currently in progress... */
4331         list<GQuark> curr = _current_trans_quarks;
4332         curr.sort ();
4333
4334         /* ...and these are the operations during which we want to update
4335            the session range location markers.
4336         */
4337         list<GQuark> ops;
4338         ops.push_back (Operations::capture);
4339         ops.push_back (Operations::paste);
4340         ops.push_back (Operations::duplicate_region);
4341         ops.push_back (Operations::insert_file);
4342         ops.push_back (Operations::insert_region);
4343         ops.push_back (Operations::drag_region_brush);
4344         ops.push_back (Operations::region_drag);
4345         ops.push_back (Operations::selection_grab);
4346         ops.push_back (Operations::region_fill);
4347         ops.push_back (Operations::fill_selection);
4348         ops.push_back (Operations::create_region);
4349         ops.push_back (Operations::region_copy);
4350         ops.push_back (Operations::fixed_time_region_copy);
4351         ops.sort ();
4352
4353         /* See if any of the current operations match the ones that we want */
4354         list<GQuark> in;
4355         set_intersection (_current_trans_quarks.begin(), _current_trans_quarks.end(), ops.begin(), ops.end(), back_inserter (in));
4356
4357         /* If so, update the session range markers */
4358         if (!in.empty ()) {
4359                 maybe_update_session_range (r->position (), r->last_frame ());
4360         }
4361 }
4362
4363 /** Update the session range markers if a is before the current start or
4364  *  b is after the current end.
4365  */
4366 void
4367 Session::maybe_update_session_range (framepos_t a, framepos_t b)
4368 {
4369         if (_state_of_the_state & Loading) {
4370                 return;
4371         }
4372
4373         framepos_t session_end_marker_shift_samples = session_end_shift * _nominal_frame_rate;
4374
4375         if (_session_range_location == 0) {
4376
4377                 set_session_range_location (a, b + session_end_marker_shift_samples);
4378
4379         } else {
4380
4381                 if (a < _session_range_location->start()) {
4382                         _session_range_location->set_start (a);
4383                 }
4384
4385                 if (b > _session_range_location->end()) {
4386                         _session_range_location->set_end (b);
4387                 }
4388         }
4389 }
4390
4391 void
4392 Session::playlist_ranges_moved (list<Evoral::RangeMove<framepos_t> > const & ranges)
4393 {
4394         for (list<Evoral::RangeMove<framepos_t> >::const_iterator i = ranges.begin(); i != ranges.end(); ++i) {
4395                 maybe_update_session_range (i->to, i->to + i->length);
4396         }
4397 }
4398
4399 void
4400 Session::playlist_regions_extended (list<Evoral::Range<framepos_t> > const & ranges)
4401 {
4402         for (list<Evoral::Range<framepos_t> >::const_iterator i = ranges.begin(); i != ranges.end(); ++i) {
4403                 maybe_update_session_range (i->from, i->to);
4404         }
4405 }
4406
4407 /* Region management */
4408
4409 boost::shared_ptr<Region>
4410 Session::find_whole_file_parent (boost::shared_ptr<Region const> child) const
4411 {
4412         const RegionFactory::RegionMap& regions (RegionFactory::regions());
4413         RegionFactory::RegionMap::const_iterator i;
4414         boost::shared_ptr<Region> region;
4415
4416         Glib::Threads::Mutex::Lock lm (region_lock);
4417
4418         for (i = regions.begin(); i != regions.end(); ++i) {
4419
4420                 region = i->second;
4421
4422                 if (region->whole_file()) {
4423
4424                         if (child->source_equivalent (region)) {
4425                                 return region;
4426                         }
4427                 }
4428         }
4429
4430         return boost::shared_ptr<Region> ();
4431 }
4432
4433 int
4434 Session::destroy_sources (list<boost::shared_ptr<Source> > srcs)
4435 {
4436         set<boost::shared_ptr<Region> > relevant_regions;
4437
4438         for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ++s) {
4439                 RegionFactory::get_regions_using_source (*s, relevant_regions);
4440         }
4441
4442         for (set<boost::shared_ptr<Region> >::iterator r = relevant_regions.begin(); r != relevant_regions.end(); ) {
4443                 set<boost::shared_ptr<Region> >::iterator tmp;
4444
4445                 tmp = r;
4446                 ++tmp;
4447
4448                 playlists->destroy_region (*r);
4449                 RegionFactory::map_remove (*r);
4450
4451                 (*r)->drop_sources ();
4452                 (*r)->drop_references ();
4453
4454                 relevant_regions.erase (r);
4455
4456                 r = tmp;
4457         }
4458
4459         for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ) {
4460
4461                 {
4462                         Glib::Threads::Mutex::Lock ls (source_lock);
4463                         /* remove from the main source list */
4464                         sources.erase ((*s)->id());
4465                 }
4466
4467                 (*s)->mark_for_remove ();
4468                 (*s)->drop_references ();
4469
4470                 s = srcs.erase (s);
4471         }
4472
4473         return 0;
4474 }
4475
4476 int
4477 Session::remove_last_capture ()
4478 {
4479         list<boost::shared_ptr<Source> > srcs;
4480
4481         boost::shared_ptr<RouteList> rl = routes.reader ();
4482         for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
4483                 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4484                 if (!tr) {
4485                         continue;
4486                 }
4487
4488                 list<boost::shared_ptr<Source> >& l = tr->last_capture_sources();
4489
4490                 if (!l.empty()) {
4491                         srcs.insert (srcs.end(), l.begin(), l.end());
4492                         l.clear ();
4493                 }
4494         }
4495
4496         destroy_sources (srcs);
4497
4498         save_state (_current_snapshot_name);
4499
4500         return 0;
4501 }
4502
4503 /* Source Management */
4504
4505 void
4506 Session::add_source (boost::shared_ptr<Source> source)
4507 {
4508         pair<SourceMap::key_type, SourceMap::mapped_type> entry;
4509         pair<SourceMap::iterator,bool> result;
4510
4511         entry.first = source->id();
4512         entry.second = source;
4513
4514         {
4515                 Glib::Threads::Mutex::Lock lm (source_lock);
4516                 result = sources.insert (entry);
4517         }
4518
4519         if (result.second) {
4520
4521                 /* yay, new source */
4522
4523                 boost::shared_ptr<FileSource> fs = boost::dynamic_pointer_cast<FileSource> (source);
4524
4525                 if (fs) {
4526                         if (!fs->within_session()) {
4527                                 ensure_search_path_includes (Glib::path_get_dirname (fs->path()), fs->type());
4528                         }
4529                 }
4530
4531                 set_dirty();
4532
4533                 boost::shared_ptr<AudioFileSource> afs;
4534
4535                 if ((afs = boost::dynamic_pointer_cast<AudioFileSource>(source)) != 0) {
4536                         if (Config->get_auto_analyse_audio()) {
4537                                 Analyser::queue_source_for_analysis (source, false);
4538                         }
4539                 }
4540
4541                 source->DropReferences.connect_same_thread (*this, boost::bind (&Session::remove_source, this, boost::weak_ptr<Source> (source)));
4542         }
4543 }
4544
4545 void
4546 Session::remove_source (boost::weak_ptr<Source> src)
4547 {
4548         if (_state_of_the_state & Deletion) {
4549                 return;
4550         }
4551
4552         SourceMap::iterator i;
4553         boost::shared_ptr<Source> source = src.lock();
4554
4555         if (!source) {
4556                 return;
4557         }
4558
4559         {
4560                 Glib::Threads::Mutex::Lock lm (source_lock);
4561
4562                 if ((i = sources.find (source->id())) != sources.end()) {
4563                         sources.erase (i);
4564                 }
4565         }
4566
4567         if (!(_state_of_the_state & StateOfTheState (InCleanup|Loading))) {
4568
4569                 /* save state so we don't end up with a session file
4570                    referring to non-existent sources.
4571                 */
4572
4573                 save_state (_current_snapshot_name);
4574         }
4575 }
4576
4577 boost::shared_ptr<Source>
4578 Session::source_by_id (const PBD::ID& id)
4579 {
4580         Glib::Threads::Mutex::Lock lm (source_lock);
4581         SourceMap::iterator i;
4582         boost::shared_ptr<Source> source;
4583
4584         if ((i = sources.find (id)) != sources.end()) {
4585                 source = i->second;
4586         }
4587
4588         return source;
4589 }
4590
4591 boost::shared_ptr<AudioFileSource>
4592 Session::audio_source_by_path_and_channel (const string& path, uint16_t chn) const
4593 {
4594         /* Restricted to audio files because only audio sources have channel
4595            as a property.
4596         */
4597
4598         Glib::Threads::Mutex::Lock lm (source_lock);
4599
4600         for (SourceMap::const_iterator i = sources.begin(); i != sources.end(); ++i) {
4601                 boost::shared_ptr<AudioFileSource> afs
4602                         = boost::dynamic_pointer_cast<AudioFileSource>(i->second);
4603
4604                 if (afs && afs->path() == path && chn == afs->channel()) {
4605                         return afs;
4606                 }
4607         }
4608
4609         return boost::shared_ptr<AudioFileSource>();
4610 }
4611
4612 boost::shared_ptr<MidiSource>
4613 Session::midi_source_by_path (const std::string& path) const
4614 {
4615         /* Restricted to MIDI files because audio sources require a channel
4616            for unique identification, in addition to a path.
4617         */
4618
4619         Glib::Threads::Mutex::Lock lm (source_lock);
4620
4621         for (SourceMap::const_iterator s = sources.begin(); s != sources.end(); ++s) {
4622                 boost::shared_ptr<MidiSource> ms
4623                         = boost::dynamic_pointer_cast<MidiSource>(s->second);
4624                 boost::shared_ptr<FileSource> fs
4625                         = boost::dynamic_pointer_cast<FileSource>(s->second);
4626
4627                 if (ms && fs && fs->path() == path) {
4628                         return ms;
4629                 }
4630         }
4631
4632         return boost::shared_ptr<MidiSource>();
4633 }
4634
4635 uint32_t
4636 Session::count_sources_by_origin (const string& path)
4637 {
4638         uint32_t cnt = 0;
4639         Glib::Threads::Mutex::Lock lm (source_lock);
4640
4641         for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
4642                 boost::shared_ptr<FileSource> fs
4643                         = boost::dynamic_pointer_cast<FileSource>(i->second);
4644
4645                 if (fs && fs->origin() == path) {
4646                         ++cnt;
4647                 }
4648         }
4649
4650         return cnt;
4651 }
4652
4653 static string
4654 peak_file_helper (const string& peak_path, const string& file_path, const string& file_base, bool hash) {
4655         if (hash) {
4656                 std::string checksum = Glib::Checksum::compute_checksum(Glib::Checksum::CHECKSUM_SHA1, file_path + G_DIR_SEPARATOR + file_base);
4657                 return Glib::build_filename (peak_path, checksum + peakfile_suffix);
4658         } else {
4659                 return Glib::build_filename (peak_path, file_base + peakfile_suffix);
4660         }
4661 }
4662
4663 string
4664 Session::construct_peak_filepath (const string& filepath, const bool in_session, const bool old_peak_name) const
4665 {
4666         string interchange_dir_string = string (interchange_dir_name) + G_DIR_SEPARATOR;
4667
4668         if (Glib::path_is_absolute (filepath)) {
4669
4670                 /* rip the session dir from the audiofile source */
4671
4672                 string session_path;
4673                 bool in_another_session = true;
4674
4675                 if (filepath.find (interchange_dir_string) != string::npos) {
4676
4677                         session_path = Glib::path_get_dirname (filepath); /* now ends in audiofiles */
4678                         session_path = Glib::path_get_dirname (session_path); /* now ends in session name */
4679                         session_path = Glib::path_get_dirname (session_path); /* now ends in interchange */
4680                         session_path = Glib::path_get_dirname (session_path); /* now has session path */
4681
4682                         /* see if it is within our session */
4683
4684                         for (vector<space_and_path>::const_iterator i = session_dirs.begin(); i != session_dirs.end(); ++i) {
4685                                 if (i->path == session_path) {
4686                                         in_another_session = false;
4687                                         break;
4688                                 }
4689                         }
4690                 } else {
4691                         in_another_session = false;
4692                 }
4693
4694
4695                 if (in_another_session) {
4696                         SessionDirectory sd (session_path);
4697                         return peak_file_helper (sd.peak_path(), "", Glib::path_get_basename (filepath), !old_peak_name);
4698                 }
4699         }
4700
4701         /* 1) if file belongs to this session
4702          * it may be a relative path (interchange/...)
4703          * or just basename (session_state, remove source)
4704          * -> just use the basename
4705          */
4706         std::string filename = Glib::path_get_basename (filepath);
4707         std::string path;
4708
4709         /* 2) if the file is outside our session dir:
4710          * (imported but not copied) add the path for check-summming */
4711         if (!in_session) {
4712                 path = Glib::path_get_dirname (filepath);
4713         }
4714
4715         return peak_file_helper (_session_dir->peak_path(), path, Glib::path_get_basename (filepath), !old_peak_name);
4716 }
4717
4718 string
4719 Session::new_audio_source_path_for_embedded (const std::string& path)
4720 {
4721         /* embedded source:
4722          *
4723          * we know that the filename is already unique because it exists
4724          * out in the filesystem.
4725          *
4726          * However, when we bring it into the session, we could get a
4727          * collision.
4728          *
4729          * Eg. two embedded files:
4730          *
4731          *          /foo/bar/baz.wav
4732          *          /frob/nic/baz.wav
4733          *
4734          * When merged into session, these collide.
4735          *
4736          * There will not be a conflict with in-memory sources
4737          * because when the source was created we already picked
4738          * a unique name for it.
4739          *
4740          * This collision is not likely to be common, but we have to guard
4741          * against it.  So, if there is a collision, take the md5 hash of the
4742          * the path, and use that as the filename instead.
4743          */
4744
4745         SessionDirectory sdir (get_best_session_directory_for_new_audio());
4746         string base = Glib::path_get_basename (path);
4747         string newpath = Glib::build_filename (sdir.sound_path(), base);
4748
4749         if (Glib::file_test (newpath, Glib::FILE_TEST_EXISTS)) {
4750
4751                 MD5 md5;
4752
4753                 md5.digestString (path.c_str());
4754                 md5.writeToString ();
4755                 base = md5.digestChars;
4756
4757                 string ext = get_suffix (path);
4758
4759                 if (!ext.empty()) {
4760                         base += '.';
4761                         base += ext;
4762                 }
4763
4764                 newpath = Glib::build_filename (sdir.sound_path(), base);
4765
4766                 /* if this collides, we're screwed */
4767
4768                 if (Glib::file_test (newpath, Glib::FILE_TEST_EXISTS)) {
4769                         error << string_compose (_("Merging embedded file %1: name collision AND md5 hash collision!"), path) << endmsg;
4770                         return string();
4771                 }
4772
4773         }
4774
4775         return newpath;
4776 }
4777
4778 /** Return true if there are no audio file sources that use @param name as
4779  * the filename component of their path.
4780  *
4781  * Return false otherwise.
4782  *
4783  * This method MUST ONLY be used to check in-session, mono files since it
4784  * hard-codes the channel of the audio file source we are looking for as zero.
4785  *
4786  * If/when Ardour supports native files in non-mono formats, the logic here
4787  * will need to be revisited.
4788  */
4789 bool
4790 Session::audio_source_name_is_unique (const string& name)
4791 {
4792         std::vector<string> sdirs = source_search_path (DataType::AUDIO);
4793         vector<space_and_path>::iterator i;
4794         uint32_t existing = 0;
4795
4796         for (vector<string>::const_iterator i = sdirs.begin(); i != sdirs.end(); ++i) {
4797
4798                 /* note that we search *without* the extension so that
4799                    we don't end up both "Audio 1-1.wav" and "Audio 1-1.caf"
4800                    in the event that this new name is required for
4801                    a file format change.
4802                 */
4803
4804                 const string spath = *i;
4805
4806                 if (matching_unsuffixed_filename_exists_in (spath, name)) {
4807                         existing++;
4808                         break;
4809                 }
4810
4811                 /* it is possible that we have the path already
4812                  * assigned to a source that has not yet been written
4813                  * (ie. the write source for a diskstream). we have to
4814                  * check this in order to make sure that our candidate
4815                  * path isn't used again, because that can lead to
4816                  * two Sources point to the same file with different
4817                  * notions of their removability.
4818                  */
4819
4820
4821                 string possible_path = Glib::build_filename (spath, name);
4822
4823                 if (audio_source_by_path_and_channel (possible_path, 0)) {
4824                         existing++;
4825                         break;
4826                 }
4827         }
4828
4829         return (existing == 0);
4830 }
4831
4832 string
4833 Session::format_audio_source_name (const string& legalized_base, uint32_t nchan, uint32_t chan, bool destructive, bool take_required, uint32_t cnt, bool related_exists)
4834 {
4835         ostringstream sstr;
4836         const string ext = native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
4837
4838         if (Profile->get_trx() && destructive) {
4839                 sstr << 'T';
4840                 sstr << setfill ('0') << setw (4) << cnt;
4841                 sstr << legalized_base;
4842         } else {
4843                 sstr << legalized_base;
4844
4845                 if (take_required || related_exists) {
4846                         sstr << '-';
4847                         sstr << cnt;
4848                 }
4849         }
4850
4851         if (nchan == 2) {
4852                 if (chan == 0) {
4853                         sstr << "%L";
4854                 } else {
4855                         sstr << "%R";
4856                 }
4857         } else if (nchan > 2) {
4858                 if (nchan < 26) {
4859                         sstr << '%';
4860                         sstr << 'a' + chan;
4861                 } else {
4862                         /* XXX what? more than 26 channels! */
4863                         sstr << '%';
4864                         sstr << chan+1;
4865                 }
4866         }
4867
4868         sstr << ext;
4869
4870         return sstr.str();
4871 }
4872
4873 /** Return a unique name based on \a base for a new internal audio source */
4874 string
4875 Session::new_audio_source_path (const string& base, uint32_t nchan, uint32_t chan, bool destructive, bool take_required)
4876 {
4877         uint32_t cnt;
4878         string possible_name;
4879         const uint32_t limit = 9999; // arbitrary limit on number of files with the same basic name
4880         string legalized;
4881         bool some_related_source_name_exists = false;
4882
4883         legalized = legalize_for_path (base);
4884
4885         // Find a "version" of the base name that doesn't exist in any of the possible directories.
4886
4887         for (cnt = (destructive ? ++destructive_index : 1); cnt <= limit; ++cnt) {
4888
4889                 possible_name = format_audio_source_name (legalized, nchan, chan, destructive, take_required, cnt, some_related_source_name_exists);
4890
4891                 if (audio_source_name_is_unique (possible_name)) {
4892                         break;
4893                 }
4894
4895                 some_related_source_name_exists = true;
4896
4897                 if (cnt > limit) {
4898                         error << string_compose(
4899                                         _("There are already %1 recordings for %2, which I consider too many."),
4900                                         limit, base) << endmsg;
4901                         destroy ();
4902                         throw failed_constructor();
4903                 }
4904         }
4905
4906         /* We've established that the new name does not exist in any session
4907          * directory, so now find out which one we should use for this new
4908          * audio source.
4909          */
4910
4911         SessionDirectory sdir (get_best_session_directory_for_new_audio());
4912
4913         std::string s = Glib::build_filename (sdir.sound_path(), possible_name);
4914
4915         return s;
4916 }
4917
4918 /** Return a unique name based on `base` for a new internal MIDI source */
4919 string
4920 Session::new_midi_source_path (const string& base)
4921 {
4922         uint32_t cnt;
4923         char buf[PATH_MAX+1];
4924         const uint32_t limit = 10000;
4925         string legalized;
4926         string possible_path;
4927         string possible_name;
4928
4929         buf[0] = '\0';
4930         legalized = legalize_for_path (base);
4931
4932         // Find a "version" of the file name that doesn't exist in any of the possible directories.
4933         std::vector<string> sdirs = source_search_path(DataType::MIDI);
4934
4935         /* - the main session folder is the first in the vector.
4936          * - after checking all locations for file-name uniqueness,
4937          *   we keep the one from the last iteration as new file name
4938          * - midi files are small and should just be kept in the main session-folder
4939          *
4940          * -> reverse the array, check main session folder last and use that as location
4941          *    for MIDI files.
4942          */
4943         std::reverse(sdirs.begin(), sdirs.end());
4944
4945         for (cnt = 1; cnt <= limit; ++cnt) {
4946
4947                 vector<space_and_path>::iterator i;
4948                 uint32_t existing = 0;
4949
4950                 for (vector<string>::const_iterator i = sdirs.begin(); i != sdirs.end(); ++i) {
4951
4952                         snprintf (buf, sizeof(buf), "%s-%u.mid", legalized.c_str(), cnt);
4953                         possible_name = buf;
4954
4955                         possible_path = Glib::build_filename (*i, possible_name);
4956
4957                         if (Glib::file_test (possible_path, Glib::FILE_TEST_EXISTS)) {
4958                                 existing++;
4959                         }
4960
4961                         if (midi_source_by_path (possible_path)) {
4962                                 existing++;
4963                         }
4964                 }
4965
4966                 if (existing == 0) {
4967                         break;
4968                 }
4969
4970                 if (cnt > limit) {
4971                         error << string_compose(
4972                                         _("There are already %1 recordings for %2, which I consider too many."),
4973                                         limit, base) << endmsg;
4974                         destroy ();
4975                         return 0;
4976                 }
4977         }
4978
4979         /* No need to "find best location" for software/app-based RAID, because
4980            MIDI is so small that we always put it in the same place.
4981         */
4982
4983         return possible_path;
4984 }
4985
4986
4987 /** Create a new within-session audio source */
4988 boost::shared_ptr<AudioFileSource>
4989 Session::create_audio_source_for_session (size_t n_chans, string const & base, uint32_t chan, bool destructive)
4990 {
4991         const string path = new_audio_source_path (base, n_chans, chan, destructive, true);
4992
4993         if (!path.empty()) {
4994                 return boost::dynamic_pointer_cast<AudioFileSource> (
4995                         SourceFactory::createWritable (DataType::AUDIO, *this, path, destructive, frame_rate(), true, true));
4996         } else {
4997                 throw failed_constructor ();
4998         }
4999 }
5000
5001 /** Create a new within-session MIDI source */
5002 boost::shared_ptr<MidiSource>
5003 Session::create_midi_source_for_session (string const & basic_name)
5004 {
5005         const string path = new_midi_source_path (basic_name);
5006
5007         if (!path.empty()) {
5008                 return boost::dynamic_pointer_cast<SMFSource> (
5009                         SourceFactory::createWritable (
5010                                 DataType::MIDI, *this, path, false, frame_rate()));
5011         } else {
5012                 throw failed_constructor ();
5013         }
5014 }
5015
5016 /** Create a new within-session MIDI source */
5017 boost::shared_ptr<MidiSource>
5018 Session::create_midi_source_by_stealing_name (boost::shared_ptr<Track> track)
5019 {
5020         /* the caller passes in the track the source will be used in,
5021            so that we can keep the numbering sane.
5022
5023            Rationale: a track with the name "Foo" that has had N
5024            captures carried out so far will ALREADY have a write source
5025            named "Foo-N+1.mid" waiting to be used for the next capture.
5026
5027            If we call new_midi_source_name() we will get "Foo-N+2". But
5028            there is no region corresponding to "Foo-N+1", so when
5029            "Foo-N+2" appears in the track, the gap presents the user
5030            with odd behaviour - why did it skip past Foo-N+1?
5031
5032            We could explain this to the user in some odd way, but
5033            instead we rename "Foo-N+1.mid" as "Foo-N+2.mid", and then
5034            use "Foo-N+1" here.
5035
5036            If that attempted rename fails, we get "Foo-N+2.mid" anyway.
5037         */
5038
5039         boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (track);
5040         assert (mt);
5041         std::string name = track->steal_write_source_name ();
5042
5043         if (name.empty()) {
5044                 return boost::shared_ptr<MidiSource>();
5045         }
5046
5047         /* MIDI files are small, just put them in the first location of the
5048            session source search path.
5049         */
5050
5051         const string path = Glib::build_filename (source_search_path (DataType::MIDI).front(), name);
5052
5053         return boost::dynamic_pointer_cast<SMFSource> (
5054                 SourceFactory::createWritable (
5055                         DataType::MIDI, *this, path, false, frame_rate()));
5056 }
5057
5058
5059 void
5060 Session::add_playlist (boost::shared_ptr<Playlist> playlist, bool unused)
5061 {
5062         if (playlist->hidden()) {
5063                 return;
5064         }
5065
5066         playlists->add (playlist);
5067
5068         if (unused) {
5069                 playlist->release();
5070         }
5071
5072         set_dirty();
5073 }
5074
5075 void
5076 Session::remove_playlist (boost::weak_ptr<Playlist> weak_playlist)
5077 {
5078         if (_state_of_the_state & Deletion) {
5079                 return;
5080         }
5081
5082         boost::shared_ptr<Playlist> playlist (weak_playlist.lock());
5083
5084         if (!playlist) {
5085                 return;
5086         }
5087
5088         playlists->remove (playlist);
5089
5090         set_dirty();
5091 }
5092
5093 void
5094 Session::set_audition (boost::shared_ptr<Region> r)
5095 {
5096         pending_audition_region = r;
5097         add_post_transport_work (PostTransportAudition);
5098         _butler->schedule_transport_work ();
5099 }
5100
5101 void
5102 Session::audition_playlist ()
5103 {
5104         SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
5105         ev->region.reset ();
5106         queue_event (ev);
5107 }
5108
5109
5110 void
5111 Session::register_lua_function (
5112                 const std::string& name,
5113                 const std::string& script,
5114                 const LuaScriptParamList& args
5115                 )
5116 {
5117         Glib::Threads::Mutex::Lock lm (lua_lock);
5118
5119         lua_State* L = lua.getState();
5120
5121         const std::string& bytecode = LuaScripting::get_factory_bytecode (script);
5122         luabridge::LuaRef tbl_arg (luabridge::newTable(L));
5123         for (LuaScriptParamList::const_iterator i = args.begin(); i != args.end(); ++i) {
5124                 if ((*i)->optional && !(*i)->is_set) { continue; }
5125                 tbl_arg[(*i)->name] = (*i)->value;
5126         }
5127         (*_lua_add)(name, bytecode, tbl_arg); // throws luabridge::LuaException
5128         set_dirty();
5129 }
5130
5131 void
5132 Session::unregister_lua_function (const std::string& name)
5133 {
5134         Glib::Threads::Mutex::Lock lm (lua_lock);
5135         (*_lua_del)(name); // throws luabridge::LuaException
5136         lua.collect_garbage ();
5137         set_dirty();
5138 }
5139
5140 std::vector<std::string>
5141 Session::registered_lua_functions ()
5142 {
5143         Glib::Threads::Mutex::Lock lm (lua_lock);
5144         std::vector<std::string> rv;
5145
5146         try {
5147                 luabridge::LuaRef list ((*_lua_list)());
5148                 for (luabridge::Iterator i (list); !i.isNil (); ++i) {
5149                         if (!i.key ().isString ()) { assert(0); continue; }
5150                         rv.push_back (i.key ().cast<std::string> ());
5151                 }
5152         } catch (luabridge::LuaException const& e) { }
5153         return rv;
5154 }
5155
5156 #ifndef NDEBUG
5157 static void _lua_print (std::string s) {
5158         std::cout << "SessionLua: " << s << "\n";
5159 }
5160 #endif
5161
5162 void
5163 Session::try_run_lua (pframes_t nframes)
5164 {
5165         if (_n_lua_scripts == 0) return;
5166         Glib::Threads::Mutex::Lock tm (lua_lock, Glib::Threads::TRY_LOCK);
5167         if (tm.locked ()) {
5168                 try { (*_lua_run)(nframes); } catch (luabridge::LuaException const& e) { }
5169         }
5170 }
5171
5172 void
5173 Session::setup_lua ()
5174 {
5175 #ifndef NDEBUG
5176         lua.Print.connect (&_lua_print);
5177 #endif
5178         lua.do_command (
5179                         "function ArdourSession ()"
5180                         "  local self = { scripts = {}, instances = {} }"
5181                         ""
5182                         "  local remove = function (n)"
5183                         "   self.scripts[n] = nil"
5184                         "   self.instances[n] = nil"
5185                         "   Session:scripts_changed()" // call back
5186                         "  end"
5187                         ""
5188                         "  local addinternal = function (n, f, a)"
5189                         "   assert(type(n) == 'string', 'function-name must be string')"
5190                         "   assert(type(f) == 'function', 'Given script is a not a function')"
5191                         "   assert(type(a) == 'table' or type(a) == 'nil', 'Given argument is invalid')"
5192                         "   assert(self.scripts[n] == nil, 'Callback \"'.. n ..'\" already exists.')"
5193                         "   self.scripts[n] = { ['f'] = f, ['a'] = a }"
5194                         "   local env = _ENV;  env.f = nil env.io = nil env.os = nil env.loadfile = nil env.require = nil env.dofile = nil env.package = nil env.debug = nil"
5195                         "   local env = { print = print, tostring = tostring, assert = assert, ipairs = ipairs, error = error, select = select, string = string, type = type, tonumber = tonumber, collectgarbage = collectgarbage, pairs = pairs, math = math, table = table, pcall = pcall, Session = Session, PBD = PBD, Timecode = Timecode, Evoral = Evoral, C = C, ARDOUR = ARDOUR }"
5196                         "   self.instances[n] = load (string.dump(f, true), nil, nil, env)(a)"
5197                         "   Session:scripts_changed()" // call back
5198                         "  end"
5199                         ""
5200                         "  local add = function (n, b, a)"
5201                         "   assert(type(b) == 'string', 'ByteCode must be string')"
5202                         "   load (b)()" // assigns f
5203                         "   assert(type(f) == 'string', 'Assigned ByteCode must be string')"
5204                         "   addinternal (n, load(f), a)"
5205                         "  end"
5206                         ""
5207                         "  local run = function (...)"
5208                         "   for n, s in pairs (self.instances) do"
5209                         "     local status, err = pcall (s, ...)"
5210                         "     if not status then"
5211                         "       print ('fn \"'.. n .. '\": ', err)"
5212                         "       remove (n)"
5213                         "      end"
5214                         "   end"
5215                         "   collectgarbage()"
5216                         "  end"
5217                         ""
5218                         "  local cleanup = function ()"
5219                         "   self.scripts = nil"
5220                         "   self.instances = nil"
5221                         "  end"
5222                         ""
5223                         "  local list = function ()"
5224                         "   local rv = {}"
5225                         "   for n, _ in pairs (self.scripts) do"
5226                         "     rv[n] = true"
5227                         "   end"
5228                         "   return rv"
5229                         "  end"
5230                         ""
5231                         "  local function basic_serialize (o)"
5232                         "    if type(o) == \"number\" then"
5233                         "     return tostring(o)"
5234                         "    else"
5235                         "     return string.format(\"%q\", o)"
5236                         "    end"
5237                         "  end"
5238                         ""
5239                         "  local function serialize (name, value)"
5240                         "   local rv = name .. ' = '"
5241                         "   collectgarbage()"
5242                         "   if type(value) == \"number\" or type(value) == \"string\" or type(value) == \"nil\" then"
5243                         "    return rv .. basic_serialize(value) .. ' '"
5244                         "   elseif type(value) == \"table\" then"
5245                         "    rv = rv .. '{} '"
5246                         "    for k,v in pairs(value) do"
5247                         "     local fieldname = string.format(\"%s[%s]\", name, basic_serialize(k))"
5248                         "     rv = rv .. serialize(fieldname, v) .. ' '"
5249                         "     collectgarbage()" // string concatenation allocates a new string :(
5250                         "    end"
5251                         "    return rv;"
5252                         "   elseif type(value) == \"function\" then"
5253                         "     return rv .. string.format(\"%q\", string.dump(value, true))"
5254                         "   else"
5255                         "    error('cannot save a ' .. type(value))"
5256                         "   end"
5257                         "  end"
5258                         ""
5259                         ""
5260                         "  local save = function ()"
5261                         "   return (serialize('scripts', self.scripts))"
5262                         "  end"
5263                         ""
5264                         "  local restore = function (state)"
5265                         "   self.scripts = {}"
5266                         "   load (state)()"
5267                         "   for n, s in pairs (scripts) do"
5268                         "    addinternal (n, load(s['f']), s['a'])"
5269                         "   end"
5270                         "  end"
5271                         ""
5272                         " return { run = run, add = add, remove = remove,"
5273                   "          list = list, restore = restore, save = save, cleanup = cleanup}"
5274                         " end"
5275                         " "
5276                         " sess = ArdourSession ()"
5277                         " ArdourSession = nil"
5278                         " "
5279                         "function ardour () end"
5280                         );
5281
5282         lua_State* L = lua.getState();
5283
5284         try {
5285                 luabridge::LuaRef lua_sess = luabridge::getGlobal (L, "sess");
5286                 lua.do_command ("sess = nil"); // hide it.
5287                 lua.do_command ("collectgarbage()");
5288
5289                 _lua_run = new luabridge::LuaRef(lua_sess["run"]);
5290                 _lua_add = new luabridge::LuaRef(lua_sess["add"]);
5291                 _lua_del = new luabridge::LuaRef(lua_sess["remove"]);
5292                 _lua_list = new luabridge::LuaRef(lua_sess["list"]);
5293                 _lua_save = new luabridge::LuaRef(lua_sess["save"]);
5294                 _lua_load = new luabridge::LuaRef(lua_sess["restore"]);
5295                 _lua_cleanup = new luabridge::LuaRef(lua_sess["cleanup"]);
5296         } catch (luabridge::LuaException const& e) {
5297                 fatal << string_compose (_("programming error: %1"),
5298                                 X_("Failed to setup Lua interpreter"))
5299                         << endmsg;
5300                 abort(); /*NOTREACHED*/
5301         }
5302
5303         LuaBindings::stddef (L);
5304         LuaBindings::common (L);
5305         LuaBindings::dsp (L);
5306         luabridge::push <Session *> (L, this);
5307         lua_setglobal (L, "Session");
5308 }
5309
5310 void
5311 Session::scripts_changed ()
5312 {
5313         assert (!lua_lock.trylock()); // must hold lua_lock
5314
5315         try {
5316                 luabridge::LuaRef list ((*_lua_list)());
5317                 int cnt = 0;
5318                 for (luabridge::Iterator i (list); !i.isNil (); ++i) {
5319                         if (!i.key ().isString ()) { assert(0); continue; }
5320                         ++cnt;
5321                 }
5322                 _n_lua_scripts = cnt;
5323         } catch (luabridge::LuaException const& e) {
5324                 fatal << string_compose (_("programming error: %1"),
5325                                 X_("Indexing Lua Session Scripts failed."))
5326                         << endmsg;
5327                 abort(); /*NOTREACHED*/
5328         }
5329 }
5330
5331 void
5332 Session::non_realtime_set_audition ()
5333 {
5334         assert (pending_audition_region);
5335         auditioner->audition_region (pending_audition_region);
5336         pending_audition_region.reset ();
5337         AuditionActive (true); /* EMIT SIGNAL */
5338 }
5339
5340 void
5341 Session::audition_region (boost::shared_ptr<Region> r)
5342 {
5343         SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
5344         ev->region = r;
5345         queue_event (ev);
5346 }
5347
5348 void
5349 Session::cancel_audition ()
5350 {
5351         if (!auditioner) {
5352                 return;
5353         }
5354         if (auditioner->auditioning()) {
5355                 auditioner->cancel_audition ();
5356                 AuditionActive (false); /* EMIT SIGNAL */
5357         }
5358 }
5359
5360 bool
5361 Session::RoutePublicOrderSorter::operator() (boost::shared_ptr<Route> a, boost::shared_ptr<Route> b)
5362 {
5363         if (a->is_monitor()) {
5364                 return true;
5365         }
5366         if (b->is_monitor()) {
5367                 return false;
5368         }
5369         return a->presentation_info() < b->presentation_info();
5370 }
5371
5372 bool
5373 Session::is_auditioning () const
5374 {
5375         /* can be called before we have an auditioner object */
5376         if (auditioner) {
5377                 return auditioner->auditioning();
5378         } else {
5379                 return false;
5380         }
5381 }
5382
5383 void
5384 Session::graph_reordered ()
5385 {
5386         /* don't do this stuff if we are setting up connections
5387            from a set_state() call or creating new tracks. Ditto for deletion.
5388         */
5389
5390         if ((_state_of_the_state & (InitialConnecting|Deletion)) || _adding_routes_in_progress || _reconnecting_routes_in_progress || _route_deletion_in_progress) {
5391                 return;
5392         }
5393
5394         /* every track/bus asked for this to be handled but it was deferred because
5395            we were connecting. do it now.
5396         */
5397
5398         request_input_change_handling ();
5399
5400         resort_routes ();
5401
5402         /* force all diskstreams to update their capture offset values to
5403            reflect any changes in latencies within the graph.
5404         */
5405
5406         boost::shared_ptr<RouteList> rl = routes.reader ();
5407         for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
5408                 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
5409                 if (tr) {
5410                         tr->set_capture_offset ();
5411                 }
5412         }
5413 }
5414
5415 /** @return Number of frames that there is disk space available to write,
5416  *  if known.
5417  */
5418 boost::optional<framecnt_t>
5419 Session::available_capture_duration ()
5420 {
5421         Glib::Threads::Mutex::Lock lm (space_lock);
5422
5423         if (_total_free_4k_blocks_uncertain) {
5424                 return boost::optional<framecnt_t> ();
5425         }
5426
5427         float sample_bytes_on_disk = 4.0; // keep gcc happy
5428
5429         switch (config.get_native_file_data_format()) {
5430         case FormatFloat:
5431                 sample_bytes_on_disk = 4.0;
5432                 break;
5433
5434         case FormatInt24:
5435                 sample_bytes_on_disk = 3.0;
5436                 break;
5437
5438         case FormatInt16:
5439                 sample_bytes_on_disk = 2.0;
5440                 break;
5441
5442         default:
5443                 /* impossible, but keep some gcc versions happy */
5444                 fatal << string_compose (_("programming error: %1"),
5445                                          X_("illegal native file data format"))
5446                       << endmsg;
5447                 abort(); /*NOTREACHED*/
5448         }
5449
5450         double scale = 4096.0 / sample_bytes_on_disk;
5451
5452         if (_total_free_4k_blocks * scale > (double) max_framecnt) {
5453                 return max_framecnt;
5454         }
5455
5456         return (framecnt_t) floor (_total_free_4k_blocks * scale);
5457 }
5458
5459 void
5460 Session::add_bundle (boost::shared_ptr<Bundle> bundle, bool emit_signal)
5461 {
5462         {
5463                 RCUWriter<BundleList> writer (_bundles);
5464                 boost::shared_ptr<BundleList> b = writer.get_copy ();
5465                 b->push_back (bundle);
5466         }
5467
5468         if (emit_signal) {
5469                 BundleAddedOrRemoved (); /* EMIT SIGNAL */
5470         }
5471
5472         set_dirty();
5473 }
5474
5475 void
5476 Session::remove_bundle (boost::shared_ptr<Bundle> bundle)
5477 {
5478         bool removed = false;
5479
5480         {
5481                 RCUWriter<BundleList> writer (_bundles);
5482                 boost::shared_ptr<BundleList> b = writer.get_copy ();
5483                 BundleList::iterator i = find (b->begin(), b->end(), bundle);
5484
5485                 if (i != b->end()) {
5486                         b->erase (i);
5487                         removed = true;
5488                 }
5489         }
5490
5491         if (removed) {
5492                  BundleAddedOrRemoved (); /* EMIT SIGNAL */
5493         }
5494
5495         set_dirty();
5496 }
5497
5498 boost::shared_ptr<Bundle>
5499 Session::bundle_by_name (string name) const
5500 {
5501         boost::shared_ptr<BundleList> b = _bundles.reader ();
5502
5503         for (BundleList::const_iterator i = b->begin(); i != b->end(); ++i) {
5504                 if ((*i)->name() == name) {
5505                         return* i;
5506                 }
5507         }
5508
5509         return boost::shared_ptr<Bundle> ();
5510 }
5511
5512 void
5513 Session::tempo_map_changed (const PropertyChange&)
5514 {
5515         clear_clicks ();
5516
5517         playlists->update_after_tempo_map_change ();
5518
5519         _locations->apply (*this, &Session::update_locations_after_tempo_map_change);
5520
5521         set_dirty ();
5522 }
5523
5524 void
5525 Session::gui_tempo_map_changed ()
5526 {
5527         clear_clicks ();
5528
5529         playlists->update_after_tempo_map_change ();
5530
5531         _locations->apply (*this, &Session::update_locations_after_tempo_map_change);
5532 }
5533
5534 void
5535 Session::update_locations_after_tempo_map_change (const Locations::LocationList& loc)
5536 {
5537         for (Locations::LocationList::const_iterator i = loc.begin(); i != loc.end(); ++i) {
5538                 (*i)->recompute_frames_from_bbt ();
5539         }
5540 }
5541
5542 /** Ensures that all buffers (scratch, send, silent, etc) are allocated for
5543  * the given count with the current block size.
5544  */
5545 void
5546 Session::ensure_buffers (ChanCount howmany)
5547 {
5548         BufferManager::ensure_buffers (howmany, bounce_processing() ? bounce_chunk_size : 0);
5549 }
5550
5551 void
5552 Session::ensure_buffer_set(BufferSet& buffers, const ChanCount& count)
5553 {
5554         for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
5555                 buffers.ensure_buffers(*t, count.get(*t), _engine.raw_buffer_size(*t));
5556         }
5557 }
5558
5559 uint32_t
5560 Session::next_insert_id ()
5561 {
5562         /* this doesn't really loop forever. just think about it */
5563
5564         while (true) {
5565                 for (boost::dynamic_bitset<uint32_t>::size_type n = 1; n < insert_bitset.size(); ++n) {
5566                         if (!insert_bitset[n]) {
5567                                 insert_bitset[n] = true;
5568                                 return n;
5569
5570                         }
5571                 }
5572
5573                 /* none available, so resize and try again */
5574
5575                 insert_bitset.resize (insert_bitset.size() + 16, false);
5576         }
5577 }
5578
5579 uint32_t
5580 Session::next_send_id ()
5581 {
5582         /* this doesn't really loop forever. just think about it */
5583
5584         while (true) {
5585                 for (boost::dynamic_bitset<uint32_t>::size_type n = 1; n < send_bitset.size(); ++n) {
5586                         if (!send_bitset[n]) {
5587                                 send_bitset[n] = true;
5588                                 return n;
5589
5590                         }
5591                 }
5592
5593                 /* none available, so resize and try again */
5594
5595                 send_bitset.resize (send_bitset.size() + 16, false);
5596         }
5597 }
5598
5599 uint32_t
5600 Session::next_aux_send_id ()
5601 {
5602         /* this doesn't really loop forever. just think about it */
5603
5604         while (true) {
5605                 for (boost::dynamic_bitset<uint32_t>::size_type n = 1; n < aux_send_bitset.size(); ++n) {
5606                         if (!aux_send_bitset[n]) {
5607                                 aux_send_bitset[n] = true;
5608                                 return n;
5609
5610                         }
5611                 }
5612
5613                 /* none available, so resize and try again */
5614
5615                 aux_send_bitset.resize (aux_send_bitset.size() + 16, false);
5616         }
5617 }
5618
5619 uint32_t
5620 Session::next_return_id ()
5621 {
5622         /* this doesn't really loop forever. just think about it */
5623
5624         while (true) {
5625                 for (boost::dynamic_bitset<uint32_t>::size_type n = 1; n < return_bitset.size(); ++n) {
5626                         if (!return_bitset[n]) {
5627                                 return_bitset[n] = true;
5628                                 return n;
5629
5630                         }
5631                 }
5632
5633                 /* none available, so resize and try again */
5634
5635                 return_bitset.resize (return_bitset.size() + 16, false);
5636         }
5637 }
5638
5639 void
5640 Session::mark_send_id (uint32_t id)
5641 {
5642         if (id >= send_bitset.size()) {
5643                 send_bitset.resize (id+16, false);
5644         }
5645         if (send_bitset[id]) {
5646                 warning << string_compose (_("send ID %1 appears to be in use already"), id) << endmsg;
5647         }
5648         send_bitset[id] = true;
5649 }
5650
5651 void
5652 Session::mark_aux_send_id (uint32_t id)
5653 {
5654         if (id >= aux_send_bitset.size()) {
5655                 aux_send_bitset.resize (id+16, false);
5656         }
5657         if (aux_send_bitset[id]) {
5658                 warning << string_compose (_("aux send ID %1 appears to be in use already"), id) << endmsg;
5659         }
5660         aux_send_bitset[id] = true;
5661 }
5662
5663 void
5664 Session::mark_return_id (uint32_t id)
5665 {
5666         if (id >= return_bitset.size()) {
5667                 return_bitset.resize (id+16, false);
5668         }
5669         if (return_bitset[id]) {
5670                 warning << string_compose (_("return ID %1 appears to be in use already"), id) << endmsg;
5671         }
5672         return_bitset[id] = true;
5673 }
5674
5675 void
5676 Session::mark_insert_id (uint32_t id)
5677 {
5678         if (id >= insert_bitset.size()) {
5679                 insert_bitset.resize (id+16, false);
5680         }
5681         if (insert_bitset[id]) {
5682                 warning << string_compose (_("insert ID %1 appears to be in use already"), id) << endmsg;
5683         }
5684         insert_bitset[id] = true;
5685 }
5686
5687 void
5688 Session::unmark_send_id (uint32_t id)
5689 {
5690         if (id < send_bitset.size()) {
5691                 send_bitset[id] = false;
5692         }
5693 }
5694
5695 void
5696 Session::unmark_aux_send_id (uint32_t id)
5697 {
5698         if (id < aux_send_bitset.size()) {
5699                 aux_send_bitset[id] = false;
5700         }
5701 }
5702
5703 void
5704 Session::unmark_return_id (uint32_t id)
5705 {
5706         if (_state_of_the_state & Deletion) { return; }
5707         if (id < return_bitset.size()) {
5708                 return_bitset[id] = false;
5709         }
5710 }
5711
5712 void
5713 Session::unmark_insert_id (uint32_t id)
5714 {
5715         if (id < insert_bitset.size()) {
5716                 insert_bitset[id] = false;
5717         }
5718 }
5719
5720 void
5721 Session::reset_native_file_format ()
5722 {
5723         boost::shared_ptr<RouteList> rl = routes.reader ();
5724
5725         for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
5726                 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
5727                 if (tr) {
5728                         /* don't save state as we do this, there's no point
5729                          */
5730                         _state_of_the_state = StateOfTheState (_state_of_the_state|InCleanup);
5731                         tr->reset_write_sources (false);
5732                         _state_of_the_state = StateOfTheState (_state_of_the_state & ~InCleanup);
5733                 }
5734         }
5735 }
5736
5737 bool
5738 Session::route_name_unique (string n) const
5739 {
5740         boost::shared_ptr<RouteList> r = routes.reader ();
5741
5742         for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
5743                 if ((*i)->name() == n) {
5744                         return false;
5745                 }
5746         }
5747
5748         return true;
5749 }
5750
5751 bool
5752 Session::route_name_internal (string n) const
5753 {
5754         if (auditioner && auditioner->name() == n) {
5755                 return true;
5756         }
5757
5758         if (_click_io && _click_io->name() == n) {
5759                 return true;
5760         }
5761
5762         return false;
5763 }
5764
5765 int
5766 Session::freeze_all (InterThreadInfo& itt)
5767 {
5768         boost::shared_ptr<RouteList> r = routes.reader ();
5769
5770         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5771
5772                 boost::shared_ptr<Track> t;
5773
5774                 if ((t = boost::dynamic_pointer_cast<Track>(*i)) != 0) {
5775                         /* XXX this is wrong because itt.progress will keep returning to zero at the start
5776                            of every track.
5777                         */
5778                         t->freeze_me (itt);
5779                 }
5780         }
5781
5782         return 0;
5783 }
5784
5785 boost::shared_ptr<Region>
5786 Session::write_one_track (Track& track, framepos_t start, framepos_t end,
5787                           bool /*overwrite*/, vector<boost::shared_ptr<Source> >& srcs,
5788                           InterThreadInfo& itt,
5789                           boost::shared_ptr<Processor> endpoint, bool include_endpoint,
5790                           bool for_export, bool for_freeze)
5791 {
5792         boost::shared_ptr<Region> result;
5793         boost::shared_ptr<Playlist> playlist;
5794         boost::shared_ptr<Source> source;
5795         ChanCount diskstream_channels (track.n_channels());
5796         framepos_t position;
5797         framecnt_t this_chunk;
5798         framepos_t to_do;
5799         framepos_t latency_skip;
5800         BufferSet buffers;
5801         framepos_t len = end - start;
5802         bool need_block_size_reset = false;
5803         ChanCount const max_proc = track.max_processor_streams ();
5804         string legal_playlist_name;
5805         string possible_path;
5806
5807         if (end <= start) {
5808                 error << string_compose (_("Cannot write a range where end <= start (e.g. %1 <= %2)"),
5809                                          end, start) << endmsg;
5810                 return result;
5811         }
5812
5813         diskstream_channels = track.bounce_get_output_streams (diskstream_channels, endpoint,
5814                         include_endpoint, for_export, for_freeze);
5815
5816         if (diskstream_channels.n(track.data_type()) < 1) {
5817                 error << _("Cannot write a range with no data.") << endmsg;
5818                 return result;
5819         }
5820
5821         // block all process callback handling
5822
5823         block_processing ();
5824
5825         {
5826                 // synchronize with AudioEngine::process_callback()
5827                 // make sure processing is not currently running
5828                 // and processing_blocked() is honored before
5829                 // acquiring thread buffers
5830                 Glib::Threads::Mutex::Lock lm (_engine.process_lock());
5831         }
5832
5833         _bounce_processing_active = true;
5834
5835         /* call tree *MUST* hold route_lock */
5836
5837         if ((playlist = track.playlist()) == 0) {
5838                 goto out;
5839         }
5840
5841         legal_playlist_name = legalize_for_path (playlist->name());
5842
5843         for (uint32_t chan_n = 0; chan_n < diskstream_channels.n(track.data_type()); ++chan_n) {
5844
5845                 string base_name = string_compose ("%1-%2-bounce", playlist->name(), chan_n);
5846                 string path = ((track.data_type() == DataType::AUDIO)
5847                                ? new_audio_source_path (legal_playlist_name, diskstream_channels.n_audio(), chan_n, false, true)
5848                                : new_midi_source_path (legal_playlist_name));
5849
5850                 if (path.empty()) {
5851                         goto out;
5852                 }
5853
5854                 try {
5855                         source = SourceFactory::createWritable (track.data_type(), *this, path, false, frame_rate());
5856                 }
5857
5858                 catch (failed_constructor& err) {
5859                         error << string_compose (_("cannot create new file \"%1\" for %2"), path, track.name()) << endmsg;
5860                         goto out;
5861                 }
5862
5863                 srcs.push_back (source);
5864         }
5865
5866         /* tell redirects that care that we are about to use a much larger
5867          * blocksize. this will flush all plugins too, so that they are ready
5868          * to be used for this process.
5869          */
5870
5871         need_block_size_reset = true;
5872         track.set_block_size (bounce_chunk_size);
5873         _engine.main_thread()->get_buffers ();
5874
5875         position = start;
5876         to_do = len;
5877         latency_skip = track.bounce_get_latency (endpoint, include_endpoint, for_export, for_freeze);
5878
5879         /* create a set of reasonably-sized buffers */
5880         for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
5881                 buffers.ensure_buffers(*t, max_proc.get(*t), bounce_chunk_size);
5882         }
5883         buffers.set_count (max_proc);
5884
5885         for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
5886                 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
5887                 boost::shared_ptr<MidiSource> ms;
5888                 if (afs) {
5889                         afs->prepare_for_peakfile_writes ();
5890                 } else if ((ms = boost::dynamic_pointer_cast<MidiSource>(*src))) {
5891                         Source::Lock lock(ms->mutex());
5892                         ms->mark_streaming_write_started(lock);
5893                 }
5894         }
5895
5896         while (to_do && !itt.cancel) {
5897
5898                 this_chunk = min (to_do, bounce_chunk_size);
5899
5900                 if (track.export_stuff (buffers, start, this_chunk, endpoint, include_endpoint, for_export, for_freeze)) {
5901                         goto out;
5902                 }
5903
5904                 start += this_chunk;
5905                 to_do -= this_chunk;
5906                 itt.progress = (float) (1.0 - ((double) to_do / len));
5907
5908                 if (latency_skip >= bounce_chunk_size) {
5909                         latency_skip -= bounce_chunk_size;
5910                         continue;
5911                 }
5912
5913                 const framecnt_t current_chunk = this_chunk - latency_skip;
5914
5915                 uint32_t n = 0;
5916                 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src, ++n) {
5917                         boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
5918                         boost::shared_ptr<MidiSource> ms;
5919
5920                         if (afs) {
5921                                 if (afs->write (buffers.get_audio(n).data(latency_skip), current_chunk) != current_chunk) {
5922                                         goto out;
5923                                 }
5924                         } else if ((ms = boost::dynamic_pointer_cast<MidiSource>(*src))) {
5925                                 Source::Lock lock(ms->mutex());
5926
5927                                 const MidiBuffer& buf = buffers.get_midi(0);
5928                                 for (MidiBuffer::const_iterator i = buf.begin(); i != buf.end(); ++i) {
5929                                         Evoral::Event<framepos_t> ev = *i;
5930                                         ev.set_time(ev.time() - position);
5931                                         ms->append_event_frames(lock, ev, ms->timeline_position());
5932                                 }
5933                         }
5934                 }
5935                 latency_skip = 0;
5936         }
5937
5938         /* post-roll, pick up delayed processor output */
5939         latency_skip = track.bounce_get_latency (endpoint, include_endpoint, for_export, for_freeze);
5940
5941         while (latency_skip && !itt.cancel) {
5942                 this_chunk = min (latency_skip, bounce_chunk_size);
5943                 latency_skip -= this_chunk;
5944
5945                 buffers.silence (this_chunk, 0);
5946                 track.bounce_process (buffers, start, this_chunk, endpoint, include_endpoint, for_export, for_freeze);
5947
5948                 uint32_t n = 0;
5949                 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src, ++n) {
5950                         boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
5951
5952                         if (afs) {
5953                                 if (afs->write (buffers.get_audio(n).data(), this_chunk) != this_chunk) {
5954                                         goto out;
5955                                 }
5956                         }
5957                 }
5958         }
5959
5960         if (!itt.cancel) {
5961
5962                 time_t now;
5963                 struct tm* xnow;
5964                 time (&now);
5965                 xnow = localtime (&now);
5966
5967                 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src) {
5968                         boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
5969                         boost::shared_ptr<MidiSource> ms;
5970
5971                         if (afs) {
5972                                 afs->update_header (position, *xnow, now);
5973                                 afs->flush_header ();
5974                         } else if ((ms = boost::dynamic_pointer_cast<MidiSource>(*src))) {
5975                                 Source::Lock lock(ms->mutex());
5976                                 ms->mark_streaming_write_completed(lock);
5977                         }
5978                 }
5979
5980                 /* construct a region to represent the bounced material */
5981
5982                 PropertyList plist;
5983
5984                 plist.add (Properties::start, 0);
5985                 plist.add (Properties::length, srcs.front()->length(srcs.front()->timeline_position()));
5986                 plist.add (Properties::name, region_name_from_path (srcs.front()->name(), true));
5987
5988                 result = RegionFactory::create (srcs, plist);
5989
5990         }
5991
5992   out:
5993         if (!result) {
5994                 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
5995                         (*src)->mark_for_remove ();
5996                         (*src)->drop_references ();
5997                 }
5998
5999         } else {
6000                 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
6001                         boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
6002
6003                         if (afs)
6004                                 afs->done_with_peakfile_writes ();
6005                 }
6006         }
6007
6008         _bounce_processing_active = false;
6009
6010         if (need_block_size_reset) {
6011                 _engine.main_thread()->drop_buffers ();
6012                 track.set_block_size (get_block_size());
6013         }
6014
6015         unblock_processing ();
6016
6017         return result;
6018 }
6019
6020 gain_t*
6021 Session::gain_automation_buffer() const
6022 {
6023         return ProcessThread::gain_automation_buffer ();
6024 }
6025
6026 gain_t*
6027 Session::trim_automation_buffer() const
6028 {
6029         return ProcessThread::trim_automation_buffer ();
6030 }
6031
6032 gain_t*
6033 Session::send_gain_automation_buffer() const
6034 {
6035         return ProcessThread::send_gain_automation_buffer ();
6036 }
6037
6038 pan_t**
6039 Session::pan_automation_buffer() const
6040 {
6041         return ProcessThread::pan_automation_buffer ();
6042 }
6043
6044 BufferSet&
6045 Session::get_silent_buffers (ChanCount count)
6046 {
6047         return ProcessThread::get_silent_buffers (count);
6048 }
6049
6050 BufferSet&
6051 Session::get_scratch_buffers (ChanCount count, bool silence)
6052 {
6053         return ProcessThread::get_scratch_buffers (count, silence);
6054 }
6055
6056 BufferSet&
6057 Session::get_noinplace_buffers (ChanCount count)
6058 {
6059         return ProcessThread::get_noinplace_buffers (count);
6060 }
6061
6062 BufferSet&
6063 Session::get_route_buffers (ChanCount count, bool silence)
6064 {
6065         return ProcessThread::get_route_buffers (count, silence);
6066 }
6067
6068
6069 BufferSet&
6070 Session::get_mix_buffers (ChanCount count)
6071 {
6072         return ProcessThread::get_mix_buffers (count);
6073 }
6074
6075 uint32_t
6076 Session::ntracks () const
6077 {
6078         uint32_t n = 0;
6079         boost::shared_ptr<RouteList> r = routes.reader ();
6080
6081         for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
6082                 if (boost::dynamic_pointer_cast<Track> (*i)) {
6083                         ++n;
6084                 }
6085         }
6086
6087         return n;
6088 }
6089
6090 uint32_t
6091 Session::nbusses () const
6092 {
6093         uint32_t n = 0;
6094         boost::shared_ptr<RouteList> r = routes.reader ();
6095
6096         for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
6097                 if (boost::dynamic_pointer_cast<Track>(*i) == 0) {
6098                         ++n;
6099                 }
6100         }
6101
6102         return n;
6103 }
6104
6105 void
6106 Session::add_automation_list(AutomationList *al)
6107 {
6108         automation_lists[al->id()] = al;
6109 }
6110
6111 /** @return true if there is at least one record-enabled track, otherwise false */
6112 bool
6113 Session::have_rec_enabled_track () const
6114 {
6115         return g_atomic_int_get (const_cast<gint*>(&_have_rec_enabled_track)) == 1;
6116 }
6117
6118 bool
6119 Session::have_rec_disabled_track () const
6120 {
6121     return g_atomic_int_get (const_cast<gint*>(&_have_rec_disabled_track)) == 1;
6122 }
6123
6124 /** Update the state of our rec-enabled tracks flag */
6125 void
6126 Session::update_route_record_state ()
6127 {
6128         boost::shared_ptr<RouteList> rl = routes.reader ();
6129         RouteList::iterator i = rl->begin();
6130         while (i != rl->end ()) {
6131
6132                 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
6133                                     if (tr && tr->rec_enable_control()->get_value()) {
6134                         break;
6135                 }
6136
6137                 ++i;
6138         }
6139
6140         int const old = g_atomic_int_get (&_have_rec_enabled_track);
6141
6142         g_atomic_int_set (&_have_rec_enabled_track, i != rl->end () ? 1 : 0);
6143
6144         if (g_atomic_int_get (&_have_rec_enabled_track) != old) {
6145                 RecordStateChanged (); /* EMIT SIGNAL */
6146         }
6147
6148         for (i = rl->begin(); i != rl->end (); ++i) {
6149                 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
6150                 if (tr && !tr->rec_enable_control()->get_value()) {
6151                         break;
6152                 }
6153         }
6154
6155         g_atomic_int_set (&_have_rec_disabled_track, i != rl->end () ? 1 : 0);
6156
6157         bool record_arm_state_changed = (old != g_atomic_int_get (&_have_rec_enabled_track) );
6158
6159         if (record_status() == Recording && record_arm_state_changed ) {
6160                 RecordArmStateChanged ();
6161         }
6162
6163 }
6164
6165 void
6166 Session::listen_position_changed ()
6167 {
6168         boost::shared_ptr<RouteList> r = routes.reader ();
6169
6170         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6171                 (*i)->listen_position_changed ();
6172         }
6173 }
6174
6175 void
6176 Session::solo_control_mode_changed ()
6177 {
6178         if (soloing() || listening()) {
6179                 /* We can't use ::clear_all_solo_state() here because during
6180                    session loading at program startup, that will queue a call
6181                    to rt_clear_all_solo_state() that will not execute until
6182                    AFTER solo states have been established (thus throwing away
6183                    the session's saved solo state). So just explicitly turn
6184                    them all off.
6185                 */
6186                 set_controls (route_list_to_control_list (get_routes(), &Route::solo_control), 0.0, Controllable::NoGroup);
6187         }
6188 }
6189
6190 /** Called when a property of one of our route groups changes */
6191 void
6192 Session::route_group_property_changed (RouteGroup* rg)
6193 {
6194         RouteGroupPropertyChanged (rg); /* EMIT SIGNAL */
6195 }
6196
6197 /** Called when a route is added to one of our route groups */
6198 void
6199 Session::route_added_to_route_group (RouteGroup* rg, boost::weak_ptr<Route> r)
6200 {
6201         RouteAddedToRouteGroup (rg, r);
6202 }
6203
6204 /** Called when a route is removed from one of our route groups */
6205 void
6206 Session::route_removed_from_route_group (RouteGroup* rg, boost::weak_ptr<Route> r)
6207 {
6208         update_route_record_state ();
6209         RouteRemovedFromRouteGroup (rg, r); /* EMIT SIGNAL */
6210 }
6211
6212 boost::shared_ptr<RouteList>
6213 Session::get_tracks () const
6214 {
6215         boost::shared_ptr<RouteList> rl = routes.reader ();
6216         boost::shared_ptr<RouteList> tl (new RouteList);
6217
6218         for (RouteList::const_iterator r = rl->begin(); r != rl->end(); ++r) {
6219                 if (boost::dynamic_pointer_cast<Track> (*r)) {
6220                         if (!(*r)->is_auditioner()) {
6221                                 tl->push_back (*r);
6222                         }
6223                 }
6224         }
6225         return tl;
6226 }
6227
6228 boost::shared_ptr<RouteList>
6229 Session::get_routes_with_regions_at (framepos_t const p) const
6230 {
6231         boost::shared_ptr<RouteList> r = routes.reader ();
6232         boost::shared_ptr<RouteList> rl (new RouteList);
6233
6234         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6235                 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
6236                 if (!tr) {
6237                         continue;
6238                 }
6239
6240                 boost::shared_ptr<Playlist> pl = tr->playlist ();
6241                 if (!pl) {
6242                         continue;
6243                 }
6244
6245                 if (pl->has_region_at (p)) {
6246                         rl->push_back (*i);
6247                 }
6248         }
6249
6250         return rl;
6251 }
6252
6253 void
6254 Session::goto_end ()
6255 {
6256         if (_session_range_location) {
6257                 request_locate (_session_range_location->end(), false);
6258         } else {
6259                 request_locate (0, false);
6260         }
6261 }
6262
6263 void
6264 Session::goto_start ()
6265 {
6266         if (_session_range_location) {
6267                 request_locate (_session_range_location->start(), false);
6268         } else {
6269                 request_locate (0, false);
6270         }
6271 }
6272
6273 framepos_t
6274 Session::current_start_frame () const
6275 {
6276         return _session_range_location ? _session_range_location->start() : 0;
6277 }
6278
6279 framepos_t
6280 Session::current_end_frame () const
6281 {
6282         return _session_range_location ? _session_range_location->end() : 0;
6283 }
6284
6285 void
6286 Session::set_session_range_location (framepos_t start, framepos_t end)
6287 {
6288         _session_range_location = new Location (*this, start, end, _("session"), Location::IsSessionRange);
6289         _locations->add (_session_range_location);
6290 }
6291
6292 void
6293 Session::step_edit_status_change (bool yn)
6294 {
6295         bool send = false;
6296
6297         bool val = false;
6298         if (yn) {
6299                 send = (_step_editors == 0);
6300                 val = true;
6301
6302                 _step_editors++;
6303         } else {
6304                 send = (_step_editors == 1);
6305                 val = false;
6306
6307                 if (_step_editors > 0) {
6308                         _step_editors--;
6309                 }
6310         }
6311
6312         if (send) {
6313                 StepEditStatusChange (val);
6314         }
6315 }
6316
6317
6318 void
6319 Session::start_time_changed (framepos_t old)
6320 {
6321         /* Update the auto loop range to match the session range
6322            (unless the auto loop range has been changed by the user)
6323         */
6324
6325         Location* s = _locations->session_range_location ();
6326         if (s == 0) {
6327                 return;
6328         }
6329
6330         Location* l = _locations->auto_loop_location ();
6331
6332         if (l && l->start() == old) {
6333                 l->set_start (s->start(), true);
6334         }
6335 }
6336
6337 void
6338 Session::end_time_changed (framepos_t old)
6339 {
6340         /* Update the auto loop range to match the session range
6341            (unless the auto loop range has been changed by the user)
6342         */
6343
6344         Location* s = _locations->session_range_location ();
6345         if (s == 0) {
6346                 return;
6347         }
6348
6349         Location* l = _locations->auto_loop_location ();
6350
6351         if (l && l->end() == old) {
6352                 l->set_end (s->end(), true);
6353         }
6354 }
6355
6356 std::vector<std::string>
6357 Session::source_search_path (DataType type) const
6358 {
6359         Searchpath sp;
6360
6361         if (session_dirs.size() == 1) {
6362                 switch (type) {
6363                 case DataType::AUDIO:
6364                         sp.push_back (_session_dir->sound_path());
6365                         break;
6366                 case DataType::MIDI:
6367                         sp.push_back (_session_dir->midi_path());
6368                         break;
6369                 }
6370         } else {
6371                 for (vector<space_and_path>::const_iterator i = session_dirs.begin(); i != session_dirs.end(); ++i) {
6372                         SessionDirectory sdir (i->path);
6373                         switch (type) {
6374                         case DataType::AUDIO:
6375                                 sp.push_back (sdir.sound_path());
6376                                 break;
6377                         case DataType::MIDI:
6378                                 sp.push_back (sdir.midi_path());
6379                                 break;
6380                         }
6381                 }
6382         }
6383
6384         if (type == DataType::AUDIO) {
6385                 const string sound_path_2X = _session_dir->sound_path_2X();
6386                 if (Glib::file_test (sound_path_2X, Glib::FILE_TEST_EXISTS|Glib::FILE_TEST_IS_DIR)) {
6387                         if (find (sp.begin(), sp.end(), sound_path_2X) == sp.end()) {
6388                                 sp.push_back (sound_path_2X);
6389                         }
6390                 }
6391         }
6392
6393         // now check the explicit (possibly user-specified) search path
6394
6395         switch (type) {
6396         case DataType::AUDIO:
6397                 sp += Searchpath(config.get_audio_search_path ());
6398                 break;
6399         case DataType::MIDI:
6400                 sp += Searchpath(config.get_midi_search_path ());
6401                 break;
6402         }
6403
6404         return sp;
6405 }
6406
6407 void
6408 Session::ensure_search_path_includes (const string& path, DataType type)
6409 {
6410         Searchpath sp;
6411
6412         if (path == ".") {
6413                 return;
6414         }
6415
6416         switch (type) {
6417         case DataType::AUDIO:
6418                 sp += Searchpath(config.get_audio_search_path ());
6419                 break;
6420         case DataType::MIDI:
6421                 sp += Searchpath (config.get_midi_search_path ());
6422                 break;
6423         }
6424
6425         for (vector<std::string>::iterator i = sp.begin(); i != sp.end(); ++i) {
6426                 /* No need to add this new directory if it has the same inode as
6427                    an existing one; checking inode rather than name prevents duplicated
6428                    directories when we are using symlinks.
6429
6430                    On Windows, I think we could just do if (*i == path) here.
6431                 */
6432                 if (PBD::equivalent_paths (*i, path)) {
6433                         return;
6434                 }
6435         }
6436
6437         sp += path;
6438
6439         switch (type) {
6440         case DataType::AUDIO:
6441                 config.set_audio_search_path (sp.to_string());
6442                 break;
6443         case DataType::MIDI:
6444                 config.set_midi_search_path (sp.to_string());
6445                 break;
6446         }
6447 }
6448
6449 void
6450 Session::remove_dir_from_search_path (const string& dir, DataType type)
6451 {
6452         Searchpath sp;
6453
6454         switch (type) {
6455         case DataType::AUDIO:
6456                 sp = Searchpath(config.get_audio_search_path ());
6457                 break;
6458         case DataType::MIDI:
6459                 sp = Searchpath (config.get_midi_search_path ());
6460                 break;
6461         }
6462
6463         sp -= dir;
6464
6465         switch (type) {
6466         case DataType::AUDIO:
6467                 config.set_audio_search_path (sp.to_string());
6468                 break;
6469         case DataType::MIDI:
6470                 config.set_midi_search_path (sp.to_string());
6471                 break;
6472         }
6473
6474 }
6475
6476 boost::shared_ptr<Speakers>
6477 Session::get_speakers()
6478 {
6479         return _speakers;
6480 }
6481
6482 list<string>
6483 Session::unknown_processors () const
6484 {
6485         list<string> p;
6486
6487         boost::shared_ptr<RouteList> r = routes.reader ();
6488         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6489                 list<string> t = (*i)->unknown_processors ();
6490                 copy (t.begin(), t.end(), back_inserter (p));
6491         }
6492
6493         p.sort ();
6494         p.unique ();
6495
6496         return p;
6497 }
6498
6499 void
6500 Session::update_latency (bool playback)
6501 {
6502
6503         DEBUG_TRACE (DEBUG::Latency, string_compose ("JACK latency callback: %1\n", (playback ? "PLAYBACK" : "CAPTURE")));
6504
6505         if ((_state_of_the_state & (InitialConnecting|Deletion)) || _adding_routes_in_progress || _route_deletion_in_progress) {
6506                 return;
6507         }
6508
6509         boost::shared_ptr<RouteList> r = routes.reader ();
6510         framecnt_t max_latency = 0;
6511
6512         if (playback) {
6513                 /* reverse the list so that we work backwards from the last route to run to the first */
6514                 RouteList* rl = routes.reader().get();
6515                 r.reset (new RouteList (*rl));
6516                 reverse (r->begin(), r->end());
6517         }
6518
6519         /* compute actual latency values for the given direction and store them all in per-port
6520            structures. this will also publish the same values (to JACK) so that computation of latency
6521            for routes can consistently use public latency values.
6522         */
6523
6524         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6525                 max_latency = max (max_latency, (*i)->set_private_port_latencies (playback));
6526         }
6527
6528         /* because we latency compensate playback, our published playback latencies should
6529            be the same for all output ports - all material played back by ardour has
6530            the same latency, whether its caused by plugins or by latency compensation. since
6531            these may differ from the values computed above, reset all playback port latencies
6532            to the same value.
6533         */
6534
6535         DEBUG_TRACE (DEBUG::Latency, string_compose ("Set public port latencies to %1\n", max_latency));
6536
6537         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6538                 (*i)->set_public_port_latencies (max_latency, playback);
6539         }
6540
6541         if (playback) {
6542
6543                 post_playback_latency ();
6544
6545         } else {
6546
6547                 post_capture_latency ();
6548         }
6549
6550         DEBUG_TRACE (DEBUG::Latency, "JACK latency callback: DONE\n");
6551 }
6552
6553 void
6554 Session::post_playback_latency ()
6555 {
6556         set_worst_playback_latency ();
6557
6558         boost::shared_ptr<RouteList> r = routes.reader ();
6559
6560         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6561                 if (!(*i)->is_auditioner() && ((*i)->active())) {
6562                         _worst_track_latency = max (_worst_track_latency, (*i)->update_signal_latency ());
6563                 }
6564         }
6565
6566         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6567                 (*i)->set_latency_compensation (_worst_track_latency);
6568         }
6569 }
6570
6571 void
6572 Session::post_capture_latency ()
6573 {
6574         set_worst_capture_latency ();
6575
6576         /* reflect any changes in capture latencies into capture offsets
6577          */
6578
6579         boost::shared_ptr<RouteList> rl = routes.reader();
6580         for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
6581                 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
6582                 if (tr) {
6583                         tr->set_capture_offset ();
6584                 }
6585         }
6586 }
6587
6588 void
6589 Session::initialize_latencies ()
6590 {
6591         {
6592                 Glib::Threads::Mutex::Lock lm (_engine.process_lock());
6593                 update_latency (false);
6594                 update_latency (true);
6595         }
6596
6597         set_worst_io_latencies ();
6598 }
6599
6600 void
6601 Session::set_worst_io_latencies ()
6602 {
6603         set_worst_playback_latency ();
6604         set_worst_capture_latency ();
6605 }
6606
6607 void
6608 Session::set_worst_playback_latency ()
6609 {
6610         if (_state_of_the_state & (InitialConnecting|Deletion)) {
6611                 return;
6612         }
6613
6614         _worst_output_latency = 0;
6615
6616         if (!_engine.connected()) {
6617                 return;
6618         }
6619
6620         boost::shared_ptr<RouteList> r = routes.reader ();
6621
6622         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6623                 _worst_output_latency = max (_worst_output_latency, (*i)->output()->latency());
6624         }
6625
6626         DEBUG_TRACE (DEBUG::Latency, string_compose ("Worst output latency: %1\n", _worst_output_latency));
6627 }
6628
6629 void
6630 Session::set_worst_capture_latency ()
6631 {
6632         if (_state_of_the_state & (InitialConnecting|Deletion)) {
6633                 return;
6634         }
6635
6636         _worst_input_latency = 0;
6637
6638         if (!_engine.connected()) {
6639                 return;
6640         }
6641
6642         boost::shared_ptr<RouteList> r = routes.reader ();
6643
6644         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6645                 _worst_input_latency = max (_worst_input_latency, (*i)->input()->latency());
6646         }
6647
6648         DEBUG_TRACE (DEBUG::Latency, string_compose ("Worst input latency: %1\n", _worst_input_latency));
6649 }
6650
6651 void
6652 Session::update_latency_compensation (bool force_whole_graph)
6653 {
6654         bool some_track_latency_changed = false;
6655
6656         if (_state_of_the_state & (InitialConnecting|Deletion)) {
6657                 return;
6658         }
6659
6660         DEBUG_TRACE(DEBUG::Latency, "---------------------------- update latency compensation\n\n");
6661
6662         _worst_track_latency = 0;
6663
6664         boost::shared_ptr<RouteList> r = routes.reader ();
6665
6666         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6667                 if (!(*i)->is_auditioner() && ((*i)->active())) {
6668                         framecnt_t tl;
6669                         if ((*i)->signal_latency () != (tl = (*i)->update_signal_latency ())) {
6670                                 some_track_latency_changed = true;
6671                         }
6672                         _worst_track_latency = max (tl, _worst_track_latency);
6673                 }
6674         }
6675
6676         DEBUG_TRACE (DEBUG::Latency, string_compose ("worst signal processing latency: %1 (changed ? %2)\n", _worst_track_latency,
6677                                                      (some_track_latency_changed ? "yes" : "no")));
6678
6679         DEBUG_TRACE(DEBUG::Latency, "---------------------------- DONE update latency compensation\n\n");
6680
6681         if (some_track_latency_changed || force_whole_graph)  {
6682                 _engine.update_latencies ();
6683         }
6684
6685
6686         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6687                 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
6688                 if (!tr) {
6689                         continue;
6690                 }
6691                 tr->set_capture_offset ();
6692         }
6693 }
6694
6695 char
6696 Session::session_name_is_legal (const string& path)
6697 {
6698         char illegal_chars[] = { '/', '\\', ':', ';', '\0' };
6699
6700         for (int i = 0; illegal_chars[i]; ++i) {
6701                 if (path.find (illegal_chars[i]) != string::npos) {
6702                         return illegal_chars[i];
6703                 }
6704         }
6705
6706         return 0;
6707 }
6708
6709 void
6710 Session::notify_presentation_info_change ()
6711 {
6712         if (deletion_in_progress()) {
6713                 return;
6714         }
6715
6716         Stripable::PresentationInfoChange (); /* EMIT SIGNAL */
6717         reassign_track_numbers();
6718
6719 #ifdef USE_TRACKS_CODE_FEATURES
6720         /* Waves Tracks: for Waves Tracks session it's required to reconnect their IOs
6721          * if track order has been changed by user
6722          */
6723         reconnect_existing_routes(true, true);
6724 #endif
6725
6726 }
6727
6728 bool
6729 Session::operation_in_progress (GQuark op) const
6730 {
6731         return (find (_current_trans_quarks.begin(), _current_trans_quarks.end(), op) != _current_trans_quarks.end());
6732 }
6733
6734 boost::shared_ptr<Port>
6735 Session::ltc_input_port () const
6736 {
6737         return _ltc_input->nth (0);
6738 }
6739
6740 boost::shared_ptr<Port>
6741 Session::ltc_output_port () const
6742 {
6743         return _ltc_output->nth (0);
6744 }
6745
6746 void
6747 Session::reconnect_ltc_input ()
6748 {
6749         if (_ltc_input) {
6750
6751                 string src = Config->get_ltc_source_port();
6752
6753                 _ltc_input->disconnect (this);
6754
6755                 if (src != _("None") && !src.empty())  {
6756                         _ltc_input->nth (0)->connect (src);
6757                 }
6758
6759                 if ( ARDOUR::Profile->get_trx () ) {
6760                         // Tracks need this signal to update timecode_source_dropdown
6761                         MtcOrLtcInputPortChanged (); //emit signal
6762                 }
6763         }
6764 }
6765
6766 void
6767 Session::reconnect_ltc_output ()
6768 {
6769         if (_ltc_output) {
6770
6771                 string src = Config->get_ltc_output_port();
6772
6773                 _ltc_output->disconnect (this);
6774
6775                 if (src != _("None") && !src.empty())  {
6776                         _ltc_output->nth (0)->connect (src);
6777                 }
6778         }
6779 }
6780
6781 void
6782 Session::set_range_selection (framepos_t start, framepos_t end)
6783 {
6784         _range_selection = Evoral::Range<framepos_t> (start, end);
6785 #ifdef USE_TRACKS_CODE_FEATURES
6786         follow_playhead_priority ();
6787 #endif
6788 }
6789
6790 void
6791 Session::set_object_selection (framepos_t start, framepos_t end)
6792 {
6793         _object_selection = Evoral::Range<framepos_t> (start, end);
6794 #ifdef USE_TRACKS_CODE_FEATURES
6795         follow_playhead_priority ();
6796 #endif
6797 }
6798
6799 void
6800 Session::clear_range_selection ()
6801 {
6802         _range_selection = Evoral::Range<framepos_t> (-1,-1);
6803 #ifdef USE_TRACKS_CODE_FEATURES
6804         follow_playhead_priority ();
6805 #endif
6806 }
6807
6808 void
6809 Session::clear_object_selection ()
6810 {
6811         _object_selection = Evoral::Range<framepos_t> (-1,-1);
6812 #ifdef USE_TRACKS_CODE_FEATURES
6813         follow_playhead_priority ();
6814 #endif
6815 }
6816
6817 void
6818 Session::auto_connect_route (boost::shared_ptr<Route> route, bool connect_inputs,
6819                 const ChanCount& input_start,
6820                 const ChanCount& output_start,
6821                 const ChanCount& input_offset,
6822                 const ChanCount& output_offset)
6823 {
6824         Glib::Threads::Mutex::Lock lx (_auto_connect_queue_lock);
6825         _auto_connect_queue.push (AutoConnectRequest (route, connect_inputs,
6826                                 input_start, output_start,
6827                                 input_offset, output_offset));
6828
6829         if (pthread_mutex_trylock (&_auto_connect_mutex) == 0) {
6830                 pthread_cond_signal (&_auto_connect_cond);
6831                 pthread_mutex_unlock (&_auto_connect_mutex);
6832         }
6833 }
6834
6835 void
6836 Session::auto_connect (const AutoConnectRequest& ar)
6837 {
6838         boost::shared_ptr<Route> route = ar.route.lock();
6839
6840         if (!route) { return; }
6841
6842         if (!IO::connecting_legal) {
6843                 return;
6844         }
6845
6846         /* If both inputs and outputs are auto-connected to physical ports,
6847          * use the max of input and output offsets to ensure auto-connected
6848          * port numbers always match up (e.g. the first audio input and the
6849          * first audio output of the route will have the same physical
6850          * port number).  Otherwise just use the lowest input or output
6851          * offset possible.
6852          */
6853
6854         const bool in_out_physical =
6855                 (Config->get_input_auto_connect() & AutoConnectPhysical)
6856                 && (Config->get_output_auto_connect() & AutoConnectPhysical)
6857                 && ar.connect_inputs;
6858
6859         const ChanCount in_offset = in_out_physical
6860                 ? ChanCount::max(ar.input_offset, ar.output_offset)
6861                 : ar.input_offset;
6862
6863         const ChanCount out_offset = in_out_physical
6864                 ? ChanCount::max(ar.input_offset, ar.output_offset)
6865                 : ar.output_offset;
6866
6867         for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
6868                 vector<string> physinputs;
6869                 vector<string> physoutputs;
6870
6871                 _engine.get_physical_outputs (*t, physoutputs);
6872                 _engine.get_physical_inputs (*t, physinputs);
6873
6874                 if (!physinputs.empty() && ar.connect_inputs) {
6875                         uint32_t nphysical_in = physinputs.size();
6876
6877                         for (uint32_t i = ar.input_start.get(*t); i < route->n_inputs().get(*t) && i < nphysical_in; ++i) {
6878                                 string port;
6879
6880                                 if (Config->get_input_auto_connect() & AutoConnectPhysical) {
6881                                         port = physinputs[(in_offset.get(*t) + i) % nphysical_in];
6882                                 }
6883
6884                                 if (!port.empty() && route->input()->connect (route->input()->ports().port(*t, i), port, this)) {
6885                                         break;
6886                                 }
6887                         }
6888                 }
6889
6890                 if (!physoutputs.empty()) {
6891                         uint32_t nphysical_out = physoutputs.size();
6892                         for (uint32_t i = ar.output_start.get(*t); i < route->n_outputs().get(*t); ++i) {
6893                                 string port;
6894
6895                                 /* Waves Tracks:
6896                                  * do not create new connections if we reached the limit of physical outputs
6897                                  * in Multi Out mode
6898                                  */
6899                                 if (!(Config->get_output_auto_connect() & AutoConnectMaster) &&
6900                                                 ARDOUR::Profile->get_trx () &&
6901                                                 ar.output_offset.get(*t) == nphysical_out ) {
6902                                         break;
6903                                 }
6904
6905                                 if ((*t) == DataType::MIDI && (Config->get_output_auto_connect() & AutoConnectPhysical)) {
6906                                         port = physoutputs[(out_offset.get(*t) + i) % nphysical_out];
6907                                 } else if ((*t) == DataType::AUDIO && (Config->get_output_auto_connect() & AutoConnectMaster)) {
6908                                         /* master bus is audio only */
6909                                         if (_master_out && _master_out->n_inputs().get(*t) > 0) {
6910                                                 port = _master_out->input()->ports().port(*t,
6911                                                                 i % _master_out->input()->n_ports().get(*t))->name();
6912                                         }
6913                                 }
6914
6915                                 if (!port.empty() && route->output()->connect (route->output()->ports().port(*t, i), port, this)) {
6916                                         break;
6917                                 }
6918                         }
6919                 }
6920         }
6921 }
6922
6923 void
6924 Session::auto_connect_thread_start ()
6925 {
6926         if (_ac_thread_active) {
6927                 return;
6928         }
6929
6930         while (!_auto_connect_queue.empty ()) {
6931                 _auto_connect_queue.pop ();
6932         }
6933
6934         _ac_thread_active = true;
6935         if (pthread_create (&_auto_connect_thread, NULL, auto_connect_thread, this)) {
6936                 _ac_thread_active = false;
6937         }
6938 }
6939
6940 void
6941 Session::auto_connect_thread_terminate ()
6942 {
6943         if (!_ac_thread_active) {
6944                 return;
6945         }
6946         _ac_thread_active = false;
6947
6948         {
6949                 Glib::Threads::Mutex::Lock lx (_auto_connect_queue_lock);
6950                 while (!_auto_connect_queue.empty ()) {
6951                         _auto_connect_queue.pop ();
6952                 }
6953         }
6954
6955         if (pthread_mutex_lock (&_auto_connect_mutex) == 0) {
6956                 pthread_cond_signal (&_auto_connect_cond);
6957                 pthread_mutex_unlock (&_auto_connect_mutex);
6958         }
6959
6960         void *status;
6961         pthread_join (_auto_connect_thread, &status);
6962 }
6963
6964 void *
6965 Session::auto_connect_thread (void *arg)
6966 {
6967         Session *s = static_cast<Session *>(arg);
6968         s->auto_connect_thread_run ();
6969         pthread_exit (0);
6970         return 0;
6971 }
6972
6973 void
6974 Session::auto_connect_thread_run ()
6975 {
6976         pthread_set_name (X_("autoconnect"));
6977         SessionEvent::create_per_thread_pool (X_("autoconnect"), 1024);
6978         PBD::notify_event_loops_about_thread_creation (pthread_self(), X_("autoconnect"), 1024);
6979         pthread_mutex_lock (&_auto_connect_mutex);
6980         while (_ac_thread_active) {
6981
6982                 if (!_auto_connect_queue.empty ()) {
6983                         // Why would we need the process lock ??
6984                         // A: if ports are added while we're connecting, the backend's iterator may be invalidated:
6985                         //   graph_order_callback() -> resort_routes() -> direct_feeds_according_to_reality () -> backend::connected_to()
6986                         //   All ardour-internal backends use a std::vector   xxxAudioBackend::find_port()
6987                         //   We have control over those, but what does jack do?
6988                         Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
6989
6990                         Glib::Threads::Mutex::Lock lx (_auto_connect_queue_lock);
6991                         while (!_auto_connect_queue.empty ()) {
6992                                 const AutoConnectRequest ar (_auto_connect_queue.front());
6993                                 _auto_connect_queue.pop ();
6994                                 lx.release ();
6995                                 auto_connect (ar);
6996                                 lx.acquire ();
6997                         }
6998                 }
6999
7000                 pthread_cond_wait (&_auto_connect_cond, &_auto_connect_mutex);
7001         }
7002         pthread_mutex_unlock (&_auto_connect_mutex);
7003 }