RAII to postpone processor changes/graph recalculation
[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 (0)
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                 ProcessorChangeBlocker  pcb (this, false);
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         ProcessorChangeBlocker  pcb (this, false /* XXX */);
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         ProcessorChangeBlocker pcb (this, false);
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                         case CopyPlaylist:
3247                                 rename_playlist = true;
3248                                 break;
3249                         default:
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                                 ProcessorChangeBlocker pcb (this, false);
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 or clear all solo state; 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         boost::shared_ptr<RouteList> r = routes.reader ();
3850         int32_t delta = route->solo_control()->transitioned_into_solo ();
3851
3852         /* the route may be a member of a group that has shared-solo
3853          * semantics. If so, then all members of that group should follow the
3854          * solo of the changed route. But ... this is optional, controlled by a
3855          * Controllable::GroupControlDisposition.
3856          *
3857          * The first argument to the signal that this method is connected to is the
3858          * GroupControlDisposition value that was used to change solo.
3859          *
3860          * If the solo change was done with group semantics (either InverseGroup
3861          * (force the entire group to change even if the group shared solo is
3862          * disabled) or UseGroup (use the group, which may or may not have the
3863          * shared solo property enabled)) then as we propagate the change to
3864          * the entire session we should IGNORE THE GROUP that the changed route
3865          * belongs to.
3866          */
3867
3868         RouteGroup* rg = route->route_group ();
3869         const bool group_already_accounted_for = (group_override == Controllable::ForGroup);
3870
3871         DEBUG_TRACE (DEBUG::Solo, string_compose ("propagate to session, group accounted for ? %1\n", group_already_accounted_for));
3872
3873         if (delta == 1 && Config->get_exclusive_solo()) {
3874
3875                 /* new solo: disable all other solos, but not the group if its solo-enabled */
3876
3877                 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3878
3879                         if ((*i) == route) {
3880                                 /* already changed */
3881                                 continue;
3882                         }
3883
3884                         if ((*i)->solo_isolate_control()->solo_isolated() || !(*i)->can_solo()) {
3885                                 /* route does not get solo propagated to it */
3886                                 continue;
3887                         }
3888
3889                         if ((group_already_accounted_for && (*i)->route_group() && (*i)->route_group() == rg)) {
3890                                 /* this route is a part of the same solo group as the route
3891                                  * that was changed. Changing that route did change or will
3892                                  * change all group members appropriately, so we can ignore it
3893                                  * here
3894                                  */
3895                                 continue;
3896                         }
3897
3898                         (*i)->solo_control()->set_value (0.0, group_override);
3899                 }
3900         }
3901
3902         DEBUG_TRACE (DEBUG::Solo, string_compose ("propagate solo change, delta = %1\n", delta));
3903
3904         RouteList uninvolved;
3905
3906         DEBUG_TRACE (DEBUG::Solo, string_compose ("%1\n", route->name()));
3907
3908         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3909                 bool via_sends_only;
3910                 bool in_signal_flow;
3911
3912                 if ((*i) == route) {
3913                         /* already changed */
3914                         continue;
3915                 }
3916
3917                 if ((*i)->solo_isolate_control()->solo_isolated() || !(*i)->can_solo()) {
3918                         /* route does not get solo propagated to it */
3919                         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(),
3920                                                                   (*i)->can_solo()));
3921                         continue;
3922                 }
3923
3924                 if ((group_already_accounted_for && (*i)->route_group() && (*i)->route_group() == rg)) {
3925                         /* this route is a part of the same solo group as the route
3926                          * that was changed. Changing that route did change or will
3927                          * change all group members appropriately, so we can ignore it
3928                          * here
3929                          */
3930                         continue;
3931                 }
3932
3933                 in_signal_flow = false;
3934
3935                 DEBUG_TRACE (DEBUG::Solo, string_compose ("check feed from %1\n", (*i)->name()));
3936
3937                 if ((*i)->feeds (route, &via_sends_only)) {
3938                         DEBUG_TRACE (DEBUG::Solo, string_compose ("\tthere is a feed from %1\n", (*i)->name()));
3939                         if (!via_sends_only) {
3940                                 if (!route->soloed_by_others_upstream()) {
3941                                         (*i)->solo_control()->mod_solo_by_others_downstream (delta);
3942                                 } else {
3943                                         DEBUG_TRACE (DEBUG::Solo, "\talready soloed by others upstream\n");
3944                                 }
3945                         } else {
3946                                 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tthere is a send-only feed from %1\n", (*i)->name()));
3947                         }
3948                         in_signal_flow = true;
3949                 } else {
3950                         DEBUG_TRACE (DEBUG::Solo, string_compose ("\tno feed from %1\n", (*i)->name()));
3951                 }
3952
3953                 DEBUG_TRACE (DEBUG::Solo, string_compose ("check feed to %1\n", (*i)->name()));
3954
3955                 if (route->feeds (*i, &via_sends_only)) {
3956                         /* propagate solo upstream only if routing other than
3957                            sends is involved, but do consider the other route
3958                            (*i) to be part of the signal flow even if only
3959                            sends are involved.
3960                         */
3961                         DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 feeds %2 via sends only %3 sboD %4 sboU %5\n",
3962                                                                   route->name(),
3963                                                                   (*i)->name(),
3964                                                                   via_sends_only,
3965                                                                   route->soloed_by_others_downstream(),
3966                                                                   route->soloed_by_others_upstream()));
3967                         if (!via_sends_only) {
3968                                 //NB. Triggers Invert Push, which handles soloed by downstream
3969                                 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tmod %1 by %2\n", (*i)->name(), delta));
3970                                 (*i)->solo_control()->mod_solo_by_others_upstream (delta);
3971                         } else {
3972                                 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tfeed to %1 ignored, sends-only\n", (*i)->name()));
3973                         }
3974                         in_signal_flow = true;
3975                 } else {
3976                         DEBUG_TRACE (DEBUG::Solo, "\tno feed to\n");
3977                 }
3978
3979                 if (!in_signal_flow) {
3980                         uninvolved.push_back (*i);
3981                 }
3982         }
3983
3984         DEBUG_TRACE (DEBUG::Solo, "propagation complete\n");
3985
3986         /* now notify that the mute state of the routes not involved in the signal
3987            pathway of the just-solo-changed route may have altered.
3988         */
3989
3990         for (RouteList::iterator i = uninvolved.begin(); i != uninvolved.end(); ++i) {
3991                 DEBUG_TRACE (DEBUG::Solo, string_compose ("mute change for %1, which neither feeds or is fed by %2\n", (*i)->name(), route->name()));
3992                 (*i)->act_on_mute ();
3993                 /* Session will emit SoloChanged() after all solo changes are
3994                  * complete, which should be used by UIs to update mute status
3995                  */
3996         }
3997 }
3998
3999 void
4000 Session::update_route_solo_state (boost::shared_ptr<RouteList> r)
4001 {
4002         /* now figure out if anything that matters is soloed (or is "listening")*/
4003
4004         bool something_soloed = false;
4005         bool something_listening = false;
4006         uint32_t listeners = 0;
4007         uint32_t isolated = 0;
4008
4009         if (!r) {
4010                 r = routes.reader();
4011         }
4012
4013         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4014                 if ((*i)->can_solo()) {
4015                         if (Config->get_solo_control_is_listen_control()) {
4016                                 if ((*i)->solo_control()->soloed_by_self_or_masters()) {
4017                                         listeners++;
4018                                         something_listening = true;
4019                                 }
4020                         } else {
4021                                 (*i)->set_listen (false);
4022                                 if ((*i)->can_solo() && (*i)->solo_control()->soloed_by_self_or_masters()) {
4023                                         something_soloed = true;
4024                                 }
4025                         }
4026                 }
4027
4028                 if ((*i)->solo_isolate_control()->solo_isolated()) {
4029                         isolated++;
4030                 }
4031         }
4032
4033         if (something_soloed != _non_soloed_outs_muted) {
4034                 _non_soloed_outs_muted = something_soloed;
4035                 SoloActive (_non_soloed_outs_muted); /* EMIT SIGNAL */
4036         }
4037
4038         if (something_listening != _listening) {
4039                 _listening = something_listening;
4040                 SoloActive (_listening);
4041         }
4042
4043         _listen_cnt = listeners;
4044
4045         if (isolated != _solo_isolated_cnt) {
4046                 _solo_isolated_cnt = isolated;
4047                 IsolatedChanged (); /* EMIT SIGNAL */
4048         }
4049
4050         DEBUG_TRACE (DEBUG::Solo, string_compose ("solo state updated by session, soloed? %1 listeners %2 isolated %3\n",
4051                                                   something_soloed, listeners, isolated));
4052
4053
4054         SoloChanged (); /* EMIT SIGNAL */
4055         set_dirty();
4056 }
4057
4058 void
4059 Session::get_stripables (StripableList& sl) const
4060 {
4061         boost::shared_ptr<RouteList> r = routes.reader ();
4062         sl.insert (sl.end(), r->begin(), r->end());
4063
4064         VCAList v = _vca_manager->vcas ();
4065         sl.insert (sl.end(), v.begin(), v.end());
4066 }
4067
4068 boost::shared_ptr<RouteList>
4069 Session::get_routes_with_internal_returns() const
4070 {
4071         boost::shared_ptr<RouteList> r = routes.reader ();
4072         boost::shared_ptr<RouteList> rl (new RouteList);
4073
4074         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4075                 if ((*i)->internal_return ()) {
4076                         rl->push_back (*i);
4077                 }
4078         }
4079         return rl;
4080 }
4081
4082 bool
4083 Session::io_name_is_legal (const std::string& name) const
4084 {
4085         boost::shared_ptr<RouteList> r = routes.reader ();
4086
4087         for (vector<string>::const_iterator reserved = reserved_io_names.begin(); reserved != reserved_io_names.end(); ++reserved) {
4088                 if (name == *reserved) {
4089                         if (!route_by_name (*reserved)) {
4090                                 /* first instance of a reserved name is allowed */
4091                                 return true;
4092                         }
4093                         /* all other instances of a reserved name are not allowed */
4094                         return false;
4095                 }
4096         }
4097
4098         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4099                 if ((*i)->name() == name) {
4100                         return false;
4101                 }
4102
4103                 if ((*i)->has_io_processor_named (name)) {
4104                         return false;
4105                 }
4106         }
4107
4108         return true;
4109 }
4110
4111 void
4112 Session::set_exclusive_input_active (boost::shared_ptr<RouteList> rl, bool onoff, bool flip_others)
4113 {
4114         RouteList rl2;
4115         vector<string> connections;
4116
4117         /* if we are passed only a single route and we're not told to turn
4118          * others off, then just do the simple thing.
4119          */
4120
4121         if (flip_others == false && rl->size() == 1) {
4122                 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (rl->front());
4123                 if (mt) {
4124                         mt->set_input_active (onoff);
4125                         return;
4126                 }
4127         }
4128
4129         for (RouteList::iterator rt = rl->begin(); rt != rl->end(); ++rt) {
4130
4131                 PortSet& ps ((*rt)->input()->ports());
4132
4133                 for (PortSet::iterator p = ps.begin(); p != ps.end(); ++p) {
4134                         p->get_connections (connections);
4135                 }
4136
4137                 for (vector<string>::iterator s = connections.begin(); s != connections.end(); ++s) {
4138                         routes_using_input_from (*s, rl2);
4139                 }
4140
4141                 /* scan all relevant routes to see if others are on or off */
4142
4143                 bool others_are_already_on = false;
4144
4145                 for (RouteList::iterator r = rl2.begin(); r != rl2.end(); ++r) {
4146
4147                         boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*r);
4148
4149                         if (!mt) {
4150                                 continue;
4151                         }
4152
4153                         if ((*r) != (*rt)) {
4154                                 if (mt->input_active()) {
4155                                         others_are_already_on = true;
4156                                 }
4157                         } else {
4158                                 /* this one needs changing */
4159                                 mt->set_input_active (onoff);
4160                         }
4161                 }
4162
4163                 if (flip_others) {
4164
4165                         /* globally reverse other routes */
4166
4167                         for (RouteList::iterator r = rl2.begin(); r != rl2.end(); ++r) {
4168                                 if ((*r) != (*rt)) {
4169                                         boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*r);
4170                                         if (mt) {
4171                                                 mt->set_input_active (!others_are_already_on);
4172                                         }
4173                                 }
4174                         }
4175                 }
4176         }
4177 }
4178
4179 void
4180 Session::routes_using_input_from (const string& str, RouteList& rl)
4181 {
4182         boost::shared_ptr<RouteList> r = routes.reader();
4183
4184         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4185                 if ((*i)->input()->connected_to (str)) {
4186                         rl.push_back (*i);
4187                 }
4188         }
4189 }
4190
4191 boost::shared_ptr<Route>
4192 Session::route_by_name (string name) const
4193 {
4194         boost::shared_ptr<RouteList> r = routes.reader ();
4195
4196         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4197                 if ((*i)->name() == name) {
4198                         return *i;
4199                 }
4200         }
4201
4202         return boost::shared_ptr<Route> ((Route*) 0);
4203 }
4204
4205 boost::shared_ptr<Route>
4206 Session::route_by_id (PBD::ID id) const
4207 {
4208         boost::shared_ptr<RouteList> r = routes.reader ();
4209
4210         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4211                 if ((*i)->id() == id) {
4212                         return *i;
4213                 }
4214         }
4215
4216         return boost::shared_ptr<Route> ((Route*) 0);
4217 }
4218
4219 boost::shared_ptr<Processor>
4220 Session::processor_by_id (PBD::ID id) const
4221 {
4222         boost::shared_ptr<RouteList> r = routes.reader ();
4223
4224         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4225                 boost::shared_ptr<Processor> p = (*i)->Route::processor_by_id (id);
4226                 if (p) {
4227                         return p;
4228                 }
4229         }
4230
4231         return boost::shared_ptr<Processor> ();
4232 }
4233
4234 boost::shared_ptr<Track>
4235 Session::track_by_diskstream_id (PBD::ID id) const
4236 {
4237         boost::shared_ptr<RouteList> r = routes.reader ();
4238
4239         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4240                 boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> (*i);
4241                 if (t && t->using_diskstream_id (id)) {
4242                         return t;
4243                 }
4244         }
4245
4246         return boost::shared_ptr<Track> ();
4247 }
4248
4249 boost::shared_ptr<Route>
4250 Session::get_remote_nth_route (PresentationInfo::order_t n) const
4251 {
4252         return boost::dynamic_pointer_cast<Route> (get_remote_nth_stripable (n, PresentationInfo::Route));
4253 }
4254
4255 boost::shared_ptr<Stripable>
4256 Session::get_remote_nth_stripable (PresentationInfo::order_t n, PresentationInfo::Flag flags) const
4257 {
4258         StripableList sl;
4259         PresentationInfo::order_t match_cnt = 0;
4260
4261         get_stripables (sl);
4262         sl.sort (Stripable::PresentationOrderSorter());
4263
4264         for (StripableList::const_iterator s = sl.begin(); s != sl.end(); ++s) {
4265
4266                 if ((*s)->presentation_info().hidden()) {
4267                         /* if the caller didn't explicitly ask for hidden
4268                            stripables, ignore hidden ones. This matches
4269                            the semantics of the pre-PresentationOrder
4270                            "get by RID" logic of Ardour 4.x and earlier.
4271
4272                            XXX at some point we should likely reverse
4273                            the logic of the flags, because asking for "the
4274                            hidden stripables" is not going to be common,
4275                            whereas asking for visible ones is normal.
4276                         */
4277
4278                         if (! (flags & PresentationInfo::Hidden)) {
4279                                 continue;
4280                         }
4281                 }
4282
4283                 if ((*s)->presentation_info().flag_match (flags)) {
4284                         if (match_cnt++ == n) {
4285                                 return *s;
4286                         }
4287                 }
4288         }
4289
4290         /* there is no nth stripable that matches the given flags */
4291         return boost::shared_ptr<Stripable>();
4292 }
4293
4294 boost::shared_ptr<Route>
4295 Session::route_by_selected_count (uint32_t id) const
4296 {
4297         boost::shared_ptr<RouteList> r = routes.reader ();
4298
4299         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4300                 /* NOT IMPLEMENTED */
4301         }
4302
4303         return boost::shared_ptr<Route> ((Route*) 0);
4304 }
4305
4306 struct PresentationOrderSorter {
4307         bool operator() (boost::shared_ptr<Stripable> a, boost::shared_ptr<Stripable> b) {
4308                 if (a->presentation_info().special() && !b->presentation_info().special()) {
4309                         /* a is not ordered, b is; b comes before a */
4310                         return false;
4311                 } else if (!b->presentation_info().order_set() && a->presentation_info().order_set()) {
4312                         /* b is not ordered, a is; a comes before b */
4313                         return true;
4314                 } else {
4315                         return a->presentation_info().order() < b->presentation_info().order();
4316                 }
4317         }
4318 };
4319
4320 void
4321 Session::reassign_track_numbers ()
4322 {
4323         int64_t tn = 0;
4324         int64_t bn = 0;
4325         RouteList r (*(routes.reader ()));
4326         PresentationOrderSorter sorter;
4327         r.sort (sorter);
4328
4329         StateProtector sp (this);
4330
4331         for (RouteList::iterator i = r.begin(); i != r.end(); ++i) {
4332                 if (boost::dynamic_pointer_cast<Track> (*i)) {
4333                         (*i)->set_track_number(++tn);
4334                 }
4335                 else if (!(*i)->is_master() && !(*i)->is_monitor() && !(*i)->is_auditioner()) {
4336                         (*i)->set_track_number(--bn);
4337                 }
4338         }
4339         const uint32_t decimals = ceilf (log10f (tn + 1));
4340         const bool decimals_changed = _track_number_decimals != decimals;
4341         _track_number_decimals = decimals;
4342
4343         if (decimals_changed && config.get_track_name_number ()) {
4344                 for (RouteList::iterator i = r.begin(); i != r.end(); ++i) {
4345                         boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> (*i);
4346                         if (t) {
4347                                 t->resync_track_name();
4348                         }
4349                 }
4350                 // trigger GUI re-layout
4351                 config.ParameterChanged("track-name-number");
4352         }
4353
4354 #ifndef NDEBUG
4355         if (DEBUG_ENABLED(DEBUG::OrderKeys)) {
4356                 boost::shared_ptr<RouteList> rl = routes.reader ();
4357                 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
4358                         DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("%1 numbered %2\n", (*i)->name(), (*i)->track_number()));
4359                 }
4360         }
4361 #endif /* NDEBUG */
4362
4363 }
4364
4365 void
4366 Session::playlist_region_added (boost::weak_ptr<Region> w)
4367 {
4368         boost::shared_ptr<Region> r = w.lock ();
4369         if (!r) {
4370                 return;
4371         }
4372
4373         /* These are the operations that are currently in progress... */
4374         list<GQuark> curr = _current_trans_quarks;
4375         curr.sort ();
4376
4377         /* ...and these are the operations during which we want to update
4378            the session range location markers.
4379         */
4380         list<GQuark> ops;
4381         ops.push_back (Operations::capture);
4382         ops.push_back (Operations::paste);
4383         ops.push_back (Operations::duplicate_region);
4384         ops.push_back (Operations::insert_file);
4385         ops.push_back (Operations::insert_region);
4386         ops.push_back (Operations::drag_region_brush);
4387         ops.push_back (Operations::region_drag);
4388         ops.push_back (Operations::selection_grab);
4389         ops.push_back (Operations::region_fill);
4390         ops.push_back (Operations::fill_selection);
4391         ops.push_back (Operations::create_region);
4392         ops.push_back (Operations::region_copy);
4393         ops.push_back (Operations::fixed_time_region_copy);
4394         ops.sort ();
4395
4396         /* See if any of the current operations match the ones that we want */
4397         list<GQuark> in;
4398         set_intersection (_current_trans_quarks.begin(), _current_trans_quarks.end(), ops.begin(), ops.end(), back_inserter (in));
4399
4400         /* If so, update the session range markers */
4401         if (!in.empty ()) {
4402                 maybe_update_session_range (r->position (), r->last_frame ());
4403         }
4404 }
4405
4406 /** Update the session range markers if a is before the current start or
4407  *  b is after the current end.
4408  */
4409 void
4410 Session::maybe_update_session_range (framepos_t a, framepos_t b)
4411 {
4412         if (_state_of_the_state & Loading) {
4413                 return;
4414         }
4415
4416         framepos_t session_end_marker_shift_samples = session_end_shift * _nominal_frame_rate;
4417
4418         if (_session_range_location == 0) {
4419
4420                 set_session_range_location (a, b + session_end_marker_shift_samples);
4421
4422         } else {
4423
4424                 if (a < _session_range_location->start()) {
4425                         _session_range_location->set_start (a);
4426                 }
4427
4428                 if (_session_range_end_is_free && (b > _session_range_location->end())) {
4429                         _session_range_location->set_end (b);
4430                 }
4431         }
4432 }
4433
4434 void
4435 Session::set_end_is_free (bool yn)
4436 {
4437         _session_range_end_is_free = yn;
4438 }
4439
4440 void
4441 Session::playlist_ranges_moved (list<Evoral::RangeMove<framepos_t> > const & ranges)
4442 {
4443         for (list<Evoral::RangeMove<framepos_t> >::const_iterator i = ranges.begin(); i != ranges.end(); ++i) {
4444                 maybe_update_session_range (i->to, i->to + i->length);
4445         }
4446 }
4447
4448 void
4449 Session::playlist_regions_extended (list<Evoral::Range<framepos_t> > const & ranges)
4450 {
4451         for (list<Evoral::Range<framepos_t> >::const_iterator i = ranges.begin(); i != ranges.end(); ++i) {
4452                 maybe_update_session_range (i->from, i->to);
4453         }
4454 }
4455
4456 /* Region management */
4457
4458 boost::shared_ptr<Region>
4459 Session::find_whole_file_parent (boost::shared_ptr<Region const> child) const
4460 {
4461         const RegionFactory::RegionMap& regions (RegionFactory::regions());
4462         RegionFactory::RegionMap::const_iterator i;
4463         boost::shared_ptr<Region> region;
4464
4465         Glib::Threads::Mutex::Lock lm (region_lock);
4466
4467         for (i = regions.begin(); i != regions.end(); ++i) {
4468
4469                 region = i->second;
4470
4471                 if (region->whole_file()) {
4472
4473                         if (child->source_equivalent (region)) {
4474                                 return region;
4475                         }
4476                 }
4477         }
4478
4479         return boost::shared_ptr<Region> ();
4480 }
4481
4482 int
4483 Session::destroy_sources (list<boost::shared_ptr<Source> > srcs)
4484 {
4485         set<boost::shared_ptr<Region> > relevant_regions;
4486
4487         for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ++s) {
4488                 RegionFactory::get_regions_using_source (*s, relevant_regions);
4489         }
4490
4491         for (set<boost::shared_ptr<Region> >::iterator r = relevant_regions.begin(); r != relevant_regions.end(); ) {
4492                 set<boost::shared_ptr<Region> >::iterator tmp;
4493
4494                 tmp = r;
4495                 ++tmp;
4496
4497                 playlists->destroy_region (*r);
4498                 RegionFactory::map_remove (*r);
4499
4500                 (*r)->drop_sources ();
4501                 (*r)->drop_references ();
4502
4503                 relevant_regions.erase (r);
4504
4505                 r = tmp;
4506         }
4507
4508         for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ) {
4509
4510                 {
4511                         Glib::Threads::Mutex::Lock ls (source_lock);
4512                         /* remove from the main source list */
4513                         sources.erase ((*s)->id());
4514                 }
4515
4516                 (*s)->mark_for_remove ();
4517                 (*s)->drop_references ();
4518
4519                 s = srcs.erase (s);
4520         }
4521
4522         return 0;
4523 }
4524
4525 int
4526 Session::remove_last_capture ()
4527 {
4528         list<boost::shared_ptr<Source> > srcs;
4529
4530         boost::shared_ptr<RouteList> rl = routes.reader ();
4531         for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
4532                 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4533                 if (!tr) {
4534                         continue;
4535                 }
4536
4537                 list<boost::shared_ptr<Source> >& l = tr->last_capture_sources();
4538
4539                 if (!l.empty()) {
4540                         srcs.insert (srcs.end(), l.begin(), l.end());
4541                         l.clear ();
4542                 }
4543         }
4544
4545         destroy_sources (srcs);
4546
4547         save_state (_current_snapshot_name);
4548
4549         return 0;
4550 }
4551
4552 /* Source Management */
4553
4554 void
4555 Session::add_source (boost::shared_ptr<Source> source)
4556 {
4557         pair<SourceMap::key_type, SourceMap::mapped_type> entry;
4558         pair<SourceMap::iterator,bool> result;
4559
4560         entry.first = source->id();
4561         entry.second = source;
4562
4563         {
4564                 Glib::Threads::Mutex::Lock lm (source_lock);
4565                 result = sources.insert (entry);
4566         }
4567
4568         if (result.second) {
4569
4570                 /* yay, new source */
4571
4572                 boost::shared_ptr<FileSource> fs = boost::dynamic_pointer_cast<FileSource> (source);
4573
4574                 if (fs) {
4575                         if (!fs->within_session()) {
4576                                 ensure_search_path_includes (Glib::path_get_dirname (fs->path()), fs->type());
4577                         }
4578                 }
4579
4580                 set_dirty();
4581
4582                 boost::shared_ptr<AudioFileSource> afs;
4583
4584                 if ((afs = boost::dynamic_pointer_cast<AudioFileSource>(source)) != 0) {
4585                         if (Config->get_auto_analyse_audio()) {
4586                                 Analyser::queue_source_for_analysis (source, false);
4587                         }
4588                 }
4589
4590                 source->DropReferences.connect_same_thread (*this, boost::bind (&Session::remove_source, this, boost::weak_ptr<Source> (source)));
4591         }
4592 }
4593
4594 void
4595 Session::remove_source (boost::weak_ptr<Source> src)
4596 {
4597         if (_state_of_the_state & Deletion) {
4598                 return;
4599         }
4600
4601         SourceMap::iterator i;
4602         boost::shared_ptr<Source> source = src.lock();
4603
4604         if (!source) {
4605                 return;
4606         }
4607
4608         {
4609                 Glib::Threads::Mutex::Lock lm (source_lock);
4610
4611                 if ((i = sources.find (source->id())) != sources.end()) {
4612                         sources.erase (i);
4613                 }
4614         }
4615
4616         if (!(_state_of_the_state & StateOfTheState (InCleanup|Loading))) {
4617
4618                 /* save state so we don't end up with a session file
4619                    referring to non-existent sources.
4620                 */
4621
4622                 save_state (_current_snapshot_name);
4623         }
4624 }
4625
4626 boost::shared_ptr<Source>
4627 Session::source_by_id (const PBD::ID& id)
4628 {
4629         Glib::Threads::Mutex::Lock lm (source_lock);
4630         SourceMap::iterator i;
4631         boost::shared_ptr<Source> source;
4632
4633         if ((i = sources.find (id)) != sources.end()) {
4634                 source = i->second;
4635         }
4636
4637         return source;
4638 }
4639
4640 boost::shared_ptr<AudioFileSource>
4641 Session::audio_source_by_path_and_channel (const string& path, uint16_t chn) const
4642 {
4643         /* Restricted to audio files because only audio sources have channel
4644            as a property.
4645         */
4646
4647         Glib::Threads::Mutex::Lock lm (source_lock);
4648
4649         for (SourceMap::const_iterator i = sources.begin(); i != sources.end(); ++i) {
4650                 boost::shared_ptr<AudioFileSource> afs
4651                         = boost::dynamic_pointer_cast<AudioFileSource>(i->second);
4652
4653                 if (afs && afs->path() == path && chn == afs->channel()) {
4654                         return afs;
4655                 }
4656         }
4657
4658         return boost::shared_ptr<AudioFileSource>();
4659 }
4660
4661 boost::shared_ptr<MidiSource>
4662 Session::midi_source_by_path (const std::string& path) const
4663 {
4664         /* Restricted to MIDI files because audio sources require a channel
4665            for unique identification, in addition to a path.
4666         */
4667
4668         Glib::Threads::Mutex::Lock lm (source_lock);
4669
4670         for (SourceMap::const_iterator s = sources.begin(); s != sources.end(); ++s) {
4671                 boost::shared_ptr<MidiSource> ms
4672                         = boost::dynamic_pointer_cast<MidiSource>(s->second);
4673                 boost::shared_ptr<FileSource> fs
4674                         = boost::dynamic_pointer_cast<FileSource>(s->second);
4675
4676                 if (ms && fs && fs->path() == path) {
4677                         return ms;
4678                 }
4679         }
4680
4681         return boost::shared_ptr<MidiSource>();
4682 }
4683
4684 uint32_t
4685 Session::count_sources_by_origin (const string& path)
4686 {
4687         uint32_t cnt = 0;
4688         Glib::Threads::Mutex::Lock lm (source_lock);
4689
4690         for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
4691                 boost::shared_ptr<FileSource> fs
4692                         = boost::dynamic_pointer_cast<FileSource>(i->second);
4693
4694                 if (fs && fs->origin() == path) {
4695                         ++cnt;
4696                 }
4697         }
4698
4699         return cnt;
4700 }
4701
4702 static string
4703 peak_file_helper (const string& peak_path, const string& file_path, const string& file_base, bool hash) {
4704         if (hash) {
4705                 std::string checksum = Glib::Checksum::compute_checksum(Glib::Checksum::CHECKSUM_SHA1, file_path + G_DIR_SEPARATOR + file_base);
4706                 return Glib::build_filename (peak_path, checksum + peakfile_suffix);
4707         } else {
4708                 return Glib::build_filename (peak_path, file_base + peakfile_suffix);
4709         }
4710 }
4711
4712 string
4713 Session::construct_peak_filepath (const string& filepath, const bool in_session, const bool old_peak_name) const
4714 {
4715         string interchange_dir_string = string (interchange_dir_name) + G_DIR_SEPARATOR;
4716
4717         if (Glib::path_is_absolute (filepath)) {
4718
4719                 /* rip the session dir from the audiofile source */
4720
4721                 string session_path;
4722                 bool in_another_session = true;
4723
4724                 if (filepath.find (interchange_dir_string) != string::npos) {
4725
4726                         session_path = Glib::path_get_dirname (filepath); /* now ends in audiofiles */
4727                         session_path = Glib::path_get_dirname (session_path); /* now ends in session name */
4728                         session_path = Glib::path_get_dirname (session_path); /* now ends in interchange */
4729                         session_path = Glib::path_get_dirname (session_path); /* now has session path */
4730
4731                         /* see if it is within our session */
4732
4733                         for (vector<space_and_path>::const_iterator i = session_dirs.begin(); i != session_dirs.end(); ++i) {
4734                                 if (i->path == session_path) {
4735                                         in_another_session = false;
4736                                         break;
4737                                 }
4738                         }
4739                 } else {
4740                         in_another_session = false;
4741                 }
4742
4743
4744                 if (in_another_session) {
4745                         SessionDirectory sd (session_path);
4746                         return peak_file_helper (sd.peak_path(), "", Glib::path_get_basename (filepath), !old_peak_name);
4747                 }
4748         }
4749
4750         /* 1) if file belongs to this session
4751          * it may be a relative path (interchange/...)
4752          * or just basename (session_state, remove source)
4753          * -> just use the basename
4754          */
4755         std::string filename = Glib::path_get_basename (filepath);
4756         std::string path;
4757
4758         /* 2) if the file is outside our session dir:
4759          * (imported but not copied) add the path for check-summming */
4760         if (!in_session) {
4761                 path = Glib::path_get_dirname (filepath);
4762         }
4763
4764         return peak_file_helper (_session_dir->peak_path(), path, Glib::path_get_basename (filepath), !old_peak_name);
4765 }
4766
4767 string
4768 Session::new_audio_source_path_for_embedded (const std::string& path)
4769 {
4770         /* embedded source:
4771          *
4772          * we know that the filename is already unique because it exists
4773          * out in the filesystem.
4774          *
4775          * However, when we bring it into the session, we could get a
4776          * collision.
4777          *
4778          * Eg. two embedded files:
4779          *
4780          *          /foo/bar/baz.wav
4781          *          /frob/nic/baz.wav
4782          *
4783          * When merged into session, these collide.
4784          *
4785          * There will not be a conflict with in-memory sources
4786          * because when the source was created we already picked
4787          * a unique name for it.
4788          *
4789          * This collision is not likely to be common, but we have to guard
4790          * against it.  So, if there is a collision, take the md5 hash of the
4791          * the path, and use that as the filename instead.
4792          */
4793
4794         SessionDirectory sdir (get_best_session_directory_for_new_audio());
4795         string base = Glib::path_get_basename (path);
4796         string newpath = Glib::build_filename (sdir.sound_path(), base);
4797
4798         if (Glib::file_test (newpath, Glib::FILE_TEST_EXISTS)) {
4799
4800                 MD5 md5;
4801
4802                 md5.digestString (path.c_str());
4803                 md5.writeToString ();
4804                 base = md5.digestChars;
4805
4806                 string ext = get_suffix (path);
4807
4808                 if (!ext.empty()) {
4809                         base += '.';
4810                         base += ext;
4811                 }
4812
4813                 newpath = Glib::build_filename (sdir.sound_path(), base);
4814
4815                 /* if this collides, we're screwed */
4816
4817                 if (Glib::file_test (newpath, Glib::FILE_TEST_EXISTS)) {
4818                         error << string_compose (_("Merging embedded file %1: name collision AND md5 hash collision!"), path) << endmsg;
4819                         return string();
4820                 }
4821
4822         }
4823
4824         return newpath;
4825 }
4826
4827 /** Return true if there are no audio file sources that use @param name as
4828  * the filename component of their path.
4829  *
4830  * Return false otherwise.
4831  *
4832  * This method MUST ONLY be used to check in-session, mono files since it
4833  * hard-codes the channel of the audio file source we are looking for as zero.
4834  *
4835  * If/when Ardour supports native files in non-mono formats, the logic here
4836  * will need to be revisited.
4837  */
4838 bool
4839 Session::audio_source_name_is_unique (const string& name)
4840 {
4841         std::vector<string> sdirs = source_search_path (DataType::AUDIO);
4842         vector<space_and_path>::iterator i;
4843         uint32_t existing = 0;
4844
4845         for (vector<string>::const_iterator i = sdirs.begin(); i != sdirs.end(); ++i) {
4846
4847                 /* note that we search *without* the extension so that
4848                    we don't end up both "Audio 1-1.wav" and "Audio 1-1.caf"
4849                    in the event that this new name is required for
4850                    a file format change.
4851                 */
4852
4853                 const string spath = *i;
4854
4855                 if (matching_unsuffixed_filename_exists_in (spath, name)) {
4856                         existing++;
4857                         break;
4858                 }
4859
4860                 /* it is possible that we have the path already
4861                  * assigned to a source that has not yet been written
4862                  * (ie. the write source for a diskstream). we have to
4863                  * check this in order to make sure that our candidate
4864                  * path isn't used again, because that can lead to
4865                  * two Sources point to the same file with different
4866                  * notions of their removability.
4867                  */
4868
4869
4870                 string possible_path = Glib::build_filename (spath, name);
4871
4872                 if (audio_source_by_path_and_channel (possible_path, 0)) {
4873                         existing++;
4874                         break;
4875                 }
4876         }
4877
4878         return (existing == 0);
4879 }
4880
4881 string
4882 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)
4883 {
4884         ostringstream sstr;
4885         const string ext = native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
4886
4887         if (Profile->get_trx() && destructive) {
4888                 sstr << 'T';
4889                 sstr << setfill ('0') << setw (4) << cnt;
4890                 sstr << legalized_base;
4891         } else {
4892                 sstr << legalized_base;
4893
4894                 if (take_required || related_exists) {
4895                         sstr << '-';
4896                         sstr << cnt;
4897                 }
4898         }
4899
4900         if (nchan == 2) {
4901                 if (chan == 0) {
4902                         sstr << "%L";
4903                 } else {
4904                         sstr << "%R";
4905                 }
4906         } else if (nchan > 2) {
4907                 if (nchan < 26) {
4908                         sstr << '%';
4909                         sstr << 'a' + chan;
4910                 } else {
4911                         /* XXX what? more than 26 channels! */
4912                         sstr << '%';
4913                         sstr << chan+1;
4914                 }
4915         }
4916
4917         sstr << ext;
4918
4919         return sstr.str();
4920 }
4921
4922 /** Return a unique name based on \a base for a new internal audio source */
4923 string
4924 Session::new_audio_source_path (const string& base, uint32_t nchan, uint32_t chan, bool destructive, bool take_required)
4925 {
4926         uint32_t cnt;
4927         string possible_name;
4928         const uint32_t limit = 9999; // arbitrary limit on number of files with the same basic name
4929         string legalized;
4930         bool some_related_source_name_exists = false;
4931
4932         legalized = legalize_for_path (base);
4933
4934         // Find a "version" of the base name that doesn't exist in any of the possible directories.
4935
4936         for (cnt = (destructive ? ++destructive_index : 1); cnt <= limit; ++cnt) {
4937
4938                 possible_name = format_audio_source_name (legalized, nchan, chan, destructive, take_required, cnt, some_related_source_name_exists);
4939
4940                 if (audio_source_name_is_unique (possible_name)) {
4941                         break;
4942                 }
4943
4944                 some_related_source_name_exists = true;
4945
4946                 if (cnt > limit) {
4947                         error << string_compose(
4948                                         _("There are already %1 recordings for %2, which I consider too many."),
4949                                         limit, base) << endmsg;
4950                         destroy ();
4951                         throw failed_constructor();
4952                 }
4953         }
4954
4955         /* We've established that the new name does not exist in any session
4956          * directory, so now find out which one we should use for this new
4957          * audio source.
4958          */
4959
4960         SessionDirectory sdir (get_best_session_directory_for_new_audio());
4961
4962         std::string s = Glib::build_filename (sdir.sound_path(), possible_name);
4963
4964         return s;
4965 }
4966
4967 /** Return a unique name based on `base` for a new internal MIDI source */
4968 string
4969 Session::new_midi_source_path (const string& base)
4970 {
4971         uint32_t cnt;
4972         char buf[PATH_MAX+1];
4973         const uint32_t limit = 10000;
4974         string legalized;
4975         string possible_path;
4976         string possible_name;
4977
4978         buf[0] = '\0';
4979         legalized = legalize_for_path (base);
4980
4981         // Find a "version" of the file name that doesn't exist in any of the possible directories.
4982         std::vector<string> sdirs = source_search_path(DataType::MIDI);
4983
4984         /* - the main session folder is the first in the vector.
4985          * - after checking all locations for file-name uniqueness,
4986          *   we keep the one from the last iteration as new file name
4987          * - midi files are small and should just be kept in the main session-folder
4988          *
4989          * -> reverse the array, check main session folder last and use that as location
4990          *    for MIDI files.
4991          */
4992         std::reverse(sdirs.begin(), sdirs.end());
4993
4994         for (cnt = 1; cnt <= limit; ++cnt) {
4995
4996                 vector<space_and_path>::iterator i;
4997                 uint32_t existing = 0;
4998
4999                 for (vector<string>::const_iterator i = sdirs.begin(); i != sdirs.end(); ++i) {
5000
5001                         snprintf (buf, sizeof(buf), "%s-%u.mid", legalized.c_str(), cnt);
5002                         possible_name = buf;
5003
5004                         possible_path = Glib::build_filename (*i, possible_name);
5005
5006                         if (Glib::file_test (possible_path, Glib::FILE_TEST_EXISTS)) {
5007                                 existing++;
5008                         }
5009
5010                         if (midi_source_by_path (possible_path)) {
5011                                 existing++;
5012                         }
5013                 }
5014
5015                 if (existing == 0) {
5016                         break;
5017                 }
5018
5019                 if (cnt > limit) {
5020                         error << string_compose(
5021                                         _("There are already %1 recordings for %2, which I consider too many."),
5022                                         limit, base) << endmsg;
5023                         destroy ();
5024                         return 0;
5025                 }
5026         }
5027
5028         /* No need to "find best location" for software/app-based RAID, because
5029            MIDI is so small that we always put it in the same place.
5030         */
5031
5032         return possible_path;
5033 }
5034
5035
5036 /** Create a new within-session audio source */
5037 boost::shared_ptr<AudioFileSource>
5038 Session::create_audio_source_for_session (size_t n_chans, string const & base, uint32_t chan, bool destructive)
5039 {
5040         const string path = new_audio_source_path (base, n_chans, chan, destructive, true);
5041
5042         if (!path.empty()) {
5043                 return boost::dynamic_pointer_cast<AudioFileSource> (
5044                         SourceFactory::createWritable (DataType::AUDIO, *this, path, destructive, frame_rate(), true, true));
5045         } else {
5046                 throw failed_constructor ();
5047         }
5048 }
5049
5050 /** Create a new within-session MIDI source */
5051 boost::shared_ptr<MidiSource>
5052 Session::create_midi_source_for_session (string const & basic_name)
5053 {
5054         const string path = new_midi_source_path (basic_name);
5055
5056         if (!path.empty()) {
5057                 return boost::dynamic_pointer_cast<SMFSource> (
5058                         SourceFactory::createWritable (
5059                                 DataType::MIDI, *this, path, false, frame_rate()));
5060         } else {
5061                 throw failed_constructor ();
5062         }
5063 }
5064
5065 /** Create a new within-session MIDI source */
5066 boost::shared_ptr<MidiSource>
5067 Session::create_midi_source_by_stealing_name (boost::shared_ptr<Track> track)
5068 {
5069         /* the caller passes in the track the source will be used in,
5070            so that we can keep the numbering sane.
5071
5072            Rationale: a track with the name "Foo" that has had N
5073            captures carried out so far will ALREADY have a write source
5074            named "Foo-N+1.mid" waiting to be used for the next capture.
5075
5076            If we call new_midi_source_name() we will get "Foo-N+2". But
5077            there is no region corresponding to "Foo-N+1", so when
5078            "Foo-N+2" appears in the track, the gap presents the user
5079            with odd behaviour - why did it skip past Foo-N+1?
5080
5081            We could explain this to the user in some odd way, but
5082            instead we rename "Foo-N+1.mid" as "Foo-N+2.mid", and then
5083            use "Foo-N+1" here.
5084
5085            If that attempted rename fails, we get "Foo-N+2.mid" anyway.
5086         */
5087
5088         boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (track);
5089         assert (mt);
5090         std::string name = track->steal_write_source_name ();
5091
5092         if (name.empty()) {
5093                 return boost::shared_ptr<MidiSource>();
5094         }
5095
5096         /* MIDI files are small, just put them in the first location of the
5097            session source search path.
5098         */
5099
5100         const string path = Glib::build_filename (source_search_path (DataType::MIDI).front(), name);
5101
5102         return boost::dynamic_pointer_cast<SMFSource> (
5103                 SourceFactory::createWritable (
5104                         DataType::MIDI, *this, path, false, frame_rate()));
5105 }
5106
5107
5108 void
5109 Session::add_playlist (boost::shared_ptr<Playlist> playlist, bool unused)
5110 {
5111         if (playlist->hidden()) {
5112                 return;
5113         }
5114
5115         playlists->add (playlist);
5116
5117         if (unused) {
5118                 playlist->release();
5119         }
5120
5121         set_dirty();
5122 }
5123
5124 void
5125 Session::remove_playlist (boost::weak_ptr<Playlist> weak_playlist)
5126 {
5127         if (_state_of_the_state & Deletion) {
5128                 return;
5129         }
5130
5131         boost::shared_ptr<Playlist> playlist (weak_playlist.lock());
5132
5133         if (!playlist) {
5134                 return;
5135         }
5136
5137         playlists->remove (playlist);
5138
5139         set_dirty();
5140 }
5141
5142 void
5143 Session::set_audition (boost::shared_ptr<Region> r)
5144 {
5145         pending_audition_region = r;
5146         add_post_transport_work (PostTransportAudition);
5147         _butler->schedule_transport_work ();
5148 }
5149
5150 void
5151 Session::audition_playlist ()
5152 {
5153         SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
5154         ev->region.reset ();
5155         queue_event (ev);
5156 }
5157
5158
5159 void
5160 Session::register_lua_function (
5161                 const std::string& name,
5162                 const std::string& script,
5163                 const LuaScriptParamList& args
5164                 )
5165 {
5166         Glib::Threads::Mutex::Lock lm (lua_lock);
5167
5168         lua_State* L = lua.getState();
5169
5170         const std::string& bytecode = LuaScripting::get_factory_bytecode (script);
5171         luabridge::LuaRef tbl_arg (luabridge::newTable(L));
5172         for (LuaScriptParamList::const_iterator i = args.begin(); i != args.end(); ++i) {
5173                 if ((*i)->optional && !(*i)->is_set) { continue; }
5174                 tbl_arg[(*i)->name] = (*i)->value;
5175         }
5176         (*_lua_add)(name, bytecode, tbl_arg); // throws luabridge::LuaException
5177         set_dirty();
5178 }
5179
5180 void
5181 Session::unregister_lua_function (const std::string& name)
5182 {
5183         Glib::Threads::Mutex::Lock lm (lua_lock);
5184         (*_lua_del)(name); // throws luabridge::LuaException
5185         lua.collect_garbage ();
5186         set_dirty();
5187 }
5188
5189 std::vector<std::string>
5190 Session::registered_lua_functions ()
5191 {
5192         Glib::Threads::Mutex::Lock lm (lua_lock);
5193         std::vector<std::string> rv;
5194
5195         try {
5196                 luabridge::LuaRef list ((*_lua_list)());
5197                 for (luabridge::Iterator i (list); !i.isNil (); ++i) {
5198                         if (!i.key ().isString ()) { assert(0); continue; }
5199                         rv.push_back (i.key ().cast<std::string> ());
5200                 }
5201         } catch (luabridge::LuaException const& e) { }
5202         return rv;
5203 }
5204
5205 #ifndef NDEBUG
5206 static void _lua_print (std::string s) {
5207         std::cout << "SessionLua: " << s << "\n";
5208 }
5209 #endif
5210
5211 void
5212 Session::try_run_lua (pframes_t nframes)
5213 {
5214         if (_n_lua_scripts == 0) return;
5215         Glib::Threads::Mutex::Lock tm (lua_lock, Glib::Threads::TRY_LOCK);
5216         if (tm.locked ()) {
5217                 try { (*_lua_run)(nframes); } catch (luabridge::LuaException const& e) { }
5218                 lua.collect_garbage_step ();
5219         }
5220 }
5221
5222 void
5223 Session::setup_lua ()
5224 {
5225 #ifndef NDEBUG
5226         lua.Print.connect (&_lua_print);
5227 #endif
5228         lua.tweak_rt_gc ();
5229         lua.do_command (
5230                         "function ArdourSession ()"
5231                         "  local self = { scripts = {}, instances = {} }"
5232                         ""
5233                         "  local remove = function (n)"
5234                         "   self.scripts[n] = nil"
5235                         "   self.instances[n] = nil"
5236                         "   Session:scripts_changed()" // call back
5237                         "  end"
5238                         ""
5239                         "  local addinternal = function (n, f, a)"
5240                         "   assert(type(n) == 'string', 'function-name must be string')"
5241                         "   assert(type(f) == 'function', 'Given script is a not a function')"
5242                         "   assert(type(a) == 'table' or type(a) == 'nil', 'Given argument is invalid')"
5243                         "   assert(self.scripts[n] == nil, 'Callback \"'.. n ..'\" already exists.')"
5244                         "   self.scripts[n] = { ['f'] = f, ['a'] = a }"
5245                         "   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"
5246                         "   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 }"
5247                         "   self.instances[n] = load (string.dump(f, true), nil, nil, env)(a)"
5248                         "   Session:scripts_changed()" // call back
5249                         "  end"
5250                         ""
5251                         "  local add = function (n, b, a)"
5252                         "   assert(type(b) == 'string', 'ByteCode must be string')"
5253                         "   load (b)()" // assigns f
5254                         "   assert(type(f) == 'string', 'Assigned ByteCode must be string')"
5255                         "   addinternal (n, load(f), a)"
5256                         "  end"
5257                         ""
5258                         "  local run = function (...)"
5259                         "   for n, s in pairs (self.instances) do"
5260                         "     local status, err = pcall (s, ...)"
5261                         "     if not status then"
5262                         "       print ('fn \"'.. n .. '\": ', err)"
5263                         "       remove (n)"
5264                         "      end"
5265                         "   end"
5266                         "   collectgarbage()"
5267                         "  end"
5268                         ""
5269                         "  local cleanup = function ()"
5270                         "   self.scripts = nil"
5271                         "   self.instances = nil"
5272                         "  end"
5273                         ""
5274                         "  local list = function ()"
5275                         "   local rv = {}"
5276                         "   for n, _ in pairs (self.scripts) do"
5277                         "     rv[n] = true"
5278                         "   end"
5279                         "   return rv"
5280                         "  end"
5281                         ""
5282                         "  local function basic_serialize (o)"
5283                         "    if type(o) == \"number\" then"
5284                         "     return tostring(o)"
5285                         "    else"
5286                         "     return string.format(\"%q\", o)"
5287                         "    end"
5288                         "  end"
5289                         ""
5290                         "  local function serialize (name, value)"
5291                         "   local rv = name .. ' = '"
5292                         "   collectgarbage()"
5293                         "   if type(value) == \"number\" or type(value) == \"string\" or type(value) == \"nil\" then"
5294                         "    return rv .. basic_serialize(value) .. ' '"
5295                         "   elseif type(value) == \"table\" then"
5296                         "    rv = rv .. '{} '"
5297                         "    for k,v in pairs(value) do"
5298                         "     local fieldname = string.format(\"%s[%s]\", name, basic_serialize(k))"
5299                         "     rv = rv .. serialize(fieldname, v) .. ' '"
5300                         "     collectgarbage()" // string concatenation allocates a new string :(
5301                         "    end"
5302                         "    return rv;"
5303                         "   elseif type(value) == \"function\" then"
5304                         "     return rv .. string.format(\"%q\", string.dump(value, true))"
5305                         "   else"
5306                         "    error('cannot save a ' .. type(value))"
5307                         "   end"
5308                         "  end"
5309                         ""
5310                         ""
5311                         "  local save = function ()"
5312                         "   return (serialize('scripts', self.scripts))"
5313                         "  end"
5314                         ""
5315                         "  local restore = function (state)"
5316                         "   self.scripts = {}"
5317                         "   load (state)()"
5318                         "   for n, s in pairs (scripts) do"
5319                         "    addinternal (n, load(s['f']), s['a'])"
5320                         "   end"
5321                         "  end"
5322                         ""
5323                         " return { run = run, add = add, remove = remove,"
5324                   "          list = list, restore = restore, save = save, cleanup = cleanup}"
5325                         " end"
5326                         " "
5327                         " sess = ArdourSession ()"
5328                         " ArdourSession = nil"
5329                         " "
5330                         "function ardour () end"
5331                         );
5332
5333         lua_State* L = lua.getState();
5334
5335         try {
5336                 luabridge::LuaRef lua_sess = luabridge::getGlobal (L, "sess");
5337                 lua.do_command ("sess = nil"); // hide it.
5338                 lua.do_command ("collectgarbage()");
5339
5340                 _lua_run = new luabridge::LuaRef(lua_sess["run"]);
5341                 _lua_add = new luabridge::LuaRef(lua_sess["add"]);
5342                 _lua_del = new luabridge::LuaRef(lua_sess["remove"]);
5343                 _lua_list = new luabridge::LuaRef(lua_sess["list"]);
5344                 _lua_save = new luabridge::LuaRef(lua_sess["save"]);
5345                 _lua_load = new luabridge::LuaRef(lua_sess["restore"]);
5346                 _lua_cleanup = new luabridge::LuaRef(lua_sess["cleanup"]);
5347         } catch (luabridge::LuaException const& e) {
5348                 fatal << string_compose (_("programming error: %1"),
5349                                 X_("Failed to setup Lua interpreter"))
5350                         << endmsg;
5351                 abort(); /*NOTREACHED*/
5352         }
5353
5354         LuaBindings::stddef (L);
5355         LuaBindings::common (L);
5356         LuaBindings::dsp (L);
5357         luabridge::push <Session *> (L, this);
5358         lua_setglobal (L, "Session");
5359 }
5360
5361 void
5362 Session::scripts_changed ()
5363 {
5364         assert (!lua_lock.trylock()); // must hold lua_lock
5365
5366         try {
5367                 luabridge::LuaRef list ((*_lua_list)());
5368                 int cnt = 0;
5369                 for (luabridge::Iterator i (list); !i.isNil (); ++i) {
5370                         if (!i.key ().isString ()) { assert(0); continue; }
5371                         ++cnt;
5372                 }
5373                 _n_lua_scripts = cnt;
5374         } catch (luabridge::LuaException const& e) {
5375                 fatal << string_compose (_("programming error: %1"),
5376                                 X_("Indexing Lua Session Scripts failed."))
5377                         << endmsg;
5378                 abort(); /*NOTREACHED*/
5379         }
5380 }
5381
5382 void
5383 Session::non_realtime_set_audition ()
5384 {
5385         assert (pending_audition_region);
5386         auditioner->audition_region (pending_audition_region);
5387         pending_audition_region.reset ();
5388         AuditionActive (true); /* EMIT SIGNAL */
5389 }
5390
5391 void
5392 Session::audition_region (boost::shared_ptr<Region> r)
5393 {
5394         SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
5395         ev->region = r;
5396         queue_event (ev);
5397 }
5398
5399 void
5400 Session::cancel_audition ()
5401 {
5402         if (!auditioner) {
5403                 return;
5404         }
5405         if (auditioner->auditioning()) {
5406                 auditioner->cancel_audition ();
5407                 AuditionActive (false); /* EMIT SIGNAL */
5408         }
5409 }
5410
5411 bool
5412 Session::RoutePublicOrderSorter::operator() (boost::shared_ptr<Route> a, boost::shared_ptr<Route> b)
5413 {
5414         if (a->is_monitor()) {
5415                 return true;
5416         }
5417         if (b->is_monitor()) {
5418                 return false;
5419         }
5420         return a->presentation_info().order() < b->presentation_info().order();
5421 }
5422
5423 bool
5424 Session::is_auditioning () const
5425 {
5426         /* can be called before we have an auditioner object */
5427         if (auditioner) {
5428                 return auditioner->auditioning();
5429         } else {
5430                 return false;
5431         }
5432 }
5433
5434 void
5435 Session::graph_reordered ()
5436 {
5437         /* don't do this stuff if we are setting up connections
5438            from a set_state() call or creating new tracks. Ditto for deletion.
5439         */
5440
5441         if ((_state_of_the_state & (InitialConnecting|Deletion)) || _adding_routes_in_progress || _reconnecting_routes_in_progress || _route_deletion_in_progress) {
5442                 return;
5443         }
5444
5445         /* every track/bus asked for this to be handled but it was deferred because
5446            we were connecting. do it now.
5447         */
5448
5449         request_input_change_handling ();
5450
5451         resort_routes ();
5452
5453         /* force all diskstreams to update their capture offset values to
5454            reflect any changes in latencies within the graph.
5455         */
5456
5457         boost::shared_ptr<RouteList> rl = routes.reader ();
5458         for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
5459                 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
5460                 if (tr) {
5461                         tr->set_capture_offset ();
5462                 }
5463         }
5464 }
5465
5466 /** @return Number of frames that there is disk space available to write,
5467  *  if known.
5468  */
5469 boost::optional<framecnt_t>
5470 Session::available_capture_duration ()
5471 {
5472         Glib::Threads::Mutex::Lock lm (space_lock);
5473
5474         if (_total_free_4k_blocks_uncertain) {
5475                 return boost::optional<framecnt_t> ();
5476         }
5477
5478         float sample_bytes_on_disk = 4.0; // keep gcc happy
5479
5480         switch (config.get_native_file_data_format()) {
5481         case FormatFloat:
5482                 sample_bytes_on_disk = 4.0;
5483                 break;
5484
5485         case FormatInt24:
5486                 sample_bytes_on_disk = 3.0;
5487                 break;
5488
5489         case FormatInt16:
5490                 sample_bytes_on_disk = 2.0;
5491                 break;
5492
5493         default:
5494                 /* impossible, but keep some gcc versions happy */
5495                 fatal << string_compose (_("programming error: %1"),
5496                                          X_("illegal native file data format"))
5497                       << endmsg;
5498                 abort(); /*NOTREACHED*/
5499         }
5500
5501         double scale = 4096.0 / sample_bytes_on_disk;
5502
5503         if (_total_free_4k_blocks * scale > (double) max_framecnt) {
5504                 return max_framecnt;
5505         }
5506
5507         return (framecnt_t) floor (_total_free_4k_blocks * scale);
5508 }
5509
5510 void
5511 Session::add_bundle (boost::shared_ptr<Bundle> bundle, bool emit_signal)
5512 {
5513         {
5514                 RCUWriter<BundleList> writer (_bundles);
5515                 boost::shared_ptr<BundleList> b = writer.get_copy ();
5516                 b->push_back (bundle);
5517         }
5518
5519         if (emit_signal) {
5520                 BundleAddedOrRemoved (); /* EMIT SIGNAL */
5521         }
5522
5523         set_dirty();
5524 }
5525
5526 void
5527 Session::remove_bundle (boost::shared_ptr<Bundle> bundle)
5528 {
5529         bool removed = false;
5530
5531         {
5532                 RCUWriter<BundleList> writer (_bundles);
5533                 boost::shared_ptr<BundleList> b = writer.get_copy ();
5534                 BundleList::iterator i = find (b->begin(), b->end(), bundle);
5535
5536                 if (i != b->end()) {
5537                         b->erase (i);
5538                         removed = true;
5539                 }
5540         }
5541
5542         if (removed) {
5543                  BundleAddedOrRemoved (); /* EMIT SIGNAL */
5544         }
5545
5546         set_dirty();
5547 }
5548
5549 boost::shared_ptr<Bundle>
5550 Session::bundle_by_name (string name) const
5551 {
5552         boost::shared_ptr<BundleList> b = _bundles.reader ();
5553
5554         for (BundleList::const_iterator i = b->begin(); i != b->end(); ++i) {
5555                 if ((*i)->name() == name) {
5556                         return* i;
5557                 }
5558         }
5559
5560         return boost::shared_ptr<Bundle> ();
5561 }
5562
5563 void
5564 Session::tempo_map_changed (const PropertyChange&)
5565 {
5566         clear_clicks ();
5567
5568         playlists->update_after_tempo_map_change ();
5569
5570         _locations->apply (*this, &Session::update_locations_after_tempo_map_change);
5571
5572         set_dirty ();
5573 }
5574
5575 void
5576 Session::gui_tempo_map_changed ()
5577 {
5578         clear_clicks ();
5579
5580         playlists->update_after_tempo_map_change ();
5581
5582         _locations->apply (*this, &Session::update_locations_after_tempo_map_change);
5583 }
5584
5585 void
5586 Session::update_locations_after_tempo_map_change (const Locations::LocationList& loc)
5587 {
5588         for (Locations::LocationList::const_iterator i = loc.begin(); i != loc.end(); ++i) {
5589                 (*i)->recompute_frames_from_bbt ();
5590         }
5591 }
5592
5593 /** Ensures that all buffers (scratch, send, silent, etc) are allocated for
5594  * the given count with the current block size.
5595  */
5596 void
5597 Session::ensure_buffers (ChanCount howmany)
5598 {
5599         BufferManager::ensure_buffers (howmany, bounce_processing() ? bounce_chunk_size : 0);
5600 }
5601
5602 void
5603 Session::ensure_buffer_set(BufferSet& buffers, const ChanCount& count)
5604 {
5605         for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
5606                 buffers.ensure_buffers(*t, count.get(*t), _engine.raw_buffer_size(*t));
5607         }
5608 }
5609
5610 uint32_t
5611 Session::next_insert_id ()
5612 {
5613         /* this doesn't really loop forever. just think about it */
5614
5615         while (true) {
5616                 for (boost::dynamic_bitset<uint32_t>::size_type n = 1; n < insert_bitset.size(); ++n) {
5617                         if (!insert_bitset[n]) {
5618                                 insert_bitset[n] = true;
5619                                 return n;
5620
5621                         }
5622                 }
5623
5624                 /* none available, so resize and try again */
5625
5626                 insert_bitset.resize (insert_bitset.size() + 16, false);
5627         }
5628 }
5629
5630 uint32_t
5631 Session::next_send_id ()
5632 {
5633         /* this doesn't really loop forever. just think about it */
5634
5635         while (true) {
5636                 for (boost::dynamic_bitset<uint32_t>::size_type n = 1; n < send_bitset.size(); ++n) {
5637                         if (!send_bitset[n]) {
5638                                 send_bitset[n] = true;
5639                                 return n;
5640
5641                         }
5642                 }
5643
5644                 /* none available, so resize and try again */
5645
5646                 send_bitset.resize (send_bitset.size() + 16, false);
5647         }
5648 }
5649
5650 uint32_t
5651 Session::next_aux_send_id ()
5652 {
5653         /* this doesn't really loop forever. just think about it */
5654
5655         while (true) {
5656                 for (boost::dynamic_bitset<uint32_t>::size_type n = 1; n < aux_send_bitset.size(); ++n) {
5657                         if (!aux_send_bitset[n]) {
5658                                 aux_send_bitset[n] = true;
5659                                 return n;
5660
5661                         }
5662                 }
5663
5664                 /* none available, so resize and try again */
5665
5666                 aux_send_bitset.resize (aux_send_bitset.size() + 16, false);
5667         }
5668 }
5669
5670 uint32_t
5671 Session::next_return_id ()
5672 {
5673         /* this doesn't really loop forever. just think about it */
5674
5675         while (true) {
5676                 for (boost::dynamic_bitset<uint32_t>::size_type n = 1; n < return_bitset.size(); ++n) {
5677                         if (!return_bitset[n]) {
5678                                 return_bitset[n] = true;
5679                                 return n;
5680
5681                         }
5682                 }
5683
5684                 /* none available, so resize and try again */
5685
5686                 return_bitset.resize (return_bitset.size() + 16, false);
5687         }
5688 }
5689
5690 void
5691 Session::mark_send_id (uint32_t id)
5692 {
5693         if (id >= send_bitset.size()) {
5694                 send_bitset.resize (id+16, false);
5695         }
5696         if (send_bitset[id]) {
5697                 warning << string_compose (_("send ID %1 appears to be in use already"), id) << endmsg;
5698         }
5699         send_bitset[id] = true;
5700 }
5701
5702 void
5703 Session::mark_aux_send_id (uint32_t id)
5704 {
5705         if (id >= aux_send_bitset.size()) {
5706                 aux_send_bitset.resize (id+16, false);
5707         }
5708         if (aux_send_bitset[id]) {
5709                 warning << string_compose (_("aux send ID %1 appears to be in use already"), id) << endmsg;
5710         }
5711         aux_send_bitset[id] = true;
5712 }
5713
5714 void
5715 Session::mark_return_id (uint32_t id)
5716 {
5717         if (id >= return_bitset.size()) {
5718                 return_bitset.resize (id+16, false);
5719         }
5720         if (return_bitset[id]) {
5721                 warning << string_compose (_("return ID %1 appears to be in use already"), id) << endmsg;
5722         }
5723         return_bitset[id] = true;
5724 }
5725
5726 void
5727 Session::mark_insert_id (uint32_t id)
5728 {
5729         if (id >= insert_bitset.size()) {
5730                 insert_bitset.resize (id+16, false);
5731         }
5732         if (insert_bitset[id]) {
5733                 warning << string_compose (_("insert ID %1 appears to be in use already"), id) << endmsg;
5734         }
5735         insert_bitset[id] = true;
5736 }
5737
5738 void
5739 Session::unmark_send_id (uint32_t id)
5740 {
5741         if (id < send_bitset.size()) {
5742                 send_bitset[id] = false;
5743         }
5744 }
5745
5746 void
5747 Session::unmark_aux_send_id (uint32_t id)
5748 {
5749         if (id < aux_send_bitset.size()) {
5750                 aux_send_bitset[id] = false;
5751         }
5752 }
5753
5754 void
5755 Session::unmark_return_id (uint32_t id)
5756 {
5757         if (_state_of_the_state & Deletion) { return; }
5758         if (id < return_bitset.size()) {
5759                 return_bitset[id] = false;
5760         }
5761 }
5762
5763 void
5764 Session::unmark_insert_id (uint32_t id)
5765 {
5766         if (id < insert_bitset.size()) {
5767                 insert_bitset[id] = false;
5768         }
5769 }
5770
5771 void
5772 Session::reset_native_file_format ()
5773 {
5774         boost::shared_ptr<RouteList> rl = routes.reader ();
5775
5776         for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
5777                 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
5778                 if (tr) {
5779                         /* don't save state as we do this, there's no point
5780                          */
5781                         _state_of_the_state = StateOfTheState (_state_of_the_state|InCleanup);
5782                         tr->reset_write_sources (false);
5783                         _state_of_the_state = StateOfTheState (_state_of_the_state & ~InCleanup);
5784                 }
5785         }
5786 }
5787
5788 bool
5789 Session::route_name_unique (string n) const
5790 {
5791         boost::shared_ptr<RouteList> r = routes.reader ();
5792
5793         for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
5794                 if ((*i)->name() == n) {
5795                         return false;
5796                 }
5797         }
5798
5799         return true;
5800 }
5801
5802 bool
5803 Session::route_name_internal (string n) const
5804 {
5805         if (auditioner && auditioner->name() == n) {
5806                 return true;
5807         }
5808
5809         if (_click_io && _click_io->name() == n) {
5810                 return true;
5811         }
5812
5813         return false;
5814 }
5815
5816 int
5817 Session::freeze_all (InterThreadInfo& itt)
5818 {
5819         boost::shared_ptr<RouteList> r = routes.reader ();
5820
5821         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5822
5823                 boost::shared_ptr<Track> t;
5824
5825                 if ((t = boost::dynamic_pointer_cast<Track>(*i)) != 0) {
5826                         /* XXX this is wrong because itt.progress will keep returning to zero at the start
5827                            of every track.
5828                         */
5829                         t->freeze_me (itt);
5830                 }
5831         }
5832
5833         return 0;
5834 }
5835
5836 boost::shared_ptr<Region>
5837 Session::write_one_track (Track& track, framepos_t start, framepos_t end,
5838                           bool /*overwrite*/, vector<boost::shared_ptr<Source> >& srcs,
5839                           InterThreadInfo& itt,
5840                           boost::shared_ptr<Processor> endpoint, bool include_endpoint,
5841                           bool for_export, bool for_freeze)
5842 {
5843         boost::shared_ptr<Region> result;
5844         boost::shared_ptr<Playlist> playlist;
5845         boost::shared_ptr<Source> source;
5846         ChanCount diskstream_channels (track.n_channels());
5847         framepos_t position;
5848         framecnt_t this_chunk;
5849         framepos_t to_do;
5850         framepos_t latency_skip;
5851         BufferSet buffers;
5852         framepos_t len = end - start;
5853         bool need_block_size_reset = false;
5854         ChanCount const max_proc = track.max_processor_streams ();
5855         string legal_playlist_name;
5856         string possible_path;
5857
5858         if (end <= start) {
5859                 error << string_compose (_("Cannot write a range where end <= start (e.g. %1 <= %2)"),
5860                                          end, start) << endmsg;
5861                 return result;
5862         }
5863
5864         diskstream_channels = track.bounce_get_output_streams (diskstream_channels, endpoint,
5865                         include_endpoint, for_export, for_freeze);
5866
5867         if (diskstream_channels.n(track.data_type()) < 1) {
5868                 error << _("Cannot write a range with no data.") << endmsg;
5869                 return result;
5870         }
5871
5872         // block all process callback handling
5873
5874         block_processing ();
5875
5876         {
5877                 // synchronize with AudioEngine::process_callback()
5878                 // make sure processing is not currently running
5879                 // and processing_blocked() is honored before
5880                 // acquiring thread buffers
5881                 Glib::Threads::Mutex::Lock lm (_engine.process_lock());
5882         }
5883
5884         _bounce_processing_active = true;
5885
5886         /* call tree *MUST* hold route_lock */
5887
5888         if ((playlist = track.playlist()) == 0) {
5889                 goto out;
5890         }
5891
5892         legal_playlist_name = legalize_for_path (playlist->name());
5893
5894         for (uint32_t chan_n = 0; chan_n < diskstream_channels.n(track.data_type()); ++chan_n) {
5895
5896                 string base_name = string_compose ("%1-%2-bounce", playlist->name(), chan_n);
5897                 string path = ((track.data_type() == DataType::AUDIO)
5898                                ? new_audio_source_path (legal_playlist_name, diskstream_channels.n_audio(), chan_n, false, true)
5899                                : new_midi_source_path (legal_playlist_name));
5900
5901                 if (path.empty()) {
5902                         goto out;
5903                 }
5904
5905                 try {
5906                         source = SourceFactory::createWritable (track.data_type(), *this, path, false, frame_rate());
5907                 }
5908
5909                 catch (failed_constructor& err) {
5910                         error << string_compose (_("cannot create new file \"%1\" for %2"), path, track.name()) << endmsg;
5911                         goto out;
5912                 }
5913
5914                 srcs.push_back (source);
5915         }
5916
5917         /* tell redirects that care that we are about to use a much larger
5918          * blocksize. this will flush all plugins too, so that they are ready
5919          * to be used for this process.
5920          */
5921
5922         need_block_size_reset = true;
5923         track.set_block_size (bounce_chunk_size);
5924         _engine.main_thread()->get_buffers ();
5925
5926         position = start;
5927         to_do = len;
5928         latency_skip = track.bounce_get_latency (endpoint, include_endpoint, for_export, for_freeze);
5929
5930         /* create a set of reasonably-sized buffers */
5931         for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
5932                 buffers.ensure_buffers(*t, max_proc.get(*t), bounce_chunk_size);
5933         }
5934         buffers.set_count (max_proc);
5935
5936         for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
5937                 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
5938                 boost::shared_ptr<MidiSource> ms;
5939                 if (afs) {
5940                         afs->prepare_for_peakfile_writes ();
5941                 } else if ((ms = boost::dynamic_pointer_cast<MidiSource>(*src))) {
5942                         Source::Lock lock(ms->mutex());
5943                         ms->mark_streaming_write_started(lock);
5944                 }
5945         }
5946
5947         while (to_do && !itt.cancel) {
5948
5949                 this_chunk = min (to_do, bounce_chunk_size);
5950
5951                 if (track.export_stuff (buffers, start, this_chunk, endpoint, include_endpoint, for_export, for_freeze)) {
5952                         goto out;
5953                 }
5954
5955                 start += this_chunk;
5956                 to_do -= this_chunk;
5957                 itt.progress = (float) (1.0 - ((double) to_do / len));
5958
5959                 if (latency_skip >= bounce_chunk_size) {
5960                         latency_skip -= bounce_chunk_size;
5961                         continue;
5962                 }
5963
5964                 const framecnt_t current_chunk = this_chunk - latency_skip;
5965
5966                 uint32_t n = 0;
5967                 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src, ++n) {
5968                         boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
5969                         boost::shared_ptr<MidiSource> ms;
5970
5971                         if (afs) {
5972                                 if (afs->write (buffers.get_audio(n).data(latency_skip), current_chunk) != current_chunk) {
5973                                         goto out;
5974                                 }
5975                         } else if ((ms = boost::dynamic_pointer_cast<MidiSource>(*src))) {
5976                                 Source::Lock lock(ms->mutex());
5977
5978                                 const MidiBuffer& buf = buffers.get_midi(0);
5979                                 for (MidiBuffer::const_iterator i = buf.begin(); i != buf.end(); ++i) {
5980                                         Evoral::Event<framepos_t> ev = *i;
5981                                         ev.set_time(ev.time() - position);
5982                                         ms->append_event_frames(lock, ev, ms->timeline_position());
5983                                 }
5984                         }
5985                 }
5986                 latency_skip = 0;
5987         }
5988
5989         /* post-roll, pick up delayed processor output */
5990         latency_skip = track.bounce_get_latency (endpoint, include_endpoint, for_export, for_freeze);
5991
5992         while (latency_skip && !itt.cancel) {
5993                 this_chunk = min (latency_skip, bounce_chunk_size);
5994                 latency_skip -= this_chunk;
5995
5996                 buffers.silence (this_chunk, 0);
5997                 track.bounce_process (buffers, start, this_chunk, endpoint, include_endpoint, for_export, for_freeze);
5998
5999                 uint32_t n = 0;
6000                 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src, ++n) {
6001                         boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
6002
6003                         if (afs) {
6004                                 if (afs->write (buffers.get_audio(n).data(), this_chunk) != this_chunk) {
6005                                         goto out;
6006                                 }
6007                         }
6008                 }
6009         }
6010
6011         if (!itt.cancel) {
6012
6013                 time_t now;
6014                 struct tm* xnow;
6015                 time (&now);
6016                 xnow = localtime (&now);
6017
6018                 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src) {
6019                         boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
6020                         boost::shared_ptr<MidiSource> ms;
6021
6022                         if (afs) {
6023                                 afs->update_header (position, *xnow, now);
6024                                 afs->flush_header ();
6025                         } else if ((ms = boost::dynamic_pointer_cast<MidiSource>(*src))) {
6026                                 Source::Lock lock(ms->mutex());
6027                                 ms->mark_streaming_write_completed(lock);
6028                         }
6029                 }
6030
6031                 /* construct a region to represent the bounced material */
6032
6033                 PropertyList plist;
6034
6035                 plist.add (Properties::start, 0);
6036                 plist.add (Properties::length, srcs.front()->length(srcs.front()->timeline_position()));
6037                 plist.add (Properties::name, region_name_from_path (srcs.front()->name(), true));
6038
6039                 result = RegionFactory::create (srcs, plist);
6040
6041         }
6042
6043   out:
6044         if (!result) {
6045                 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
6046                         (*src)->mark_for_remove ();
6047                         (*src)->drop_references ();
6048                 }
6049
6050         } else {
6051                 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
6052                         boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
6053
6054                         if (afs)
6055                                 afs->done_with_peakfile_writes ();
6056                 }
6057         }
6058
6059         _bounce_processing_active = false;
6060
6061         if (need_block_size_reset) {
6062                 _engine.main_thread()->drop_buffers ();
6063                 track.set_block_size (get_block_size());
6064         }
6065
6066         unblock_processing ();
6067
6068         return result;
6069 }
6070
6071 gain_t*
6072 Session::gain_automation_buffer() const
6073 {
6074         return ProcessThread::gain_automation_buffer ();
6075 }
6076
6077 gain_t*
6078 Session::trim_automation_buffer() const
6079 {
6080         return ProcessThread::trim_automation_buffer ();
6081 }
6082
6083 gain_t*
6084 Session::send_gain_automation_buffer() const
6085 {
6086         return ProcessThread::send_gain_automation_buffer ();
6087 }
6088
6089 pan_t**
6090 Session::pan_automation_buffer() const
6091 {
6092         return ProcessThread::pan_automation_buffer ();
6093 }
6094
6095 BufferSet&
6096 Session::get_silent_buffers (ChanCount count)
6097 {
6098         return ProcessThread::get_silent_buffers (count);
6099 }
6100
6101 BufferSet&
6102 Session::get_scratch_buffers (ChanCount count, bool silence)
6103 {
6104         return ProcessThread::get_scratch_buffers (count, silence);
6105 }
6106
6107 BufferSet&
6108 Session::get_noinplace_buffers (ChanCount count)
6109 {
6110         return ProcessThread::get_noinplace_buffers (count);
6111 }
6112
6113 BufferSet&
6114 Session::get_route_buffers (ChanCount count, bool silence)
6115 {
6116         return ProcessThread::get_route_buffers (count, silence);
6117 }
6118
6119
6120 BufferSet&
6121 Session::get_mix_buffers (ChanCount count)
6122 {
6123         return ProcessThread::get_mix_buffers (count);
6124 }
6125
6126 uint32_t
6127 Session::ntracks () const
6128 {
6129         uint32_t n = 0;
6130         boost::shared_ptr<RouteList> r = routes.reader ();
6131
6132         for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
6133                 if (boost::dynamic_pointer_cast<Track> (*i)) {
6134                         ++n;
6135                 }
6136         }
6137
6138         return n;
6139 }
6140
6141 uint32_t
6142 Session::nbusses () const
6143 {
6144         uint32_t n = 0;
6145         boost::shared_ptr<RouteList> r = routes.reader ();
6146
6147         for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
6148                 if (boost::dynamic_pointer_cast<Track>(*i) == 0) {
6149                         ++n;
6150                 }
6151         }
6152
6153         return n;
6154 }
6155
6156 void
6157 Session::add_automation_list(AutomationList *al)
6158 {
6159         automation_lists[al->id()] = al;
6160 }
6161
6162 /** @return true if there is at least one record-enabled track, otherwise false */
6163 bool
6164 Session::have_rec_enabled_track () const
6165 {
6166         return g_atomic_int_get (const_cast<gint*>(&_have_rec_enabled_track)) == 1;
6167 }
6168
6169 bool
6170 Session::have_rec_disabled_track () const
6171 {
6172     return g_atomic_int_get (const_cast<gint*>(&_have_rec_disabled_track)) == 1;
6173 }
6174
6175 /** Update the state of our rec-enabled tracks flag */
6176 void
6177 Session::update_route_record_state ()
6178 {
6179         boost::shared_ptr<RouteList> rl = routes.reader ();
6180         RouteList::iterator i = rl->begin();
6181         while (i != rl->end ()) {
6182
6183                 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
6184                                     if (tr && tr->rec_enable_control()->get_value()) {
6185                         break;
6186                 }
6187
6188                 ++i;
6189         }
6190
6191         int const old = g_atomic_int_get (&_have_rec_enabled_track);
6192
6193         g_atomic_int_set (&_have_rec_enabled_track, i != rl->end () ? 1 : 0);
6194
6195         if (g_atomic_int_get (&_have_rec_enabled_track) != old) {
6196                 RecordStateChanged (); /* EMIT SIGNAL */
6197         }
6198
6199         for (i = rl->begin(); i != rl->end (); ++i) {
6200                 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
6201                 if (tr && !tr->rec_enable_control()->get_value()) {
6202                         break;
6203                 }
6204         }
6205
6206         g_atomic_int_set (&_have_rec_disabled_track, i != rl->end () ? 1 : 0);
6207
6208         bool record_arm_state_changed = (old != g_atomic_int_get (&_have_rec_enabled_track) );
6209
6210         if (record_status() == Recording && record_arm_state_changed ) {
6211                 RecordArmStateChanged ();
6212         }
6213
6214 }
6215
6216 void
6217 Session::listen_position_changed ()
6218 {
6219         ProcessorChangeBlocker pcb (this);
6220         boost::shared_ptr<RouteList> r = routes.reader ();
6221         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6222                 (*i)->listen_position_changed ();
6223         }
6224 }
6225
6226 void
6227 Session::solo_control_mode_changed ()
6228 {
6229         if (soloing() || listening()) {
6230                 if (loading()) {
6231                         /* We can't use ::clear_all_solo_state() here because during
6232                            session loading at program startup, that will queue a call
6233                            to rt_clear_all_solo_state() that will not execute until
6234                            AFTER solo states have been established (thus throwing away
6235                            the session's saved solo state). So just explicitly turn
6236                            them all off.
6237                         */
6238                         set_controls (route_list_to_control_list (get_routes(), &Stripable::solo_control), 0.0, Controllable::NoGroup);
6239                 } else {
6240                         clear_all_solo_state (get_routes());
6241                 }
6242         }
6243 }
6244
6245 /** Called when a property of one of our route groups changes */
6246 void
6247 Session::route_group_property_changed (RouteGroup* rg)
6248 {
6249         RouteGroupPropertyChanged (rg); /* EMIT SIGNAL */
6250 }
6251
6252 /** Called when a route is added to one of our route groups */
6253 void
6254 Session::route_added_to_route_group (RouteGroup* rg, boost::weak_ptr<Route> r)
6255 {
6256         RouteAddedToRouteGroup (rg, r);
6257 }
6258
6259 /** Called when a route is removed from one of our route groups */
6260 void
6261 Session::route_removed_from_route_group (RouteGroup* rg, boost::weak_ptr<Route> r)
6262 {
6263         update_route_record_state ();
6264         RouteRemovedFromRouteGroup (rg, r); /* EMIT SIGNAL */
6265
6266         if (!rg->has_control_master () && !rg->has_subgroup () && rg->empty()) {
6267                 remove_route_group (*rg);
6268         }
6269 }
6270
6271 boost::shared_ptr<RouteList>
6272 Session::get_tracks () const
6273 {
6274         boost::shared_ptr<RouteList> rl = routes.reader ();
6275         boost::shared_ptr<RouteList> tl (new RouteList);
6276
6277         for (RouteList::const_iterator r = rl->begin(); r != rl->end(); ++r) {
6278                 if (boost::dynamic_pointer_cast<Track> (*r)) {
6279                         if (!(*r)->is_auditioner()) {
6280                                 tl->push_back (*r);
6281                         }
6282                 }
6283         }
6284         return tl;
6285 }
6286
6287 boost::shared_ptr<RouteList>
6288 Session::get_routes_with_regions_at (framepos_t const p) const
6289 {
6290         boost::shared_ptr<RouteList> r = routes.reader ();
6291         boost::shared_ptr<RouteList> rl (new RouteList);
6292
6293         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6294                 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
6295                 if (!tr) {
6296                         continue;
6297                 }
6298
6299                 boost::shared_ptr<Playlist> pl = tr->playlist ();
6300                 if (!pl) {
6301                         continue;
6302                 }
6303
6304                 if (pl->has_region_at (p)) {
6305                         rl->push_back (*i);
6306                 }
6307         }
6308
6309         return rl;
6310 }
6311
6312 void
6313 Session::goto_end ()
6314 {
6315         if (_session_range_location) {
6316                 request_locate (_session_range_location->end(), false);
6317         } else {
6318                 request_locate (0, false);
6319         }
6320 }
6321
6322 void
6323 Session::goto_start (bool and_roll)
6324 {
6325         if (_session_range_location) {
6326                 request_locate (_session_range_location->start(), and_roll);
6327         } else {
6328                 request_locate (0, and_roll);
6329         }
6330 }
6331
6332 framepos_t
6333 Session::current_start_frame () const
6334 {
6335         return _session_range_location ? _session_range_location->start() : 0;
6336 }
6337
6338 framepos_t
6339 Session::current_end_frame () const
6340 {
6341         return _session_range_location ? _session_range_location->end() : 0;
6342 }
6343
6344 void
6345 Session::set_session_range_location (framepos_t start, framepos_t end)
6346 {
6347         _session_range_location = new Location (*this, start, end, _("session"), Location::IsSessionRange);
6348         _locations->add (_session_range_location);
6349 }
6350
6351 void
6352 Session::step_edit_status_change (bool yn)
6353 {
6354         bool send = false;
6355
6356         bool val = false;
6357         if (yn) {
6358                 send = (_step_editors == 0);
6359                 val = true;
6360
6361                 _step_editors++;
6362         } else {
6363                 send = (_step_editors == 1);
6364                 val = false;
6365
6366                 if (_step_editors > 0) {
6367                         _step_editors--;
6368                 }
6369         }
6370
6371         if (send) {
6372                 StepEditStatusChange (val);
6373         }
6374 }
6375
6376
6377 void
6378 Session::start_time_changed (framepos_t old)
6379 {
6380         /* Update the auto loop range to match the session range
6381            (unless the auto loop range has been changed by the user)
6382         */
6383
6384         Location* s = _locations->session_range_location ();
6385         if (s == 0) {
6386                 return;
6387         }
6388
6389         Location* l = _locations->auto_loop_location ();
6390
6391         if (l && l->start() == old) {
6392                 l->set_start (s->start(), true);
6393         }
6394         set_dirty ();
6395 }
6396
6397 void
6398 Session::end_time_changed (framepos_t old)
6399 {
6400         /* Update the auto loop range to match the session range
6401            (unless the auto loop range has been changed by the user)
6402         */
6403
6404         Location* s = _locations->session_range_location ();
6405         if (s == 0) {
6406                 return;
6407         }
6408
6409         Location* l = _locations->auto_loop_location ();
6410
6411         if (l && l->end() == old) {
6412                 l->set_end (s->end(), true);
6413         }
6414         set_dirty ();
6415 }
6416
6417 std::vector<std::string>
6418 Session::source_search_path (DataType type) const
6419 {
6420         Searchpath sp;
6421
6422         if (session_dirs.size() == 1) {
6423                 switch (type) {
6424                 case DataType::AUDIO:
6425                         sp.push_back (_session_dir->sound_path());
6426                         break;
6427                 case DataType::MIDI:
6428                         sp.push_back (_session_dir->midi_path());
6429                         break;
6430                 }
6431         } else {
6432                 for (vector<space_and_path>::const_iterator i = session_dirs.begin(); i != session_dirs.end(); ++i) {
6433                         SessionDirectory sdir (i->path);
6434                         switch (type) {
6435                         case DataType::AUDIO:
6436                                 sp.push_back (sdir.sound_path());
6437                                 break;
6438                         case DataType::MIDI:
6439                                 sp.push_back (sdir.midi_path());
6440                                 break;
6441                         }
6442                 }
6443         }
6444
6445         if (type == DataType::AUDIO) {
6446                 const string sound_path_2X = _session_dir->sound_path_2X();
6447                 if (Glib::file_test (sound_path_2X, Glib::FILE_TEST_EXISTS|Glib::FILE_TEST_IS_DIR)) {
6448                         if (find (sp.begin(), sp.end(), sound_path_2X) == sp.end()) {
6449                                 sp.push_back (sound_path_2X);
6450                         }
6451                 }
6452         }
6453
6454         // now check the explicit (possibly user-specified) search path
6455
6456         switch (type) {
6457         case DataType::AUDIO:
6458                 sp += Searchpath(config.get_audio_search_path ());
6459                 break;
6460         case DataType::MIDI:
6461                 sp += Searchpath(config.get_midi_search_path ());
6462                 break;
6463         }
6464
6465         return sp;
6466 }
6467
6468 void
6469 Session::ensure_search_path_includes (const string& path, DataType type)
6470 {
6471         Searchpath sp;
6472
6473         if (path == ".") {
6474                 return;
6475         }
6476
6477         switch (type) {
6478         case DataType::AUDIO:
6479                 sp += Searchpath(config.get_audio_search_path ());
6480                 break;
6481         case DataType::MIDI:
6482                 sp += Searchpath (config.get_midi_search_path ());
6483                 break;
6484         }
6485
6486         for (vector<std::string>::iterator i = sp.begin(); i != sp.end(); ++i) {
6487                 /* No need to add this new directory if it has the same inode as
6488                    an existing one; checking inode rather than name prevents duplicated
6489                    directories when we are using symlinks.
6490
6491                    On Windows, I think we could just do if (*i == path) here.
6492                 */
6493                 if (PBD::equivalent_paths (*i, path)) {
6494                         return;
6495                 }
6496         }
6497
6498         sp += path;
6499
6500         switch (type) {
6501         case DataType::AUDIO:
6502                 config.set_audio_search_path (sp.to_string());
6503                 break;
6504         case DataType::MIDI:
6505                 config.set_midi_search_path (sp.to_string());
6506                 break;
6507         }
6508 }
6509
6510 void
6511 Session::remove_dir_from_search_path (const string& dir, DataType type)
6512 {
6513         Searchpath sp;
6514
6515         switch (type) {
6516         case DataType::AUDIO:
6517                 sp = Searchpath(config.get_audio_search_path ());
6518                 break;
6519         case DataType::MIDI:
6520                 sp = Searchpath (config.get_midi_search_path ());
6521                 break;
6522         }
6523
6524         sp -= dir;
6525
6526         switch (type) {
6527         case DataType::AUDIO:
6528                 config.set_audio_search_path (sp.to_string());
6529                 break;
6530         case DataType::MIDI:
6531                 config.set_midi_search_path (sp.to_string());
6532                 break;
6533         }
6534
6535 }
6536
6537 boost::shared_ptr<Speakers>
6538 Session::get_speakers()
6539 {
6540         return _speakers;
6541 }
6542
6543 list<string>
6544 Session::unknown_processors () const
6545 {
6546         list<string> p;
6547
6548         boost::shared_ptr<RouteList> r = routes.reader ();
6549         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6550                 list<string> t = (*i)->unknown_processors ();
6551                 copy (t.begin(), t.end(), back_inserter (p));
6552         }
6553
6554         p.sort ();
6555         p.unique ();
6556
6557         return p;
6558 }
6559
6560 void
6561 Session::update_latency (bool playback)
6562 {
6563
6564         DEBUG_TRACE (DEBUG::Latency, string_compose ("JACK latency callback: %1\n", (playback ? "PLAYBACK" : "CAPTURE")));
6565
6566         if ((_state_of_the_state & (InitialConnecting|Deletion)) || _adding_routes_in_progress || _route_deletion_in_progress) {
6567                 return;
6568         }
6569
6570         boost::shared_ptr<RouteList> r = routes.reader ();
6571         framecnt_t max_latency = 0;
6572
6573         if (playback) {
6574                 /* reverse the list so that we work backwards from the last route to run to the first */
6575                 RouteList* rl = routes.reader().get();
6576                 r.reset (new RouteList (*rl));
6577                 reverse (r->begin(), r->end());
6578         }
6579
6580         /* compute actual latency values for the given direction and store them all in per-port
6581            structures. this will also publish the same values (to JACK) so that computation of latency
6582            for routes can consistently use public latency values.
6583         */
6584
6585         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6586                 max_latency = max (max_latency, (*i)->set_private_port_latencies (playback));
6587         }
6588
6589         /* because we latency compensate playback, our published playback latencies should
6590            be the same for all output ports - all material played back by ardour has
6591            the same latency, whether its caused by plugins or by latency compensation. since
6592            these may differ from the values computed above, reset all playback port latencies
6593            to the same value.
6594         */
6595
6596         DEBUG_TRACE (DEBUG::Latency, string_compose ("Set public port latencies to %1\n", max_latency));
6597
6598         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6599                 (*i)->set_public_port_latencies (max_latency, playback);
6600         }
6601
6602         if (playback) {
6603
6604                 post_playback_latency ();
6605
6606         } else {
6607
6608                 post_capture_latency ();
6609         }
6610
6611         DEBUG_TRACE (DEBUG::Latency, "JACK latency callback: DONE\n");
6612 }
6613
6614 void
6615 Session::post_playback_latency ()
6616 {
6617         set_worst_playback_latency ();
6618
6619         boost::shared_ptr<RouteList> r = routes.reader ();
6620
6621         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6622                 if (!(*i)->is_auditioner() && ((*i)->active())) {
6623                         _worst_track_latency = max (_worst_track_latency, (*i)->update_signal_latency ());
6624                 }
6625         }
6626
6627         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6628                 (*i)->set_latency_compensation (_worst_track_latency);
6629         }
6630 }
6631
6632 void
6633 Session::post_capture_latency ()
6634 {
6635         set_worst_capture_latency ();
6636
6637         /* reflect any changes in capture latencies into capture offsets
6638          */
6639
6640         boost::shared_ptr<RouteList> rl = routes.reader();
6641         for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
6642                 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
6643                 if (tr) {
6644                         tr->set_capture_offset ();
6645                 }
6646         }
6647 }
6648
6649 void
6650 Session::initialize_latencies ()
6651 {
6652         {
6653                 Glib::Threads::Mutex::Lock lm (_engine.process_lock());
6654                 update_latency (false);
6655                 update_latency (true);
6656         }
6657
6658         set_worst_io_latencies ();
6659 }
6660
6661 void
6662 Session::set_worst_io_latencies ()
6663 {
6664         set_worst_playback_latency ();
6665         set_worst_capture_latency ();
6666 }
6667
6668 void
6669 Session::set_worst_playback_latency ()
6670 {
6671         if (_state_of_the_state & (InitialConnecting|Deletion)) {
6672                 return;
6673         }
6674
6675         _worst_output_latency = 0;
6676
6677         if (!_engine.connected()) {
6678                 return;
6679         }
6680
6681         boost::shared_ptr<RouteList> r = routes.reader ();
6682
6683         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6684                 _worst_output_latency = max (_worst_output_latency, (*i)->output()->latency());
6685         }
6686
6687         DEBUG_TRACE (DEBUG::Latency, string_compose ("Worst output latency: %1\n", _worst_output_latency));
6688 }
6689
6690 void
6691 Session::set_worst_capture_latency ()
6692 {
6693         if (_state_of_the_state & (InitialConnecting|Deletion)) {
6694                 return;
6695         }
6696
6697         _worst_input_latency = 0;
6698
6699         if (!_engine.connected()) {
6700                 return;
6701         }
6702
6703         boost::shared_ptr<RouteList> r = routes.reader ();
6704
6705         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6706                 _worst_input_latency = max (_worst_input_latency, (*i)->input()->latency());
6707         }
6708
6709         DEBUG_TRACE (DEBUG::Latency, string_compose ("Worst input latency: %1\n", _worst_input_latency));
6710 }
6711
6712 void
6713 Session::update_latency_compensation (bool force_whole_graph)
6714 {
6715         bool some_track_latency_changed = false;
6716
6717         if (_state_of_the_state & (InitialConnecting|Deletion)) {
6718                 return;
6719         }
6720
6721         DEBUG_TRACE(DEBUG::Latency, "---------------------------- update latency compensation\n\n");
6722
6723         _worst_track_latency = 0;
6724
6725         boost::shared_ptr<RouteList> r = routes.reader ();
6726
6727         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6728                 if (!(*i)->is_auditioner() && ((*i)->active())) {
6729                         framecnt_t tl;
6730                         if ((*i)->signal_latency () != (tl = (*i)->update_signal_latency ())) {
6731                                 some_track_latency_changed = true;
6732                         }
6733                         _worst_track_latency = max (tl, _worst_track_latency);
6734                 }
6735         }
6736
6737         DEBUG_TRACE (DEBUG::Latency, string_compose ("worst signal processing latency: %1 (changed ? %2)\n", _worst_track_latency,
6738                                                      (some_track_latency_changed ? "yes" : "no")));
6739
6740         DEBUG_TRACE(DEBUG::Latency, "---------------------------- DONE update latency compensation\n\n");
6741
6742         if (some_track_latency_changed || force_whole_graph)  {
6743                 _engine.update_latencies ();
6744         }
6745
6746
6747         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6748                 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
6749                 if (!tr) {
6750                         continue;
6751                 }
6752                 tr->set_capture_offset ();
6753         }
6754 }
6755
6756 char
6757 Session::session_name_is_legal (const string& path)
6758 {
6759         char illegal_chars[] = { '/', '\\', ':', ';', '\0' };
6760
6761         for (int i = 0; illegal_chars[i]; ++i) {
6762                 if (path.find (illegal_chars[i]) != string::npos) {
6763                         return illegal_chars[i];
6764                 }
6765         }
6766
6767         return 0;
6768 }
6769
6770 void
6771 Session::notify_presentation_info_change ()
6772 {
6773         if (deletion_in_progress()) {
6774                 return;
6775         }
6776
6777         PresentationInfo::Change (); /* EMIT SIGNAL */
6778         reassign_track_numbers();
6779
6780 #ifdef USE_TRACKS_CODE_FEATURES
6781         /* Waves Tracks: for Waves Tracks session it's required to reconnect their IOs
6782          * if track order has been changed by user
6783          */
6784         reconnect_existing_routes(true, true);
6785 #endif
6786
6787 }
6788
6789 bool
6790 Session::operation_in_progress (GQuark op) const
6791 {
6792         return (find (_current_trans_quarks.begin(), _current_trans_quarks.end(), op) != _current_trans_quarks.end());
6793 }
6794
6795 boost::shared_ptr<Port>
6796 Session::ltc_input_port () const
6797 {
6798         return _ltc_input->nth (0);
6799 }
6800
6801 boost::shared_ptr<Port>
6802 Session::ltc_output_port () const
6803 {
6804         return _ltc_output->nth (0);
6805 }
6806
6807 void
6808 Session::reconnect_ltc_input ()
6809 {
6810         if (_ltc_input) {
6811
6812                 string src = Config->get_ltc_source_port();
6813
6814                 _ltc_input->disconnect (this);
6815
6816                 if (src != _("None") && !src.empty())  {
6817                         _ltc_input->nth (0)->connect (src);
6818                 }
6819
6820                 if ( ARDOUR::Profile->get_trx () ) {
6821                         // Tracks need this signal to update timecode_source_dropdown
6822                         MtcOrLtcInputPortChanged (); //emit signal
6823                 }
6824         }
6825 }
6826
6827 void
6828 Session::reconnect_ltc_output ()
6829 {
6830         if (_ltc_output) {
6831
6832                 string src = Config->get_ltc_output_port();
6833
6834                 _ltc_output->disconnect (this);
6835
6836                 if (src != _("None") && !src.empty())  {
6837                         _ltc_output->nth (0)->connect (src);
6838                 }
6839         }
6840 }
6841
6842 void
6843 Session::set_range_selection (framepos_t start, framepos_t end)
6844 {
6845         _range_selection = Evoral::Range<framepos_t> (start, end);
6846 #ifdef USE_TRACKS_CODE_FEATURES
6847         follow_playhead_priority ();
6848 #endif
6849 }
6850
6851 void
6852 Session::set_object_selection (framepos_t start, framepos_t end)
6853 {
6854         _object_selection = Evoral::Range<framepos_t> (start, end);
6855 #ifdef USE_TRACKS_CODE_FEATURES
6856         follow_playhead_priority ();
6857 #endif
6858 }
6859
6860 void
6861 Session::clear_range_selection ()
6862 {
6863         _range_selection = Evoral::Range<framepos_t> (-1,-1);
6864 #ifdef USE_TRACKS_CODE_FEATURES
6865         follow_playhead_priority ();
6866 #endif
6867 }
6868
6869 void
6870 Session::clear_object_selection ()
6871 {
6872         _object_selection = Evoral::Range<framepos_t> (-1,-1);
6873 #ifdef USE_TRACKS_CODE_FEATURES
6874         follow_playhead_priority ();
6875 #endif
6876 }
6877
6878 void
6879 Session::auto_connect_route (boost::shared_ptr<Route> route, bool connect_inputs,
6880                 const ChanCount& input_start,
6881                 const ChanCount& output_start,
6882                 const ChanCount& input_offset,
6883                 const ChanCount& output_offset)
6884 {
6885         Glib::Threads::Mutex::Lock lx (_auto_connect_queue_lock);
6886         _auto_connect_queue.push (AutoConnectRequest (route, connect_inputs,
6887                                 input_start, output_start,
6888                                 input_offset, output_offset));
6889
6890         auto_connect_thread_wakeup ();
6891 }
6892
6893 void
6894 Session::auto_connect_thread_wakeup ()
6895 {
6896         if (pthread_mutex_trylock (&_auto_connect_mutex) == 0) {
6897                 pthread_cond_signal (&_auto_connect_cond);
6898                 pthread_mutex_unlock (&_auto_connect_mutex);
6899         }
6900 }
6901
6902 void
6903 Session::queue_latency_recompute ()
6904 {
6905         g_atomic_int_inc (&_latency_recompute_pending);
6906         auto_connect_thread_wakeup ();
6907 }
6908
6909 void
6910 Session::auto_connect (const AutoConnectRequest& ar)
6911 {
6912         boost::shared_ptr<Route> route = ar.route.lock();
6913
6914         if (!route) { return; }
6915
6916         if (!IO::connecting_legal) {
6917                 return;
6918         }
6919
6920         /* If both inputs and outputs are auto-connected to physical ports,
6921          * use the max of input and output offsets to ensure auto-connected
6922          * port numbers always match up (e.g. the first audio input and the
6923          * first audio output of the route will have the same physical
6924          * port number).  Otherwise just use the lowest input or output
6925          * offset possible.
6926          */
6927
6928         const bool in_out_physical =
6929                 (Config->get_input_auto_connect() & AutoConnectPhysical)
6930                 && (Config->get_output_auto_connect() & AutoConnectPhysical)
6931                 && ar.connect_inputs;
6932
6933         const ChanCount in_offset = in_out_physical
6934                 ? ChanCount::max(ar.input_offset, ar.output_offset)
6935                 : ar.input_offset;
6936
6937         const ChanCount out_offset = in_out_physical
6938                 ? ChanCount::max(ar.input_offset, ar.output_offset)
6939                 : ar.output_offset;
6940
6941         for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
6942                 vector<string> physinputs;
6943                 vector<string> physoutputs;
6944
6945
6946                 /* for connecting track inputs we only want MIDI ports marked
6947                  * for "music".
6948                  */
6949
6950                 get_physical_ports (physinputs, physoutputs, *t, MidiPortMusic);
6951
6952                 if (!physinputs.empty() && ar.connect_inputs) {
6953                         uint32_t nphysical_in = physinputs.size();
6954
6955                         for (uint32_t i = ar.input_start.get(*t); i < route->n_inputs().get(*t) && i < nphysical_in; ++i) {
6956                                 string port;
6957
6958                                 if (Config->get_input_auto_connect() & AutoConnectPhysical) {
6959                                         port = physinputs[(in_offset.get(*t) + i) % nphysical_in];
6960                                 }
6961
6962                                 if (!port.empty() && route->input()->connect (route->input()->ports().port(*t, i), port, this)) {
6963                                         break;
6964                                 }
6965                         }
6966                 }
6967
6968                 if (!physoutputs.empty()) {
6969                         uint32_t nphysical_out = physoutputs.size();
6970                         for (uint32_t i = ar.output_start.get(*t); i < route->n_outputs().get(*t); ++i) {
6971                                 string port;
6972
6973                                 /* Waves Tracks:
6974                                  * do not create new connections if we reached the limit of physical outputs
6975                                  * in Multi Out mode
6976                                  */
6977                                 if (!(Config->get_output_auto_connect() & AutoConnectMaster) &&
6978                                                 ARDOUR::Profile->get_trx () &&
6979                                                 ar.output_offset.get(*t) == nphysical_out ) {
6980                                         break;
6981                                 }
6982
6983                                 if ((*t) == DataType::MIDI && (Config->get_output_auto_connect() & AutoConnectPhysical)) {
6984                                         port = physoutputs[(out_offset.get(*t) + i) % nphysical_out];
6985                                 } else if ((*t) == DataType::AUDIO && (Config->get_output_auto_connect() & AutoConnectMaster)) {
6986                                         /* master bus is audio only */
6987                                         if (_master_out && _master_out->n_inputs().get(*t) > 0) {
6988                                                 port = _master_out->input()->ports().port(*t,
6989                                                                 i % _master_out->input()->n_ports().get(*t))->name();
6990                                         }
6991                                 }
6992
6993                                 if (!port.empty() && route->output()->connect (route->output()->ports().port(*t, i), port, this)) {
6994                                         break;
6995                                 }
6996                         }
6997                 }
6998         }
6999 }
7000
7001 void
7002 Session::auto_connect_thread_start ()
7003 {
7004         if (_ac_thread_active) {
7005                 return;
7006         }
7007
7008         while (!_auto_connect_queue.empty ()) {
7009                 _auto_connect_queue.pop ();
7010         }
7011
7012         _ac_thread_active = true;
7013         if (pthread_create (&_auto_connect_thread, NULL, auto_connect_thread, this)) {
7014                 _ac_thread_active = false;
7015         }
7016 }
7017
7018 void
7019 Session::auto_connect_thread_terminate ()
7020 {
7021         if (!_ac_thread_active) {
7022                 return;
7023         }
7024         _ac_thread_active = false;
7025
7026         {
7027                 Glib::Threads::Mutex::Lock lx (_auto_connect_queue_lock);
7028                 while (!_auto_connect_queue.empty ()) {
7029                         _auto_connect_queue.pop ();
7030                 }
7031         }
7032
7033         auto_connect_thread_wakeup ();
7034
7035         void *status;
7036         pthread_join (_auto_connect_thread, &status);
7037 }
7038
7039 void *
7040 Session::auto_connect_thread (void *arg)
7041 {
7042         Session *s = static_cast<Session *>(arg);
7043         s->auto_connect_thread_run ();
7044         pthread_exit (0);
7045         return 0;
7046 }
7047
7048 void
7049 Session::auto_connect_thread_run ()
7050 {
7051         pthread_set_name (X_("autoconnect"));
7052         SessionEvent::create_per_thread_pool (X_("autoconnect"), 1024);
7053         PBD::notify_event_loops_about_thread_creation (pthread_self(), X_("autoconnect"), 1024);
7054         pthread_mutex_lock (&_auto_connect_mutex);
7055         while (_ac_thread_active) {
7056
7057                 if (!_auto_connect_queue.empty ()) {
7058                         // Why would we need the process lock ??
7059                         // A: if ports are added while we're connecting, the backend's iterator may be invalidated:
7060                         //   graph_order_callback() -> resort_routes() -> direct_feeds_according_to_reality () -> backend::connected_to()
7061                         //   All ardour-internal backends use a std::vector   xxxAudioBackend::find_port()
7062                         //   We have control over those, but what does jack do?
7063                         Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
7064
7065                         Glib::Threads::Mutex::Lock lx (_auto_connect_queue_lock);
7066                         while (!_auto_connect_queue.empty ()) {
7067                                 const AutoConnectRequest ar (_auto_connect_queue.front());
7068                                 _auto_connect_queue.pop ();
7069                                 lx.release ();
7070                                 auto_connect (ar);
7071                                 lx.acquire ();
7072                         }
7073                 }
7074
7075                 if (!actively_recording ()) { // might not be needed,
7076                         /* this is only used for updating plugin latencies, the
7077                          * graph does not change. so it's safe in general.
7078                          * BUT..
7079                          * .. update_latency_compensation () entails set_capture_offset()
7080                          * which calls Diskstream::set_capture_offset () which
7081                          * modifies the capture offset... which can be a proplem
7082                          * in "prepare_to_stop"
7083                          */
7084                         while (g_atomic_int_and (&_latency_recompute_pending, 0)) {
7085                                 update_latency_compensation ();
7086                         }
7087                 }
7088
7089                 AudioEngine::instance()->clear_pending_port_deletions ();
7090
7091                 pthread_cond_wait (&_auto_connect_cond, &_auto_connect_mutex);
7092         }
7093         pthread_mutex_unlock (&_auto_connect_mutex);
7094 }
7095
7096 void
7097 Session::cancel_all_solo ()
7098 {
7099         StripableList sl;
7100
7101         get_stripables (sl);
7102
7103         set_controls (stripable_list_to_control_list (sl, &Stripable::solo_control), 0.0, Controllable::NoGroup);
7104         clear_all_solo_state (routes.reader());
7105 }