Fix crash when instrument instantiation fails on track creation.
[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 (!plugin) {
2534                                         warning << "Failed to add Synth Plugin to newly created track." << endmsg;
2535                                         continue;
2536                                 }
2537                                 if (pset) {
2538                                         plugin->load_preset (*pset);
2539                                 }
2540                                 boost::shared_ptr<Processor> p (new PluginInsert (*this, plugin));
2541                                 (*r)->add_processor (p, PreFader);
2542                         }
2543                 }
2544         }
2545
2546         return ret;
2547 }
2548
2549 RouteList
2550 Session::new_midi_route (RouteGroup* route_group, uint32_t how_many, string name_template, boost::shared_ptr<PluginInfo> instrument, Plugin::PresetRecord* pset,
2551                          PresentationInfo::Flag flag, PresentationInfo::order_t order)
2552 {
2553         string bus_name;
2554         uint32_t bus_id = 0;
2555         string port;
2556         RouteList ret;
2557
2558         bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("Midi Bus");
2559
2560         while (how_many) {
2561                 if (!find_route_name (name_template.empty () ? _("Midi Bus") : name_template, ++bus_id, bus_name, use_number)) {
2562                         error << "cannot find name for new midi bus" << endmsg;
2563                         goto failure;
2564                 }
2565
2566                 try {
2567                         boost::shared_ptr<Route> bus (new Route (*this, bus_name, flag, DataType::AUDIO)); // XXX Editor::add_routes is not ready for ARDOUR::DataType::MIDI
2568
2569                         if (bus->init ()) {
2570                                 goto failure;
2571                         }
2572
2573                         if (Profile->get_mixbus ()) {
2574                                 bus->set_strict_io (true);
2575                         }
2576
2577                         BOOST_MARK_ROUTE(bus);
2578
2579                         {
2580                                 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2581
2582                                 if (bus->input()->ensure_io (ChanCount(DataType::MIDI, 1), false, this)) {
2583                                         error << _("cannot configure new midi bus input") << endmsg;
2584                                         goto failure;
2585                                 }
2586
2587
2588                                 if (bus->output()->ensure_io (ChanCount(DataType::MIDI, 1), false, this)) {
2589                                         error << _("cannot configure new midi bus output") << endmsg;
2590                                         goto failure;
2591                                 }
2592                         }
2593
2594                         if (route_group) {
2595                                 route_group->add (bus);
2596                         }
2597
2598                         bus->add_internal_return ();
2599                         ret.push_back (bus);
2600                 }
2601
2602                 catch (failed_constructor &err) {
2603                         error << _("Session: could not create new audio route.") << endmsg;
2604                         goto failure;
2605                 }
2606
2607                 catch (AudioEngine::PortRegistrationFailure& pfe) {
2608                         error << pfe.what() << endmsg;
2609                         goto failure;
2610                 }
2611
2612
2613                 --how_many;
2614         }
2615
2616   failure:
2617         if (!ret.empty()) {
2618                 StateProtector sp (this);
2619                 add_routes (ret, false, false, false, order);
2620
2621                 if (instrument) {
2622                         for (RouteList::iterator r = ret.begin(); r != ret.end(); ++r) {
2623                                 PluginPtr plugin = instrument->load (*this);
2624                                 if (!plugin) {
2625                                         warning << "Failed to add Synth Plugin to newly created track." << endmsg;
2626                                         continue;
2627                                 }
2628                                 if (pset) {
2629                                         plugin->load_preset (*pset);
2630                                 }
2631                                 boost::shared_ptr<Processor> p (new PluginInsert (*this, plugin));
2632                                 (*r)->add_processor (p, PreFader);
2633                         }
2634                 }
2635         }
2636
2637         return ret;
2638
2639 }
2640
2641
2642 void
2643 Session::midi_output_change_handler (IOChange change, void * /*src*/, boost::weak_ptr<Route> wmt)
2644 {
2645         boost::shared_ptr<Route> midi_track (wmt.lock());
2646
2647         if (!midi_track) {
2648                 return;
2649         }
2650
2651         if ((change.type & IOChange::ConfigurationChanged) && Config->get_output_auto_connect() != ManualConnect) {
2652
2653                 if (change.after.n_audio() <= change.before.n_audio()) {
2654                         return;
2655                 }
2656
2657                 /* new audio ports: make sure the audio goes somewhere useful,
2658                  * unless the user has no-auto-connect selected.
2659                  *
2660                  * The existing ChanCounts don't matter for this call as they are only
2661                  * to do with matching input and output indices, and we are only changing
2662                  * outputs here.
2663                  */
2664                 auto_connect_route (midi_track, false, ChanCount(), change.before);
2665         }
2666 }
2667
2668 #ifdef USE_TRACKS_CODE_FEATURES
2669
2670 static bool
2671 compare_routes_by_remote_id (const boost::shared_ptr<Route>& route1, const boost::shared_ptr<Route>& route2)
2672 {
2673         return route1->remote_control_id() < route2->remote_control_id();
2674 }
2675
2676 void
2677 Session::reconnect_existing_routes (bool withLock, bool reconnect_master, bool reconnect_inputs, bool reconnect_outputs)
2678 {
2679         // it is not allowed to perform connection
2680         if (!IO::connecting_legal) {
2681                 return;
2682         }
2683
2684         // if we are deleting routes we will call this once at the end
2685         if (_route_deletion_in_progress) {
2686                 return;
2687         }
2688
2689         Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock (), Glib::Threads::NOT_LOCK);
2690
2691         if (withLock) {
2692                 lm.acquire ();
2693         }
2694
2695         // We need to disconnect the route's inputs and outputs first
2696         // basing on autoconnect configuration
2697         bool reconnectIputs = !(Config->get_input_auto_connect() & ManualConnect) && reconnect_inputs;
2698         bool reconnectOutputs = !(Config->get_output_auto_connect() & ManualConnect) && reconnect_outputs;
2699
2700         ChanCount existing_inputs;
2701         ChanCount existing_outputs;
2702         count_existing_track_channels (existing_inputs, existing_outputs);
2703
2704         //ChanCount inputs = ChanCount::ZERO;
2705         //ChanCount outputs = ChanCount::ZERO;
2706
2707         RouteList existing_routes = *routes.reader ();
2708         existing_routes.sort (compare_routes_by_remote_id);
2709
2710         {
2711                 PBD::Unwinder<bool> protect_ignore_changes (_reconnecting_routes_in_progress, true);
2712
2713                 vector<string> physinputs;
2714                 vector<string> physoutputs;
2715
2716                 EngineStateController::instance()->get_physical_audio_outputs(physoutputs);
2717                 EngineStateController::instance()->get_physical_audio_inputs(physinputs);
2718
2719                 uint32_t input_n = 0;
2720                 uint32_t output_n = 0;
2721                 RouteList::iterator rIter = existing_routes.begin();
2722                 const AutoConnectOption current_input_auto_connection (Config->get_input_auto_connect());
2723                 const AutoConnectOption current_output_auto_connection (Config->get_output_auto_connect());
2724                 for (; rIter != existing_routes.end(); ++rIter) {
2725                         if (*rIter == _master_out || *rIter == _monitor_out ) {
2726                                 continue;
2727                         }
2728
2729                         if (current_output_auto_connection == AutoConnectPhysical) {
2730                                 (*rIter)->amp()->deactivate();
2731                         } else if (current_output_auto_connection == AutoConnectMaster) {
2732                                 (*rIter)->amp()->activate();
2733                         }
2734
2735                         if (reconnectIputs) {
2736                                 (*rIter)->input()->disconnect (this); //GZ: check this; could be heavy
2737
2738                                 for (uint32_t route_input_n = 0; route_input_n < (*rIter)->n_inputs().get(DataType::AUDIO); ++route_input_n) {
2739
2740                                         if (current_input_auto_connection & AutoConnectPhysical) {
2741
2742                                                 if ( input_n == physinputs.size() ) {
2743                                                         break;
2744                                                 }
2745
2746                                                 string port = physinputs[input_n];
2747
2748                                                 if (port.empty() ) {
2749                                                         error << "Physical Input number "<< input_n << " is unavailable and cannot be connected" << endmsg;
2750                                                 }
2751
2752                                                 //GZ: check this; could be heavy
2753                                                 (*rIter)->input()->connect ((*rIter)->input()->ports().port(DataType::AUDIO, route_input_n), port, this);
2754                                                 ++input_n;
2755                                         }
2756                                 }
2757                         }
2758
2759                         if (reconnectOutputs) {
2760
2761                                 //normalize route ouptuts: reduce the amount outputs to be equal to the amount of inputs
2762                                 if (current_output_auto_connection & AutoConnectPhysical) {
2763
2764                                         //GZ: check this; could be heavy
2765                                         (*rIter)->output()->disconnect (this);
2766                                         size_t route_inputs_count = (*rIter)->n_inputs().get(DataType::AUDIO);
2767
2768                                         //GZ: check this; could be heavy
2769                                         (*rIter)->output()->ensure_io(ChanCount(DataType::AUDIO, route_inputs_count), false, this );
2770
2771                                 } else if (current_output_auto_connection & AutoConnectMaster){
2772
2773                                         if (!reconnect_master) {
2774                                                 continue;
2775                                         }
2776
2777                                         //GZ: check this; could be heavy
2778                                         (*rIter)->output()->disconnect (this);
2779
2780                                         if (_master_out) {
2781                                                 uint32_t master_inputs_count = _master_out->n_inputs().get(DataType::AUDIO);
2782                                                 (*rIter)->output()->ensure_io(ChanCount(DataType::AUDIO, master_inputs_count), false, this );
2783                                         } else {
2784                                                 error << error << "Master bus is not available" << endmsg;
2785                                                 break;
2786                                         }
2787                                 }
2788
2789                                 for (uint32_t route_output_n = 0; route_output_n < (*rIter)->n_outputs().get(DataType::AUDIO); ++route_output_n) {
2790                                         if (current_output_auto_connection & AutoConnectPhysical) {
2791
2792                                                 if ( output_n == physoutputs.size() ) {
2793                                                         break;
2794                                                 }
2795
2796                                                 string port = physoutputs[output_n];
2797
2798                                                 if (port.empty() ) {
2799                                                         error << "Physical Output number "<< output_n << " is unavailable and cannot be connected" << endmsg;
2800                                                 }
2801
2802                                                 //GZ: check this; could be heavy
2803                                                 (*rIter)->output()->connect ((*rIter)->output()->ports().port(DataType::AUDIO, route_output_n), port, this);
2804                                                 ++output_n;
2805
2806                                         } else if (current_output_auto_connection & AutoConnectMaster) {
2807
2808                                                 if ( route_output_n == _master_out->n_inputs().get(DataType::AUDIO) ) {
2809                                                         break;
2810                                                 }
2811
2812                                                 // connect to master bus
2813                                                 string port = _master_out->input()->ports().port(DataType::AUDIO, route_output_n)->name();
2814
2815                                                 if (port.empty() ) {
2816                                                         error << "MasterBus Input number "<< route_output_n << " is unavailable and cannot be connected" << endmsg;
2817                                                 }
2818
2819
2820                                                 //GZ: check this; could be heavy
2821                                                 (*rIter)->output()->connect ((*rIter)->output()->ports().port(DataType::AUDIO, route_output_n), port, this);
2822
2823                                         }
2824                                 }
2825                         }
2826                 }
2827
2828                 _master_out->output()->disconnect (this);
2829                 auto_connect_master_bus ();
2830         }
2831
2832         graph_reordered ();
2833
2834         session_routes_reconnected (); /* EMIT SIGNAL */
2835 }
2836
2837 void
2838 Session::reconnect_midi_scene_ports(bool inputs)
2839 {
2840     if (inputs ) {
2841
2842         boost::shared_ptr<MidiPort> scene_in_ptr = scene_in();
2843         if (scene_in_ptr) {
2844             scene_in_ptr->disconnect_all ();
2845
2846             std::vector<EngineStateController::MidiPortState> midi_port_states;
2847             EngineStateController::instance()->get_physical_midi_input_states (midi_port_states);
2848
2849             std::vector<EngineStateController::MidiPortState>::iterator state_iter = midi_port_states.begin();
2850
2851             for (; state_iter != midi_port_states.end(); ++state_iter) {
2852                 if (state_iter->active && state_iter->available && state_iter->scene_connected) {
2853                     scene_in_ptr->connect (state_iter->name);
2854                 }
2855             }
2856         }
2857
2858     } else {
2859
2860         boost::shared_ptr<MidiPort> scene_out_ptr = scene_out();
2861
2862         if (scene_out_ptr ) {
2863             scene_out_ptr->disconnect_all ();
2864
2865             std::vector<EngineStateController::MidiPortState> midi_port_states;
2866             EngineStateController::instance()->get_physical_midi_output_states (midi_port_states);
2867
2868             std::vector<EngineStateController::MidiPortState>::iterator state_iter = midi_port_states.begin();
2869
2870             for (; state_iter != midi_port_states.end(); ++state_iter) {
2871                 if (state_iter->active && state_iter->available && state_iter->scene_connected) {
2872                     scene_out_ptr->connect (state_iter->name);
2873                 }
2874             }
2875         }
2876     }
2877 }
2878
2879 void
2880 Session::reconnect_mtc_ports ()
2881 {
2882         boost::shared_ptr<MidiPort> mtc_in_ptr = _midi_ports->mtc_input_port();
2883
2884         if (!mtc_in_ptr) {
2885                 return;
2886         }
2887
2888         mtc_in_ptr->disconnect_all ();
2889
2890         std::vector<EngineStateController::MidiPortState> midi_port_states;
2891         EngineStateController::instance()->get_physical_midi_input_states (midi_port_states);
2892
2893         std::vector<EngineStateController::MidiPortState>::iterator state_iter = midi_port_states.begin();
2894
2895         for (; state_iter != midi_port_states.end(); ++state_iter) {
2896                 if (state_iter->available && state_iter->mtc_in) {
2897                         mtc_in_ptr->connect (state_iter->name);
2898                 }
2899         }
2900
2901         if (!_midi_ports->mtc_input_port ()->connected () &&
2902             config.get_external_sync () &&
2903             (Config->get_sync_source () == MTC) ) {
2904                 config.set_external_sync (false);
2905         }
2906
2907         if ( ARDOUR::Profile->get_trx () ) {
2908                 // Tracks need this signal to update timecode_source_dropdown
2909                 MtcOrLtcInputPortChanged (); //emit signal
2910         }
2911 }
2912
2913 void
2914 Session::reconnect_mmc_ports(bool inputs)
2915 {
2916         if (inputs ) { // get all enabled midi input ports
2917
2918                 boost::shared_ptr<MidiPort> mmc_in_ptr = _midi_ports->mmc_in();
2919                 if (mmc_in_ptr) {
2920                         mmc_in_ptr->disconnect_all ();
2921                         std::vector<std::string> enabled_midi_inputs;
2922                         EngineStateController::instance()->get_physical_midi_inputs (enabled_midi_inputs);
2923
2924                         std::vector<std::string>::iterator port_iter = enabled_midi_inputs.begin();
2925
2926                         for (; port_iter != enabled_midi_inputs.end(); ++port_iter) {
2927                                 mmc_in_ptr->connect (*port_iter);
2928                         }
2929
2930                 }
2931         } else { // get all enabled midi output ports
2932
2933                 boost::shared_ptr<MidiPort> mmc_out_ptr = _midi_ports->mmc_out();
2934                 if (mmc_out_ptr ) {
2935                         mmc_out_ptr->disconnect_all ();
2936                         std::vector<std::string> enabled_midi_outputs;
2937                         EngineStateController::instance()->get_physical_midi_outputs (enabled_midi_outputs);
2938
2939                         std::vector<std::string>::iterator port_iter = enabled_midi_outputs.begin();
2940
2941                         for (; port_iter != enabled_midi_outputs.end(); ++port_iter) {
2942                                 mmc_out_ptr->connect (*port_iter);
2943                         }
2944                 }
2945         }
2946 }
2947
2948 #endif
2949
2950 void
2951 Session::ensure_route_presentation_info_gap (PresentationInfo::order_t first_new_order, uint32_t how_many)
2952 {
2953         if (first_new_order == PresentationInfo::max_order) {
2954                 /* adding at end, no worries */
2955                 return;
2956         }
2957
2958         /* create a gap in the presentation info to accomodate @param how_many
2959          * new objects.
2960          */
2961         StripableList sl;
2962         get_stripables (sl);
2963
2964         for (StripableList::iterator si = sl.begin(); si != sl.end(); ++si) {
2965                 boost::shared_ptr<Stripable> s (*si);
2966
2967                 if (s->is_monitor() || s->is_auditioner()) {
2968                         continue;
2969                 }
2970
2971                 if (s->presentation_info().order () >= first_new_order) {
2972                         s->set_presentation_order (s->presentation_info().order () + how_many);
2973                 }
2974         }
2975 }
2976
2977 /** Caller must not hold process lock
2978  *  @param name_template string to use for the start of the name, or "" to use "Audio".
2979  */
2980 list< boost::shared_ptr<AudioTrack> >
2981 Session::new_audio_track (int input_channels, int output_channels, RouteGroup* route_group,
2982                           uint32_t how_many, string name_template, PresentationInfo::order_t order,
2983                           TrackMode mode)
2984 {
2985         string track_name;
2986         uint32_t track_id = 0;
2987         string port;
2988         RouteList new_routes;
2989         list<boost::shared_ptr<AudioTrack> > ret;
2990
2991         const string name_pattern = default_track_name_pattern (DataType::AUDIO);
2992         bool const use_number = (how_many != 1) || name_template.empty () || (name_template == name_pattern);
2993
2994         while (how_many) {
2995
2996                 if (!find_route_name (name_template.empty() ? _(name_pattern.c_str()) : name_template, ++track_id, track_name, use_number)) {
2997                         error << "cannot find name for new audio track" << endmsg;
2998                         goto failed;
2999                 }
3000
3001                 boost::shared_ptr<AudioTrack> track;
3002
3003                 try {
3004                         track.reset (new AudioTrack (*this, track_name, mode));
3005
3006                         if (track->init ()) {
3007                                 goto failed;
3008                         }
3009
3010                         if (Profile->get_mixbus ()) {
3011                                 track->set_strict_io (true);
3012                         }
3013
3014                         if (ARDOUR::Profile->get_trx ()) {
3015                                 // TRACKS considers it's not a USE CASE, it's
3016                                 // a piece of behavior of the session model:
3017                                 //
3018                                 // Gain for a newly created route depends on
3019                                 // the current output_auto_connect mode:
3020                                 //
3021                                 //  0 for Stereo Out mode
3022                                 //  0 Multi Out mode
3023                                 if (Config->get_output_auto_connect() & AutoConnectMaster) {
3024                                         track->gain_control()->set_value (dB_to_coefficient (0), Controllable::NoGroup);
3025                                 }
3026                         }
3027
3028                         track->use_new_diskstream();
3029
3030                         BOOST_MARK_TRACK (track);
3031
3032                         {
3033                                 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
3034
3035                                 if (track->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
3036                                         error << string_compose (
3037                                                 _("cannot configure %1 in/%2 out configuration for new audio track"),
3038                                                 input_channels, output_channels)
3039                                               << endmsg;
3040                                         goto failed;
3041                                 }
3042
3043                                 if (track->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
3044                                         error << string_compose (
3045                                                 _("cannot configure %1 in/%2 out configuration for new audio track"),
3046                                                 input_channels, output_channels)
3047                                               << endmsg;
3048                                         goto failed;
3049                                 }
3050                         }
3051
3052                         if (route_group) {
3053                                 route_group->add (track);
3054                         }
3055
3056                         track->non_realtime_input_change();
3057
3058                         track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this));
3059
3060                         new_routes.push_back (track);
3061                         ret.push_back (track);
3062                 }
3063
3064                 catch (failed_constructor &err) {
3065                         error << _("Session: could not create new audio track.") << endmsg;
3066                         goto failed;
3067                 }
3068
3069                 catch (AudioEngine::PortRegistrationFailure& pfe) {
3070
3071                         error << pfe.what() << endmsg;
3072                         goto failed;
3073                 }
3074
3075                 --how_many;
3076         }
3077
3078   failed:
3079         if (!new_routes.empty()) {
3080                 StateProtector sp (this);
3081                 if (Profile->get_trx()) {
3082                         add_routes (new_routes, false, false, false, order);
3083                 } else {
3084                         add_routes (new_routes, true, true, false, order);
3085                 }
3086         }
3087
3088         return ret;
3089 }
3090
3091 /** Caller must not hold process lock.
3092  *  @param name_template string to use for the start of the name, or "" to use "Bus".
3093  */
3094 RouteList
3095 Session::new_audio_route (int input_channels, int output_channels, RouteGroup* route_group, uint32_t how_many, string name_template,
3096                           PresentationInfo::Flag flags, PresentationInfo::order_t order)
3097 {
3098         string bus_name;
3099         uint32_t bus_id = 0;
3100         string port;
3101         RouteList ret;
3102
3103         bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("Bus");
3104
3105         while (how_many) {
3106                 if (!find_route_name (name_template.empty () ? _("Bus") : name_template, ++bus_id, bus_name, use_number)) {
3107                         error << "cannot find name for new audio bus" << endmsg;
3108                         goto failure;
3109                 }
3110
3111                 try {
3112                         boost::shared_ptr<Route> bus (new Route (*this, bus_name, flags, DataType::AUDIO));
3113
3114                         if (bus->init ()) {
3115                                 goto failure;
3116                         }
3117
3118                         if (Profile->get_mixbus ()) {
3119                                 bus->set_strict_io (true);
3120                         }
3121
3122                         BOOST_MARK_ROUTE(bus);
3123
3124                         {
3125                                 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
3126
3127                                 if (bus->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
3128                                         error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
3129                                                                  input_channels, output_channels)
3130                                               << endmsg;
3131                                         goto failure;
3132                                 }
3133
3134
3135                                 if (bus->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
3136                                         error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
3137                                                                  input_channels, output_channels)
3138                                               << endmsg;
3139                                         goto failure;
3140                                 }
3141                         }
3142
3143                         if (route_group) {
3144                                 route_group->add (bus);
3145                         }
3146
3147                         bus->add_internal_return ();
3148                         ret.push_back (bus);
3149                 }
3150
3151                 catch (failed_constructor &err) {
3152                         error << _("Session: could not create new audio route.") << endmsg;
3153                         goto failure;
3154                 }
3155
3156                 catch (AudioEngine::PortRegistrationFailure& pfe) {
3157                         error << pfe.what() << endmsg;
3158                         goto failure;
3159                 }
3160
3161
3162                 --how_many;
3163         }
3164
3165   failure:
3166         if (!ret.empty()) {
3167                 StateProtector sp (this);
3168                 if (Profile->get_trx()) {
3169                         add_routes (ret, false, false, false, order);
3170                 } else {
3171                         add_routes (ret, false, true, true, order); // autoconnect // outputs only
3172                 }
3173         }
3174
3175         return ret;
3176
3177 }
3178
3179 RouteList
3180 Session::new_route_from_template (uint32_t how_many, PresentationInfo::order_t insert_at, const std::string& template_path, const std::string& name_base,
3181                                   PlaylistDisposition pd)
3182 {
3183         XMLTree tree;
3184
3185         if (!tree.read (template_path.c_str())) {
3186                 return RouteList();
3187         }
3188
3189         return new_route_from_template (how_many, insert_at, *tree.root(), name_base, pd);
3190 }
3191
3192 RouteList
3193 Session::new_route_from_template (uint32_t how_many, PresentationInfo::order_t insert_at, XMLNode& node, const std::string& name_base, PlaylistDisposition pd)
3194 {
3195         RouteList ret;
3196         uint32_t number = 0;
3197         const uint32_t being_added = how_many;
3198         /* This will prevent the use of any existing XML-provided PBD::ID
3199            values by Stateful.
3200         */
3201         Stateful::ForceIDRegeneration force_ids;
3202         IO::disable_connecting ();
3203
3204         while (how_many) {
3205
3206                 /* We're going to modify the node contents a bit so take a
3207                  * copy. The node may be re-used when duplicating more than once.
3208                  */
3209
3210                 XMLNode node_copy (node);
3211
3212                 try {
3213                         string name;
3214
3215                         if (!name_base.empty()) {
3216
3217                                 /* if we're adding more than one routes, force
3218                                  * all the names of the new routes to be
3219                                  * numbered, via the final parameter.
3220                                  */
3221
3222                                 if (!find_route_name (name_base.c_str(), ++number, name, (being_added > 1))) {
3223                                         fatal << _("Session: UINT_MAX routes? impossible!") << endmsg;
3224                                         /*NOTREACHDE*/
3225                                 }
3226
3227                         } else {
3228
3229                                 string const route_name  = node_copy.property(X_("name"))->value ();
3230
3231                                 /* generate a new name by adding a number to the end of the template name */
3232                                 if (!find_route_name (route_name.c_str(), ++number, name, true)) {
3233                                         fatal << _("Session: UINT_MAX routes? impossible!") << endmsg;
3234                                         abort(); /*NOTREACHED*/
3235                                 }
3236                         }
3237
3238                         /* set this name in the XML description that we are about to use */
3239
3240                         bool rename_playlist;
3241                         switch (pd) {
3242                         case NewPlaylist:
3243                                 rename_playlist = true;
3244                                 break;
3245                         default:
3246                         case CopyPlaylist:
3247                         case SharePlaylist:
3248                                 rename_playlist = false;
3249                         }
3250
3251                         Route::set_name_in_state (node_copy, name, rename_playlist);
3252
3253                         /* trim bitslots from listen sends so that new ones are used */
3254                         XMLNodeList children = node_copy.children ();
3255                         for (XMLNodeList::iterator i = children.begin(); i != children.end(); ++i) {
3256                                 if ((*i)->name() == X_("Processor")) {
3257                                         /* ForceIDRegeneration does not catch the following */
3258                                         XMLProperty const * role = (*i)->property (X_("role"));
3259                                         XMLProperty const * type = (*i)->property (X_("type"));
3260                                         if (role && role->value() == X_("Aux")) {
3261                                                 /* check if the target bus exists.
3262                                                  * we should not save aux-sends in templates.
3263                                                  */
3264                                                 XMLProperty const * target = (*i)->property (X_("target"));
3265                                                 if (!target) {
3266                                                         (*i)->add_property ("type", "dangling-aux-send");
3267                                                         continue;
3268                                                 }
3269                                                 boost::shared_ptr<Route> r = route_by_id (target->value());
3270                                                 if (!r || boost::dynamic_pointer_cast<Track>(r)) {
3271                                                         (*i)->add_property ("type", "dangling-aux-send");
3272                                                         continue;
3273                                                 }
3274                                         }
3275                                         if (role && role->value() == X_("Listen")) {
3276                                                 (*i)->remove_property (X_("bitslot"));
3277                                         }
3278                                         else if (role && (role->value() == X_("Send") || role->value() == X_("Aux"))) {
3279                                                 char buf[32];
3280                                                 Delivery::Role xrole;
3281                                                 uint32_t bitslot = 0;
3282                                                 xrole = Delivery::Role (string_2_enum (role->value(), xrole));
3283                                                 std::string name = Send::name_and_id_new_send(*this, xrole, bitslot, false);
3284                                                 snprintf (buf, sizeof (buf), "%" PRIu32, bitslot);
3285                                                 (*i)->remove_property (X_("bitslot"));
3286                                                 (*i)->remove_property (X_("name"));
3287                                                 (*i)->add_property ("bitslot", buf);
3288                                                 (*i)->add_property ("name", name);
3289                                         }
3290                                         else if (type && type->value() == X_("intreturn")) {
3291                                                 (*i)->remove_property (X_("bitslot"));
3292                                                 (*i)->add_property ("ignore-bitslot", "1");
3293                                         }
3294                                         else if (type && type->value() == X_("return")) {
3295                                                 // Return::set_state() generates a new one
3296                                                 (*i)->remove_property (X_("bitslot"));
3297                                         }
3298                                         else if (type && type->value() == X_("port")) {
3299                                                 // PortInsert::set_state() handles the bitslot
3300                                                 (*i)->remove_property (X_("bitslot"));
3301                                                 (*i)->add_property ("ignore-name", "1");
3302                                         }
3303                                 }
3304                         }
3305
3306                         boost::shared_ptr<Route> route (XMLRouteFactory (node_copy, 3000));
3307
3308                         if (route == 0) {
3309                                 error << _("Session: cannot create track/bus from template description") << endmsg;
3310                                 goto out;
3311                         }
3312
3313                         if (boost::dynamic_pointer_cast<Track>(route)) {
3314                                 /* force input/output change signals so that the new diskstream
3315                                    picks up the configuration of the route. During session
3316                                    loading this normally happens in a different way.
3317                                 */
3318
3319                                 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
3320
3321                                 IOChange change (IOChange::Type (IOChange::ConfigurationChanged | IOChange::ConnectionsChanged));
3322                                 change.after = route->input()->n_ports();
3323                                 route->input()->changed (change, this);
3324                                 change.after = route->output()->n_ports();
3325                                 route->output()->changed (change, this);
3326                         }
3327
3328                         boost::shared_ptr<Track> track;
3329
3330                         if ((track = boost::dynamic_pointer_cast<Track> (route))) {
3331                                 switch (pd) {
3332                                 case NewPlaylist:
3333                                         track->use_new_playlist ();
3334                                         break;
3335                                 case CopyPlaylist:
3336                                         track->use_copy_playlist ();
3337                                         break;
3338                                 case SharePlaylist:
3339                                         break;
3340                                 }
3341                         };
3342
3343                         ret.push_back (route);
3344                 }
3345
3346                 catch (failed_constructor &err) {
3347                         error << _("Session: could not create new route from template") << endmsg;
3348                         goto out;
3349                 }
3350
3351                 catch (AudioEngine::PortRegistrationFailure& pfe) {
3352                         error << pfe.what() << endmsg;
3353                         goto out;
3354                 }
3355
3356                 --how_many;
3357         }
3358
3359   out:
3360         if (!ret.empty()) {
3361                 StateProtector sp (this);
3362                 if (Profile->get_trx()) {
3363                         add_routes (ret, false, false, false, insert_at);
3364                 } else {
3365                         add_routes (ret, true, true, false, insert_at);
3366                 }
3367                 IO::enable_connecting ();
3368         }
3369
3370         return ret;
3371 }
3372
3373 void
3374 Session::add_routes (RouteList& new_routes, bool input_auto_connect, bool output_auto_connect, bool save, PresentationInfo::order_t order)
3375 {
3376         try {
3377                 PBD::Unwinder<bool> aip (_adding_routes_in_progress, true);
3378                 add_routes_inner (new_routes, input_auto_connect, output_auto_connect, order);
3379
3380         } catch (...) {
3381                 error << _("Adding new tracks/busses failed") << endmsg;
3382         }
3383
3384         graph_reordered ();
3385
3386         update_latency (true);
3387         update_latency (false);
3388
3389         set_dirty();
3390
3391         if (save) {
3392                 save_state (_current_snapshot_name);
3393         }
3394
3395         update_route_record_state ();
3396
3397         RouteAdded (new_routes); /* EMIT SIGNAL */
3398 }
3399
3400 void
3401 Session::add_routes_inner (RouteList& new_routes, bool input_auto_connect, bool output_auto_connect, PresentationInfo::order_t order)
3402 {
3403         ChanCount existing_inputs;
3404         ChanCount existing_outputs;
3405         uint32_t n_routes;
3406         uint32_t added = 0;
3407
3408         count_existing_track_channels (existing_inputs, existing_outputs);
3409
3410         {
3411                 RCUWriter<RouteList> writer (routes);
3412                 boost::shared_ptr<RouteList> r = writer.get_copy ();
3413                 r->insert (r->end(), new_routes.begin(), new_routes.end());
3414                 n_routes = r->size();
3415
3416                 /* if there is no control out and we're not in the middle of loading,
3417                  * resort the graph here. if there is a control out, we will resort
3418                  * toward the end of this method. if we are in the middle of loading,
3419                  * we will resort when done.
3420                  */
3421
3422                 if (!_monitor_out && IO::connecting_legal) {
3423                         resort_routes_using (r);
3424                 }
3425         }
3426
3427         DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("ensure order gap starting at %1 for %2\n", order, new_routes.size()));
3428         ensure_route_presentation_info_gap (order, new_routes.size());
3429
3430         for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x, ++added) {
3431
3432                 boost::weak_ptr<Route> wpr (*x);
3433                 boost::shared_ptr<Route> r (*x);
3434
3435                 r->solo_control()->Changed.connect_same_thread (*this, boost::bind (&Session::route_solo_changed, this, _1, _2,wpr));
3436                 r->solo_isolate_control()->Changed.connect_same_thread (*this, boost::bind (&Session::route_solo_isolated_changed, this, wpr));
3437                 r->mute_control()->Changed.connect_same_thread (*this, boost::bind (&Session::route_mute_changed, this));
3438
3439                 r->output()->changed.connect_same_thread (*this, boost::bind (&Session::set_worst_io_latencies_x, this, _1, _2));
3440                 r->processors_changed.connect_same_thread (*this, boost::bind (&Session::route_processors_changed, this, _1));
3441                 r->processor_latency_changed.connect_same_thread (*this, boost::bind (&Session::queue_latency_recompute, this));
3442
3443                 if (r->is_master()) {
3444                         _master_out = r;
3445                 }
3446
3447                 if (r->is_monitor()) {
3448                         _monitor_out = r;
3449                 }
3450
3451                 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (r);
3452                 if (tr) {
3453                         tr->PlaylistChanged.connect_same_thread (*this, boost::bind (&Session::track_playlist_changed, this, boost::weak_ptr<Track> (tr)));
3454                         track_playlist_changed (boost::weak_ptr<Track> (tr));
3455                         tr->rec_enable_control()->Changed.connect_same_thread (*this, boost::bind (&Session::update_route_record_state, this));
3456
3457                         boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (tr);
3458                         if (mt) {
3459                                 mt->StepEditStatusChange.connect_same_thread (*this, boost::bind (&Session::step_edit_status_change, this, _1));
3460                                 mt->output()->changed.connect_same_thread (*this, boost::bind (&Session::midi_output_change_handler, this, _1, _2, boost::weak_ptr<Route>(mt)));
3461                                 mt->presentation_info().PropertyChanged.connect_same_thread (*this, boost::bind (&Session::midi_track_presentation_info_changed, this, _1, boost::weak_ptr<MidiTrack>(mt)));
3462                         }
3463                 }
3464
3465                 if (!r->presentation_info().special()) {
3466
3467                         DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("checking PI state for %1\n", r->name()));
3468
3469                         /* presentation info order may already have been set from XML */
3470
3471                         if (!r->presentation_info().order_set()) {
3472
3473                                 if (order == PresentationInfo::max_order) {
3474                                         /* just add to the end */
3475                                         r->set_presentation_order (n_routes + added, false);
3476                                         DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("group order not set, set to NR %1 + %2 = %3\n", n_routes, added, n_routes + added));
3477                                 } else {
3478                                         r->set_presentation_order (order + added);
3479                                         DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("group order not set, set to %1 + %2 = %3\n", order, added, order + added));
3480                                 }
3481                         } else {
3482                                 DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("group order already set to %1\n", r->presentation_info().order()));
3483                         }
3484                 }
3485
3486 #if !defined(__APPLE__) && !defined(__FreeBSD__)
3487                 /* clang complains: 'operator<<' should be declared prior to the call site or in an associated namespace of one of its
3488                  * arguments std::ostream& operator<<(std::ostream& o, ARDOUR::PresentationInfo const& rid)"
3489                  */
3490                 DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("added route %1, group order %2 type %3 (summary: %4)\n",
3491                                                                r->name(),
3492                                                                r->presentation_info().order(),
3493                                                                enum_2_string (r->presentation_info().flags()),
3494                                                                r->presentation_info()));
3495 #endif
3496
3497
3498                 if (input_auto_connect || output_auto_connect) {
3499                         auto_connect_route (r, input_auto_connect, ChanCount (), ChanCount (), existing_inputs, existing_outputs);
3500                         existing_inputs += r->n_inputs();
3501                         existing_outputs += r->n_outputs();
3502                 }
3503
3504                 ARDOUR::GUIIdle ();
3505         }
3506
3507         if (_monitor_out && IO::connecting_legal) {
3508                 Glib::Threads::Mutex::Lock lm (_engine.process_lock());
3509
3510                 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) {
3511                         if ((*x)->is_monitor()) {
3512                                 /* relax */
3513                         } else if ((*x)->is_master()) {
3514                                 /* relax */
3515                         } else {
3516                                 (*x)->enable_monitor_send ();
3517                         }
3518                 }
3519         }
3520
3521         reassign_track_numbers ();
3522 }
3523
3524 void
3525 Session::globally_set_send_gains_to_zero (boost::shared_ptr<Route> dest)
3526 {
3527         boost::shared_ptr<RouteList> r = routes.reader ();
3528         boost::shared_ptr<Send> s;
3529
3530         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3531                 if ((s = (*i)->internal_send_for (dest)) != 0) {
3532                         s->amp()->gain_control()->set_value (GAIN_COEFF_ZERO, Controllable::NoGroup);
3533                 }
3534         }
3535 }
3536
3537 void
3538 Session::globally_set_send_gains_to_unity (boost::shared_ptr<Route> dest)
3539 {
3540         boost::shared_ptr<RouteList> r = routes.reader ();
3541         boost::shared_ptr<Send> s;
3542
3543         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3544                 if ((s = (*i)->internal_send_for (dest)) != 0) {
3545                         s->amp()->gain_control()->set_value (GAIN_COEFF_UNITY, Controllable::NoGroup);
3546                 }
3547         }
3548 }
3549
3550 void
3551 Session::globally_set_send_gains_from_track(boost::shared_ptr<Route> dest)
3552 {
3553         boost::shared_ptr<RouteList> r = routes.reader ();
3554         boost::shared_ptr<Send> s;
3555
3556         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3557                 if ((s = (*i)->internal_send_for (dest)) != 0) {
3558                         s->amp()->gain_control()->set_value ((*i)->gain_control()->get_value(), Controllable::NoGroup);
3559                 }
3560         }
3561 }
3562
3563 /** @param include_buses true to add sends to buses and tracks, false for just tracks */
3564 void
3565 Session::globally_add_internal_sends (boost::shared_ptr<Route> dest, Placement p, bool include_buses)
3566 {
3567         boost::shared_ptr<RouteList> r = routes.reader ();
3568         boost::shared_ptr<RouteList> t (new RouteList);
3569
3570         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3571                 /* no MIDI sends because there are no MIDI busses yet */
3572                 if (include_buses || boost::dynamic_pointer_cast<AudioTrack>(*i)) {
3573                         t->push_back (*i);
3574                 }
3575         }
3576
3577         add_internal_sends (dest, p, t);
3578 }
3579
3580 void
3581 Session::add_internal_sends (boost::shared_ptr<Route> dest, Placement p, boost::shared_ptr<RouteList> senders)
3582 {
3583         for (RouteList::iterator i = senders->begin(); i != senders->end(); ++i) {
3584                 add_internal_send (dest, (*i)->before_processor_for_placement (p), *i);
3585         }
3586 }
3587
3588 void
3589 Session::add_internal_send (boost::shared_ptr<Route> dest, int index, boost::shared_ptr<Route> sender)
3590 {
3591         add_internal_send (dest, sender->before_processor_for_index (index), sender);
3592 }
3593
3594 void
3595 Session::add_internal_send (boost::shared_ptr<Route> dest, boost::shared_ptr<Processor> before, boost::shared_ptr<Route> sender)
3596 {
3597         if (sender->is_monitor() || sender->is_master() || sender == dest || dest->is_monitor() || dest->is_master()) {
3598                 return;
3599         }
3600
3601         if (!dest->internal_return()) {
3602                 dest->add_internal_return ();
3603         }
3604
3605         sender->add_aux_send (dest, before);
3606
3607         graph_reordered ();
3608 }
3609
3610 void
3611 Session::remove_routes (boost::shared_ptr<RouteList> routes_to_remove)
3612 {
3613         { // RCU Writer scope
3614                 PBD::Unwinder<bool> uw_flag (_route_deletion_in_progress, true);
3615                 RCUWriter<RouteList> writer (routes);
3616                 boost::shared_ptr<RouteList> rs = writer.get_copy ();
3617
3618
3619                 for (RouteList::iterator iter = routes_to_remove->begin(); iter != routes_to_remove->end(); ++iter) {
3620
3621                         if (*iter == _master_out) {
3622                                 continue;
3623                         }
3624
3625                         (*iter)->solo_control()->set_value (0.0, Controllable::NoGroup);
3626
3627                         rs->remove (*iter);
3628
3629                         /* deleting the master out seems like a dumb
3630                            idea, but its more of a UI policy issue
3631                            than our concern.
3632                         */
3633
3634                         if (*iter == _master_out) {
3635                                 _master_out = boost::shared_ptr<Route> ();
3636                         }
3637
3638                         if (*iter == _monitor_out) {
3639                                 _monitor_out.reset ();
3640                         }
3641
3642                         // We need to disconnect the route's inputs and outputs
3643
3644                         (*iter)->input()->disconnect (0);
3645                         (*iter)->output()->disconnect (0);
3646
3647                         /* if the route had internal sends sending to it, remove them */
3648                         if ((*iter)->internal_return()) {
3649
3650                                 boost::shared_ptr<RouteList> r = routes.reader ();
3651                                 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3652                                         boost::shared_ptr<Send> s = (*i)->internal_send_for (*iter);
3653                                         if (s) {
3654                                                 (*i)->remove_processor (s);
3655                                         }
3656                                 }
3657                         }
3658
3659                         /* if the monitoring section had a pointer to this route, remove it */
3660                         if (_monitor_out && !(*iter)->is_master() && !(*iter)->is_monitor()) {
3661                                 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
3662                                 PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
3663                                 (*iter)->remove_aux_or_listen (_monitor_out);
3664                         }
3665
3666                         boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*iter);
3667                         if (mt && mt->step_editing()) {
3668                                 if (_step_editors > 0) {
3669                                         _step_editors--;
3670                                 }
3671                         }
3672                 }
3673
3674                 /* writer goes out of scope, forces route list update */
3675
3676         } // end of RCU Writer scope
3677
3678         update_route_solo_state ();
3679         update_latency_compensation ();
3680         set_dirty();
3681
3682         /* Re-sort routes to remove the graph's current references to the one that is
3683          * going away, then flush old references out of the graph.
3684          * Wave Tracks: reconnect routes
3685          */
3686
3687 #ifdef USE_TRACKS_CODE_FEATURES
3688                 reconnect_existing_routes(true, false);
3689 #else
3690                 routes.flush (); // maybe unsafe, see below.
3691                 resort_routes ();
3692 #endif
3693
3694         if (_process_graph && !(_state_of_the_state & Deletion)) {
3695                 _process_graph->clear_other_chain ();
3696         }
3697
3698         /* get rid of it from the dead wood collection in the route list manager */
3699         /* XXX i think this is unsafe as it currently stands, but i am not sure. (pd, october 2nd, 2006) */
3700
3701         routes.flush ();
3702
3703         /* try to cause everyone to drop their references
3704          * and unregister ports from the backend
3705          */
3706
3707         for (RouteList::iterator iter = routes_to_remove->begin(); iter != routes_to_remove->end(); ++iter) {
3708                 cerr << "Drop references to " << (*iter)->name() << endl;
3709                 (*iter)->drop_references ();
3710         }
3711
3712         if (_state_of_the_state & Deletion) {
3713                 return;
3714         }
3715
3716         PresentationInfo::Change(); /* EMIT SIGNAL */
3717
3718         /* save the new state of the world */
3719
3720         if (save_state (_current_snapshot_name)) {
3721                 save_history (_current_snapshot_name);
3722         }
3723
3724         update_route_record_state ();
3725 }
3726
3727 void
3728 Session::remove_route (boost::shared_ptr<Route> route)
3729 {
3730         boost::shared_ptr<RouteList> rl (new RouteList);
3731         rl->push_back (route);
3732         remove_routes (rl);
3733 }
3734
3735 void
3736 Session::route_mute_changed ()
3737 {
3738         set_dirty ();
3739 }
3740
3741 void
3742 Session::route_listen_changed (Controllable::GroupControlDisposition group_override, boost::weak_ptr<Route> wpr)
3743 {
3744         boost::shared_ptr<Route> route (wpr.lock());
3745
3746         if (!route) {
3747                 return;
3748         }
3749
3750         assert (Config->get_solo_control_is_listen_control());
3751
3752         if (route->solo_control()->soloed_by_self_or_masters()) {
3753
3754                 if (Config->get_exclusive_solo()) {
3755
3756                         RouteGroup* rg = route->route_group ();
3757                         const bool group_already_accounted_for = (group_override == Controllable::ForGroup);
3758
3759                         boost::shared_ptr<RouteList> r = routes.reader ();
3760
3761                         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3762                                 if ((*i) == route) {
3763                                         /* already changed */
3764                                         continue;
3765                                 }
3766
3767                                 if ((*i)->solo_isolate_control()->solo_isolated() || !(*i)->can_solo()) {
3768                                         /* route does not get solo propagated to it */
3769                                         continue;
3770                                 }
3771
3772                                 if ((group_already_accounted_for && (*i)->route_group() && (*i)->route_group() == rg)) {
3773                                         /* this route is a part of the same solo group as the route
3774                                          * that was changed. Changing that route did change or will
3775                                          * change all group members appropriately, so we can ignore it
3776                                          * here
3777                                          */
3778                                         continue;
3779                                 }
3780                                 (*i)->solo_control()->set_value (0.0, Controllable::NoGroup);
3781                         }
3782                 }
3783
3784                 _listen_cnt++;
3785
3786         } else if (_listen_cnt > 0) {
3787
3788                 _listen_cnt--;
3789         }
3790
3791         update_route_solo_state ();
3792 }
3793
3794 void
3795 Session::route_solo_isolated_changed (boost::weak_ptr<Route> wpr)
3796 {
3797         boost::shared_ptr<Route> route (wpr.lock());
3798
3799         if (!route) {
3800                 return;
3801         }
3802
3803         bool send_changed = false;
3804
3805         if (route->solo_isolate_control()->solo_isolated()) {
3806                 if (_solo_isolated_cnt == 0) {
3807                         send_changed = true;
3808                 }
3809                 _solo_isolated_cnt++;
3810         } else if (_solo_isolated_cnt > 0) {
3811                 _solo_isolated_cnt--;
3812                 if (_solo_isolated_cnt == 0) {
3813                         send_changed = true;
3814                 }
3815         }
3816
3817         if (send_changed) {
3818                 IsolatedChanged (); /* EMIT SIGNAL */
3819         }
3820 }
3821
3822 void
3823 Session::route_solo_changed (bool self_solo_changed, Controllable::GroupControlDisposition group_override,  boost::weak_ptr<Route> wpr)
3824 {
3825         DEBUG_TRACE (DEBUG::Solo, string_compose ("route solo change, self = %1\n", self_solo_changed));
3826
3827         boost::shared_ptr<Route> route (wpr.lock());
3828
3829         if (!route) {
3830                 return;
3831         }
3832
3833         if (Config->get_solo_control_is_listen_control()) {
3834                 route_listen_changed (group_override, wpr);
3835                 return;
3836         }
3837
3838         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()));
3839
3840         if (route->solo_control()->transitioned_into_solo() == 0) {
3841                 /* route solo changed by upstream/downstream; not interesting
3842                    to Session.
3843                 */
3844                 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()));
3845                 return;
3846         }
3847
3848         if (route->solo_control()->transitioned_into_solo() == 0) {
3849                 /* reason for being soloed changed (e.g. master went away, we
3850                  * took over the master state), but actual status did
3851                  * not. nothing to do.
3852                  */
3853                 DEBUG_TRACE (DEBUG::Solo, string_compose ("%1: solo change was change in reason, not status\n", route->name()));
3854         }
3855
3856         boost::shared_ptr<RouteList> r = routes.reader ();
3857         int32_t delta = route->solo_control()->transitioned_into_solo ();
3858
3859         /* the route may be a member of a group that has shared-solo
3860          * semantics. If so, then all members of that group should follow the
3861          * solo of the changed route. But ... this is optional, controlled by a
3862          * Controllable::GroupControlDisposition.
3863          *
3864          * The first argument to the signal that this method is connected to is the
3865          * GroupControlDisposition value that was used to change solo.
3866          *
3867          * If the solo change was done with group semantics (either InverseGroup
3868          * (force the entire group to change even if the group shared solo is
3869          * disabled) or UseGroup (use the group, which may or may not have the
3870          * shared solo property enabled)) then as we propagate the change to
3871          * the entire session we should IGNORE THE GROUP that the changed route
3872          * belongs to.
3873          */
3874
3875         RouteGroup* rg = route->route_group ();
3876         const bool group_already_accounted_for = (group_override == Controllable::ForGroup);
3877
3878         if (delta == 1 && Config->get_exclusive_solo()) {
3879
3880                 /* new solo: disable all other solos, but not the group if its solo-enabled */
3881
3882                 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3883
3884                         if ((*i) == route) {
3885                                 /* already changed */
3886                                 continue;
3887                         }
3888
3889                         if ((*i)->solo_isolate_control()->solo_isolated() || !(*i)->can_solo()) {
3890                                 /* route does not get solo propagated to it */
3891                                 continue;
3892                         }
3893
3894                         if ((group_already_accounted_for && (*i)->route_group() && (*i)->route_group() == rg)) {
3895                                 /* this route is a part of the same solo group as the route
3896                                  * that was changed. Changing that route did change or will
3897                                  * change all group members appropriately, so we can ignore it
3898                                  * here
3899                                  */
3900                                 continue;
3901                         }
3902
3903                         (*i)->solo_control()->set_value (0.0, group_override);
3904                 }
3905         }
3906
3907         DEBUG_TRACE (DEBUG::Solo, string_compose ("propagate solo change, delta = %1\n", delta));
3908
3909         RouteList uninvolved;
3910
3911         DEBUG_TRACE (DEBUG::Solo, string_compose ("%1\n", route->name()));
3912
3913         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3914                 bool via_sends_only;
3915                 bool in_signal_flow;
3916
3917                 if ((*i) == route) {
3918                         /* already changed */
3919                         continue;
3920                 }
3921
3922                 if ((*i)->solo_isolate_control()->solo_isolated() || !(*i)->can_solo()) {
3923                         /* route does not get solo propagated to it */
3924                         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(),
3925                                                                   (*i)->can_solo()));
3926                         continue;
3927                 }
3928
3929                 if ((group_already_accounted_for && (*i)->route_group() && (*i)->route_group() == rg)) {
3930                         /* this route is a part of the same solo group as the route
3931                          * that was changed. Changing that route did change or will
3932                          * change all group members appropriately, so we can ignore it
3933                          * here
3934                          */
3935                         continue;
3936                 }
3937
3938                 in_signal_flow = false;
3939
3940                 DEBUG_TRACE (DEBUG::Solo, string_compose ("check feed from %1\n", (*i)->name()));
3941
3942                 if ((*i)->feeds (route, &via_sends_only)) {
3943                         DEBUG_TRACE (DEBUG::Solo, string_compose ("\tthere is a feed from %1\n", (*i)->name()));
3944                         if (!via_sends_only) {
3945                                 if (!route->soloed_by_others_upstream()) {
3946                                         (*i)->solo_control()->mod_solo_by_others_downstream (delta);
3947                                 } else {
3948                                         DEBUG_TRACE (DEBUG::Solo, "\talready soloed by others upstream\n");
3949                                 }
3950                         } else {
3951                                 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tthere is a send-only feed from %1\n", (*i)->name()));
3952                         }
3953                         in_signal_flow = true;
3954                 } else {
3955                         DEBUG_TRACE (DEBUG::Solo, string_compose ("\tno feed from %1\n", (*i)->name()));
3956                 }
3957
3958                 DEBUG_TRACE (DEBUG::Solo, string_compose ("check feed to %1\n", (*i)->name()));
3959
3960                 if (route->feeds (*i, &via_sends_only)) {
3961                         /* propagate solo upstream only if routing other than
3962                            sends is involved, but do consider the other route
3963                            (*i) to be part of the signal flow even if only
3964                            sends are involved.
3965                         */
3966                         DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 feeds %2 via sends only %3 sboD %4 sboU %5\n",
3967                                                                   route->name(),
3968                                                                   (*i)->name(),
3969                                                                   via_sends_only,
3970                                                                   route->soloed_by_others_downstream(),
3971                                                                   route->soloed_by_others_upstream()));
3972                         if (!via_sends_only) {
3973                                 //NB. Triggers Invert Push, which handles soloed by downstream
3974                                 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tmod %1 by %2\n", (*i)->name(), delta));
3975                                 (*i)->solo_control()->mod_solo_by_others_upstream (delta);
3976                         } else {
3977                                 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tfeed to %1 ignored, sends-only\n", (*i)->name()));
3978                         }
3979                         in_signal_flow = true;
3980                 } else {
3981                         DEBUG_TRACE (DEBUG::Solo, "\tno feed to\n");
3982                 }
3983
3984                 if (!in_signal_flow) {
3985                         uninvolved.push_back (*i);
3986                 }
3987         }
3988
3989         DEBUG_TRACE (DEBUG::Solo, "propagation complete\n");
3990
3991         update_route_solo_state (r);
3992
3993         /* now notify that the mute state of the routes not involved in the signal
3994            pathway of the just-solo-changed route may have altered.
3995         */
3996
3997         for (RouteList::iterator i = uninvolved.begin(); i != uninvolved.end(); ++i) {
3998                 DEBUG_TRACE (DEBUG::Solo, string_compose ("mute change for %1, which neither feeds or is fed by %2\n", (*i)->name(), route->name()));
3999                 (*i)->act_on_mute ();
4000                 (*i)->mute_control()->Changed (false, Controllable::NoGroup);
4001         }
4002
4003         SoloChanged (); /* EMIT SIGNAL */
4004         set_dirty();
4005 }
4006
4007 void
4008 Session::update_route_solo_state (boost::shared_ptr<RouteList> r)
4009 {
4010         /* now figure out if anything that matters is soloed (or is "listening")*/
4011
4012         bool something_soloed = false;
4013         bool something_listening = false;
4014         uint32_t listeners = 0;
4015         uint32_t isolated = 0;
4016
4017         if (!r) {
4018                 r = routes.reader();
4019         }
4020
4021         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4022                 if ((*i)->can_solo()) {
4023                         if (Config->get_solo_control_is_listen_control()) {
4024                                 if ((*i)->self_soloed() || (*i)->solo_control()->get_masters_value()) {
4025                                         listeners++;
4026                                         something_listening = true;
4027                                 }
4028                         } else {
4029                                 (*i)->set_listen (false);
4030                                 if ((*i)->can_solo() && ((*i)->self_soloed() || (*i)->solo_control()->get_masters_value())) {
4031                                         something_soloed = true;
4032                                 }
4033                         }
4034                 }
4035
4036                 if ((*i)->solo_isolate_control()->solo_isolated()) {
4037                         isolated++;
4038                 }
4039         }
4040
4041         if (something_soloed != _non_soloed_outs_muted) {
4042                 _non_soloed_outs_muted = something_soloed;
4043                 SoloActive (_non_soloed_outs_muted); /* EMIT SIGNAL */
4044         }
4045
4046         if (something_listening != _listening) {
4047                 _listening = something_listening;
4048                 SoloActive (_listening);
4049         }
4050
4051         _listen_cnt = listeners;
4052
4053         if (isolated != _solo_isolated_cnt) {
4054                 _solo_isolated_cnt = isolated;
4055                 IsolatedChanged (); /* EMIT SIGNAL */
4056         }
4057
4058         DEBUG_TRACE (DEBUG::Solo, string_compose ("solo state updated by session, soloed? %1 listeners %2 isolated %3\n",
4059                                                   something_soloed, listeners, isolated));
4060 }
4061
4062 void
4063 Session::get_stripables (StripableList& sl) const
4064 {
4065         boost::shared_ptr<RouteList> r = routes.reader ();
4066         sl.insert (sl.end(), r->begin(), r->end());
4067
4068         VCAList v = _vca_manager->vcas ();
4069         sl.insert (sl.end(), v.begin(), v.end());
4070 }
4071
4072 boost::shared_ptr<RouteList>
4073 Session::get_routes_with_internal_returns() const
4074 {
4075         boost::shared_ptr<RouteList> r = routes.reader ();
4076         boost::shared_ptr<RouteList> rl (new RouteList);
4077
4078         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4079                 if ((*i)->internal_return ()) {
4080                         rl->push_back (*i);
4081                 }
4082         }
4083         return rl;
4084 }
4085
4086 bool
4087 Session::io_name_is_legal (const std::string& name) const
4088 {
4089         boost::shared_ptr<RouteList> r = routes.reader ();
4090
4091         for (vector<string>::const_iterator reserved = reserved_io_names.begin(); reserved != reserved_io_names.end(); ++reserved) {
4092                 if (name == *reserved) {
4093                         if (!route_by_name (*reserved)) {
4094                                 /* first instance of a reserved name is allowed */
4095                                 return true;
4096                         }
4097                         /* all other instances of a reserved name are not allowed */
4098                         return false;
4099                 }
4100         }
4101
4102         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4103                 if ((*i)->name() == name) {
4104                         return false;
4105                 }
4106
4107                 if ((*i)->has_io_processor_named (name)) {
4108                         return false;
4109                 }
4110         }
4111
4112         return true;
4113 }
4114
4115 void
4116 Session::set_exclusive_input_active (boost::shared_ptr<RouteList> rl, bool onoff, bool flip_others)
4117 {
4118         RouteList rl2;
4119         vector<string> connections;
4120
4121         /* if we are passed only a single route and we're not told to turn
4122          * others off, then just do the simple thing.
4123          */
4124
4125         if (flip_others == false && rl->size() == 1) {
4126                 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (rl->front());
4127                 if (mt) {
4128                         mt->set_input_active (onoff);
4129                         return;
4130                 }
4131         }
4132
4133         for (RouteList::iterator rt = rl->begin(); rt != rl->end(); ++rt) {
4134
4135                 PortSet& ps ((*rt)->input()->ports());
4136
4137                 for (PortSet::iterator p = ps.begin(); p != ps.end(); ++p) {
4138                         p->get_connections (connections);
4139                 }
4140
4141                 for (vector<string>::iterator s = connections.begin(); s != connections.end(); ++s) {
4142                         routes_using_input_from (*s, rl2);
4143                 }
4144
4145                 /* scan all relevant routes to see if others are on or off */
4146
4147                 bool others_are_already_on = false;
4148
4149                 for (RouteList::iterator r = rl2.begin(); r != rl2.end(); ++r) {
4150
4151                         boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*r);
4152
4153                         if (!mt) {
4154                                 continue;
4155                         }
4156
4157                         if ((*r) != (*rt)) {
4158                                 if (mt->input_active()) {
4159                                         others_are_already_on = true;
4160                                 }
4161                         } else {
4162                                 /* this one needs changing */
4163                                 mt->set_input_active (onoff);
4164                         }
4165                 }
4166
4167                 if (flip_others) {
4168
4169                         /* globally reverse other routes */
4170
4171                         for (RouteList::iterator r = rl2.begin(); r != rl2.end(); ++r) {
4172                                 if ((*r) != (*rt)) {
4173                                         boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*r);
4174                                         if (mt) {
4175                                                 mt->set_input_active (!others_are_already_on);
4176                                         }
4177                                 }
4178                         }
4179                 }
4180         }
4181 }
4182
4183 void
4184 Session::routes_using_input_from (const string& str, RouteList& rl)
4185 {
4186         boost::shared_ptr<RouteList> r = routes.reader();
4187
4188         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4189                 if ((*i)->input()->connected_to (str)) {
4190                         rl.push_back (*i);
4191                 }
4192         }
4193 }
4194
4195 boost::shared_ptr<Route>
4196 Session::route_by_name (string name) const
4197 {
4198         boost::shared_ptr<RouteList> r = routes.reader ();
4199
4200         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4201                 if ((*i)->name() == name) {
4202                         return *i;
4203                 }
4204         }
4205
4206         return boost::shared_ptr<Route> ((Route*) 0);
4207 }
4208
4209 boost::shared_ptr<Route>
4210 Session::route_by_id (PBD::ID id) const
4211 {
4212         boost::shared_ptr<RouteList> r = routes.reader ();
4213
4214         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4215                 if ((*i)->id() == id) {
4216                         return *i;
4217                 }
4218         }
4219
4220         return boost::shared_ptr<Route> ((Route*) 0);
4221 }
4222
4223 boost::shared_ptr<Processor>
4224 Session::processor_by_id (PBD::ID id) const
4225 {
4226         boost::shared_ptr<RouteList> r = routes.reader ();
4227
4228         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4229                 boost::shared_ptr<Processor> p = (*i)->Route::processor_by_id (id);
4230                 if (p) {
4231                         return p;
4232                 }
4233         }
4234
4235         return boost::shared_ptr<Processor> ();
4236 }
4237
4238 boost::shared_ptr<Track>
4239 Session::track_by_diskstream_id (PBD::ID id) const
4240 {
4241         boost::shared_ptr<RouteList> r = routes.reader ();
4242
4243         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4244                 boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> (*i);
4245                 if (t && t->using_diskstream_id (id)) {
4246                         return t;
4247                 }
4248         }
4249
4250         return boost::shared_ptr<Track> ();
4251 }
4252
4253 boost::shared_ptr<Route>
4254 Session::get_remote_nth_route (PresentationInfo::order_t n) const
4255 {
4256         return boost::dynamic_pointer_cast<Route> (get_remote_nth_stripable (n, PresentationInfo::Route));
4257 }
4258
4259 boost::shared_ptr<Stripable>
4260 Session::get_remote_nth_stripable (PresentationInfo::order_t n, PresentationInfo::Flag flags) const
4261 {
4262         StripableList sl;
4263         PresentationInfo::order_t match_cnt = 0;
4264
4265         get_stripables (sl);
4266         sl.sort (Stripable::PresentationOrderSorter());
4267
4268         for (StripableList::const_iterator s = sl.begin(); s != sl.end(); ++s) {
4269
4270                 if ((*s)->presentation_info().hidden()) {
4271                         /* if the caller didn't explicitly ask for hidden
4272                            stripables, ignore hidden ones. This matches
4273                            the semantics of the pre-PresentationOrder
4274                            "get by RID" logic of Ardour 4.x and earlier.
4275
4276                            XXX at some point we should likely reverse
4277                            the logic of the flags, because asking for "the
4278                            hidden stripables" is not going to be common,
4279                            whereas asking for visible ones is normal.
4280                         */
4281
4282                         if (! (flags & PresentationInfo::Hidden)) {
4283                                 continue;
4284                         }
4285                 }
4286
4287                 if ((*s)->presentation_info().flag_match (flags)) {
4288                         if (match_cnt++ == n) {
4289                                 return *s;
4290                         }
4291                 }
4292         }
4293
4294         /* there is no nth stripable that matches the given flags */
4295         return boost::shared_ptr<Stripable>();
4296 }
4297
4298 boost::shared_ptr<Route>
4299 Session::route_by_selected_count (uint32_t id) const
4300 {
4301         boost::shared_ptr<RouteList> r = routes.reader ();
4302
4303         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4304                 /* NOT IMPLEMENTED */
4305         }
4306
4307         return boost::shared_ptr<Route> ((Route*) 0);
4308 }
4309
4310 struct PresentationOrderSorter {
4311         bool operator() (boost::shared_ptr<Stripable> a, boost::shared_ptr<Stripable> b) {
4312                 if (a->presentation_info().special() && !b->presentation_info().special()) {
4313                         /* a is not ordered, b is; b comes before a */
4314                         return false;
4315                 } else if (!b->presentation_info().order_set() && a->presentation_info().order_set()) {
4316                         /* b is not ordered, a is; a comes before b */
4317                         return true;
4318                 } else {
4319                         return a->presentation_info().order() < b->presentation_info().order();
4320                 }
4321         }
4322 };
4323
4324 void
4325 Session::reassign_track_numbers ()
4326 {
4327         int64_t tn = 0;
4328         int64_t bn = 0;
4329         RouteList r (*(routes.reader ()));
4330         PresentationOrderSorter sorter;
4331         r.sort (sorter);
4332
4333         StateProtector sp (this);
4334
4335         for (RouteList::iterator i = r.begin(); i != r.end(); ++i) {
4336                 if (boost::dynamic_pointer_cast<Track> (*i)) {
4337                         (*i)->set_track_number(++tn);
4338                 }
4339                 else if (!(*i)->is_master() && !(*i)->is_monitor() && !(*i)->is_auditioner()) {
4340                         (*i)->set_track_number(--bn);
4341                 }
4342         }
4343         const uint32_t decimals = ceilf (log10f (tn + 1));
4344         const bool decimals_changed = _track_number_decimals != decimals;
4345         _track_number_decimals = decimals;
4346
4347         if (decimals_changed && config.get_track_name_number ()) {
4348                 for (RouteList::iterator i = r.begin(); i != r.end(); ++i) {
4349                         boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> (*i);
4350                         if (t) {
4351                                 t->resync_track_name();
4352                         }
4353                 }
4354                 // trigger GUI re-layout
4355                 config.ParameterChanged("track-name-number");
4356         }
4357
4358 #ifndef NDEBUG
4359         if (DEBUG_ENABLED(DEBUG::OrderKeys)) {
4360                 boost::shared_ptr<RouteList> rl = routes.reader ();
4361                 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
4362                         DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("%1 numbered %2\n", (*i)->name(), (*i)->track_number()));
4363                 }
4364         }
4365 #endif /* NDEBUG */
4366
4367 }
4368
4369 void
4370 Session::playlist_region_added (boost::weak_ptr<Region> w)
4371 {
4372         boost::shared_ptr<Region> r = w.lock ();
4373         if (!r) {
4374                 return;
4375         }
4376
4377         /* These are the operations that are currently in progress... */
4378         list<GQuark> curr = _current_trans_quarks;
4379         curr.sort ();
4380
4381         /* ...and these are the operations during which we want to update
4382            the session range location markers.
4383         */
4384         list<GQuark> ops;
4385         ops.push_back (Operations::capture);
4386         ops.push_back (Operations::paste);
4387         ops.push_back (Operations::duplicate_region);
4388         ops.push_back (Operations::insert_file);
4389         ops.push_back (Operations::insert_region);
4390         ops.push_back (Operations::drag_region_brush);
4391         ops.push_back (Operations::region_drag);
4392         ops.push_back (Operations::selection_grab);
4393         ops.push_back (Operations::region_fill);
4394         ops.push_back (Operations::fill_selection);
4395         ops.push_back (Operations::create_region);
4396         ops.push_back (Operations::region_copy);
4397         ops.push_back (Operations::fixed_time_region_copy);
4398         ops.sort ();
4399
4400         /* See if any of the current operations match the ones that we want */
4401         list<GQuark> in;
4402         set_intersection (_current_trans_quarks.begin(), _current_trans_quarks.end(), ops.begin(), ops.end(), back_inserter (in));
4403
4404         /* If so, update the session range markers */
4405         if (!in.empty ()) {
4406                 maybe_update_session_range (r->position (), r->last_frame ());
4407         }
4408 }
4409
4410 /** Update the session range markers if a is before the current start or
4411  *  b is after the current end.
4412  */
4413 void
4414 Session::maybe_update_session_range (framepos_t a, framepos_t b)
4415 {
4416         if (_state_of_the_state & Loading) {
4417                 return;
4418         }
4419
4420         framepos_t session_end_marker_shift_samples = session_end_shift * _nominal_frame_rate;
4421
4422         if (_session_range_location == 0) {
4423
4424                 set_session_range_location (a, b + session_end_marker_shift_samples);
4425
4426         } else {
4427
4428                 if (a < _session_range_location->start()) {
4429                         _session_range_location->set_start (a);
4430                 }
4431
4432                 if (_session_range_end_is_free && (b > _session_range_location->end())) {
4433                         _session_range_location->set_end (b);
4434                 }
4435         }
4436 }
4437
4438 void
4439 Session::set_end_is_free (bool yn)
4440 {
4441         _session_range_end_is_free = yn;
4442 }
4443
4444 void
4445 Session::playlist_ranges_moved (list<Evoral::RangeMove<framepos_t> > const & ranges)
4446 {
4447         for (list<Evoral::RangeMove<framepos_t> >::const_iterator i = ranges.begin(); i != ranges.end(); ++i) {
4448                 maybe_update_session_range (i->to, i->to + i->length);
4449         }
4450 }
4451
4452 void
4453 Session::playlist_regions_extended (list<Evoral::Range<framepos_t> > const & ranges)
4454 {
4455         for (list<Evoral::Range<framepos_t> >::const_iterator i = ranges.begin(); i != ranges.end(); ++i) {
4456                 maybe_update_session_range (i->from, i->to);
4457         }
4458 }
4459
4460 /* Region management */
4461
4462 boost::shared_ptr<Region>
4463 Session::find_whole_file_parent (boost::shared_ptr<Region const> child) const
4464 {
4465         const RegionFactory::RegionMap& regions (RegionFactory::regions());
4466         RegionFactory::RegionMap::const_iterator i;
4467         boost::shared_ptr<Region> region;
4468
4469         Glib::Threads::Mutex::Lock lm (region_lock);
4470
4471         for (i = regions.begin(); i != regions.end(); ++i) {
4472
4473                 region = i->second;
4474
4475                 if (region->whole_file()) {
4476
4477                         if (child->source_equivalent (region)) {
4478                                 return region;
4479                         }
4480                 }
4481         }
4482
4483         return boost::shared_ptr<Region> ();
4484 }
4485
4486 int
4487 Session::destroy_sources (list<boost::shared_ptr<Source> > srcs)
4488 {
4489         set<boost::shared_ptr<Region> > relevant_regions;
4490
4491         for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ++s) {
4492                 RegionFactory::get_regions_using_source (*s, relevant_regions);
4493         }
4494
4495         for (set<boost::shared_ptr<Region> >::iterator r = relevant_regions.begin(); r != relevant_regions.end(); ) {
4496                 set<boost::shared_ptr<Region> >::iterator tmp;
4497
4498                 tmp = r;
4499                 ++tmp;
4500
4501                 playlists->destroy_region (*r);
4502                 RegionFactory::map_remove (*r);
4503
4504                 (*r)->drop_sources ();
4505                 (*r)->drop_references ();
4506
4507                 relevant_regions.erase (r);
4508
4509                 r = tmp;
4510         }
4511
4512         for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ) {
4513
4514                 {
4515                         Glib::Threads::Mutex::Lock ls (source_lock);
4516                         /* remove from the main source list */
4517                         sources.erase ((*s)->id());
4518                 }
4519
4520                 (*s)->mark_for_remove ();
4521                 (*s)->drop_references ();
4522
4523                 s = srcs.erase (s);
4524         }
4525
4526         return 0;
4527 }
4528
4529 int
4530 Session::remove_last_capture ()
4531 {
4532         list<boost::shared_ptr<Source> > srcs;
4533
4534         boost::shared_ptr<RouteList> rl = routes.reader ();
4535         for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
4536                 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4537                 if (!tr) {
4538                         continue;
4539                 }
4540
4541                 list<boost::shared_ptr<Source> >& l = tr->last_capture_sources();
4542
4543                 if (!l.empty()) {
4544                         srcs.insert (srcs.end(), l.begin(), l.end());
4545                         l.clear ();
4546                 }
4547         }
4548
4549         destroy_sources (srcs);
4550
4551         save_state (_current_snapshot_name);
4552
4553         return 0;
4554 }
4555
4556 /* Source Management */
4557
4558 void
4559 Session::add_source (boost::shared_ptr<Source> source)
4560 {
4561         pair<SourceMap::key_type, SourceMap::mapped_type> entry;
4562         pair<SourceMap::iterator,bool> result;
4563
4564         entry.first = source->id();
4565         entry.second = source;
4566
4567         {
4568                 Glib::Threads::Mutex::Lock lm (source_lock);
4569                 result = sources.insert (entry);
4570         }
4571
4572         if (result.second) {
4573
4574                 /* yay, new source */
4575
4576                 boost::shared_ptr<FileSource> fs = boost::dynamic_pointer_cast<FileSource> (source);
4577
4578                 if (fs) {
4579                         if (!fs->within_session()) {
4580                                 ensure_search_path_includes (Glib::path_get_dirname (fs->path()), fs->type());
4581                         }
4582                 }
4583
4584                 set_dirty();
4585
4586                 boost::shared_ptr<AudioFileSource> afs;
4587
4588                 if ((afs = boost::dynamic_pointer_cast<AudioFileSource>(source)) != 0) {
4589                         if (Config->get_auto_analyse_audio()) {
4590                                 Analyser::queue_source_for_analysis (source, false);
4591                         }
4592                 }
4593
4594                 source->DropReferences.connect_same_thread (*this, boost::bind (&Session::remove_source, this, boost::weak_ptr<Source> (source)));
4595         }
4596 }
4597
4598 void
4599 Session::remove_source (boost::weak_ptr<Source> src)
4600 {
4601         if (_state_of_the_state & Deletion) {
4602                 return;
4603         }
4604
4605         SourceMap::iterator i;
4606         boost::shared_ptr<Source> source = src.lock();
4607
4608         if (!source) {
4609                 return;
4610         }
4611
4612         {
4613                 Glib::Threads::Mutex::Lock lm (source_lock);
4614
4615                 if ((i = sources.find (source->id())) != sources.end()) {
4616                         sources.erase (i);
4617                 }
4618         }
4619
4620         if (!(_state_of_the_state & StateOfTheState (InCleanup|Loading))) {
4621
4622                 /* save state so we don't end up with a session file
4623                    referring to non-existent sources.
4624                 */
4625
4626                 save_state (_current_snapshot_name);
4627         }
4628 }
4629
4630 boost::shared_ptr<Source>
4631 Session::source_by_id (const PBD::ID& id)
4632 {
4633         Glib::Threads::Mutex::Lock lm (source_lock);
4634         SourceMap::iterator i;
4635         boost::shared_ptr<Source> source;
4636
4637         if ((i = sources.find (id)) != sources.end()) {
4638                 source = i->second;
4639         }
4640
4641         return source;
4642 }
4643
4644 boost::shared_ptr<AudioFileSource>
4645 Session::audio_source_by_path_and_channel (const string& path, uint16_t chn) const
4646 {
4647         /* Restricted to audio files because only audio sources have channel
4648            as a property.
4649         */
4650
4651         Glib::Threads::Mutex::Lock lm (source_lock);
4652
4653         for (SourceMap::const_iterator i = sources.begin(); i != sources.end(); ++i) {
4654                 boost::shared_ptr<AudioFileSource> afs
4655                         = boost::dynamic_pointer_cast<AudioFileSource>(i->second);
4656
4657                 if (afs && afs->path() == path && chn == afs->channel()) {
4658                         return afs;
4659                 }
4660         }
4661
4662         return boost::shared_ptr<AudioFileSource>();
4663 }
4664
4665 boost::shared_ptr<MidiSource>
4666 Session::midi_source_by_path (const std::string& path) const
4667 {
4668         /* Restricted to MIDI files because audio sources require a channel
4669            for unique identification, in addition to a path.
4670         */
4671
4672         Glib::Threads::Mutex::Lock lm (source_lock);
4673
4674         for (SourceMap::const_iterator s = sources.begin(); s != sources.end(); ++s) {
4675                 boost::shared_ptr<MidiSource> ms
4676                         = boost::dynamic_pointer_cast<MidiSource>(s->second);
4677                 boost::shared_ptr<FileSource> fs
4678                         = boost::dynamic_pointer_cast<FileSource>(s->second);
4679
4680                 if (ms && fs && fs->path() == path) {
4681                         return ms;
4682                 }
4683         }
4684
4685         return boost::shared_ptr<MidiSource>();
4686 }
4687
4688 uint32_t
4689 Session::count_sources_by_origin (const string& path)
4690 {
4691         uint32_t cnt = 0;
4692         Glib::Threads::Mutex::Lock lm (source_lock);
4693
4694         for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
4695                 boost::shared_ptr<FileSource> fs
4696                         = boost::dynamic_pointer_cast<FileSource>(i->second);
4697
4698                 if (fs && fs->origin() == path) {
4699                         ++cnt;
4700                 }
4701         }
4702
4703         return cnt;
4704 }
4705
4706 static string
4707 peak_file_helper (const string& peak_path, const string& file_path, const string& file_base, bool hash) {
4708         if (hash) {
4709                 std::string checksum = Glib::Checksum::compute_checksum(Glib::Checksum::CHECKSUM_SHA1, file_path + G_DIR_SEPARATOR + file_base);
4710                 return Glib::build_filename (peak_path, checksum + peakfile_suffix);
4711         } else {
4712                 return Glib::build_filename (peak_path, file_base + peakfile_suffix);
4713         }
4714 }
4715
4716 string
4717 Session::construct_peak_filepath (const string& filepath, const bool in_session, const bool old_peak_name) const
4718 {
4719         string interchange_dir_string = string (interchange_dir_name) + G_DIR_SEPARATOR;
4720
4721         if (Glib::path_is_absolute (filepath)) {
4722
4723                 /* rip the session dir from the audiofile source */
4724
4725                 string session_path;
4726                 bool in_another_session = true;
4727
4728                 if (filepath.find (interchange_dir_string) != string::npos) {
4729
4730                         session_path = Glib::path_get_dirname (filepath); /* now ends in audiofiles */
4731                         session_path = Glib::path_get_dirname (session_path); /* now ends in session name */
4732                         session_path = Glib::path_get_dirname (session_path); /* now ends in interchange */
4733                         session_path = Glib::path_get_dirname (session_path); /* now has session path */
4734
4735                         /* see if it is within our session */
4736
4737                         for (vector<space_and_path>::const_iterator i = session_dirs.begin(); i != session_dirs.end(); ++i) {
4738                                 if (i->path == session_path) {
4739                                         in_another_session = false;
4740                                         break;
4741                                 }
4742                         }
4743                 } else {
4744                         in_another_session = false;
4745                 }
4746
4747
4748                 if (in_another_session) {
4749                         SessionDirectory sd (session_path);
4750                         return peak_file_helper (sd.peak_path(), "", Glib::path_get_basename (filepath), !old_peak_name);
4751                 }
4752         }
4753
4754         /* 1) if file belongs to this session
4755          * it may be a relative path (interchange/...)
4756          * or just basename (session_state, remove source)
4757          * -> just use the basename
4758          */
4759         std::string filename = Glib::path_get_basename (filepath);
4760         std::string path;
4761
4762         /* 2) if the file is outside our session dir:
4763          * (imported but not copied) add the path for check-summming */
4764         if (!in_session) {
4765                 path = Glib::path_get_dirname (filepath);
4766         }
4767
4768         return peak_file_helper (_session_dir->peak_path(), path, Glib::path_get_basename (filepath), !old_peak_name);
4769 }
4770
4771 string
4772 Session::new_audio_source_path_for_embedded (const std::string& path)
4773 {
4774         /* embedded source:
4775          *
4776          * we know that the filename is already unique because it exists
4777          * out in the filesystem.
4778          *
4779          * However, when we bring it into the session, we could get a
4780          * collision.
4781          *
4782          * Eg. two embedded files:
4783          *
4784          *          /foo/bar/baz.wav
4785          *          /frob/nic/baz.wav
4786          *
4787          * When merged into session, these collide.
4788          *
4789          * There will not be a conflict with in-memory sources
4790          * because when the source was created we already picked
4791          * a unique name for it.
4792          *
4793          * This collision is not likely to be common, but we have to guard
4794          * against it.  So, if there is a collision, take the md5 hash of the
4795          * the path, and use that as the filename instead.
4796          */
4797
4798         SessionDirectory sdir (get_best_session_directory_for_new_audio());
4799         string base = Glib::path_get_basename (path);
4800         string newpath = Glib::build_filename (sdir.sound_path(), base);
4801
4802         if (Glib::file_test (newpath, Glib::FILE_TEST_EXISTS)) {
4803
4804                 MD5 md5;
4805
4806                 md5.digestString (path.c_str());
4807                 md5.writeToString ();
4808                 base = md5.digestChars;
4809
4810                 string ext = get_suffix (path);
4811
4812                 if (!ext.empty()) {
4813                         base += '.';
4814                         base += ext;
4815                 }
4816
4817                 newpath = Glib::build_filename (sdir.sound_path(), base);
4818
4819                 /* if this collides, we're screwed */
4820
4821                 if (Glib::file_test (newpath, Glib::FILE_TEST_EXISTS)) {
4822                         error << string_compose (_("Merging embedded file %1: name collision AND md5 hash collision!"), path) << endmsg;
4823                         return string();
4824                 }
4825
4826         }
4827
4828         return newpath;
4829 }
4830
4831 /** Return true if there are no audio file sources that use @param name as
4832  * the filename component of their path.
4833  *
4834  * Return false otherwise.
4835  *
4836  * This method MUST ONLY be used to check in-session, mono files since it
4837  * hard-codes the channel of the audio file source we are looking for as zero.
4838  *
4839  * If/when Ardour supports native files in non-mono formats, the logic here
4840  * will need to be revisited.
4841  */
4842 bool
4843 Session::audio_source_name_is_unique (const string& name)
4844 {
4845         std::vector<string> sdirs = source_search_path (DataType::AUDIO);
4846         vector<space_and_path>::iterator i;
4847         uint32_t existing = 0;
4848
4849         for (vector<string>::const_iterator i = sdirs.begin(); i != sdirs.end(); ++i) {
4850
4851                 /* note that we search *without* the extension so that
4852                    we don't end up both "Audio 1-1.wav" and "Audio 1-1.caf"
4853                    in the event that this new name is required for
4854                    a file format change.
4855                 */
4856
4857                 const string spath = *i;
4858
4859                 if (matching_unsuffixed_filename_exists_in (spath, name)) {
4860                         existing++;
4861                         break;
4862                 }
4863
4864                 /* it is possible that we have the path already
4865                  * assigned to a source that has not yet been written
4866                  * (ie. the write source for a diskstream). we have to
4867                  * check this in order to make sure that our candidate
4868                  * path isn't used again, because that can lead to
4869                  * two Sources point to the same file with different
4870                  * notions of their removability.
4871                  */
4872
4873
4874                 string possible_path = Glib::build_filename (spath, name);
4875
4876                 if (audio_source_by_path_and_channel (possible_path, 0)) {
4877                         existing++;
4878                         break;
4879                 }
4880         }
4881
4882         return (existing == 0);
4883 }
4884
4885 string
4886 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)
4887 {
4888         ostringstream sstr;
4889         const string ext = native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
4890
4891         if (Profile->get_trx() && destructive) {
4892                 sstr << 'T';
4893                 sstr << setfill ('0') << setw (4) << cnt;
4894                 sstr << legalized_base;
4895         } else {
4896                 sstr << legalized_base;
4897
4898                 if (take_required || related_exists) {
4899                         sstr << '-';
4900                         sstr << cnt;
4901                 }
4902         }
4903
4904         if (nchan == 2) {
4905                 if (chan == 0) {
4906                         sstr << "%L";
4907                 } else {
4908                         sstr << "%R";
4909                 }
4910         } else if (nchan > 2) {
4911                 if (nchan < 26) {
4912                         sstr << '%';
4913                         sstr << 'a' + chan;
4914                 } else {
4915                         /* XXX what? more than 26 channels! */
4916                         sstr << '%';
4917                         sstr << chan+1;
4918                 }
4919         }
4920
4921         sstr << ext;
4922
4923         return sstr.str();
4924 }
4925
4926 /** Return a unique name based on \a base for a new internal audio source */
4927 string
4928 Session::new_audio_source_path (const string& base, uint32_t nchan, uint32_t chan, bool destructive, bool take_required)
4929 {
4930         uint32_t cnt;
4931         string possible_name;
4932         const uint32_t limit = 9999; // arbitrary limit on number of files with the same basic name
4933         string legalized;
4934         bool some_related_source_name_exists = false;
4935
4936         legalized = legalize_for_path (base);
4937
4938         // Find a "version" of the base name that doesn't exist in any of the possible directories.
4939
4940         for (cnt = (destructive ? ++destructive_index : 1); cnt <= limit; ++cnt) {
4941
4942                 possible_name = format_audio_source_name (legalized, nchan, chan, destructive, take_required, cnt, some_related_source_name_exists);
4943
4944                 if (audio_source_name_is_unique (possible_name)) {
4945                         break;
4946                 }
4947
4948                 some_related_source_name_exists = true;
4949
4950                 if (cnt > limit) {
4951                         error << string_compose(
4952                                         _("There are already %1 recordings for %2, which I consider too many."),
4953                                         limit, base) << endmsg;
4954                         destroy ();
4955                         throw failed_constructor();
4956                 }
4957         }
4958
4959         /* We've established that the new name does not exist in any session
4960          * directory, so now find out which one we should use for this new
4961          * audio source.
4962          */
4963
4964         SessionDirectory sdir (get_best_session_directory_for_new_audio());
4965
4966         std::string s = Glib::build_filename (sdir.sound_path(), possible_name);
4967
4968         return s;
4969 }
4970
4971 /** Return a unique name based on `base` for a new internal MIDI source */
4972 string
4973 Session::new_midi_source_path (const string& base)
4974 {
4975         uint32_t cnt;
4976         char buf[PATH_MAX+1];
4977         const uint32_t limit = 10000;
4978         string legalized;
4979         string possible_path;
4980         string possible_name;
4981
4982         buf[0] = '\0';
4983         legalized = legalize_for_path (base);
4984
4985         // Find a "version" of the file name that doesn't exist in any of the possible directories.
4986         std::vector<string> sdirs = source_search_path(DataType::MIDI);
4987
4988         /* - the main session folder is the first in the vector.
4989          * - after checking all locations for file-name uniqueness,
4990          *   we keep the one from the last iteration as new file name
4991          * - midi files are small and should just be kept in the main session-folder
4992          *
4993          * -> reverse the array, check main session folder last and use that as location
4994          *    for MIDI files.
4995          */
4996         std::reverse(sdirs.begin(), sdirs.end());
4997
4998         for (cnt = 1; cnt <= limit; ++cnt) {
4999
5000                 vector<space_and_path>::iterator i;
5001                 uint32_t existing = 0;
5002
5003                 for (vector<string>::const_iterator i = sdirs.begin(); i != sdirs.end(); ++i) {
5004
5005                         snprintf (buf, sizeof(buf), "%s-%u.mid", legalized.c_str(), cnt);
5006                         possible_name = buf;
5007
5008                         possible_path = Glib::build_filename (*i, possible_name);
5009
5010                         if (Glib::file_test (possible_path, Glib::FILE_TEST_EXISTS)) {
5011                                 existing++;
5012                         }
5013
5014                         if (midi_source_by_path (possible_path)) {
5015                                 existing++;
5016                         }
5017                 }
5018
5019                 if (existing == 0) {
5020                         break;
5021                 }
5022
5023                 if (cnt > limit) {
5024                         error << string_compose(
5025                                         _("There are already %1 recordings for %2, which I consider too many."),
5026                                         limit, base) << endmsg;
5027                         destroy ();
5028                         return 0;
5029                 }
5030         }
5031
5032         /* No need to "find best location" for software/app-based RAID, because
5033            MIDI is so small that we always put it in the same place.
5034         */
5035
5036         return possible_path;
5037 }
5038
5039
5040 /** Create a new within-session audio source */
5041 boost::shared_ptr<AudioFileSource>
5042 Session::create_audio_source_for_session (size_t n_chans, string const & base, uint32_t chan, bool destructive)
5043 {
5044         const string path = new_audio_source_path (base, n_chans, chan, destructive, true);
5045
5046         if (!path.empty()) {
5047                 return boost::dynamic_pointer_cast<AudioFileSource> (
5048                         SourceFactory::createWritable (DataType::AUDIO, *this, path, destructive, frame_rate(), true, true));
5049         } else {
5050                 throw failed_constructor ();
5051         }
5052 }
5053
5054 /** Create a new within-session MIDI source */
5055 boost::shared_ptr<MidiSource>
5056 Session::create_midi_source_for_session (string const & basic_name)
5057 {
5058         const string path = new_midi_source_path (basic_name);
5059
5060         if (!path.empty()) {
5061                 return boost::dynamic_pointer_cast<SMFSource> (
5062                         SourceFactory::createWritable (
5063                                 DataType::MIDI, *this, path, false, frame_rate()));
5064         } else {
5065                 throw failed_constructor ();
5066         }
5067 }
5068
5069 /** Create a new within-session MIDI source */
5070 boost::shared_ptr<MidiSource>
5071 Session::create_midi_source_by_stealing_name (boost::shared_ptr<Track> track)
5072 {
5073         /* the caller passes in the track the source will be used in,
5074            so that we can keep the numbering sane.
5075
5076            Rationale: a track with the name "Foo" that has had N
5077            captures carried out so far will ALREADY have a write source
5078            named "Foo-N+1.mid" waiting to be used for the next capture.
5079
5080            If we call new_midi_source_name() we will get "Foo-N+2". But
5081            there is no region corresponding to "Foo-N+1", so when
5082            "Foo-N+2" appears in the track, the gap presents the user
5083            with odd behaviour - why did it skip past Foo-N+1?
5084
5085            We could explain this to the user in some odd way, but
5086            instead we rename "Foo-N+1.mid" as "Foo-N+2.mid", and then
5087            use "Foo-N+1" here.
5088
5089            If that attempted rename fails, we get "Foo-N+2.mid" anyway.
5090         */
5091
5092         boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (track);
5093         assert (mt);
5094         std::string name = track->steal_write_source_name ();
5095
5096         if (name.empty()) {
5097                 return boost::shared_ptr<MidiSource>();
5098         }
5099
5100         /* MIDI files are small, just put them in the first location of the
5101            session source search path.
5102         */
5103
5104         const string path = Glib::build_filename (source_search_path (DataType::MIDI).front(), name);
5105
5106         return boost::dynamic_pointer_cast<SMFSource> (
5107                 SourceFactory::createWritable (
5108                         DataType::MIDI, *this, path, false, frame_rate()));
5109 }
5110
5111
5112 void
5113 Session::add_playlist (boost::shared_ptr<Playlist> playlist, bool unused)
5114 {
5115         if (playlist->hidden()) {
5116                 return;
5117         }
5118
5119         playlists->add (playlist);
5120
5121         if (unused) {
5122                 playlist->release();
5123         }
5124
5125         set_dirty();
5126 }
5127
5128 void
5129 Session::remove_playlist (boost::weak_ptr<Playlist> weak_playlist)
5130 {
5131         if (_state_of_the_state & Deletion) {
5132                 return;
5133         }
5134
5135         boost::shared_ptr<Playlist> playlist (weak_playlist.lock());
5136
5137         if (!playlist) {
5138                 return;
5139         }
5140
5141         playlists->remove (playlist);
5142
5143         set_dirty();
5144 }
5145
5146 void
5147 Session::set_audition (boost::shared_ptr<Region> r)
5148 {
5149         pending_audition_region = r;
5150         add_post_transport_work (PostTransportAudition);
5151         _butler->schedule_transport_work ();
5152 }
5153
5154 void
5155 Session::audition_playlist ()
5156 {
5157         SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
5158         ev->region.reset ();
5159         queue_event (ev);
5160 }
5161
5162
5163 void
5164 Session::register_lua_function (
5165                 const std::string& name,
5166                 const std::string& script,
5167                 const LuaScriptParamList& args
5168                 )
5169 {
5170         Glib::Threads::Mutex::Lock lm (lua_lock);
5171
5172         lua_State* L = lua.getState();
5173
5174         const std::string& bytecode = LuaScripting::get_factory_bytecode (script);
5175         luabridge::LuaRef tbl_arg (luabridge::newTable(L));
5176         for (LuaScriptParamList::const_iterator i = args.begin(); i != args.end(); ++i) {
5177                 if ((*i)->optional && !(*i)->is_set) { continue; }
5178                 tbl_arg[(*i)->name] = (*i)->value;
5179         }
5180         (*_lua_add)(name, bytecode, tbl_arg); // throws luabridge::LuaException
5181         set_dirty();
5182 }
5183
5184 void
5185 Session::unregister_lua_function (const std::string& name)
5186 {
5187         Glib::Threads::Mutex::Lock lm (lua_lock);
5188         (*_lua_del)(name); // throws luabridge::LuaException
5189         lua.collect_garbage ();
5190         set_dirty();
5191 }
5192
5193 std::vector<std::string>
5194 Session::registered_lua_functions ()
5195 {
5196         Glib::Threads::Mutex::Lock lm (lua_lock);
5197         std::vector<std::string> rv;
5198
5199         try {
5200                 luabridge::LuaRef list ((*_lua_list)());
5201                 for (luabridge::Iterator i (list); !i.isNil (); ++i) {
5202                         if (!i.key ().isString ()) { assert(0); continue; }
5203                         rv.push_back (i.key ().cast<std::string> ());
5204                 }
5205         } catch (luabridge::LuaException const& e) { }
5206         return rv;
5207 }
5208
5209 #ifndef NDEBUG
5210 static void _lua_print (std::string s) {
5211         std::cout << "SessionLua: " << s << "\n";
5212 }
5213 #endif
5214
5215 void
5216 Session::try_run_lua (pframes_t nframes)
5217 {
5218         if (_n_lua_scripts == 0) return;
5219         Glib::Threads::Mutex::Lock tm (lua_lock, Glib::Threads::TRY_LOCK);
5220         if (tm.locked ()) {
5221                 try { (*_lua_run)(nframes); } catch (luabridge::LuaException const& e) { }
5222                 lua.collect_garbage_step ();
5223         }
5224 }
5225
5226 void
5227 Session::setup_lua ()
5228 {
5229 #ifndef NDEBUG
5230         lua.Print.connect (&_lua_print);
5231 #endif
5232         lua.tweak_rt_gc ();
5233         lua.do_command (
5234                         "function ArdourSession ()"
5235                         "  local self = { scripts = {}, instances = {} }"
5236                         ""
5237                         "  local remove = function (n)"
5238                         "   self.scripts[n] = nil"
5239                         "   self.instances[n] = nil"
5240                         "   Session:scripts_changed()" // call back
5241                         "  end"
5242                         ""
5243                         "  local addinternal = function (n, f, a)"
5244                         "   assert(type(n) == 'string', 'function-name must be string')"
5245                         "   assert(type(f) == 'function', 'Given script is a not a function')"
5246                         "   assert(type(a) == 'table' or type(a) == 'nil', 'Given argument is invalid')"
5247                         "   assert(self.scripts[n] == nil, 'Callback \"'.. n ..'\" already exists.')"
5248                         "   self.scripts[n] = { ['f'] = f, ['a'] = a }"
5249                         "   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"
5250                         "   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 }"
5251                         "   self.instances[n] = load (string.dump(f, true), nil, nil, env)(a)"
5252                         "   Session:scripts_changed()" // call back
5253                         "  end"
5254                         ""
5255                         "  local add = function (n, b, a)"
5256                         "   assert(type(b) == 'string', 'ByteCode must be string')"
5257                         "   load (b)()" // assigns f
5258                         "   assert(type(f) == 'string', 'Assigned ByteCode must be string')"
5259                         "   addinternal (n, load(f), a)"
5260                         "  end"
5261                         ""
5262                         "  local run = function (...)"
5263                         "   for n, s in pairs (self.instances) do"
5264                         "     local status, err = pcall (s, ...)"
5265                         "     if not status then"
5266                         "       print ('fn \"'.. n .. '\": ', err)"
5267                         "       remove (n)"
5268                         "      end"
5269                         "   end"
5270                         "   collectgarbage()"
5271                         "  end"
5272                         ""
5273                         "  local cleanup = function ()"
5274                         "   self.scripts = nil"
5275                         "   self.instances = nil"
5276                         "  end"
5277                         ""
5278                         "  local list = function ()"
5279                         "   local rv = {}"
5280                         "   for n, _ in pairs (self.scripts) do"
5281                         "     rv[n] = true"
5282                         "   end"
5283                         "   return rv"
5284                         "  end"
5285                         ""
5286                         "  local function basic_serialize (o)"
5287                         "    if type(o) == \"number\" then"
5288                         "     return tostring(o)"
5289                         "    else"
5290                         "     return string.format(\"%q\", o)"
5291                         "    end"
5292                         "  end"
5293                         ""
5294                         "  local function serialize (name, value)"
5295                         "   local rv = name .. ' = '"
5296                         "   collectgarbage()"
5297                         "   if type(value) == \"number\" or type(value) == \"string\" or type(value) == \"nil\" then"
5298                         "    return rv .. basic_serialize(value) .. ' '"
5299                         "   elseif type(value) == \"table\" then"
5300                         "    rv = rv .. '{} '"
5301                         "    for k,v in pairs(value) do"
5302                         "     local fieldname = string.format(\"%s[%s]\", name, basic_serialize(k))"
5303                         "     rv = rv .. serialize(fieldname, v) .. ' '"
5304                         "     collectgarbage()" // string concatenation allocates a new string :(
5305                         "    end"
5306                         "    return rv;"
5307                         "   elseif type(value) == \"function\" then"
5308                         "     return rv .. string.format(\"%q\", string.dump(value, true))"
5309                         "   else"
5310                         "    error('cannot save a ' .. type(value))"
5311                         "   end"
5312                         "  end"
5313                         ""
5314                         ""
5315                         "  local save = function ()"
5316                         "   return (serialize('scripts', self.scripts))"
5317                         "  end"
5318                         ""
5319                         "  local restore = function (state)"
5320                         "   self.scripts = {}"
5321                         "   load (state)()"
5322                         "   for n, s in pairs (scripts) do"
5323                         "    addinternal (n, load(s['f']), s['a'])"
5324                         "   end"
5325                         "  end"
5326                         ""
5327                         " return { run = run, add = add, remove = remove,"
5328                   "          list = list, restore = restore, save = save, cleanup = cleanup}"
5329                         " end"
5330                         " "
5331                         " sess = ArdourSession ()"
5332                         " ArdourSession = nil"
5333                         " "
5334                         "function ardour () end"
5335                         );
5336
5337         lua_State* L = lua.getState();
5338
5339         try {
5340                 luabridge::LuaRef lua_sess = luabridge::getGlobal (L, "sess");
5341                 lua.do_command ("sess = nil"); // hide it.
5342                 lua.do_command ("collectgarbage()");
5343
5344                 _lua_run = new luabridge::LuaRef(lua_sess["run"]);
5345                 _lua_add = new luabridge::LuaRef(lua_sess["add"]);
5346                 _lua_del = new luabridge::LuaRef(lua_sess["remove"]);
5347                 _lua_list = new luabridge::LuaRef(lua_sess["list"]);
5348                 _lua_save = new luabridge::LuaRef(lua_sess["save"]);
5349                 _lua_load = new luabridge::LuaRef(lua_sess["restore"]);
5350                 _lua_cleanup = new luabridge::LuaRef(lua_sess["cleanup"]);
5351         } catch (luabridge::LuaException const& e) {
5352                 fatal << string_compose (_("programming error: %1"),
5353                                 X_("Failed to setup Lua interpreter"))
5354                         << endmsg;
5355                 abort(); /*NOTREACHED*/
5356         }
5357
5358         LuaBindings::stddef (L);
5359         LuaBindings::common (L);
5360         LuaBindings::dsp (L);
5361         luabridge::push <Session *> (L, this);
5362         lua_setglobal (L, "Session");
5363 }
5364
5365 void
5366 Session::scripts_changed ()
5367 {
5368         assert (!lua_lock.trylock()); // must hold lua_lock
5369
5370         try {
5371                 luabridge::LuaRef list ((*_lua_list)());
5372                 int cnt = 0;
5373                 for (luabridge::Iterator i (list); !i.isNil (); ++i) {
5374                         if (!i.key ().isString ()) { assert(0); continue; }
5375                         ++cnt;
5376                 }
5377                 _n_lua_scripts = cnt;
5378         } catch (luabridge::LuaException const& e) {
5379                 fatal << string_compose (_("programming error: %1"),
5380                                 X_("Indexing Lua Session Scripts failed."))
5381                         << endmsg;
5382                 abort(); /*NOTREACHED*/
5383         }
5384 }
5385
5386 void
5387 Session::non_realtime_set_audition ()
5388 {
5389         assert (pending_audition_region);
5390         auditioner->audition_region (pending_audition_region);
5391         pending_audition_region.reset ();
5392         AuditionActive (true); /* EMIT SIGNAL */
5393 }
5394
5395 void
5396 Session::audition_region (boost::shared_ptr<Region> r)
5397 {
5398         SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
5399         ev->region = r;
5400         queue_event (ev);
5401 }
5402
5403 void
5404 Session::cancel_audition ()
5405 {
5406         if (!auditioner) {
5407                 return;
5408         }
5409         if (auditioner->auditioning()) {
5410                 auditioner->cancel_audition ();
5411                 AuditionActive (false); /* EMIT SIGNAL */
5412         }
5413 }
5414
5415 bool
5416 Session::RoutePublicOrderSorter::operator() (boost::shared_ptr<Route> a, boost::shared_ptr<Route> b)
5417 {
5418         if (a->is_monitor()) {
5419                 return true;
5420         }
5421         if (b->is_monitor()) {
5422                 return false;
5423         }
5424         return a->presentation_info().order() < b->presentation_info().order();
5425 }
5426
5427 bool
5428 Session::is_auditioning () const
5429 {
5430         /* can be called before we have an auditioner object */
5431         if (auditioner) {
5432                 return auditioner->auditioning();
5433         } else {
5434                 return false;
5435         }
5436 }
5437
5438 void
5439 Session::graph_reordered ()
5440 {
5441         /* don't do this stuff if we are setting up connections
5442            from a set_state() call or creating new tracks. Ditto for deletion.
5443         */
5444
5445         if ((_state_of_the_state & (InitialConnecting|Deletion)) || _adding_routes_in_progress || _reconnecting_routes_in_progress || _route_deletion_in_progress) {
5446                 return;
5447         }
5448
5449         /* every track/bus asked for this to be handled but it was deferred because
5450            we were connecting. do it now.
5451         */
5452
5453         request_input_change_handling ();
5454
5455         resort_routes ();
5456
5457         /* force all diskstreams to update their capture offset values to
5458            reflect any changes in latencies within the graph.
5459         */
5460
5461         boost::shared_ptr<RouteList> rl = routes.reader ();
5462         for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
5463                 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
5464                 if (tr) {
5465                         tr->set_capture_offset ();
5466                 }
5467         }
5468 }
5469
5470 /** @return Number of frames that there is disk space available to write,
5471  *  if known.
5472  */
5473 boost::optional<framecnt_t>
5474 Session::available_capture_duration ()
5475 {
5476         Glib::Threads::Mutex::Lock lm (space_lock);
5477
5478         if (_total_free_4k_blocks_uncertain) {
5479                 return boost::optional<framecnt_t> ();
5480         }
5481
5482         float sample_bytes_on_disk = 4.0; // keep gcc happy
5483
5484         switch (config.get_native_file_data_format()) {
5485         case FormatFloat:
5486                 sample_bytes_on_disk = 4.0;
5487                 break;
5488
5489         case FormatInt24:
5490                 sample_bytes_on_disk = 3.0;
5491                 break;
5492
5493         case FormatInt16:
5494                 sample_bytes_on_disk = 2.0;
5495                 break;
5496
5497         default:
5498                 /* impossible, but keep some gcc versions happy */
5499                 fatal << string_compose (_("programming error: %1"),
5500                                          X_("illegal native file data format"))
5501                       << endmsg;
5502                 abort(); /*NOTREACHED*/
5503         }
5504
5505         double scale = 4096.0 / sample_bytes_on_disk;
5506
5507         if (_total_free_4k_blocks * scale > (double) max_framecnt) {
5508                 return max_framecnt;
5509         }
5510
5511         return (framecnt_t) floor (_total_free_4k_blocks * scale);
5512 }
5513
5514 void
5515 Session::add_bundle (boost::shared_ptr<Bundle> bundle, bool emit_signal)
5516 {
5517         {
5518                 RCUWriter<BundleList> writer (_bundles);
5519                 boost::shared_ptr<BundleList> b = writer.get_copy ();
5520                 b->push_back (bundle);
5521         }
5522
5523         if (emit_signal) {
5524                 BundleAddedOrRemoved (); /* EMIT SIGNAL */
5525         }
5526
5527         set_dirty();
5528 }
5529
5530 void
5531 Session::remove_bundle (boost::shared_ptr<Bundle> bundle)
5532 {
5533         bool removed = false;
5534
5535         {
5536                 RCUWriter<BundleList> writer (_bundles);
5537                 boost::shared_ptr<BundleList> b = writer.get_copy ();
5538                 BundleList::iterator i = find (b->begin(), b->end(), bundle);
5539
5540                 if (i != b->end()) {
5541                         b->erase (i);
5542                         removed = true;
5543                 }
5544         }
5545
5546         if (removed) {
5547                  BundleAddedOrRemoved (); /* EMIT SIGNAL */
5548         }
5549
5550         set_dirty();
5551 }
5552
5553 boost::shared_ptr<Bundle>
5554 Session::bundle_by_name (string name) const
5555 {
5556         boost::shared_ptr<BundleList> b = _bundles.reader ();
5557
5558         for (BundleList::const_iterator i = b->begin(); i != b->end(); ++i) {
5559                 if ((*i)->name() == name) {
5560                         return* i;
5561                 }
5562         }
5563
5564         return boost::shared_ptr<Bundle> ();
5565 }
5566
5567 void
5568 Session::tempo_map_changed (const PropertyChange&)
5569 {
5570         clear_clicks ();
5571
5572         playlists->update_after_tempo_map_change ();
5573
5574         _locations->apply (*this, &Session::update_locations_after_tempo_map_change);
5575
5576         set_dirty ();
5577 }
5578
5579 void
5580 Session::gui_tempo_map_changed ()
5581 {
5582         clear_clicks ();
5583
5584         playlists->update_after_tempo_map_change ();
5585
5586         _locations->apply (*this, &Session::update_locations_after_tempo_map_change);
5587 }
5588
5589 void
5590 Session::update_locations_after_tempo_map_change (const Locations::LocationList& loc)
5591 {
5592         for (Locations::LocationList::const_iterator i = loc.begin(); i != loc.end(); ++i) {
5593                 (*i)->recompute_frames_from_bbt ();
5594         }
5595 }
5596
5597 /** Ensures that all buffers (scratch, send, silent, etc) are allocated for
5598  * the given count with the current block size.
5599  */
5600 void
5601 Session::ensure_buffers (ChanCount howmany)
5602 {
5603         BufferManager::ensure_buffers (howmany, bounce_processing() ? bounce_chunk_size : 0);
5604 }
5605
5606 void
5607 Session::ensure_buffer_set(BufferSet& buffers, const ChanCount& count)
5608 {
5609         for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
5610                 buffers.ensure_buffers(*t, count.get(*t), _engine.raw_buffer_size(*t));
5611         }
5612 }
5613
5614 uint32_t
5615 Session::next_insert_id ()
5616 {
5617         /* this doesn't really loop forever. just think about it */
5618
5619         while (true) {
5620                 for (boost::dynamic_bitset<uint32_t>::size_type n = 1; n < insert_bitset.size(); ++n) {
5621                         if (!insert_bitset[n]) {
5622                                 insert_bitset[n] = true;
5623                                 return n;
5624
5625                         }
5626                 }
5627
5628                 /* none available, so resize and try again */
5629
5630                 insert_bitset.resize (insert_bitset.size() + 16, false);
5631         }
5632 }
5633
5634 uint32_t
5635 Session::next_send_id ()
5636 {
5637         /* this doesn't really loop forever. just think about it */
5638
5639         while (true) {
5640                 for (boost::dynamic_bitset<uint32_t>::size_type n = 1; n < send_bitset.size(); ++n) {
5641                         if (!send_bitset[n]) {
5642                                 send_bitset[n] = true;
5643                                 return n;
5644
5645                         }
5646                 }
5647
5648                 /* none available, so resize and try again */
5649
5650                 send_bitset.resize (send_bitset.size() + 16, false);
5651         }
5652 }
5653
5654 uint32_t
5655 Session::next_aux_send_id ()
5656 {
5657         /* this doesn't really loop forever. just think about it */
5658
5659         while (true) {
5660                 for (boost::dynamic_bitset<uint32_t>::size_type n = 1; n < aux_send_bitset.size(); ++n) {
5661                         if (!aux_send_bitset[n]) {
5662                                 aux_send_bitset[n] = true;
5663                                 return n;
5664
5665                         }
5666                 }
5667
5668                 /* none available, so resize and try again */
5669
5670                 aux_send_bitset.resize (aux_send_bitset.size() + 16, false);
5671         }
5672 }
5673
5674 uint32_t
5675 Session::next_return_id ()
5676 {
5677         /* this doesn't really loop forever. just think about it */
5678
5679         while (true) {
5680                 for (boost::dynamic_bitset<uint32_t>::size_type n = 1; n < return_bitset.size(); ++n) {
5681                         if (!return_bitset[n]) {
5682                                 return_bitset[n] = true;
5683                                 return n;
5684
5685                         }
5686                 }
5687
5688                 /* none available, so resize and try again */
5689
5690                 return_bitset.resize (return_bitset.size() + 16, false);
5691         }
5692 }
5693
5694 void
5695 Session::mark_send_id (uint32_t id)
5696 {
5697         if (id >= send_bitset.size()) {
5698                 send_bitset.resize (id+16, false);
5699         }
5700         if (send_bitset[id]) {
5701                 warning << string_compose (_("send ID %1 appears to be in use already"), id) << endmsg;
5702         }
5703         send_bitset[id] = true;
5704 }
5705
5706 void
5707 Session::mark_aux_send_id (uint32_t id)
5708 {
5709         if (id >= aux_send_bitset.size()) {
5710                 aux_send_bitset.resize (id+16, false);
5711         }
5712         if (aux_send_bitset[id]) {
5713                 warning << string_compose (_("aux send ID %1 appears to be in use already"), id) << endmsg;
5714         }
5715         aux_send_bitset[id] = true;
5716 }
5717
5718 void
5719 Session::mark_return_id (uint32_t id)
5720 {
5721         if (id >= return_bitset.size()) {
5722                 return_bitset.resize (id+16, false);
5723         }
5724         if (return_bitset[id]) {
5725                 warning << string_compose (_("return ID %1 appears to be in use already"), id) << endmsg;
5726         }
5727         return_bitset[id] = true;
5728 }
5729
5730 void
5731 Session::mark_insert_id (uint32_t id)
5732 {
5733         if (id >= insert_bitset.size()) {
5734                 insert_bitset.resize (id+16, false);
5735         }
5736         if (insert_bitset[id]) {
5737                 warning << string_compose (_("insert ID %1 appears to be in use already"), id) << endmsg;
5738         }
5739         insert_bitset[id] = true;
5740 }
5741
5742 void
5743 Session::unmark_send_id (uint32_t id)
5744 {
5745         if (id < send_bitset.size()) {
5746                 send_bitset[id] = false;
5747         }
5748 }
5749
5750 void
5751 Session::unmark_aux_send_id (uint32_t id)
5752 {
5753         if (id < aux_send_bitset.size()) {
5754                 aux_send_bitset[id] = false;
5755         }
5756 }
5757
5758 void
5759 Session::unmark_return_id (uint32_t id)
5760 {
5761         if (_state_of_the_state & Deletion) { return; }
5762         if (id < return_bitset.size()) {
5763                 return_bitset[id] = false;
5764         }
5765 }
5766
5767 void
5768 Session::unmark_insert_id (uint32_t id)
5769 {
5770         if (id < insert_bitset.size()) {
5771                 insert_bitset[id] = false;
5772         }
5773 }
5774
5775 void
5776 Session::reset_native_file_format ()
5777 {
5778         boost::shared_ptr<RouteList> rl = routes.reader ();
5779
5780         for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
5781                 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
5782                 if (tr) {
5783                         /* don't save state as we do this, there's no point
5784                          */
5785                         _state_of_the_state = StateOfTheState (_state_of_the_state|InCleanup);
5786                         tr->reset_write_sources (false);
5787                         _state_of_the_state = StateOfTheState (_state_of_the_state & ~InCleanup);
5788                 }
5789         }
5790 }
5791
5792 bool
5793 Session::route_name_unique (string n) const
5794 {
5795         boost::shared_ptr<RouteList> r = routes.reader ();
5796
5797         for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
5798                 if ((*i)->name() == n) {
5799                         return false;
5800                 }
5801         }
5802
5803         return true;
5804 }
5805
5806 bool
5807 Session::route_name_internal (string n) const
5808 {
5809         if (auditioner && auditioner->name() == n) {
5810                 return true;
5811         }
5812
5813         if (_click_io && _click_io->name() == n) {
5814                 return true;
5815         }
5816
5817         return false;
5818 }
5819
5820 int
5821 Session::freeze_all (InterThreadInfo& itt)
5822 {
5823         boost::shared_ptr<RouteList> r = routes.reader ();
5824
5825         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
5826
5827                 boost::shared_ptr<Track> t;
5828
5829                 if ((t = boost::dynamic_pointer_cast<Track>(*i)) != 0) {
5830                         /* XXX this is wrong because itt.progress will keep returning to zero at the start
5831                            of every track.
5832                         */
5833                         t->freeze_me (itt);
5834                 }
5835         }
5836
5837         return 0;
5838 }
5839
5840 boost::shared_ptr<Region>
5841 Session::write_one_track (Track& track, framepos_t start, framepos_t end,
5842                           bool /*overwrite*/, vector<boost::shared_ptr<Source> >& srcs,
5843                           InterThreadInfo& itt,
5844                           boost::shared_ptr<Processor> endpoint, bool include_endpoint,
5845                           bool for_export, bool for_freeze)
5846 {
5847         boost::shared_ptr<Region> result;
5848         boost::shared_ptr<Playlist> playlist;
5849         boost::shared_ptr<Source> source;
5850         ChanCount diskstream_channels (track.n_channels());
5851         framepos_t position;
5852         framecnt_t this_chunk;
5853         framepos_t to_do;
5854         framepos_t latency_skip;
5855         BufferSet buffers;
5856         framepos_t len = end - start;
5857         bool need_block_size_reset = false;
5858         ChanCount const max_proc = track.max_processor_streams ();
5859         string legal_playlist_name;
5860         string possible_path;
5861
5862         if (end <= start) {
5863                 error << string_compose (_("Cannot write a range where end <= start (e.g. %1 <= %2)"),
5864                                          end, start) << endmsg;
5865                 return result;
5866         }
5867
5868         diskstream_channels = track.bounce_get_output_streams (diskstream_channels, endpoint,
5869                         include_endpoint, for_export, for_freeze);
5870
5871         if (diskstream_channels.n(track.data_type()) < 1) {
5872                 error << _("Cannot write a range with no data.") << endmsg;
5873                 return result;
5874         }
5875
5876         // block all process callback handling
5877
5878         block_processing ();
5879
5880         {
5881                 // synchronize with AudioEngine::process_callback()
5882                 // make sure processing is not currently running
5883                 // and processing_blocked() is honored before
5884                 // acquiring thread buffers
5885                 Glib::Threads::Mutex::Lock lm (_engine.process_lock());
5886         }
5887
5888         _bounce_processing_active = true;
5889
5890         /* call tree *MUST* hold route_lock */
5891
5892         if ((playlist = track.playlist()) == 0) {
5893                 goto out;
5894         }
5895
5896         legal_playlist_name = legalize_for_path (playlist->name());
5897
5898         for (uint32_t chan_n = 0; chan_n < diskstream_channels.n(track.data_type()); ++chan_n) {
5899
5900                 string base_name = string_compose ("%1-%2-bounce", playlist->name(), chan_n);
5901                 string path = ((track.data_type() == DataType::AUDIO)
5902                                ? new_audio_source_path (legal_playlist_name, diskstream_channels.n_audio(), chan_n, false, true)
5903                                : new_midi_source_path (legal_playlist_name));
5904
5905                 if (path.empty()) {
5906                         goto out;
5907                 }
5908
5909                 try {
5910                         source = SourceFactory::createWritable (track.data_type(), *this, path, false, frame_rate());
5911                 }
5912
5913                 catch (failed_constructor& err) {
5914                         error << string_compose (_("cannot create new file \"%1\" for %2"), path, track.name()) << endmsg;
5915                         goto out;
5916                 }
5917
5918                 srcs.push_back (source);
5919         }
5920
5921         /* tell redirects that care that we are about to use a much larger
5922          * blocksize. this will flush all plugins too, so that they are ready
5923          * to be used for this process.
5924          */
5925
5926         need_block_size_reset = true;
5927         track.set_block_size (bounce_chunk_size);
5928         _engine.main_thread()->get_buffers ();
5929
5930         position = start;
5931         to_do = len;
5932         latency_skip = track.bounce_get_latency (endpoint, include_endpoint, for_export, for_freeze);
5933
5934         /* create a set of reasonably-sized buffers */
5935         for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
5936                 buffers.ensure_buffers(*t, max_proc.get(*t), bounce_chunk_size);
5937         }
5938         buffers.set_count (max_proc);
5939
5940         for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
5941                 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
5942                 boost::shared_ptr<MidiSource> ms;
5943                 if (afs) {
5944                         afs->prepare_for_peakfile_writes ();
5945                 } else if ((ms = boost::dynamic_pointer_cast<MidiSource>(*src))) {
5946                         Source::Lock lock(ms->mutex());
5947                         ms->mark_streaming_write_started(lock);
5948                 }
5949         }
5950
5951         while (to_do && !itt.cancel) {
5952
5953                 this_chunk = min (to_do, bounce_chunk_size);
5954
5955                 if (track.export_stuff (buffers, start, this_chunk, endpoint, include_endpoint, for_export, for_freeze)) {
5956                         goto out;
5957                 }
5958
5959                 start += this_chunk;
5960                 to_do -= this_chunk;
5961                 itt.progress = (float) (1.0 - ((double) to_do / len));
5962
5963                 if (latency_skip >= bounce_chunk_size) {
5964                         latency_skip -= bounce_chunk_size;
5965                         continue;
5966                 }
5967
5968                 const framecnt_t current_chunk = this_chunk - latency_skip;
5969
5970                 uint32_t n = 0;
5971                 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src, ++n) {
5972                         boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
5973                         boost::shared_ptr<MidiSource> ms;
5974
5975                         if (afs) {
5976                                 if (afs->write (buffers.get_audio(n).data(latency_skip), current_chunk) != current_chunk) {
5977                                         goto out;
5978                                 }
5979                         } else if ((ms = boost::dynamic_pointer_cast<MidiSource>(*src))) {
5980                                 Source::Lock lock(ms->mutex());
5981
5982                                 const MidiBuffer& buf = buffers.get_midi(0);
5983                                 for (MidiBuffer::const_iterator i = buf.begin(); i != buf.end(); ++i) {
5984                                         Evoral::Event<framepos_t> ev = *i;
5985                                         ev.set_time(ev.time() - position);
5986                                         ms->append_event_frames(lock, ev, ms->timeline_position());
5987                                 }
5988                         }
5989                 }
5990                 latency_skip = 0;
5991         }
5992
5993         /* post-roll, pick up delayed processor output */
5994         latency_skip = track.bounce_get_latency (endpoint, include_endpoint, for_export, for_freeze);
5995
5996         while (latency_skip && !itt.cancel) {
5997                 this_chunk = min (latency_skip, bounce_chunk_size);
5998                 latency_skip -= this_chunk;
5999
6000                 buffers.silence (this_chunk, 0);
6001                 track.bounce_process (buffers, start, this_chunk, endpoint, include_endpoint, for_export, for_freeze);
6002
6003                 uint32_t n = 0;
6004                 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src, ++n) {
6005                         boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
6006
6007                         if (afs) {
6008                                 if (afs->write (buffers.get_audio(n).data(), this_chunk) != this_chunk) {
6009                                         goto out;
6010                                 }
6011                         }
6012                 }
6013         }
6014
6015         if (!itt.cancel) {
6016
6017                 time_t now;
6018                 struct tm* xnow;
6019                 time (&now);
6020                 xnow = localtime (&now);
6021
6022                 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src) {
6023                         boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
6024                         boost::shared_ptr<MidiSource> ms;
6025
6026                         if (afs) {
6027                                 afs->update_header (position, *xnow, now);
6028                                 afs->flush_header ();
6029                         } else if ((ms = boost::dynamic_pointer_cast<MidiSource>(*src))) {
6030                                 Source::Lock lock(ms->mutex());
6031                                 ms->mark_streaming_write_completed(lock);
6032                         }
6033                 }
6034
6035                 /* construct a region to represent the bounced material */
6036
6037                 PropertyList plist;
6038
6039                 plist.add (Properties::start, 0);
6040                 plist.add (Properties::length, srcs.front()->length(srcs.front()->timeline_position()));
6041                 plist.add (Properties::name, region_name_from_path (srcs.front()->name(), true));
6042
6043                 result = RegionFactory::create (srcs, plist);
6044
6045         }
6046
6047   out:
6048         if (!result) {
6049                 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
6050                         (*src)->mark_for_remove ();
6051                         (*src)->drop_references ();
6052                 }
6053
6054         } else {
6055                 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
6056                         boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
6057
6058                         if (afs)
6059                                 afs->done_with_peakfile_writes ();
6060                 }
6061         }
6062
6063         _bounce_processing_active = false;
6064
6065         if (need_block_size_reset) {
6066                 _engine.main_thread()->drop_buffers ();
6067                 track.set_block_size (get_block_size());
6068         }
6069
6070         unblock_processing ();
6071
6072         return result;
6073 }
6074
6075 gain_t*
6076 Session::gain_automation_buffer() const
6077 {
6078         return ProcessThread::gain_automation_buffer ();
6079 }
6080
6081 gain_t*
6082 Session::trim_automation_buffer() const
6083 {
6084         return ProcessThread::trim_automation_buffer ();
6085 }
6086
6087 gain_t*
6088 Session::send_gain_automation_buffer() const
6089 {
6090         return ProcessThread::send_gain_automation_buffer ();
6091 }
6092
6093 pan_t**
6094 Session::pan_automation_buffer() const
6095 {
6096         return ProcessThread::pan_automation_buffer ();
6097 }
6098
6099 BufferSet&
6100 Session::get_silent_buffers (ChanCount count)
6101 {
6102         return ProcessThread::get_silent_buffers (count);
6103 }
6104
6105 BufferSet&
6106 Session::get_scratch_buffers (ChanCount count, bool silence)
6107 {
6108         return ProcessThread::get_scratch_buffers (count, silence);
6109 }
6110
6111 BufferSet&
6112 Session::get_noinplace_buffers (ChanCount count)
6113 {
6114         return ProcessThread::get_noinplace_buffers (count);
6115 }
6116
6117 BufferSet&
6118 Session::get_route_buffers (ChanCount count, bool silence)
6119 {
6120         return ProcessThread::get_route_buffers (count, silence);
6121 }
6122
6123
6124 BufferSet&
6125 Session::get_mix_buffers (ChanCount count)
6126 {
6127         return ProcessThread::get_mix_buffers (count);
6128 }
6129
6130 uint32_t
6131 Session::ntracks () const
6132 {
6133         uint32_t n = 0;
6134         boost::shared_ptr<RouteList> r = routes.reader ();
6135
6136         for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
6137                 if (boost::dynamic_pointer_cast<Track> (*i)) {
6138                         ++n;
6139                 }
6140         }
6141
6142         return n;
6143 }
6144
6145 uint32_t
6146 Session::nbusses () const
6147 {
6148         uint32_t n = 0;
6149         boost::shared_ptr<RouteList> r = routes.reader ();
6150
6151         for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
6152                 if (boost::dynamic_pointer_cast<Track>(*i) == 0) {
6153                         ++n;
6154                 }
6155         }
6156
6157         return n;
6158 }
6159
6160 void
6161 Session::add_automation_list(AutomationList *al)
6162 {
6163         automation_lists[al->id()] = al;
6164 }
6165
6166 /** @return true if there is at least one record-enabled track, otherwise false */
6167 bool
6168 Session::have_rec_enabled_track () const
6169 {
6170         return g_atomic_int_get (const_cast<gint*>(&_have_rec_enabled_track)) == 1;
6171 }
6172
6173 bool
6174 Session::have_rec_disabled_track () const
6175 {
6176     return g_atomic_int_get (const_cast<gint*>(&_have_rec_disabled_track)) == 1;
6177 }
6178
6179 /** Update the state of our rec-enabled tracks flag */
6180 void
6181 Session::update_route_record_state ()
6182 {
6183         boost::shared_ptr<RouteList> rl = routes.reader ();
6184         RouteList::iterator i = rl->begin();
6185         while (i != rl->end ()) {
6186
6187                 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
6188                                     if (tr && tr->rec_enable_control()->get_value()) {
6189                         break;
6190                 }
6191
6192                 ++i;
6193         }
6194
6195         int const old = g_atomic_int_get (&_have_rec_enabled_track);
6196
6197         g_atomic_int_set (&_have_rec_enabled_track, i != rl->end () ? 1 : 0);
6198
6199         if (g_atomic_int_get (&_have_rec_enabled_track) != old) {
6200                 RecordStateChanged (); /* EMIT SIGNAL */
6201         }
6202
6203         for (i = rl->begin(); i != rl->end (); ++i) {
6204                 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
6205                 if (tr && !tr->rec_enable_control()->get_value()) {
6206                         break;
6207                 }
6208         }
6209
6210         g_atomic_int_set (&_have_rec_disabled_track, i != rl->end () ? 1 : 0);
6211
6212         bool record_arm_state_changed = (old != g_atomic_int_get (&_have_rec_enabled_track) );
6213
6214         if (record_status() == Recording && record_arm_state_changed ) {
6215                 RecordArmStateChanged ();
6216         }
6217
6218 }
6219
6220 void
6221 Session::listen_position_changed ()
6222 {
6223         boost::shared_ptr<RouteList> r = routes.reader ();
6224
6225         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6226                 (*i)->listen_position_changed ();
6227         }
6228 }
6229
6230 void
6231 Session::solo_control_mode_changed ()
6232 {
6233         if (soloing() || listening()) {
6234                 /* We can't use ::clear_all_solo_state() here because during
6235                    session loading at program startup, that will queue a call
6236                    to rt_clear_all_solo_state() that will not execute until
6237                    AFTER solo states have been established (thus throwing away
6238                    the session's saved solo state). So just explicitly turn
6239                    them all off.
6240                 */
6241                 set_controls (route_list_to_control_list (get_routes(), &Stripable::solo_control), 0.0, Controllable::NoGroup);
6242         }
6243 }
6244
6245 /** Called when a property of one of our route groups changes */
6246 void
6247 Session::route_group_property_changed (RouteGroup* rg)
6248 {
6249         RouteGroupPropertyChanged (rg); /* EMIT SIGNAL */
6250 }
6251
6252 /** Called when a route is added to one of our route groups */
6253 void
6254 Session::route_added_to_route_group (RouteGroup* rg, boost::weak_ptr<Route> r)
6255 {
6256         RouteAddedToRouteGroup (rg, r);
6257 }
6258
6259 /** Called when a route is removed from one of our route groups */
6260 void
6261 Session::route_removed_from_route_group (RouteGroup* rg, boost::weak_ptr<Route> r)
6262 {
6263         update_route_record_state ();
6264         RouteRemovedFromRouteGroup (rg, r); /* EMIT SIGNAL */
6265 }
6266
6267 boost::shared_ptr<RouteList>
6268 Session::get_tracks () const
6269 {
6270         boost::shared_ptr<RouteList> rl = routes.reader ();
6271         boost::shared_ptr<RouteList> tl (new RouteList);
6272
6273         for (RouteList::const_iterator r = rl->begin(); r != rl->end(); ++r) {
6274                 if (boost::dynamic_pointer_cast<Track> (*r)) {
6275                         if (!(*r)->is_auditioner()) {
6276                                 tl->push_back (*r);
6277                         }
6278                 }
6279         }
6280         return tl;
6281 }
6282
6283 boost::shared_ptr<RouteList>
6284 Session::get_routes_with_regions_at (framepos_t const p) const
6285 {
6286         boost::shared_ptr<RouteList> r = routes.reader ();
6287         boost::shared_ptr<RouteList> rl (new RouteList);
6288
6289         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6290                 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
6291                 if (!tr) {
6292                         continue;
6293                 }
6294
6295                 boost::shared_ptr<Playlist> pl = tr->playlist ();
6296                 if (!pl) {
6297                         continue;
6298                 }
6299
6300                 if (pl->has_region_at (p)) {
6301                         rl->push_back (*i);
6302                 }
6303         }
6304
6305         return rl;
6306 }
6307
6308 void
6309 Session::goto_end ()
6310 {
6311         if (_session_range_location) {
6312                 request_locate (_session_range_location->end(), false);
6313         } else {
6314                 request_locate (0, false);
6315         }
6316 }
6317
6318 void
6319 Session::goto_start (bool and_roll)
6320 {
6321         if (_session_range_location) {
6322                 request_locate (_session_range_location->start(), and_roll);
6323         } else {
6324                 request_locate (0, and_roll);
6325         }
6326 }
6327
6328 framepos_t
6329 Session::current_start_frame () const
6330 {
6331         return _session_range_location ? _session_range_location->start() : 0;
6332 }
6333
6334 framepos_t
6335 Session::current_end_frame () const
6336 {
6337         return _session_range_location ? _session_range_location->end() : 0;
6338 }
6339
6340 void
6341 Session::set_session_range_location (framepos_t start, framepos_t end)
6342 {
6343         _session_range_location = new Location (*this, start, end, _("session"), Location::IsSessionRange);
6344         _locations->add (_session_range_location);
6345 }
6346
6347 void
6348 Session::step_edit_status_change (bool yn)
6349 {
6350         bool send = false;
6351
6352         bool val = false;
6353         if (yn) {
6354                 send = (_step_editors == 0);
6355                 val = true;
6356
6357                 _step_editors++;
6358         } else {
6359                 send = (_step_editors == 1);
6360                 val = false;
6361
6362                 if (_step_editors > 0) {
6363                         _step_editors--;
6364                 }
6365         }
6366
6367         if (send) {
6368                 StepEditStatusChange (val);
6369         }
6370 }
6371
6372
6373 void
6374 Session::start_time_changed (framepos_t old)
6375 {
6376         /* Update the auto loop range to match the session range
6377            (unless the auto loop range has been changed by the user)
6378         */
6379
6380         Location* s = _locations->session_range_location ();
6381         if (s == 0) {
6382                 return;
6383         }
6384
6385         Location* l = _locations->auto_loop_location ();
6386
6387         if (l && l->start() == old) {
6388                 l->set_start (s->start(), true);
6389         }
6390         set_dirty ();
6391 }
6392
6393 void
6394 Session::end_time_changed (framepos_t old)
6395 {
6396         /* Update the auto loop range to match the session range
6397            (unless the auto loop range has been changed by the user)
6398         */
6399
6400         Location* s = _locations->session_range_location ();
6401         if (s == 0) {
6402                 return;
6403         }
6404
6405         Location* l = _locations->auto_loop_location ();
6406
6407         if (l && l->end() == old) {
6408                 l->set_end (s->end(), true);
6409         }
6410         set_dirty ();
6411 }
6412
6413 std::vector<std::string>
6414 Session::source_search_path (DataType type) const
6415 {
6416         Searchpath sp;
6417
6418         if (session_dirs.size() == 1) {
6419                 switch (type) {
6420                 case DataType::AUDIO:
6421                         sp.push_back (_session_dir->sound_path());
6422                         break;
6423                 case DataType::MIDI:
6424                         sp.push_back (_session_dir->midi_path());
6425                         break;
6426                 }
6427         } else {
6428                 for (vector<space_and_path>::const_iterator i = session_dirs.begin(); i != session_dirs.end(); ++i) {
6429                         SessionDirectory sdir (i->path);
6430                         switch (type) {
6431                         case DataType::AUDIO:
6432                                 sp.push_back (sdir.sound_path());
6433                                 break;
6434                         case DataType::MIDI:
6435                                 sp.push_back (sdir.midi_path());
6436                                 break;
6437                         }
6438                 }
6439         }
6440
6441         if (type == DataType::AUDIO) {
6442                 const string sound_path_2X = _session_dir->sound_path_2X();
6443                 if (Glib::file_test (sound_path_2X, Glib::FILE_TEST_EXISTS|Glib::FILE_TEST_IS_DIR)) {
6444                         if (find (sp.begin(), sp.end(), sound_path_2X) == sp.end()) {
6445                                 sp.push_back (sound_path_2X);
6446                         }
6447                 }
6448         }
6449
6450         // now check the explicit (possibly user-specified) search path
6451
6452         switch (type) {
6453         case DataType::AUDIO:
6454                 sp += Searchpath(config.get_audio_search_path ());
6455                 break;
6456         case DataType::MIDI:
6457                 sp += Searchpath(config.get_midi_search_path ());
6458                 break;
6459         }
6460
6461         return sp;
6462 }
6463
6464 void
6465 Session::ensure_search_path_includes (const string& path, DataType type)
6466 {
6467         Searchpath sp;
6468
6469         if (path == ".") {
6470                 return;
6471         }
6472
6473         switch (type) {
6474         case DataType::AUDIO:
6475                 sp += Searchpath(config.get_audio_search_path ());
6476                 break;
6477         case DataType::MIDI:
6478                 sp += Searchpath (config.get_midi_search_path ());
6479                 break;
6480         }
6481
6482         for (vector<std::string>::iterator i = sp.begin(); i != sp.end(); ++i) {
6483                 /* No need to add this new directory if it has the same inode as
6484                    an existing one; checking inode rather than name prevents duplicated
6485                    directories when we are using symlinks.
6486
6487                    On Windows, I think we could just do if (*i == path) here.
6488                 */
6489                 if (PBD::equivalent_paths (*i, path)) {
6490                         return;
6491                 }
6492         }
6493
6494         sp += path;
6495
6496         switch (type) {
6497         case DataType::AUDIO:
6498                 config.set_audio_search_path (sp.to_string());
6499                 break;
6500         case DataType::MIDI:
6501                 config.set_midi_search_path (sp.to_string());
6502                 break;
6503         }
6504 }
6505
6506 void
6507 Session::remove_dir_from_search_path (const string& dir, DataType type)
6508 {
6509         Searchpath sp;
6510
6511         switch (type) {
6512         case DataType::AUDIO:
6513                 sp = Searchpath(config.get_audio_search_path ());
6514                 break;
6515         case DataType::MIDI:
6516                 sp = Searchpath (config.get_midi_search_path ());
6517                 break;
6518         }
6519
6520         sp -= dir;
6521
6522         switch (type) {
6523         case DataType::AUDIO:
6524                 config.set_audio_search_path (sp.to_string());
6525                 break;
6526         case DataType::MIDI:
6527                 config.set_midi_search_path (sp.to_string());
6528                 break;
6529         }
6530
6531 }
6532
6533 boost::shared_ptr<Speakers>
6534 Session::get_speakers()
6535 {
6536         return _speakers;
6537 }
6538
6539 list<string>
6540 Session::unknown_processors () const
6541 {
6542         list<string> p;
6543
6544         boost::shared_ptr<RouteList> r = routes.reader ();
6545         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6546                 list<string> t = (*i)->unknown_processors ();
6547                 copy (t.begin(), t.end(), back_inserter (p));
6548         }
6549
6550         p.sort ();
6551         p.unique ();
6552
6553         return p;
6554 }
6555
6556 void
6557 Session::update_latency (bool playback)
6558 {
6559
6560         DEBUG_TRACE (DEBUG::Latency, string_compose ("JACK latency callback: %1\n", (playback ? "PLAYBACK" : "CAPTURE")));
6561
6562         if ((_state_of_the_state & (InitialConnecting|Deletion)) || _adding_routes_in_progress || _route_deletion_in_progress) {
6563                 return;
6564         }
6565
6566         boost::shared_ptr<RouteList> r = routes.reader ();
6567         framecnt_t max_latency = 0;
6568
6569         if (playback) {
6570                 /* reverse the list so that we work backwards from the last route to run to the first */
6571                 RouteList* rl = routes.reader().get();
6572                 r.reset (new RouteList (*rl));
6573                 reverse (r->begin(), r->end());
6574         }
6575
6576         /* compute actual latency values for the given direction and store them all in per-port
6577            structures. this will also publish the same values (to JACK) so that computation of latency
6578            for routes can consistently use public latency values.
6579         */
6580
6581         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6582                 max_latency = max (max_latency, (*i)->set_private_port_latencies (playback));
6583         }
6584
6585         /* because we latency compensate playback, our published playback latencies should
6586            be the same for all output ports - all material played back by ardour has
6587            the same latency, whether its caused by plugins or by latency compensation. since
6588            these may differ from the values computed above, reset all playback port latencies
6589            to the same value.
6590         */
6591
6592         DEBUG_TRACE (DEBUG::Latency, string_compose ("Set public port latencies to %1\n", max_latency));
6593
6594         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6595                 (*i)->set_public_port_latencies (max_latency, playback);
6596         }
6597
6598         if (playback) {
6599
6600                 post_playback_latency ();
6601
6602         } else {
6603
6604                 post_capture_latency ();
6605         }
6606
6607         DEBUG_TRACE (DEBUG::Latency, "JACK latency callback: DONE\n");
6608 }
6609
6610 void
6611 Session::post_playback_latency ()
6612 {
6613         set_worst_playback_latency ();
6614
6615         boost::shared_ptr<RouteList> r = routes.reader ();
6616
6617         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6618                 if (!(*i)->is_auditioner() && ((*i)->active())) {
6619                         _worst_track_latency = max (_worst_track_latency, (*i)->update_signal_latency ());
6620                 }
6621         }
6622
6623         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6624                 (*i)->set_latency_compensation (_worst_track_latency);
6625         }
6626 }
6627
6628 void
6629 Session::post_capture_latency ()
6630 {
6631         set_worst_capture_latency ();
6632
6633         /* reflect any changes in capture latencies into capture offsets
6634          */
6635
6636         boost::shared_ptr<RouteList> rl = routes.reader();
6637         for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
6638                 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
6639                 if (tr) {
6640                         tr->set_capture_offset ();
6641                 }
6642         }
6643 }
6644
6645 void
6646 Session::initialize_latencies ()
6647 {
6648         {
6649                 Glib::Threads::Mutex::Lock lm (_engine.process_lock());
6650                 update_latency (false);
6651                 update_latency (true);
6652         }
6653
6654         set_worst_io_latencies ();
6655 }
6656
6657 void
6658 Session::set_worst_io_latencies ()
6659 {
6660         set_worst_playback_latency ();
6661         set_worst_capture_latency ();
6662 }
6663
6664 void
6665 Session::set_worst_playback_latency ()
6666 {
6667         if (_state_of_the_state & (InitialConnecting|Deletion)) {
6668                 return;
6669         }
6670
6671         _worst_output_latency = 0;
6672
6673         if (!_engine.connected()) {
6674                 return;
6675         }
6676
6677         boost::shared_ptr<RouteList> r = routes.reader ();
6678
6679         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6680                 _worst_output_latency = max (_worst_output_latency, (*i)->output()->latency());
6681         }
6682
6683         DEBUG_TRACE (DEBUG::Latency, string_compose ("Worst output latency: %1\n", _worst_output_latency));
6684 }
6685
6686 void
6687 Session::set_worst_capture_latency ()
6688 {
6689         if (_state_of_the_state & (InitialConnecting|Deletion)) {
6690                 return;
6691         }
6692
6693         _worst_input_latency = 0;
6694
6695         if (!_engine.connected()) {
6696                 return;
6697         }
6698
6699         boost::shared_ptr<RouteList> r = routes.reader ();
6700
6701         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6702                 _worst_input_latency = max (_worst_input_latency, (*i)->input()->latency());
6703         }
6704
6705         DEBUG_TRACE (DEBUG::Latency, string_compose ("Worst input latency: %1\n", _worst_input_latency));
6706 }
6707
6708 void
6709 Session::update_latency_compensation (bool force_whole_graph)
6710 {
6711         bool some_track_latency_changed = false;
6712
6713         if (_state_of_the_state & (InitialConnecting|Deletion)) {
6714                 return;
6715         }
6716
6717         DEBUG_TRACE(DEBUG::Latency, "---------------------------- update latency compensation\n\n");
6718
6719         _worst_track_latency = 0;
6720
6721         boost::shared_ptr<RouteList> r = routes.reader ();
6722
6723         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6724                 if (!(*i)->is_auditioner() && ((*i)->active())) {
6725                         framecnt_t tl;
6726                         if ((*i)->signal_latency () != (tl = (*i)->update_signal_latency ())) {
6727                                 some_track_latency_changed = true;
6728                         }
6729                         _worst_track_latency = max (tl, _worst_track_latency);
6730                 }
6731         }
6732
6733         DEBUG_TRACE (DEBUG::Latency, string_compose ("worst signal processing latency: %1 (changed ? %2)\n", _worst_track_latency,
6734                                                      (some_track_latency_changed ? "yes" : "no")));
6735
6736         DEBUG_TRACE(DEBUG::Latency, "---------------------------- DONE update latency compensation\n\n");
6737
6738         if (some_track_latency_changed || force_whole_graph)  {
6739                 _engine.update_latencies ();
6740         }
6741
6742
6743         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
6744                 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
6745                 if (!tr) {
6746                         continue;
6747                 }
6748                 tr->set_capture_offset ();
6749         }
6750 }
6751
6752 char
6753 Session::session_name_is_legal (const string& path)
6754 {
6755         char illegal_chars[] = { '/', '\\', ':', ';', '\0' };
6756
6757         for (int i = 0; illegal_chars[i]; ++i) {
6758                 if (path.find (illegal_chars[i]) != string::npos) {
6759                         return illegal_chars[i];
6760                 }
6761         }
6762
6763         return 0;
6764 }
6765
6766 void
6767 Session::notify_presentation_info_change ()
6768 {
6769         if (deletion_in_progress()) {
6770                 return;
6771         }
6772
6773         PresentationInfo::Change (); /* EMIT SIGNAL */
6774         reassign_track_numbers();
6775
6776 #ifdef USE_TRACKS_CODE_FEATURES
6777         /* Waves Tracks: for Waves Tracks session it's required to reconnect their IOs
6778          * if track order has been changed by user
6779          */
6780         reconnect_existing_routes(true, true);
6781 #endif
6782
6783 }
6784
6785 bool
6786 Session::operation_in_progress (GQuark op) const
6787 {
6788         return (find (_current_trans_quarks.begin(), _current_trans_quarks.end(), op) != _current_trans_quarks.end());
6789 }
6790
6791 boost::shared_ptr<Port>
6792 Session::ltc_input_port () const
6793 {
6794         return _ltc_input->nth (0);
6795 }
6796
6797 boost::shared_ptr<Port>
6798 Session::ltc_output_port () const
6799 {
6800         return _ltc_output->nth (0);
6801 }
6802
6803 void
6804 Session::reconnect_ltc_input ()
6805 {
6806         if (_ltc_input) {
6807
6808                 string src = Config->get_ltc_source_port();
6809
6810                 _ltc_input->disconnect (this);
6811
6812                 if (src != _("None") && !src.empty())  {
6813                         _ltc_input->nth (0)->connect (src);
6814                 }
6815
6816                 if ( ARDOUR::Profile->get_trx () ) {
6817                         // Tracks need this signal to update timecode_source_dropdown
6818                         MtcOrLtcInputPortChanged (); //emit signal
6819                 }
6820         }
6821 }
6822
6823 void
6824 Session::reconnect_ltc_output ()
6825 {
6826         if (_ltc_output) {
6827
6828                 string src = Config->get_ltc_output_port();
6829
6830                 _ltc_output->disconnect (this);
6831
6832                 if (src != _("None") && !src.empty())  {
6833                         _ltc_output->nth (0)->connect (src);
6834                 }
6835         }
6836 }
6837
6838 void
6839 Session::set_range_selection (framepos_t start, framepos_t end)
6840 {
6841         _range_selection = Evoral::Range<framepos_t> (start, end);
6842 #ifdef USE_TRACKS_CODE_FEATURES
6843         follow_playhead_priority ();
6844 #endif
6845 }
6846
6847 void
6848 Session::set_object_selection (framepos_t start, framepos_t end)
6849 {
6850         _object_selection = Evoral::Range<framepos_t> (start, end);
6851 #ifdef USE_TRACKS_CODE_FEATURES
6852         follow_playhead_priority ();
6853 #endif
6854 }
6855
6856 void
6857 Session::clear_range_selection ()
6858 {
6859         _range_selection = Evoral::Range<framepos_t> (-1,-1);
6860 #ifdef USE_TRACKS_CODE_FEATURES
6861         follow_playhead_priority ();
6862 #endif
6863 }
6864
6865 void
6866 Session::clear_object_selection ()
6867 {
6868         _object_selection = Evoral::Range<framepos_t> (-1,-1);
6869 #ifdef USE_TRACKS_CODE_FEATURES
6870         follow_playhead_priority ();
6871 #endif
6872 }
6873
6874 void
6875 Session::auto_connect_route (boost::shared_ptr<Route> route, bool connect_inputs,
6876                 const ChanCount& input_start,
6877                 const ChanCount& output_start,
6878                 const ChanCount& input_offset,
6879                 const ChanCount& output_offset)
6880 {
6881         Glib::Threads::Mutex::Lock lx (_auto_connect_queue_lock);
6882         _auto_connect_queue.push (AutoConnectRequest (route, connect_inputs,
6883                                 input_start, output_start,
6884                                 input_offset, output_offset));
6885
6886         auto_connect_thread_wakeup ();
6887 }
6888
6889 void
6890 Session::auto_connect_thread_wakeup ()
6891 {
6892         if (pthread_mutex_trylock (&_auto_connect_mutex) == 0) {
6893                 pthread_cond_signal (&_auto_connect_cond);
6894                 pthread_mutex_unlock (&_auto_connect_mutex);
6895         }
6896 }
6897
6898 void
6899 Session::queue_latency_recompute ()
6900 {
6901         g_atomic_int_inc (&_latency_recompute_pending);
6902         auto_connect_thread_wakeup ();
6903 }
6904
6905 void
6906 Session::auto_connect (const AutoConnectRequest& ar)
6907 {
6908         boost::shared_ptr<Route> route = ar.route.lock();
6909
6910         if (!route) { return; }
6911
6912         if (!IO::connecting_legal) {
6913                 return;
6914         }
6915
6916         /* If both inputs and outputs are auto-connected to physical ports,
6917          * use the max of input and output offsets to ensure auto-connected
6918          * port numbers always match up (e.g. the first audio input and the
6919          * first audio output of the route will have the same physical
6920          * port number).  Otherwise just use the lowest input or output
6921          * offset possible.
6922          */
6923
6924         const bool in_out_physical =
6925                 (Config->get_input_auto_connect() & AutoConnectPhysical)
6926                 && (Config->get_output_auto_connect() & AutoConnectPhysical)
6927                 && ar.connect_inputs;
6928
6929         const ChanCount in_offset = in_out_physical
6930                 ? ChanCount::max(ar.input_offset, ar.output_offset)
6931                 : ar.input_offset;
6932
6933         const ChanCount out_offset = in_out_physical
6934                 ? ChanCount::max(ar.input_offset, ar.output_offset)
6935                 : ar.output_offset;
6936
6937         for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
6938                 vector<string> physinputs;
6939                 vector<string> physoutputs;
6940
6941
6942                 /* for connecting track inputs we only want MIDI ports marked
6943                  * for "music".
6944                  */
6945
6946                 get_physical_ports (physinputs, physoutputs, *t, MidiPortMusic);
6947
6948                 if (!physinputs.empty() && ar.connect_inputs) {
6949                         uint32_t nphysical_in = physinputs.size();
6950
6951                         for (uint32_t i = ar.input_start.get(*t); i < route->n_inputs().get(*t) && i < nphysical_in; ++i) {
6952                                 string port;
6953
6954                                 if (Config->get_input_auto_connect() & AutoConnectPhysical) {
6955                                         port = physinputs[(in_offset.get(*t) + i) % nphysical_in];
6956                                 }
6957
6958                                 if (!port.empty() && route->input()->connect (route->input()->ports().port(*t, i), port, this)) {
6959                                         break;
6960                                 }
6961                         }
6962                 }
6963
6964                 if (!physoutputs.empty()) {
6965                         uint32_t nphysical_out = physoutputs.size();
6966                         for (uint32_t i = ar.output_start.get(*t); i < route->n_outputs().get(*t); ++i) {
6967                                 string port;
6968
6969                                 /* Waves Tracks:
6970                                  * do not create new connections if we reached the limit of physical outputs
6971                                  * in Multi Out mode
6972                                  */
6973                                 if (!(Config->get_output_auto_connect() & AutoConnectMaster) &&
6974                                                 ARDOUR::Profile->get_trx () &&
6975                                                 ar.output_offset.get(*t) == nphysical_out ) {
6976                                         break;
6977                                 }
6978
6979                                 if ((*t) == DataType::MIDI && (Config->get_output_auto_connect() & AutoConnectPhysical)) {
6980                                         port = physoutputs[(out_offset.get(*t) + i) % nphysical_out];
6981                                 } else if ((*t) == DataType::AUDIO && (Config->get_output_auto_connect() & AutoConnectMaster)) {
6982                                         /* master bus is audio only */
6983                                         if (_master_out && _master_out->n_inputs().get(*t) > 0) {
6984                                                 port = _master_out->input()->ports().port(*t,
6985                                                                 i % _master_out->input()->n_ports().get(*t))->name();
6986                                         }
6987                                 }
6988
6989                                 if (!port.empty() && route->output()->connect (route->output()->ports().port(*t, i), port, this)) {
6990                                         break;
6991                                 }
6992                         }
6993                 }
6994         }
6995 }
6996
6997 void
6998 Session::auto_connect_thread_start ()
6999 {
7000         if (_ac_thread_active) {
7001                 return;
7002         }
7003
7004         while (!_auto_connect_queue.empty ()) {
7005                 _auto_connect_queue.pop ();
7006         }
7007
7008         _ac_thread_active = true;
7009         if (pthread_create (&_auto_connect_thread, NULL, auto_connect_thread, this)) {
7010                 _ac_thread_active = false;
7011         }
7012 }
7013
7014 void
7015 Session::auto_connect_thread_terminate ()
7016 {
7017         if (!_ac_thread_active) {
7018                 return;
7019         }
7020         _ac_thread_active = false;
7021
7022         {
7023                 Glib::Threads::Mutex::Lock lx (_auto_connect_queue_lock);
7024                 while (!_auto_connect_queue.empty ()) {
7025                         _auto_connect_queue.pop ();
7026                 }
7027         }
7028
7029         auto_connect_thread_wakeup ();
7030
7031         void *status;
7032         pthread_join (_auto_connect_thread, &status);
7033 }
7034
7035 void *
7036 Session::auto_connect_thread (void *arg)
7037 {
7038         Session *s = static_cast<Session *>(arg);
7039         s->auto_connect_thread_run ();
7040         pthread_exit (0);
7041         return 0;
7042 }
7043
7044 void
7045 Session::auto_connect_thread_run ()
7046 {
7047         pthread_set_name (X_("autoconnect"));
7048         SessionEvent::create_per_thread_pool (X_("autoconnect"), 1024);
7049         PBD::notify_event_loops_about_thread_creation (pthread_self(), X_("autoconnect"), 1024);
7050         pthread_mutex_lock (&_auto_connect_mutex);
7051         while (_ac_thread_active) {
7052
7053                 if (!_auto_connect_queue.empty ()) {
7054                         // Why would we need the process lock ??
7055                         // A: if ports are added while we're connecting, the backend's iterator may be invalidated:
7056                         //   graph_order_callback() -> resort_routes() -> direct_feeds_according_to_reality () -> backend::connected_to()
7057                         //   All ardour-internal backends use a std::vector   xxxAudioBackend::find_port()
7058                         //   We have control over those, but what does jack do?
7059                         Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
7060
7061                         Glib::Threads::Mutex::Lock lx (_auto_connect_queue_lock);
7062                         while (!_auto_connect_queue.empty ()) {
7063                                 const AutoConnectRequest ar (_auto_connect_queue.front());
7064                                 _auto_connect_queue.pop ();
7065                                 lx.release ();
7066                                 auto_connect (ar);
7067                                 lx.acquire ();
7068                         }
7069                 }
7070
7071                 if (!actively_recording ()) { // might not be needed,
7072                         /* this is only used for updating plugin latencies, the
7073                          * graph does not change. so it's safe in general.
7074                          * BUT..
7075                          * .. update_latency_compensation () entails set_capture_offset()
7076                          * which calls Diskstream::set_capture_offset () which
7077                          * modifies the capture offset... which can be a proplem
7078                          * in "prepare_to_stop"
7079                          */
7080                         while (g_atomic_int_and (&_latency_recompute_pending, 0)) {
7081                                 update_latency_compensation ();
7082                         }
7083                 }
7084
7085                 AudioEngine::instance()->clear_pending_port_deletions ();
7086
7087                 pthread_cond_wait (&_auto_connect_cond, &_auto_connect_mutex);
7088         }
7089         pthread_mutex_unlock (&_auto_connect_mutex);
7090 }
7091
7092 void
7093 Session::cancel_all_solo ()
7094 {
7095         StripableList sl;
7096
7097         get_stripables (sl);
7098
7099         set_controls (stripable_list_to_control_list (sl, &Stripable::solo_control), 0.0, Controllable::NoGroup);
7100         clear_all_solo_state (routes.reader());
7101 }