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