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