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