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