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