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