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