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