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