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