ccf4cb2b86ebd767ed45786af8bb234b1b48cf0d
[ardour.git] / libs / ardour / session.cc
1 /*
2     Copyright (C) 1999-2010 Paul Davis
3
4     This program is free software; you can redistribute it and/or modify
5     it under the terms of the GNU General Public License as published by
6     the Free Software Foundation; either version 2 of the License, or
7     (at your option) any later version.
8
9     This program is distributed in the hope that it will be useful,
10     but WITHOUT ANY WARRANTY; without even the implied warranty of
11     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12     GNU General Public License for more details.
13
14     You should have received a copy of the GNU General Public License
15     along with this program; if not, write to the Free Software
16     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17
18 */
19
20 #include <stdint.h>
21
22 #include <algorithm>
23 #include <string>
24 #include <vector>
25 #include <sstream>
26 #include <fstream>
27 #include <cstdio> /* sprintf(3) ... grrr */
28 #include <cmath>
29 #include <cerrno>
30 #include <unistd.h>
31 #include <limits.h>
32
33 #include <glibmm/threads.h>
34 #include <glibmm/miscutils.h>
35 #include <glibmm/fileutils.h>
36
37 #include <boost/algorithm/string/erase.hpp>
38
39 #include "pbd/error.h"
40 #include "pbd/boost_debug.h"
41 #include "pbd/pathscanner.h"
42 #include "pbd/stl_delete.h"
43 #include "pbd/basename.h"
44 #include "pbd/stacktrace.h"
45 #include "pbd/file_utils.h"
46 #include "pbd/convert.h"
47 #include "pbd/strsplit.h"
48 #include "pbd/unwind.h"
49
50 #include "ardour/amp.h"
51 #include "ardour/analyser.h"
52 #include "ardour/audio_buffer.h"
53 #include "ardour/audio_diskstream.h"
54 #include "ardour/audio_port.h"
55 #include "ardour/audio_track.h"
56 #include "ardour/audioengine.h"
57 #include "ardour/audiofilesource.h"
58 #include "ardour/auditioner.h"
59 #include "ardour/buffer_manager.h"
60 #include "ardour/buffer_set.h"
61 #include "ardour/bundle.h"
62 #include "ardour/butler.h"
63 #include "ardour/click.h"
64 #include "ardour/control_protocol_manager.h"
65 #include "ardour/data_type.h"
66 #include "ardour/debug.h"
67 #include "ardour/filename_extensions.h"
68 #include "ardour/graph.h"
69 #include "ardour/midi_track.h"
70 #include "ardour/midi_ui.h"
71 #include "ardour/operations.h"
72 #include "ardour/playlist.h"
73 #include "ardour/plugin.h"
74 #include "ardour/plugin_insert.h"
75 #include "ardour/process_thread.h"
76 #include "ardour/rc_configuration.h"
77 #include "ardour/recent_sessions.h"
78 #include "ardour/region.h"
79 #include "ardour/region_factory.h"
80 #include "ardour/route_graph.h"
81 #include "ardour/route_group.h"
82 #include "ardour/send.h"
83 #include "ardour/session.h"
84 #include "ardour/session_directory.h"
85 #include "ardour/session_playlists.h"
86 #include "ardour/smf_source.h"
87 #include "ardour/source_factory.h"
88 #include "ardour/utils.h"
89
90 #include "midi++/port.h"
91 #include "midi++/jack_midi_port.h"
92 #include "midi++/mmc.h"
93 #include "midi++/manager.h"
94
95 #include "i18n.h"
96
97 namespace ARDOUR {
98 class MidiSource;
99 class Processor;
100 class Speakers;
101 }
102
103 using namespace std;
104 using namespace ARDOUR;
105 using namespace PBD;
106
107 bool Session::_disable_all_loaded_plugins = false;
108
109 PBD::Signal1<void,std::string> Session::Dialog;
110 PBD::Signal0<int> Session::AskAboutPendingState;
111 PBD::Signal2<int, framecnt_t, framecnt_t> Session::AskAboutSampleRateMismatch;
112 PBD::Signal0<void> Session::SendFeedback;
113 PBD::Signal3<int,Session*,std::string,DataType> Session::MissingFile;
114
115 PBD::Signal1<void, framepos_t> Session::StartTimeChanged;
116 PBD::Signal1<void, framepos_t> Session::EndTimeChanged;
117 PBD::Signal2<void,std::string, std::string> Session::Exported;
118 PBD::Signal1<int,boost::shared_ptr<Playlist> > Session::AskAboutPlaylistDeletion;
119 PBD::Signal0<void> Session::Quit;
120 PBD::Signal0<void> Session::FeedbackDetected;
121 PBD::Signal0<void> Session::SuccessfulGraphSort;
122
123 static void clean_up_session_event (SessionEvent* ev) { delete ev; }
124 const SessionEvent::RTeventCallback Session::rt_cleanup (clean_up_session_event);
125
126 /** @param snapshot_name Snapshot name, without .ardour suffix */
127 Session::Session (AudioEngine &eng,
128                   const string& fullpath,
129                   const string& snapshot_name,
130                   BusProfile* bus_profile,
131                   string mix_template)
132         : _engine (eng)
133         , _target_transport_speed (0.0)
134         , _requested_return_frame (-1)
135         , _session_dir (new SessionDirectory(fullpath))
136         , state_tree (0)
137         , _state_of_the_state (Clean)
138         , _butler (new Butler (*this))
139         , _post_transport_work (0)
140         , _send_timecode_update (false)
141         , _all_route_group (new RouteGroup (*this, "all"))
142         , routes (new RouteList)
143         , _total_free_4k_blocks (0)
144         , _total_free_4k_blocks_uncertain (false)
145         , _bundles (new BundleList)
146         , _bundle_xml_node (0)
147         , _current_trans (0)
148         , click_data (0)
149         , click_emphasis_data (0)
150         , main_outs (0)
151         , _have_rec_enabled_track (false)
152         , _suspend_timecode_transmission (0)
153 {
154         _locations = new Locations (*this);
155 #ifdef HAVE_LTC
156         ltc_encoder = NULL;
157 #endif
158
159         if (how_many_dsp_threads () > 1) {
160                 /* For now, only create the graph if we are using >1 DSP threads, as
161                    it is a bit slower than the old code with 1 thread.
162                 */
163                 _process_graph.reset (new Graph (*this));
164         }
165
166         playlists.reset (new SessionPlaylists);
167
168         _all_route_group->set_active (true, this);
169
170         interpolation.add_channel_to (0, 0);
171
172         if (!eng.connected()) {
173                 throw failed_constructor();
174         }
175
176         n_physical_outputs = _engine.n_physical_outputs ();
177         n_physical_inputs =  _engine.n_physical_inputs ();
178
179         first_stage_init (fullpath, snapshot_name);
180
181         _is_new = !Glib::file_test (_path, Glib::FileTest (G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR));
182
183         if (_is_new) {
184                 if (create (mix_template, bus_profile)) {
185                         destroy ();
186                         throw failed_constructor ();
187                 }
188         }
189
190         if (second_stage_init ()) {
191                 destroy ();
192                 throw failed_constructor ();
193         }
194
195         store_recent_sessions(_name, _path);
196
197         bool was_dirty = dirty();
198
199         _state_of_the_state = StateOfTheState (_state_of_the_state & ~Dirty);
200
201         Config->ParameterChanged.connect_same_thread (*this, boost::bind (&Session::config_changed, this, _1, false));
202         config.ParameterChanged.connect_same_thread (*this, boost::bind (&Session::config_changed, this, _1, true));
203
204         if (was_dirty) {
205                 DirtyChanged (); /* EMIT SIGNAL */
206         }
207
208         StartTimeChanged.connect_same_thread (*this, boost::bind (&Session::start_time_changed, this, _1));
209         EndTimeChanged.connect_same_thread (*this, boost::bind (&Session::end_time_changed, this, _1));
210
211         _is_new = false;
212 }
213
214 Session::~Session ()
215 {
216 #ifdef PT_TIMING        
217         ST.dump ("ST.dump");
218 #endif  
219         destroy ();
220 }
221
222 void
223 Session::destroy ()
224 {
225         vector<void*> debug_pointers;
226
227         /* if we got to here, leaving pending capture state around
228            is a mistake.
229         */
230
231         remove_pending_capture_state ();
232
233         _state_of_the_state = StateOfTheState (CannotSave|Deletion);
234
235         /* disconnect from any and all signals that we are connected to */
236
237         drop_connections ();
238
239         _engine.remove_session ();
240
241         /* deregister all ports - there will be no process or any other
242          * callbacks from the engine any more.
243          */
244
245         Port::PortDrop (); /* EMIT SIGNAL */
246
247 #ifdef HAVE_LTC
248         ltc_tx_cleanup();
249 #endif
250
251         /* clear history so that no references to objects are held any more */
252
253         _history.clear ();
254
255         /* clear state tree so that no references to objects are held any more */
256
257         delete state_tree;
258
259         /* reset dynamic state version back to default */
260
261         Stateful::loading_state_version = 0;
262
263         _butler->drop_references ();
264         delete _butler;
265         _butler = 0;
266         
267         delete midi_control_ui;
268         delete _all_route_group;
269
270         if (click_data != default_click) {
271                 delete [] click_data;
272         }
273
274         if (click_emphasis_data != default_click_emphasis) {
275                 delete [] click_emphasis_data;
276         }
277
278         clear_clicks ();
279
280         /* clear out any pending dead wood from RCU managed objects */
281
282         routes.flush ();
283         _bundles.flush ();
284
285         AudioDiskstream::free_working_buffers();
286
287         /* tell everyone who is still standing that we're about to die */
288         drop_references ();
289
290         /* tell everyone to drop references and delete objects as we go */
291
292         DEBUG_TRACE (DEBUG::Destruction, "delete regions\n");
293         RegionFactory::delete_all_regions ();
294
295         DEBUG_TRACE (DEBUG::Destruction, "delete routes\n");
296
297         /* reset these three references to special routes before we do the usual route delete thing */
298
299         auditioner.reset ();
300         _master_out.reset ();
301         _monitor_out.reset ();
302
303         {
304                 RCUWriter<RouteList> writer (routes);
305                 boost::shared_ptr<RouteList> r = writer.get_copy ();
306
307                 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
308                         DEBUG_TRACE(DEBUG::Destruction, string_compose ("Dropping for route %1 ; pre-ref = %2\n", (*i)->name(), (*i).use_count()));
309                         (*i)->drop_references ();
310                 }
311
312                 r->clear ();
313                 /* writer goes out of scope and updates master */
314         }
315         routes.flush ();
316
317         DEBUG_TRACE (DEBUG::Destruction, "delete sources\n");
318         for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
319                 DEBUG_TRACE(DEBUG::Destruction, string_compose ("Dropping for source %1 ; pre-ref = %2\n", i->second->name(), i->second.use_count()));
320                 i->second->drop_references ();
321         }
322
323         sources.clear ();
324
325         DEBUG_TRACE (DEBUG::Destruction, "delete route groups\n");
326         for (list<RouteGroup *>::iterator i = _route_groups.begin(); i != _route_groups.end(); ++i) {
327
328                 delete *i;
329         }
330
331         /* not strictly necessary, but doing it here allows the shared_ptr debugging to work */
332         playlists.reset ();
333
334         delete _locations;
335
336         DEBUG_TRACE (DEBUG::Destruction, "Session::destroy() done\n");
337
338 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
339         boost_debug_list_ptrs ();
340 #endif
341 }
342
343 void
344 Session::when_engine_running ()
345 {
346         string first_physical_output;
347
348         BootMessage (_("Set block size and sample rate"));
349
350         set_block_size (_engine.frames_per_cycle());
351         set_frame_rate (_engine.frame_rate());
352
353         BootMessage (_("Using configuration"));
354
355         boost::function<void (std::string)> ff (boost::bind (&Session::config_changed, this, _1, false));
356         boost::function<void (std::string)> ft (boost::bind (&Session::config_changed, this, _1, true));
357
358         Config->map_parameters (ff);
359         config.map_parameters (ft);
360
361         /* every time we reconnect, recompute worst case output latencies */
362
363         _engine.Running.connect_same_thread (*this, boost::bind (&Session::initialize_latencies, this));
364
365         if (synced_to_jack()) {
366                 _engine.transport_stop ();
367         }
368
369         if (config.get_jack_time_master()) {
370                 _engine.transport_locate (_transport_frame);
371         }
372
373         _clicking = false;
374
375         try {
376                 XMLNode* child = 0;
377                 
378                 _ltc_input.reset (new IO (*this, _("LTC In"), IO::Input));
379                 _ltc_output.reset (new IO (*this, _("LTC Out"), IO::Output));
380
381                 if (state_tree && (child = find_named_node (*state_tree->root(), "LTC-In")) != 0) {
382                         _ltc_input->set_state (*(child->children().front()), Stateful::loading_state_version);
383                 } else {
384                         {
385                                 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
386                                 _ltc_input->ensure_io (ChanCount (DataType::AUDIO, 1), true, this);
387                         }
388                         reconnect_ltc_input ();
389                 }
390
391                 if (state_tree && (child = find_named_node (*state_tree->root(), "LTC-Out")) != 0) {
392                         _ltc_output->set_state (*(child->children().front()), Stateful::loading_state_version);
393                 } else {
394                         {
395                                 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
396                                 _ltc_output->ensure_io (ChanCount (DataType::AUDIO, 1), true, this);
397                         }
398                         reconnect_ltc_output ();
399                 }
400                                                 
401                 /* fix up names of LTC ports because we don't want the normal
402                  * IO style of NAME/TYPE-{in,out}N
403                  */
404                 
405                 _ltc_input->nth (0)->set_name (_("LTC-in"));
406                 _ltc_output->nth (0)->set_name (_("LTC-out"));
407
408                 _click_io.reset (new ClickIO (*this, "click"));
409                 _click_gain.reset (new Amp (*this));
410                 _click_gain->activate ();
411
412                 if (state_tree && (child = find_named_node (*state_tree->root(), "Click")) != 0) {
413
414                         /* existing state for Click */
415                         int c = 0;
416
417                         if (Stateful::loading_state_version < 3000) {
418                                 c = _click_io->set_state_2X (*child->children().front(), Stateful::loading_state_version, false);
419                         } else {
420                                 const XMLNodeList& children (child->children());
421                                 XMLNodeList::const_iterator i = children.begin();
422                                 if ((c = _click_io->set_state (**i, Stateful::loading_state_version)) == 0) {
423                                         ++i;
424                                         if (i != children.end()) {
425                                                 c = _click_gain->set_state (**i, Stateful::loading_state_version);
426                                         }
427                                 }
428                         }
429                         
430                         if (c == 0) {
431                                 _clicking = Config->get_clicking ();
432
433                         } else {
434
435                                 error << _("could not setup Click I/O") << endmsg;
436                                 _clicking = false;
437                         }
438
439
440                 } else {
441
442                         /* default state for Click: dual-mono to first 2 physical outputs */
443
444                         vector<string> outs;
445                         _engine.get_physical_outputs (DataType::AUDIO, outs);
446
447                         for (uint32_t physport = 0; physport < 2; ++physport) {
448                                 if (outs.size() > physport) {
449                                         if (_click_io->add_port (outs[physport], this)) {
450                                                 // relax, even though its an error
451                                         }
452                                 }
453                         }
454
455                         if (_click_io->n_ports () > ChanCount::ZERO) {
456                                 _clicking = Config->get_clicking ();
457                         }
458                 }
459         }
460
461         catch (failed_constructor& err) {
462                 error << _("cannot setup Click I/O") << endmsg;
463         }
464
465         BootMessage (_("Compute I/O Latencies"));
466
467         if (_clicking) {
468                 // XXX HOW TO ALERT UI TO THIS ? DO WE NEED TO?
469         }
470
471         BootMessage (_("Set up standard connections"));
472
473         vector<string> inputs[DataType::num_types];
474         vector<string> outputs[DataType::num_types];
475         for (uint32_t i = 0; i < DataType::num_types; ++i) {
476                 _engine.get_physical_inputs (DataType (DataType::Symbol (i)), inputs[i]);
477                 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
478         }
479
480         /* Create a set of Bundle objects that map
481            to the physical I/O currently available.  We create both
482            mono and stereo bundles, so that the common cases of mono
483            and stereo tracks get bundles to put in their mixer strip
484            in / out menus.  There may be a nicer way of achieving that;
485            it doesn't really scale that well to higher channel counts
486         */
487
488         /* mono output bundles */
489
490         for (uint32_t np = 0; np < outputs[DataType::AUDIO].size(); ++np) {
491                 char buf[32];
492                 snprintf (buf, sizeof (buf), _("out %" PRIu32), np+1);
493
494                 boost::shared_ptr<Bundle> c (new Bundle (buf, true));
495                 c->add_channel (_("mono"), DataType::AUDIO);
496                 c->set_port (0, outputs[DataType::AUDIO][np]);
497
498                 add_bundle (c);
499         }
500
501         /* stereo output bundles */
502
503         for (uint32_t np = 0; np < outputs[DataType::AUDIO].size(); np += 2) {
504                 if (np + 1 < outputs[DataType::AUDIO].size()) {
505                         char buf[32];
506                         snprintf (buf, sizeof(buf), _("out %" PRIu32 "+%" PRIu32), np + 1, np + 2);
507                         boost::shared_ptr<Bundle> c (new Bundle (buf, true));
508                         c->add_channel (_("L"), DataType::AUDIO);
509                         c->set_port (0, outputs[DataType::AUDIO][np]);
510                         c->add_channel (_("R"), DataType::AUDIO);
511                         c->set_port (1, outputs[DataType::AUDIO][np + 1]);
512
513                         add_bundle (c);
514                 }
515         }
516
517         /* mono input bundles */
518
519         for (uint32_t np = 0; np < inputs[DataType::AUDIO].size(); ++np) {
520                 char buf[32];
521                 snprintf (buf, sizeof (buf), _("in %" PRIu32), np+1);
522
523                 boost::shared_ptr<Bundle> c (new Bundle (buf, false));
524                 c->add_channel (_("mono"), DataType::AUDIO);
525                 c->set_port (0, inputs[DataType::AUDIO][np]);
526
527                 add_bundle (c);
528         }
529
530         /* stereo input bundles */
531
532         for (uint32_t np = 0; np < inputs[DataType::AUDIO].size(); np += 2) {
533                 if (np + 1 < inputs[DataType::AUDIO].size()) {
534                         char buf[32];
535                         snprintf (buf, sizeof(buf), _("in %" PRIu32 "+%" PRIu32), np + 1, np + 2);
536
537                         boost::shared_ptr<Bundle> c (new Bundle (buf, false));
538                         c->add_channel (_("L"), DataType::AUDIO);
539                         c->set_port (0, inputs[DataType::AUDIO][np]);
540                         c->add_channel (_("R"), DataType::AUDIO);
541                         c->set_port (1, inputs[DataType::AUDIO][np + 1]);
542
543                         add_bundle (c);
544                 }
545         }
546
547         /* MIDI input bundles */
548
549         for (uint32_t np = 0; np < inputs[DataType::MIDI].size(); ++np) {
550                 string n = inputs[DataType::MIDI][np];
551                 boost::erase_first (n, X_("alsa_pcm:"));
552
553                 boost::shared_ptr<Bundle> c (new Bundle (n, false));
554                 c->add_channel ("", DataType::MIDI);
555                 c->set_port (0, inputs[DataType::MIDI][np]);
556                 add_bundle (c);
557         }
558
559         /* MIDI output bundles */
560
561         for (uint32_t np = 0; np < outputs[DataType::MIDI].size(); ++np) {
562                 string n = outputs[DataType::MIDI][np];
563                 boost::erase_first (n, X_("alsa_pcm:"));
564
565                 boost::shared_ptr<Bundle> c (new Bundle (n, true));
566                 c->add_channel ("", DataType::MIDI);
567                 c->set_port (0, outputs[DataType::MIDI][np]);
568                 add_bundle (c);
569         }
570
571         BootMessage (_("Setup signal flow and plugins"));
572
573         /* Reset all panners */
574
575         Delivery::reset_panners ();
576
577         /* this will cause the CPM to instantiate any protocols that are in use
578          * (or mandatory), which will pass it this Session, and then call
579          * set_state() on each instantiated protocol to match stored state.
580          */
581
582         ControlProtocolManager::instance().set_session (this);
583
584         /* This must be done after the ControlProtocolManager set_session above,
585            as it will set states for ports which the ControlProtocolManager creates.
586         */
587
588         MIDI::Manager::instance()->set_port_states (Config->midi_port_states ());
589
590         /* And this must be done after the MIDI::Manager::set_port_states as
591          * it will try to make connections whose details are loaded by set_port_states.
592          */
593
594         hookup_io ();
595
596         /* Let control protocols know that we are now all connected, so they
597          * could start talking to surfaces if they want to.
598          */
599
600         ControlProtocolManager::instance().midi_connectivity_established ();
601
602         if (_is_new && !no_auto_connect()) {
603                 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock());
604                 auto_connect_master_bus ();
605         }
606
607         _state_of_the_state = StateOfTheState (_state_of_the_state & ~(CannotSave|Dirty));
608
609         /* update latencies */
610
611         initialize_latencies ();
612
613         /* hook us up to the engine */
614
615         BootMessage (_("Connect to engine"));
616         _engine.set_session (this);
617         _engine.reset_timebase ();
618 }
619
620 void
621 Session::auto_connect_master_bus ()
622 {
623         if (!_master_out || !Config->get_auto_connect_standard_busses() || _monitor_out) {
624                 return;
625         }
626                 
627         /* if requested auto-connect the outputs to the first N physical ports.
628          */
629         
630         uint32_t limit = _master_out->n_outputs().n_total();
631         vector<string> outputs[DataType::num_types];
632         
633         for (uint32_t i = 0; i < DataType::num_types; ++i) {
634                 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
635         }
636         
637         for (uint32_t n = 0; n < limit; ++n) {
638                 boost::shared_ptr<Port> p = _master_out->output()->nth (n);
639                 string connect_to;
640                 if (outputs[p->type()].size() > n) {
641                         connect_to = outputs[p->type()][n];
642                 }
643                 
644                 if (!connect_to.empty() && p->connected_to (connect_to) == false) {
645                         if (_master_out->output()->connect (p, connect_to, this)) {
646                                 error << string_compose (_("cannot connect master output %1 to %2"), n, connect_to)
647                                       << endmsg;
648                                 break;
649                         }
650                 }
651         }
652 }
653
654 void
655 Session::remove_monitor_section ()
656 {
657         if (!_monitor_out) {
658                 return;
659         }
660
661         /* force reversion to Solo-In-Place */
662         Config->set_solo_control_is_listen_control (false);
663
664         {
665                 /* Hold process lock while doing this so that we don't hear bits and
666                  * pieces of audio as we work on each route.
667                  */
668                 
669                 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
670                 
671                 /* Connect tracks to monitor section. Note that in an
672                    existing session, the internal sends will already exist, but we want the
673                    routes to notice that they connect to the control out specifically.
674                 */
675                 
676                 
677                 boost::shared_ptr<RouteList> r = routes.reader ();
678                 PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
679                 
680                 for (RouteList::iterator x = r->begin(); x != r->end(); ++x) {
681                         
682                         if ((*x)->is_monitor()) {
683                                 /* relax */
684                         } else if ((*x)->is_master()) {
685                                 /* relax */
686                         } else {
687                                 (*x)->remove_aux_or_listen (_monitor_out);
688                         }
689                 }
690         }
691
692         remove_route (_monitor_out);
693         auto_connect_master_bus ();
694 }
695
696 void
697 Session::add_monitor_section ()
698 {
699         RouteList rl;
700
701         if (_monitor_out || !_master_out) {
702                 return;
703         }
704
705         boost::shared_ptr<Route> r (new Route (*this, _("monitor"), Route::MonitorOut, DataType::AUDIO));
706
707         if (r->init ()) {
708                 return;
709         }
710
711 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
712         // boost_debug_shared_ptr_mark_interesting (r.get(), "Route");
713 #endif
714         {
715                 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
716                 r->input()->ensure_io (_master_out->output()->n_ports(), false, this);
717                 r->output()->ensure_io (_master_out->output()->n_ports(), false, this);
718         }
719
720         rl.push_back (r);
721         add_routes (rl, false, false, false);
722         
723         assert (_monitor_out);
724
725         /* AUDIO ONLY as of june 29th 2009, because listen semantics for anything else
726            are undefined, at best.
727         */
728         
729         uint32_t limit = _monitor_out->n_inputs().n_audio();
730         
731         if (_master_out) {
732                 
733                 /* connect the inputs to the master bus outputs. this
734                  * represents a separate data feed from the internal sends from
735                  * each route. as of jan 2011, it allows the monitor section to
736                  * conditionally ignore either the internal sends or the normal
737                  * input feed, but we should really find a better way to do
738                  * this, i think.
739                  */
740
741                 _master_out->output()->disconnect (this);
742
743                 for (uint32_t n = 0; n < limit; ++n) {
744                         boost::shared_ptr<AudioPort> p = _monitor_out->input()->ports().nth_audio_port (n);
745                         boost::shared_ptr<AudioPort> o = _master_out->output()->ports().nth_audio_port (n);
746                         
747                         if (o) {
748                                 string connect_to = o->name();
749                                 if (_monitor_out->input()->connect (p, connect_to, this)) {
750                                         error << string_compose (_("cannot connect control input %1 to %2"), n, connect_to)
751                                               << endmsg;
752                                         break;
753                                 }
754                         }
755                 }
756         }
757         
758         /* if monitor section is not connected, connect it to physical outs
759          */
760         
761         if (Config->get_auto_connect_standard_busses() && !_monitor_out->output()->connected ()) {
762                 
763                 if (!Config->get_monitor_bus_preferred_bundle().empty()) {
764                         
765                         boost::shared_ptr<Bundle> b = bundle_by_name (Config->get_monitor_bus_preferred_bundle());
766                         
767                         if (b) {
768                                 _monitor_out->output()->connect_ports_to_bundle (b, true, this);
769                         } else {
770                                 warning << string_compose (_("The preferred I/O for the monitor bus (%1) cannot be found"),
771                                                            Config->get_monitor_bus_preferred_bundle())
772                                         << endmsg;
773                         }
774                         
775                 } else {
776                         
777                         /* Monitor bus is audio only */
778
779                         uint32_t mod = n_physical_outputs.get (DataType::AUDIO);
780                         uint32_t limit = _monitor_out->n_outputs().get (DataType::AUDIO);
781                         vector<string> outputs[DataType::num_types];
782
783                         for (uint32_t i = 0; i < DataType::num_types; ++i) {
784                                 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
785                         }
786                         
787                         
788                         if (mod != 0) {
789                                 
790                                 for (uint32_t n = 0; n < limit; ++n) {
791                                         
792                                         boost::shared_ptr<Port> p = _monitor_out->output()->ports().port(DataType::AUDIO, n);
793                                         string connect_to;
794                                         if (outputs[DataType::AUDIO].size() > (n % mod)) {
795                                                 connect_to = outputs[DataType::AUDIO][n % mod];
796                                         }
797                                         
798                                         if (!connect_to.empty()) {
799                                                 if (_monitor_out->output()->connect (p, connect_to, this)) {
800                                                         error << string_compose (
801                                                                 _("cannot connect control output %1 to %2"),
802                                                                 n, connect_to)
803                                                               << endmsg;
804                                                         break;
805                                                 }
806                                         }
807                                 }
808                         }
809                 }
810         }
811
812         /* Hold process lock while doing this so that we don't hear bits and
813          * pieces of audio as we work on each route.
814          */
815          
816         Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
817
818         /* Connect tracks to monitor section. Note that in an
819            existing session, the internal sends will already exist, but we want the
820            routes to notice that they connect to the control out specifically.
821         */
822
823
824         boost::shared_ptr<RouteList> rls = routes.reader ();
825
826         PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
827
828         for (RouteList::iterator x = rls->begin(); x != rls->end(); ++x) {
829                 
830                 if ((*x)->is_monitor()) {
831                         /* relax */
832                 } else if ((*x)->is_master()) {
833                         /* relax */
834                 } else {
835                         (*x)->enable_monitor_send ();
836                 }
837         }
838 }
839
840 void
841 Session::hookup_io ()
842 {
843         /* stop graph reordering notifications from
844            causing resorts, etc.
845         */
846
847         _state_of_the_state = StateOfTheState (_state_of_the_state | InitialConnecting);
848
849         if (!auditioner) {
850
851                 /* we delay creating the auditioner till now because
852                    it makes its own connections to ports.
853                 */
854
855                 try {
856                         boost::shared_ptr<Auditioner> a (new Auditioner (*this));
857                         if (a->init()) {
858                                 throw failed_constructor ();
859                         }
860                         a->use_new_diskstream ();
861                         auditioner = a;
862                 }
863
864                 catch (failed_constructor& err) {
865                         warning << _("cannot create Auditioner: no auditioning of regions possible") << endmsg;
866                 }
867         }
868
869         /* load bundles, which we may have postponed earlier on */
870         if (_bundle_xml_node) {
871                 load_bundles (*_bundle_xml_node);
872                 delete _bundle_xml_node;
873         }
874
875         /* Tell all IO objects to connect themselves together */
876
877         IO::enable_connecting ();
878         MIDI::JackMIDIPort::MakeConnections ();
879
880         /* Anyone who cares about input state, wake up and do something */
881
882         IOConnectionsComplete (); /* EMIT SIGNAL */
883
884         _state_of_the_state = StateOfTheState (_state_of_the_state & ~InitialConnecting);
885
886         /* now handle the whole enchilada as if it was one
887            graph reorder event.
888         */
889
890         graph_reordered ();
891
892         /* update the full solo state, which can't be
893            correctly determined on a per-route basis, but
894            needs the global overview that only the session
895            has.
896         */
897
898         update_route_solo_state ();
899 }
900
901 void
902 Session::track_playlist_changed (boost::weak_ptr<Track> wp)
903 {
904         boost::shared_ptr<Track> track = wp.lock ();
905         if (!track) {
906                 return;
907         }
908
909         boost::shared_ptr<Playlist> playlist;
910
911         if ((playlist = track->playlist()) != 0) {
912                 playlist->RegionAdded.connect_same_thread (*this, boost::bind (&Session::playlist_region_added, this, _1));
913                 playlist->RangesMoved.connect_same_thread (*this, boost::bind (&Session::playlist_ranges_moved, this, _1));
914                 playlist->RegionsExtended.connect_same_thread (*this, boost::bind (&Session::playlist_regions_extended, this, _1));
915         }
916 }
917
918 bool
919 Session::record_enabling_legal () const
920 {
921         /* this used to be in here, but survey says.... we don't need to restrict it */
922         // if (record_status() == Recording) {
923         //      return false;
924         // }
925
926         if (Config->get_all_safe()) {
927                 return false;
928         }
929         return true;
930 }
931
932 void
933 Session::set_track_monitor_input_status (bool yn)
934 {
935         boost::shared_ptr<RouteList> rl = routes.reader ();
936         for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
937                 boost::shared_ptr<AudioTrack> tr = boost::dynamic_pointer_cast<AudioTrack> (*i);
938                 if (tr && tr->record_enabled ()) {
939                         //cerr << "switching to input = " << !auto_input << __FILE__ << __LINE__ << endl << endl;
940                         tr->request_jack_monitors_input (yn);
941                 }
942         }
943 }
944
945 void
946 Session::auto_punch_start_changed (Location* location)
947 {
948         replace_event (SessionEvent::PunchIn, location->start());
949
950         if (get_record_enabled() && config.get_punch_in()) {
951                 /* capture start has been changed, so save new pending state */
952                 save_state ("", true);
953         }
954 }
955
956 void
957 Session::auto_punch_end_changed (Location* location)
958 {
959         framepos_t when_to_stop = location->end();
960         // when_to_stop += _worst_output_latency + _worst_input_latency;
961         replace_event (SessionEvent::PunchOut, when_to_stop);
962 }
963
964 void
965 Session::auto_punch_changed (Location* location)
966 {
967         framepos_t when_to_stop = location->end();
968
969         replace_event (SessionEvent::PunchIn, location->start());
970         //when_to_stop += _worst_output_latency + _worst_input_latency;
971         replace_event (SessionEvent::PunchOut, when_to_stop);
972 }
973
974 /** @param loc A loop location.
975  *  @param pos Filled in with the start time of the required fade-out (in session frames).
976  *  @param length Filled in with the length of the required fade-out.
977  */
978 void
979 Session::auto_loop_declick_range (Location* loc, framepos_t & pos, framepos_t & length)
980 {
981         pos = max (loc->start(), loc->end() - 64);
982         length = loc->end() - pos;
983 }
984
985 void
986 Session::auto_loop_changed (Location* location)
987 {
988         replace_event (SessionEvent::AutoLoop, location->end(), location->start());
989         framepos_t dcp;
990         framecnt_t dcl;
991         auto_loop_declick_range (location, dcp, dcl);
992         replace_event (SessionEvent::AutoLoopDeclick, dcp, dcl);
993
994         if (transport_rolling() && play_loop) {
995
996
997                 // if (_transport_frame > location->end()) {
998
999                 if (_transport_frame < location->start() || _transport_frame > location->end()) {
1000                         // relocate to beginning of loop
1001                         clear_events (SessionEvent::LocateRoll);
1002
1003                         request_locate (location->start(), true);
1004
1005                 }
1006                 else if (Config->get_seamless_loop() && !loop_changing) {
1007
1008                         // schedule a locate-roll to refill the diskstreams at the
1009                         // previous loop end
1010                         loop_changing = true;
1011
1012                         if (location->end() > last_loopend) {
1013                                 clear_events (SessionEvent::LocateRoll);
1014                                 SessionEvent *ev = new SessionEvent (SessionEvent::LocateRoll, SessionEvent::Add, last_loopend, last_loopend, 0, true);
1015                                 queue_event (ev);
1016                         }
1017
1018                 }
1019         }
1020
1021         last_loopend = location->end();
1022 }
1023
1024 void
1025 Session::set_auto_punch_location (Location* location)
1026 {
1027         Location* existing;
1028
1029         if ((existing = _locations->auto_punch_location()) != 0 && existing != location) {
1030                 punch_connections.drop_connections();
1031                 existing->set_auto_punch (false, this);
1032                 remove_event (existing->start(), SessionEvent::PunchIn);
1033                 clear_events (SessionEvent::PunchOut);
1034                 auto_punch_location_changed (0);
1035         }
1036
1037         set_dirty();
1038
1039         if (location == 0) {
1040                 return;
1041         }
1042
1043         if (location->end() <= location->start()) {
1044                 error << _("Session: you can't use that location for auto punch (start <= end)") << endmsg;
1045                 return;
1046         }
1047
1048         punch_connections.drop_connections ();
1049
1050         location->start_changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_start_changed, this, _1));
1051         location->end_changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_end_changed, this, _1));
1052         location->changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_changed, this, _1));
1053
1054         location->set_auto_punch (true, this);
1055
1056         auto_punch_changed (location);
1057
1058         auto_punch_location_changed (location);
1059 }
1060
1061 void
1062 Session::set_auto_loop_location (Location* location)
1063 {
1064         Location* existing;
1065
1066         if ((existing = _locations->auto_loop_location()) != 0 && existing != location) {
1067                 loop_connections.drop_connections ();
1068                 existing->set_auto_loop (false, this);
1069                 remove_event (existing->end(), SessionEvent::AutoLoop);
1070                 framepos_t dcp;
1071                 framecnt_t dcl;
1072                 auto_loop_declick_range (existing, dcp, dcl);
1073                 remove_event (dcp, SessionEvent::AutoLoopDeclick);
1074                 auto_loop_location_changed (0);
1075         }
1076
1077         set_dirty();
1078
1079         if (location == 0) {
1080                 return;
1081         }
1082
1083         if (location->end() <= location->start()) {
1084                 error << _("Session: you can't use a mark for auto loop") << endmsg;
1085                 return;
1086         }
1087
1088         last_loopend = location->end();
1089
1090         loop_connections.drop_connections ();
1091
1092         location->start_changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, _1));
1093         location->end_changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, _1));
1094         location->changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, _1));
1095
1096         location->set_auto_loop (true, this);
1097
1098         /* take care of our stuff first */
1099
1100         auto_loop_changed (location);
1101
1102         /* now tell everyone else */
1103
1104         auto_loop_location_changed (location);
1105 }
1106
1107 void
1108 Session::locations_added (Location *)
1109 {
1110         set_dirty ();
1111 }
1112
1113 void
1114 Session::locations_changed ()
1115 {
1116         _locations->apply (*this, &Session::handle_locations_changed);
1117 }
1118
1119 void
1120 Session::handle_locations_changed (Locations::LocationList& locations)
1121 {
1122         Locations::LocationList::iterator i;
1123         Location* location;
1124         bool set_loop = false;
1125         bool set_punch = false;
1126
1127         for (i = locations.begin(); i != locations.end(); ++i) {
1128
1129                 location =* i;
1130
1131                 if (location->is_auto_punch()) {
1132                         set_auto_punch_location (location);
1133                         set_punch = true;
1134                 }
1135                 if (location->is_auto_loop()) {
1136                         set_auto_loop_location (location);
1137                         set_loop = true;
1138                 }
1139
1140                 if (location->is_session_range()) {
1141                         _session_range_location = location;
1142                 }
1143         }
1144
1145         if (!set_loop) {
1146                 set_auto_loop_location (0);
1147         }
1148         if (!set_punch) {
1149                 set_auto_punch_location (0);
1150         }
1151
1152         set_dirty();
1153 }
1154
1155 void
1156 Session::enable_record ()
1157 {
1158         if (_transport_speed != 0.0 && _transport_speed != 1.0) {
1159                 /* no recording at anything except normal speed */
1160                 return;
1161         }
1162
1163         while (1) {
1164                 RecordState rs = (RecordState) g_atomic_int_get (&_record_status);
1165
1166                 if (rs == Recording) {
1167                         break;
1168                 }
1169                 
1170                 if (g_atomic_int_compare_and_exchange (&_record_status, rs, Recording)) {
1171
1172                         _last_record_location = _transport_frame;
1173                         MIDI::Manager::instance()->mmc()->send (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordStrobe));
1174
1175                         if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1176                                 set_track_monitor_input_status (true);
1177                         }
1178
1179                         RecordStateChanged ();
1180                         break;
1181                 }
1182         }
1183 }
1184
1185 void
1186 Session::disable_record (bool rt_context, bool force)
1187 {
1188         RecordState rs;
1189
1190         if ((rs = (RecordState) g_atomic_int_get (&_record_status)) != Disabled) {
1191
1192                 if ((!Config->get_latched_record_enable () && !play_loop) || force) {
1193                         g_atomic_int_set (&_record_status, Disabled);
1194                         MIDI::Manager::instance()->mmc()->send (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordExit));
1195                 } else {
1196                         if (rs == Recording) {
1197                                 g_atomic_int_set (&_record_status, Enabled);
1198                         }
1199                 }
1200
1201                 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1202                         set_track_monitor_input_status (false);
1203                 }
1204
1205                 RecordStateChanged (); /* emit signal */
1206
1207                 if (!rt_context) {
1208                         remove_pending_capture_state ();
1209                 }
1210         }
1211 }
1212
1213 void
1214 Session::step_back_from_record ()
1215 {
1216         if (g_atomic_int_compare_and_exchange (&_record_status, Recording, Enabled)) {
1217
1218                 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1219                         set_track_monitor_input_status (false);
1220                 }
1221
1222                 RecordStateChanged (); /* emit signal */
1223         }
1224 }
1225
1226 void
1227 Session::maybe_enable_record ()
1228 {
1229         if (_step_editors > 0) {
1230                 return;
1231         }
1232
1233         g_atomic_int_set (&_record_status, Enabled);
1234
1235         /* This function is currently called from somewhere other than an RT thread.
1236            This save_state() call therefore doesn't impact anything.  Doing it here
1237            means that we save pending state of which sources the next record will use,
1238            which gives us some chance of recovering from a crash during the record.
1239         */
1240
1241         save_state ("", true);
1242
1243         if (_transport_speed) {
1244                 if (!config.get_punch_in()) {
1245                         enable_record ();
1246                 }
1247         } else {
1248                 MIDI::Manager::instance()->mmc()->send (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordPause));
1249                 RecordStateChanged (); /* EMIT SIGNAL */
1250         }
1251
1252         set_dirty();
1253 }
1254
1255 framepos_t
1256 Session::audible_frame () const
1257 {
1258         framepos_t ret;
1259         framepos_t tf;
1260         framecnt_t offset;
1261
1262         /* the first of these two possible settings for "offset"
1263            mean that the audible frame is stationary until
1264            audio emerges from the latency compensation
1265            "pseudo-pipeline".
1266
1267            the second means that the audible frame is stationary
1268            until audio would emerge from a physical port
1269            in the absence of any plugin latency compensation
1270         */
1271
1272         offset = worst_playback_latency ();
1273
1274         if (offset > current_block_size) {
1275                 offset -= current_block_size;
1276         } else {
1277                 /* XXX is this correct? if we have no external
1278                    physical connections and everything is internal
1279                    then surely this is zero? still, how
1280                    likely is that anyway?
1281                 */
1282                 offset = current_block_size;
1283         }
1284
1285         if (synced_to_jack()) {
1286                 tf = _engine.transport_frame();
1287         } else {
1288                 tf = _transport_frame;
1289         }
1290
1291         ret = tf;
1292
1293         if (!non_realtime_work_pending()) {
1294
1295                 /* MOVING */
1296
1297                 /* Check to see if we have passed the first guaranteed
1298                    audible frame past our last start position. if not,
1299                    return that last start point because in terms
1300                    of audible frames, we have not moved yet.
1301
1302                    `Start position' in this context means the time we last
1303                    either started, located, or changed transport direction.
1304                 */
1305
1306                 if (_transport_speed > 0.0f) {
1307
1308                         if (!play_loop || !have_looped) {
1309                                 if (tf < _last_roll_or_reversal_location + offset) {
1310                                         return _last_roll_or_reversal_location;
1311                                 }
1312                         }
1313
1314
1315                         /* forwards */
1316                         ret -= offset;
1317
1318                 } else if (_transport_speed < 0.0f) {
1319
1320                         /* XXX wot? no backward looping? */
1321
1322                         if (tf > _last_roll_or_reversal_location - offset) {
1323                                 return _last_roll_or_reversal_location;
1324                         } else {
1325                                 /* backwards */
1326                                 ret += offset;
1327                         }
1328                 }
1329         }
1330
1331         return ret;
1332 }
1333
1334 void
1335 Session::set_frame_rate (framecnt_t frames_per_second)
1336 {
1337         /** \fn void Session::set_frame_size(framecnt_t)
1338                 the AudioEngine object that calls this guarantees
1339                 that it will not be called while we are also in
1340                 ::process(). Its fine to do things that block
1341                 here.
1342         */
1343
1344         _base_frame_rate = frames_per_second;
1345
1346         sync_time_vars();
1347
1348         clear_clicks ();
1349
1350         // XXX we need some equivalent to this, somehow
1351         // SndFileSource::setup_standard_crossfades (frames_per_second);
1352
1353         set_dirty();
1354
1355         /* XXX need to reset/reinstantiate all LADSPA plugins */
1356 }
1357
1358 void
1359 Session::set_block_size (pframes_t nframes)
1360 {
1361         /* the AudioEngine guarantees
1362            that it will not be called while we are also in
1363            ::process(). It is therefore fine to do things that block
1364            here.
1365         */
1366         
1367         {
1368                 current_block_size = nframes;
1369
1370                 ensure_buffers ();
1371
1372                 boost::shared_ptr<RouteList> r = routes.reader ();
1373
1374                 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1375                         (*i)->set_block_size (nframes);
1376                 }
1377
1378                 boost::shared_ptr<RouteList> rl = routes.reader ();
1379                 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1380                         boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
1381                         if (tr) {
1382                                 tr->set_block_size (nframes);
1383                         }
1384                 }
1385
1386                 set_worst_io_latencies ();
1387         }
1388 }
1389
1390
1391 static void
1392 trace_terminal (boost::shared_ptr<Route> r1, boost::shared_ptr<Route> rbase)
1393 {
1394         boost::shared_ptr<Route> r2;
1395
1396         if (r1->feeds (rbase) && rbase->feeds (r1)) {
1397                 info << string_compose(_("feedback loop setup between %1 and %2"), r1->name(), rbase->name()) << endmsg;
1398                 return;
1399         }
1400
1401         /* make a copy of the existing list of routes that feed r1 */
1402
1403         Route::FedBy existing (r1->fed_by());
1404
1405         /* for each route that feeds r1, recurse, marking it as feeding
1406            rbase as well.
1407         */
1408
1409         for (Route::FedBy::iterator i = existing.begin(); i != existing.end(); ++i) {
1410                 if (!(r2 = i->r.lock ())) {
1411                         /* (*i) went away, ignore it */
1412                         continue;
1413                 }
1414
1415                 /* r2 is a route that feeds r1 which somehow feeds base. mark
1416                    base as being fed by r2
1417                 */
1418
1419                 rbase->add_fed_by (r2, i->sends_only);
1420
1421                 if (r2 != rbase) {
1422
1423                         /* 2nd level feedback loop detection. if r1 feeds or is fed by r2,
1424                            stop here.
1425                         */
1426
1427                         if (r1->feeds (r2) && r2->feeds (r1)) {
1428                                 continue;
1429                         }
1430
1431                         /* now recurse, so that we can mark base as being fed by
1432                            all routes that feed r2
1433                         */
1434
1435                         trace_terminal (r2, rbase);
1436                 }
1437
1438         }
1439 }
1440
1441 void
1442 Session::resort_routes ()
1443 {
1444         /* don't do anything here with signals emitted
1445            by Routes during initial setup or while we
1446            are being destroyed.
1447         */
1448
1449         if (_state_of_the_state & (InitialConnecting | Deletion)) {
1450                 return;
1451         }
1452
1453         {
1454                 RCUWriter<RouteList> writer (routes);
1455                 boost::shared_ptr<RouteList> r = writer.get_copy ();
1456                 resort_routes_using (r);
1457                 /* writer goes out of scope and forces update */
1458         }
1459
1460 #ifndef NDEBUG
1461         boost::shared_ptr<RouteList> rl = routes.reader ();
1462         for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1463                 DEBUG_TRACE (DEBUG::Graph, string_compose ("%1 fed by ...\n", (*i)->name()));
1464
1465                 const Route::FedBy& fb ((*i)->fed_by());
1466
1467                 for (Route::FedBy::const_iterator f = fb.begin(); f != fb.end(); ++f) {
1468                         boost::shared_ptr<Route> sf = f->r.lock();
1469                         if (sf) {
1470                                 DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 (sends only ? %2)\n", sf->name(), f->sends_only));
1471                         }
1472                 }
1473         }
1474 #endif
1475
1476 }
1477
1478 /** This is called whenever we need to rebuild the graph of how we will process
1479  *  routes.
1480  *  @param r List of routes, in any order.
1481  */
1482
1483 void
1484 Session::resort_routes_using (boost::shared_ptr<RouteList> r)
1485 {
1486         /* We are going to build a directed graph of our routes;
1487            this is where the edges of that graph are put.
1488         */
1489         
1490         GraphEdges edges;
1491
1492         /* Go through all routes doing two things:
1493          *
1494          * 1. Collect the edges of the route graph.  Each of these edges
1495          *    is a pair of routes, one of which directly feeds the other
1496          *    either by a JACK connection or by an internal send.
1497          *
1498          * 2. Begin the process of making routes aware of which other
1499          *    routes directly or indirectly feed them.  This information
1500          *    is used by the solo code.
1501          */
1502            
1503         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1504
1505                 /* Clear out the route's list of direct or indirect feeds */
1506                 (*i)->clear_fed_by ();
1507
1508                 for (RouteList::iterator j = r->begin(); j != r->end(); ++j) {
1509
1510                         bool via_sends_only;
1511
1512                         /* See if this *j feeds *i according to the current state of the JACK
1513                            connections and internal sends.
1514                         */
1515                         if ((*j)->direct_feeds_according_to_reality (*i, &via_sends_only)) {
1516                                 /* add the edge to the graph (part #1) */
1517                                 edges.add (*j, *i, via_sends_only);
1518                                 /* tell the route (for part #2) */
1519                                 (*i)->add_fed_by (*j, via_sends_only);
1520                         }
1521                 }
1522         }
1523
1524         /* Attempt a topological sort of the route graph */
1525         boost::shared_ptr<RouteList> sorted_routes = topological_sort (r, edges);
1526         
1527         if (sorted_routes) {
1528                 /* We got a satisfactory topological sort, so there is no feedback;
1529                    use this new graph.
1530
1531                    Note: the process graph rechain does not require a
1532                    topologically-sorted list, but hey ho.
1533                 */
1534                 if (_process_graph) {
1535                         _process_graph->rechain (sorted_routes, edges);
1536                 }
1537                 
1538                 _current_route_graph = edges;
1539
1540                 /* Complete the building of the routes' lists of what directly
1541                    or indirectly feeds them.
1542                 */
1543                 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1544                         trace_terminal (*i, *i);
1545                 }
1546
1547                 *r = *sorted_routes;
1548
1549 #ifndef NDEBUG
1550                 DEBUG_TRACE (DEBUG::Graph, "Routes resorted, order follows:\n");
1551                 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1552                         DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 signal order %2\n",
1553                                                                    (*i)->name(), (*i)->order_key (MixerSort)));
1554                 }
1555 #endif
1556
1557                 SuccessfulGraphSort (); /* EMIT SIGNAL */
1558
1559         } else {
1560                 /* The topological sort failed, so we have a problem.  Tell everyone
1561                    and stick to the old graph; this will continue to be processed, so
1562                    until the feedback is fixed, what is played back will not quite
1563                    reflect what is actually connected.  Note also that we do not
1564                    do trace_terminal here, as it would fail due to an endless recursion,
1565                    so the solo code will think that everything is still connected
1566                    as it was before.
1567                 */
1568                 
1569                 FeedbackDetected (); /* EMIT SIGNAL */
1570         }
1571
1572 }
1573
1574 /** Find a route name starting with \a base, maybe followed by the
1575  *  lowest \a id.  \a id will always be added if \a definitely_add_number
1576  *  is true on entry; otherwise it will only be added if required
1577  *  to make the name unique.
1578  *
1579  *  Names are constructed like e.g. "Audio 3" for base="Audio" and id=3.
1580  *  The available route name with the lowest ID will be used, and \a id
1581  *  will be set to the ID.
1582  *
1583  *  \return false if a route name could not be found, and \a track_name
1584  *  and \a id do not reflect a free route name.
1585  */
1586 bool
1587 Session::find_route_name (string const & base, uint32_t& id, char* name, size_t name_len, bool definitely_add_number)
1588 {
1589         if (!definitely_add_number && route_by_name (base) == 0) {
1590                 /* juse use the base */
1591                 snprintf (name, name_len, "%s", base.c_str());
1592                 return true;
1593         }
1594
1595         do {
1596                 snprintf (name, name_len, "%s %" PRIu32, base.c_str(), id);
1597
1598                 if (route_by_name (name) == 0) {
1599                         return true;
1600                 }
1601
1602                 ++id;
1603
1604         } while (id < (UINT_MAX-1));
1605
1606         return false;
1607 }
1608
1609 /** Count the total ins and outs of all non-hidden tracks in the session and return them in in and out */
1610 void
1611 Session::count_existing_track_channels (ChanCount& in, ChanCount& out)
1612 {
1613         in  = ChanCount::ZERO;
1614         out = ChanCount::ZERO;
1615
1616         boost::shared_ptr<RouteList> r = routes.reader ();
1617
1618         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1619                 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
1620                 if (tr && !tr->is_hidden()) {
1621                         in  += tr->n_inputs();
1622                         out += tr->n_outputs();
1623                 }
1624         }
1625 }
1626
1627 /** Caller must not hold process lock
1628  *  @param name_template string to use for the start of the name, or "" to use "MIDI".
1629  *  @param instrument plugin info for the instrument to insert pre-fader, if any
1630  */
1631 list<boost::shared_ptr<MidiTrack> >
1632 Session::new_midi_track (const ChanCount& input, const ChanCount& output, boost::shared_ptr<PluginInfo> instrument, 
1633                          TrackMode mode, RouteGroup* route_group, uint32_t how_many, string name_template)
1634 {
1635         char track_name[32];
1636         uint32_t track_id = 0;
1637         string port;
1638         RouteList new_routes;
1639         list<boost::shared_ptr<MidiTrack> > ret;
1640
1641         cerr << "Adding MIDI track with in = " << input << " out = " << output << endl;
1642
1643         bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("MIDI");
1644
1645         while (how_many) {
1646                 if (!find_route_name (name_template.empty() ? _("MIDI") : name_template, ++track_id, track_name, sizeof(track_name), use_number)) {
1647                         error << "cannot find name for new midi track" << endmsg;
1648                         goto failed;
1649                 }
1650
1651                 boost::shared_ptr<MidiTrack> track;
1652
1653                 try {
1654                         track.reset (new MidiTrack (*this, track_name, Route::Flag (0), mode));
1655
1656                         if (track->init ()) {
1657                                 goto failed;
1658                         }
1659
1660                         track->use_new_diskstream();
1661
1662 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
1663                         // boost_debug_shared_ptr_mark_interesting (track.get(), "Track");
1664 #endif
1665                         {
1666                                 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1667                                 if (track->input()->ensure_io (input, false, this)) {
1668                                         error << "cannot configure " << input << " out configuration for new midi track" << endmsg;     
1669                                         goto failed;
1670                                 }
1671
1672                                 if (track->output()->ensure_io (output, false, this)) {
1673                                         error << "cannot configure " << output << " out configuration for new midi track" << endmsg;
1674                                         goto failed;
1675                                 }
1676                         }
1677
1678                         track->non_realtime_input_change();
1679
1680                         if (route_group) {
1681                                 route_group->add (track);
1682                         }
1683
1684                         track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this));
1685
1686                         if (Config->get_remote_model() == UserOrdered) {
1687                                 track->set_remote_control_id (next_control_id());
1688                         }
1689
1690                         new_routes.push_back (track);
1691                         ret.push_back (track);
1692                 }
1693
1694                 catch (failed_constructor &err) {
1695                         error << _("Session: could not create new midi track.") << endmsg;
1696                         goto failed;
1697                 }
1698
1699                 catch (AudioEngine::PortRegistrationFailure& pfe) {
1700
1701                         error << string_compose (_("No more JACK ports are available. You will need to stop %1 and restart JACK with ports if you need this many tracks."), PROGRAM_NAME) << endmsg;
1702                         goto failed;
1703                 }
1704
1705                 --how_many;
1706         }
1707
1708   failed:
1709         if (!new_routes.empty()) {
1710                 add_routes (new_routes, true, true, true);
1711
1712                 if (instrument) {
1713                         for (RouteList::iterator r = new_routes.begin(); r != new_routes.end(); ++r) {
1714                                 PluginPtr plugin = instrument->load (*this);
1715                                 boost::shared_ptr<Processor> p (new PluginInsert (*this, plugin));
1716                                 (*r)->add_processor (p, PreFader);
1717                                 
1718                         }
1719                 }
1720         }
1721
1722         return ret;
1723 }
1724
1725 void
1726 Session::midi_output_change_handler (IOChange change, void * /*src*/, boost::weak_ptr<Route> wmt)
1727 {
1728         boost::shared_ptr<Route> midi_track (wmt.lock());
1729
1730         if (!midi_track) {
1731                 return;
1732         }
1733
1734         if ((change.type & IOChange::ConfigurationChanged) && Config->get_output_auto_connect() != ManualConnect) {
1735
1736                 if (change.after.n_audio() <= change.before.n_audio()) {
1737                         return;
1738                 }
1739
1740                 /* new audio ports: make sure the audio goes somewhere useful,
1741                    unless the user has no-auto-connect selected.
1742
1743                    The existing ChanCounts don't matter for this call as they are only
1744                    to do with matching input and output indices, and we are only changing
1745                    outputs here.
1746                 */
1747
1748                 ChanCount dummy;
1749
1750                 auto_connect_route (midi_track, dummy, dummy, false, false, ChanCount(), change.before);
1751         }
1752 }
1753
1754 /** @param connect_inputs true to connect inputs as well as outputs, false to connect just outputs.
1755  *  @param input_start Where to start from when auto-connecting inputs; e.g. if this is 0, auto-connect starting from input 0.
1756  *  @param output_start As \a input_start, but for outputs.
1757  */
1758 void
1759 Session::auto_connect_route (boost::shared_ptr<Route> route, ChanCount& existing_inputs, ChanCount& existing_outputs,
1760                              bool with_lock, bool connect_inputs, ChanCount input_start, ChanCount output_start)
1761 {
1762         if (!IO::connecting_legal) {
1763                 return;
1764         }
1765
1766         Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock (), Glib::Threads::NOT_LOCK);
1767
1768         if (with_lock) {
1769                 lm.acquire ();
1770         }
1771
1772         /* If both inputs and outputs are auto-connected to physical ports,
1773            use the max of input and output offsets to ensure auto-connected
1774            port numbers always match up (e.g. the first audio input and the
1775            first audio output of the route will have the same physical
1776            port number).  Otherwise just use the lowest input or output
1777            offset possible.
1778         */
1779
1780         DEBUG_TRACE (DEBUG::Graph,
1781                      string_compose("Auto-connect: existing in = %1 out = %2\n",
1782                                     existing_inputs, existing_outputs));
1783
1784         const bool in_out_physical =
1785                 (Config->get_input_auto_connect() & AutoConnectPhysical)
1786                 && (Config->get_output_auto_connect() & AutoConnectPhysical)
1787                 && connect_inputs;
1788
1789         const ChanCount in_offset = in_out_physical
1790                 ? ChanCount::max(existing_inputs, existing_outputs)
1791                 : existing_inputs;
1792
1793         const ChanCount out_offset = in_out_physical
1794                 ? ChanCount::max(existing_inputs, existing_outputs)
1795                 : existing_outputs;
1796
1797         for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1798                 vector<string> physinputs;
1799                 vector<string> physoutputs;
1800
1801                 _engine.get_physical_outputs (*t, physoutputs);
1802                 _engine.get_physical_inputs (*t, physinputs);
1803
1804                 if (!physinputs.empty() && connect_inputs) {
1805                         uint32_t nphysical_in = physinputs.size();
1806
1807                         DEBUG_TRACE (DEBUG::Graph,
1808                                      string_compose("There are %1 physical inputs of type %2\n",
1809                                                     nphysical_in, *t));
1810
1811                         for (uint32_t i = input_start.get(*t); i < route->n_inputs().get(*t) && i < nphysical_in; ++i) {
1812                                 string port;
1813
1814                                 if (Config->get_input_auto_connect() & AutoConnectPhysical) {
1815                                         DEBUG_TRACE (DEBUG::Graph,
1816                                                      string_compose("Get index %1 + %2 % %3 = %4\n",
1817                                                                     in_offset.get(*t), i, nphysical_in,
1818                                                                     (in_offset.get(*t) + i) % nphysical_in));
1819                                         port = physinputs[(in_offset.get(*t) + i) % nphysical_in];
1820                                 }
1821
1822                                 DEBUG_TRACE (DEBUG::Graph,
1823                                              string_compose("Connect route %1 IN to %2\n",
1824                                                             route->name(), port));
1825
1826                                 if (!port.empty() && route->input()->connect (route->input()->ports().port(*t, i), port, this)) {
1827                                         break;
1828                                 }
1829
1830                                 ChanCount one_added (*t, 1);
1831                                 existing_inputs += one_added;
1832                         }
1833                 }
1834
1835                 if (!physoutputs.empty()) {
1836                         uint32_t nphysical_out = physoutputs.size();
1837                         for (uint32_t i = output_start.get(*t); i < route->n_outputs().get(*t); ++i) {
1838                                 string port;
1839
1840                                 if ((*t) == DataType::MIDI || Config->get_output_auto_connect() & AutoConnectPhysical) {
1841                                         port = physoutputs[(out_offset.get(*t) + i) % nphysical_out];
1842                                 } else if ((*t) == DataType::AUDIO && Config->get_output_auto_connect() & AutoConnectMaster) {
1843                                         /* master bus is audio only */
1844                                         if (_master_out && _master_out->n_inputs().get(*t) > 0) {
1845                                                 port = _master_out->input()->ports().port(*t,
1846                                                                 i % _master_out->input()->n_ports().get(*t))->name();
1847                                         }
1848                                 }
1849
1850                                 DEBUG_TRACE (DEBUG::Graph,
1851                                              string_compose("Connect route %1 OUT to %2\n",
1852                                                             route->name(), port));
1853
1854                                 if (!port.empty() && route->output()->connect (route->output()->ports().port(*t, i), port, this)) {
1855                                         break;
1856                                 }
1857
1858                                 ChanCount one_added (*t, 1);
1859                                 existing_outputs += one_added;
1860                         }
1861                 }
1862         }
1863 }
1864
1865 /** Caller must not hold process lock
1866  *  @param name_template string to use for the start of the name, or "" to use "Audio".
1867  */
1868 list< boost::shared_ptr<AudioTrack> >
1869 Session::new_audio_track (int input_channels, int output_channels, TrackMode mode, RouteGroup* route_group, 
1870                           uint32_t how_many, string name_template)
1871 {
1872         char track_name[32];
1873         uint32_t track_id = 0;
1874         string port;
1875         RouteList new_routes;
1876         list<boost::shared_ptr<AudioTrack> > ret;
1877
1878         bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("Audio");
1879
1880         while (how_many) {
1881                 if (!find_route_name (name_template.empty() ? _("Audio") : name_template, ++track_id, track_name, sizeof(track_name), use_number)) {
1882                         error << "cannot find name for new audio track" << endmsg;
1883                         goto failed;
1884                 }
1885
1886                 boost::shared_ptr<AudioTrack> track;
1887
1888                 try {
1889                         track.reset (new AudioTrack (*this, track_name, Route::Flag (0), mode));
1890
1891                         if (track->init ()) {
1892                                 goto failed;
1893                         }
1894
1895                         track->use_new_diskstream();
1896
1897 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
1898                         // boost_debug_shared_ptr_mark_interesting (track.get(), "Track");
1899 #endif
1900                         {
1901                                 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1902
1903                                 if (track->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
1904                                         error << string_compose (
1905                                                 _("cannot configure %1 in/%2 out configuration for new audio track"),
1906                                                 input_channels, output_channels)
1907                                               << endmsg;
1908                                         goto failed;
1909                                 }
1910
1911                                 if (track->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
1912                                         error << string_compose (
1913                                                 _("cannot configure %1 in/%2 out configuration for new audio track"),
1914                                                 input_channels, output_channels)
1915                                               << endmsg;
1916                                         goto failed;
1917                                 }
1918                         }
1919
1920                         if (route_group) {
1921                                 route_group->add (track);
1922                         }
1923
1924                         track->non_realtime_input_change();
1925
1926                         track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this));
1927                         if (Config->get_remote_model() == UserOrdered) {
1928                                 track->set_remote_control_id (next_control_id());
1929                         }
1930
1931                         new_routes.push_back (track);
1932                         ret.push_back (track);
1933                 }
1934
1935                 catch (failed_constructor &err) {
1936                         error << _("Session: could not create new audio track.") << endmsg;
1937                         goto failed;
1938                 }
1939
1940                 catch (AudioEngine::PortRegistrationFailure& pfe) {
1941
1942                         error << pfe.what() << endmsg;
1943                         goto failed;
1944                 }
1945
1946                 --how_many;
1947         }
1948
1949   failed:
1950         if (!new_routes.empty()) {
1951                 add_routes (new_routes, true, true, true);
1952         }
1953
1954         return ret;
1955 }
1956
1957 /** Caller must not hold process lock.
1958  *  @param name_template string to use for the start of the name, or "" to use "Bus".
1959  */
1960 RouteList
1961 Session::new_audio_route (int input_channels, int output_channels, RouteGroup* route_group, uint32_t how_many, string name_template)
1962 {
1963         char bus_name[32];
1964         uint32_t bus_id = 0;
1965         string port;
1966         RouteList ret;
1967
1968         bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("Bus");
1969         
1970         while (how_many) {
1971                 if (!find_route_name (name_template.empty () ? _("Bus") : name_template, ++bus_id, bus_name, sizeof(bus_name), use_number)) {
1972                         error << "cannot find name for new audio bus" << endmsg;
1973                         goto failure;
1974                 }
1975
1976                 try {
1977                         boost::shared_ptr<Route> bus (new Route (*this, bus_name, Route::Flag(0), DataType::AUDIO));
1978
1979                         if (bus->init ()) {
1980                                 goto failure;
1981                         }
1982
1983 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
1984                         // boost_debug_shared_ptr_mark_interesting (bus.get(), "Route");
1985 #endif
1986                         {
1987                                 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1988
1989                                 if (bus->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
1990                                         error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
1991                                                                  input_channels, output_channels)
1992                                               << endmsg;
1993                                         goto failure;
1994                                 }
1995
1996
1997                                 if (bus->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
1998                                         error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
1999                                                                  input_channels, output_channels)
2000                                               << endmsg;
2001                                         goto failure;
2002                                 }
2003                         }
2004
2005                         if (route_group) {
2006                                 route_group->add (bus);
2007                         }
2008                         if (Config->get_remote_model() == UserOrdered) {
2009                                 bus->set_remote_control_id (next_control_id());
2010                         }
2011
2012                         bus->add_internal_return ();
2013
2014                         ret.push_back (bus);
2015                 }
2016
2017
2018                 catch (failed_constructor &err) {
2019                         error << _("Session: could not create new audio route.") << endmsg;
2020                         goto failure;
2021                 }
2022
2023                 catch (AudioEngine::PortRegistrationFailure& pfe) {
2024                         error << pfe.what() << endmsg;
2025                         goto failure;
2026                 }
2027
2028
2029                 --how_many;
2030         }
2031
2032   failure:
2033         if (!ret.empty()) {
2034                 add_routes (ret, false, true, true); // autoconnect outputs only
2035         }
2036
2037         return ret;
2038
2039 }
2040
2041 RouteList
2042 Session::new_route_from_template (uint32_t how_many, const std::string& template_path)
2043 {
2044         RouteList ret;
2045         uint32_t control_id;
2046         XMLTree tree;
2047         uint32_t number = 0;
2048
2049         if (!tree.read (template_path.c_str())) {
2050                 return ret;
2051         }
2052
2053         XMLNode* node = tree.root();
2054
2055         IO::disable_connecting ();
2056
2057         control_id = next_control_id ();
2058
2059         while (how_many) {
2060
2061                 XMLNode node_copy (*node);
2062
2063                 /* Remove IDs of everything so that new ones are used */
2064                 node_copy.remove_property_recursively (X_("id"));
2065
2066                 try {
2067                         string const route_name = node_copy.property(X_("name"))->value ();
2068                         
2069                         /* generate a new name by adding a number to the end of the template name */
2070                         char name[32];
2071                         if (!find_route_name (route_name.c_str(), ++number, name, sizeof(name), true)) {
2072                                 fatal << _("Session: UINT_MAX routes? impossible!") << endmsg;
2073                                 /*NOTREACHED*/
2074                         }
2075
2076                         /* set this name in the XML description that we are about to use */
2077                         Route::set_name_in_state (node_copy, name);
2078
2079                         /* trim bitslots from listen sends so that new ones are used */
2080                         XMLNodeList children = node_copy.children ();
2081                         for (XMLNodeList::iterator i = children.begin(); i != children.end(); ++i) {
2082                                 if ((*i)->name() == X_("Processor")) {
2083                                         XMLProperty* role = (*i)->property (X_("role"));
2084                                         if (role && role->value() == X_("Listen")) {
2085                                                 (*i)->remove_property (X_("bitslot"));
2086                                         }
2087                                 }
2088                         }
2089                         
2090                         boost::shared_ptr<Route> route (XMLRouteFactory (node_copy, 3000));
2091
2092                         if (route == 0) {
2093                                 error << _("Session: cannot create track/bus from template description") << endmsg;
2094                                 goto out;
2095                         }
2096
2097                         if (boost::dynamic_pointer_cast<Track>(route)) {
2098                                 /* force input/output change signals so that the new diskstream
2099                                    picks up the configuration of the route. During session
2100                                    loading this normally happens in a different way.
2101                                 */
2102
2103                                 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2104
2105                                 IOChange change (IOChange::Type (IOChange::ConfigurationChanged | IOChange::ConnectionsChanged));
2106                                 change.after = route->input()->n_ports();
2107                                 route->input()->changed (change, this);
2108                                 change.after = route->output()->n_ports();
2109                                 route->output()->changed (change, this);
2110                         }
2111
2112                         route->set_remote_control_id (control_id);
2113                         ++control_id;
2114
2115                         ret.push_back (route);
2116                 }
2117
2118                 catch (failed_constructor &err) {
2119                         error << _("Session: could not create new route from template") << endmsg;
2120                         goto out;
2121                 }
2122
2123                 catch (AudioEngine::PortRegistrationFailure& pfe) {
2124                         error << pfe.what() << endmsg;
2125                         goto out;
2126                 }
2127
2128                 --how_many;
2129         }
2130
2131   out:
2132         if (!ret.empty()) {
2133                 add_routes (ret, true, true, true);
2134                 IO::enable_connecting ();
2135         }
2136
2137         return ret;
2138 }
2139
2140 void
2141 Session::add_routes (RouteList& new_routes, bool input_auto_connect, bool output_auto_connect, bool save)
2142 {
2143         try {
2144                 PBD::Unwinder<bool> aip (_adding_routes_in_progress, true);
2145                 add_routes_inner (new_routes, input_auto_connect, output_auto_connect);
2146
2147         } catch (...) {
2148                 error << _("Adding new tracks/busses failed") << endmsg;
2149         }
2150
2151         graph_reordered ();
2152
2153         update_latency (true);
2154         update_latency (false);
2155                 
2156         set_dirty();
2157         
2158         if (save) {
2159                 save_state (_current_snapshot_name);
2160         }
2161         
2162         RouteAdded (new_routes); /* EMIT SIGNAL */
2163 }
2164
2165 void
2166 Session::add_routes_inner (RouteList& new_routes, bool input_auto_connect, bool output_auto_connect)
2167 {
2168         ChanCount existing_inputs;
2169         ChanCount existing_outputs;
2170         uint32_t order = next_control_id();
2171
2172         count_existing_track_channels (existing_inputs, existing_outputs);
2173
2174         {
2175                 RCUWriter<RouteList> writer (routes);
2176                 boost::shared_ptr<RouteList> r = writer.get_copy ();
2177                 r->insert (r->end(), new_routes.begin(), new_routes.end());
2178
2179                 /* if there is no control out and we're not in the middle of loading,
2180                    resort the graph here. if there is a control out, we will resort
2181                    toward the end of this method. if we are in the middle of loading,
2182                    we will resort when done.
2183                 */
2184
2185                 if (!_monitor_out && IO::connecting_legal) {
2186                         resort_routes_using (r);
2187                 }
2188         }
2189
2190         for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) {
2191
2192                 boost::weak_ptr<Route> wpr (*x);
2193                 boost::shared_ptr<Route> r (*x);
2194
2195                 r->listen_changed.connect_same_thread (*this, boost::bind (&Session::route_listen_changed, this, _1, wpr));
2196                 r->solo_changed.connect_same_thread (*this, boost::bind (&Session::route_solo_changed, this, _1, _2, wpr));
2197                 r->solo_isolated_changed.connect_same_thread (*this, boost::bind (&Session::route_solo_isolated_changed, this, _1, wpr));
2198                 r->mute_changed.connect_same_thread (*this, boost::bind (&Session::route_mute_changed, this, _1));
2199                 r->output()->changed.connect_same_thread (*this, boost::bind (&Session::set_worst_io_latencies_x, this, _1, _2));
2200                 r->processors_changed.connect_same_thread (*this, boost::bind (&Session::route_processors_changed, this, _1));
2201
2202                 if (r->is_master()) {
2203                         _master_out = r;
2204                 }
2205
2206                 if (r->is_monitor()) {
2207                         _monitor_out = r;
2208                 }
2209
2210                 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (r);
2211                 if (tr) {
2212                         tr->PlaylistChanged.connect_same_thread (*this, boost::bind (&Session::track_playlist_changed, this, boost::weak_ptr<Track> (tr)));
2213                         track_playlist_changed (boost::weak_ptr<Track> (tr));
2214                         tr->RecordEnableChanged.connect_same_thread (*this, boost::bind (&Session::update_have_rec_enabled_track, this));
2215
2216                         boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (tr);
2217                         if (mt) {
2218                                 mt->StepEditStatusChange.connect_same_thread (*this, boost::bind (&Session::step_edit_status_change, this, _1));
2219                                 mt->output()->changed.connect_same_thread (*this, boost::bind (&Session::midi_output_change_handler, this, _1, _2, boost::weak_ptr<Route>(mt)));
2220                         }
2221                 }
2222
2223
2224                 if (input_auto_connect || output_auto_connect) {
2225                         auto_connect_route (r, existing_inputs, existing_outputs, true, input_auto_connect);
2226                 }
2227
2228                 /* order keys are a GUI responsibility but we need to set up
2229                    reasonable defaults because they also affect the remote control
2230                    ID in most situations.
2231                 */
2232
2233                 if (!r->has_order_key (EditorSort)) {
2234                         if (r->is_hidden()) {
2235                                 /* use an arbitrarily high value */
2236                                 r->set_order_key (EditorSort, UINT_MAX);
2237                                 r->set_order_key (MixerSort, UINT_MAX);
2238                         } else {
2239                                 DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("while adding, set %1 to order key %2\n", r->name(), order));
2240                                 r->set_order_key (EditorSort, order);
2241                                 r->set_order_key (MixerSort, order);
2242                                 order++;
2243                         }
2244                 }
2245         }
2246
2247         if (_monitor_out && IO::connecting_legal) {
2248                 Glib::Threads::Mutex::Lock lm (_engine.process_lock());         
2249                 
2250                 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) {
2251                         if ((*x)->is_monitor()) {
2252                                 /* relax */
2253                         } else if ((*x)->is_master()) {
2254                                         /* relax */
2255                         } else {
2256                                 (*x)->enable_monitor_send ();
2257                         }
2258                 }
2259         }
2260 }
2261
2262 void
2263 Session::globally_set_send_gains_to_zero (boost::shared_ptr<Route> dest)
2264 {
2265         boost::shared_ptr<RouteList> r = routes.reader ();
2266         boost::shared_ptr<Send> s;
2267
2268         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2269                 if ((s = (*i)->internal_send_for (dest)) != 0) {
2270                         s->amp()->gain_control()->set_value (0.0);
2271                 }
2272         }
2273 }
2274
2275 void
2276 Session::globally_set_send_gains_to_unity (boost::shared_ptr<Route> dest)
2277 {
2278         boost::shared_ptr<RouteList> r = routes.reader ();
2279         boost::shared_ptr<Send> s;
2280
2281         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2282                 if ((s = (*i)->internal_send_for (dest)) != 0) {
2283                         s->amp()->gain_control()->set_value (1.0);
2284                 }
2285         }
2286 }
2287
2288 void
2289 Session::globally_set_send_gains_from_track(boost::shared_ptr<Route> dest)
2290 {
2291         boost::shared_ptr<RouteList> r = routes.reader ();
2292         boost::shared_ptr<Send> s;
2293
2294         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2295                 if ((s = (*i)->internal_send_for (dest)) != 0) {
2296                         s->amp()->gain_control()->set_value ((*i)->gain_control()->get_value());
2297                 }
2298         }
2299 }
2300
2301 /** @param include_buses true to add sends to buses and tracks, false for just tracks */
2302 void
2303 Session::globally_add_internal_sends (boost::shared_ptr<Route> dest, Placement p, bool include_buses)
2304 {
2305         boost::shared_ptr<RouteList> r = routes.reader ();
2306         boost::shared_ptr<RouteList> t (new RouteList);
2307
2308         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2309                 /* no MIDI sends because there are no MIDI busses yet */
2310                 if (include_buses || boost::dynamic_pointer_cast<AudioTrack>(*i)) {
2311                         t->push_back (*i);
2312                 }
2313         }
2314
2315         add_internal_sends (dest, p, t);
2316 }
2317
2318 void
2319 Session::add_internal_sends (boost::shared_ptr<Route> dest, Placement p, boost::shared_ptr<RouteList> senders)
2320 {
2321         for (RouteList::iterator i = senders->begin(); i != senders->end(); ++i) {
2322                 add_internal_send (dest, (*i)->before_processor_for_placement (p), *i);
2323         }
2324 }
2325
2326 void
2327 Session::add_internal_send (boost::shared_ptr<Route> dest, int index, boost::shared_ptr<Route> sender)
2328 {
2329         add_internal_send (dest, sender->before_processor_for_index (index), sender);
2330 }
2331
2332 void
2333 Session::add_internal_send (boost::shared_ptr<Route> dest, boost::shared_ptr<Processor> before, boost::shared_ptr<Route> sender)
2334 {
2335         if (sender->is_monitor() || sender->is_master() || sender == dest || dest->is_monitor() || dest->is_master()) {
2336                 return;
2337         }
2338
2339         if (!dest->internal_return()) {
2340                 dest->add_internal_return ();
2341         }
2342
2343         sender->add_aux_send (dest, before);
2344
2345         graph_reordered ();
2346 }
2347
2348 void
2349 Session::remove_route (boost::shared_ptr<Route> route)
2350 {
2351         if (route == _master_out) {
2352                 return;
2353         }
2354
2355         route->set_solo (false, this);
2356
2357         {
2358                 RCUWriter<RouteList> writer (routes);
2359                 boost::shared_ptr<RouteList> rs = writer.get_copy ();
2360
2361                 rs->remove (route);
2362
2363                 /* deleting the master out seems like a dumb
2364                    idea, but its more of a UI policy issue
2365                    than our concern.
2366                 */
2367
2368                 if (route == _master_out) {
2369                         _master_out = boost::shared_ptr<Route> ();
2370                 }
2371
2372                 if (route == _monitor_out) {
2373                         _monitor_out.reset ();
2374                 }
2375
2376                 /* writer goes out of scope, forces route list update */
2377         }
2378
2379         update_route_solo_state ();
2380
2381         // We need to disconnect the route's inputs and outputs
2382
2383         route->input()->disconnect (0);
2384         route->output()->disconnect (0);
2385
2386         /* if the route had internal sends sending to it, remove them */
2387         if (route->internal_return()) {
2388
2389                 boost::shared_ptr<RouteList> r = routes.reader ();
2390                 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2391                         boost::shared_ptr<Send> s = (*i)->internal_send_for (route);
2392                         if (s) {
2393                                 (*i)->remove_processor (s);
2394                         }
2395                 }
2396         }
2397
2398         boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (route);
2399         if (mt && mt->step_editing()) {
2400                 if (_step_editors > 0) {
2401                         _step_editors--;
2402                 }
2403         }
2404
2405         update_latency_compensation ();
2406         set_dirty();
2407
2408         /* Re-sort routes to remove the graph's current references to the one that is
2409          * going away, then flush old references out of the graph.
2410          */
2411
2412         resort_routes ();
2413         if (_process_graph) {
2414                 _process_graph->clear_other_chain ();
2415         }
2416
2417         /* get rid of it from the dead wood collection in the route list manager */
2418
2419         /* XXX i think this is unsafe as it currently stands, but i am not sure. (pd, october 2nd, 2006) */
2420
2421         routes.flush ();
2422
2423         /* try to cause everyone to drop their references */
2424
2425         route->drop_references ();
2426
2427         Route::RemoteControlIDChange(); /* EMIT SIGNAL */
2428
2429         /* save the new state of the world */
2430
2431         if (save_state (_current_snapshot_name)) {
2432                 save_history (_current_snapshot_name);
2433         }
2434 }
2435
2436 void
2437 Session::route_mute_changed (void* /*src*/)
2438 {
2439         set_dirty ();
2440 }
2441
2442 void
2443 Session::route_listen_changed (void* /*src*/, boost::weak_ptr<Route> wpr)
2444 {
2445         boost::shared_ptr<Route> route = wpr.lock();
2446         if (!route) {
2447                 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_changed")) << endmsg;
2448                 return;
2449         }
2450
2451         if (route->listening_via_monitor ()) {
2452
2453                 if (Config->get_exclusive_solo()) {
2454                         /* new listen: disable all other listen */
2455                         boost::shared_ptr<RouteList> r = routes.reader ();
2456                         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2457                                 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_hidden()) {
2458                                         continue;
2459                                 }
2460                                 (*i)->set_listen (false, this);
2461                         }
2462                 }
2463
2464                 _listen_cnt++;
2465
2466         } else if (_listen_cnt > 0) {
2467
2468                 _listen_cnt--;
2469         }
2470
2471         update_route_solo_state ();
2472 }
2473 void
2474 Session::route_solo_isolated_changed (void* /*src*/, boost::weak_ptr<Route> wpr)
2475 {
2476         boost::shared_ptr<Route> route = wpr.lock ();
2477
2478         if (!route) {
2479                 /* should not happen */
2480                 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_changed")) << endmsg;
2481                 return;
2482         }
2483
2484         bool send_changed = false;
2485
2486         if (route->solo_isolated()) {
2487                 if (_solo_isolated_cnt == 0) {
2488                         send_changed = true;
2489                 }
2490                 _solo_isolated_cnt++;
2491         } else if (_solo_isolated_cnt > 0) {
2492                 _solo_isolated_cnt--;
2493                 if (_solo_isolated_cnt == 0) {
2494                         send_changed = true;
2495                 }
2496         }
2497
2498         if (send_changed) {
2499                 IsolatedChanged (); /* EMIT SIGNAL */
2500         }
2501 }
2502
2503 void
2504 Session::route_solo_changed (bool self_solo_change, void* /*src*/, boost::weak_ptr<Route> wpr)
2505 {
2506         DEBUG_TRACE (DEBUG::Solo, string_compose ("route solo change, self = %1\n", self_solo_change));
2507
2508         if (!self_solo_change) {
2509                 // session doesn't care about changes to soloed-by-others
2510                 return;
2511         }
2512
2513         if (solo_update_disabled) {
2514                 // We know already
2515                 DEBUG_TRACE (DEBUG::Solo, "solo update disabled - changed ignored\n");
2516                 return;
2517         }
2518
2519         boost::shared_ptr<Route> route = wpr.lock ();
2520         assert (route);
2521
2522         boost::shared_ptr<RouteList> r = routes.reader ();
2523         int32_t delta;
2524
2525         if (route->self_soloed()) {
2526                 delta = 1;
2527         } else {
2528                 delta = -1;
2529         }
2530
2531         RouteGroup* rg = route->route_group ();
2532         bool leave_group_alone = (rg && rg->is_active() && rg->is_solo());
2533
2534         if (delta == 1 && Config->get_exclusive_solo()) {
2535                 
2536                 /* new solo: disable all other solos, but not the group if its solo-enabled */
2537
2538                 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2539                         if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_hidden() ||
2540                             (leave_group_alone && ((*i)->route_group() == rg))) {
2541                                 continue;
2542                         }
2543                         (*i)->set_solo (false, this);
2544                 }
2545         }
2546
2547         DEBUG_TRACE (DEBUG::Solo, string_compose ("propagate solo change, delta = %1\n", delta));
2548
2549         solo_update_disabled = true;
2550
2551         RouteList uninvolved;
2552
2553         DEBUG_TRACE (DEBUG::Solo, string_compose ("%1\n", route->name()));
2554
2555         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2556                 bool via_sends_only;
2557                 bool in_signal_flow;
2558
2559                 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_hidden() ||
2560                     (leave_group_alone && ((*i)->route_group() == rg))) {
2561                         continue;
2562                 }
2563
2564                 in_signal_flow = false;
2565
2566                 DEBUG_TRACE (DEBUG::Solo, string_compose ("check feed from %1\n", (*i)->name()));
2567                 
2568                 if ((*i)->feeds (route, &via_sends_only)) {
2569                         DEBUG_TRACE (DEBUG::Solo, string_compose ("\tthere is a feed from %1\n", (*i)->name()));
2570                         if (!via_sends_only) {
2571                                 if (!route->soloed_by_others_upstream()) {
2572                                         (*i)->mod_solo_by_others_downstream (delta);
2573                                 }
2574                         } else {
2575                                 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tthere is a send-only feed from %1\n", (*i)->name()));
2576                         }
2577                         in_signal_flow = true;
2578                 } else {
2579                         DEBUG_TRACE (DEBUG::Solo, string_compose ("\tno feed from %1\n", (*i)->name()));
2580                 }
2581                 
2582                 DEBUG_TRACE (DEBUG::Solo, string_compose ("check feed to %1\n", (*i)->name()));
2583
2584                 if (route->feeds (*i, &via_sends_only)) {
2585                         /* propagate solo upstream only if routing other than
2586                            sends is involved, but do consider the other route
2587                            (*i) to be part of the signal flow even if only
2588                            sends are involved.
2589                         */
2590                         DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 feeds %2 via sends only %3 sboD %4 sboU %5\n",
2591                                                                   route->name(),
2592                                                                   (*i)->name(),
2593                                                                   via_sends_only,
2594                                                                   route->soloed_by_others_downstream(),
2595                                                                   route->soloed_by_others_upstream()));
2596                         if (!via_sends_only) {
2597                                 if (!route->soloed_by_others_downstream()) {
2598                                         DEBUG_TRACE (DEBUG::Solo, string_compose ("\tmod %1 by %2\n", (*i)->name(), delta));
2599                                         (*i)->mod_solo_by_others_upstream (delta);
2600                                 } else {
2601                                         DEBUG_TRACE (DEBUG::Solo, "\talready soloed by others downstream\n");
2602                                 }
2603                         } else {
2604                                 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tfeed to %1 ignored, sends-only\n", (*i)->name()));
2605                         }
2606                         in_signal_flow = true;
2607                 } else {
2608                         DEBUG_TRACE (DEBUG::Solo, "\tno feed to\n");
2609                 }
2610
2611                 if (!in_signal_flow) {
2612                         uninvolved.push_back (*i);
2613                 }
2614         }
2615
2616         solo_update_disabled = false;
2617         DEBUG_TRACE (DEBUG::Solo, "propagation complete\n");
2618
2619         update_route_solo_state (r);
2620
2621         /* now notify that the mute state of the routes not involved in the signal
2622            pathway of the just-solo-changed route may have altered.
2623         */
2624
2625         for (RouteList::iterator i = uninvolved.begin(); i != uninvolved.end(); ++i) {
2626                 DEBUG_TRACE (DEBUG::Solo, string_compose ("mute change for %1, which neither feeds or is fed by %2\n", (*i)->name(), route->name()));
2627                 (*i)->mute_changed (this);
2628         }
2629
2630         SoloChanged (); /* EMIT SIGNAL */
2631         set_dirty();
2632 }
2633
2634 void
2635 Session::update_route_solo_state (boost::shared_ptr<RouteList> r)
2636 {
2637         /* now figure out if anything that matters is soloed (or is "listening")*/
2638
2639         bool something_soloed = false;
2640         uint32_t listeners = 0;
2641         uint32_t isolated = 0;
2642
2643         if (!r) {
2644                 r = routes.reader();
2645         }
2646
2647         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2648                 if (!(*i)->is_master() && !(*i)->is_monitor() && !(*i)->is_hidden() && (*i)->self_soloed()) {
2649                         something_soloed = true;
2650                 }
2651
2652                 if (!(*i)->is_hidden() && (*i)->listening_via_monitor()) {
2653                         if (Config->get_solo_control_is_listen_control()) {
2654                                 listeners++;
2655                         } else {
2656                                 (*i)->set_listen (false, this);
2657                         }
2658                 }
2659
2660                 if ((*i)->solo_isolated()) {
2661                         isolated++;
2662                 }
2663         }
2664
2665         if (something_soloed != _non_soloed_outs_muted) {
2666                 _non_soloed_outs_muted = something_soloed;
2667                 SoloActive (_non_soloed_outs_muted); /* EMIT SIGNAL */
2668         }
2669
2670         _listen_cnt = listeners;
2671
2672         if (isolated != _solo_isolated_cnt) {
2673                 _solo_isolated_cnt = isolated;
2674                 IsolatedChanged (); /* EMIT SIGNAL */
2675         }
2676
2677         DEBUG_TRACE (DEBUG::Solo, string_compose ("solo state updated by session, soloed? %1 listeners %2 isolated %3\n",
2678                                                   something_soloed, listeners, isolated));
2679 }
2680
2681 boost::shared_ptr<RouteList>
2682 Session::get_routes_with_internal_returns() const
2683 {
2684         boost::shared_ptr<RouteList> r = routes.reader ();
2685         boost::shared_ptr<RouteList> rl (new RouteList);
2686
2687         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2688                 if ((*i)->internal_return ()) {
2689                         rl->push_back (*i);
2690                 }
2691         }
2692         return rl;
2693 }
2694
2695 bool
2696 Session::io_name_is_legal (const std::string& name)
2697 {
2698         boost::shared_ptr<RouteList> r = routes.reader ();
2699
2700         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2701                 if ((*i)->name() == name) {
2702                         return false;
2703                 }
2704
2705                 if ((*i)->has_io_processor_named (name)) {
2706                         return false;
2707                 }
2708         }
2709
2710         return true;
2711 }
2712
2713 void
2714 Session::set_exclusive_input_active (boost::shared_ptr<RouteList> rl, bool onoff, bool flip_others)
2715 {
2716         RouteList rl2;
2717         vector<string> connections;
2718
2719         /* if we are passed only a single route and we're not told to turn
2720          * others off, then just do the simple thing.
2721          */
2722
2723         if (flip_others == false && rl->size() == 1) {
2724                 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (rl->front());
2725                 if (mt) {
2726                         mt->set_input_active (onoff);
2727                         return;
2728                 }
2729         }
2730
2731         for (RouteList::iterator rt = rl->begin(); rt != rl->end(); ++rt) {
2732
2733                 PortSet& ps ((*rt)->input()->ports());
2734                 
2735                 for (PortSet::iterator p = ps.begin(); p != ps.end(); ++p) {
2736                         p->get_connections (connections);
2737                 }
2738                 
2739                 for (vector<string>::iterator s = connections.begin(); s != connections.end(); ++s) {
2740                         routes_using_input_from (*s, rl2);
2741                 }
2742                 
2743                 /* scan all relevant routes to see if others are on or off */
2744                 
2745                 bool others_are_already_on = false;
2746                 
2747                 for (RouteList::iterator r = rl2.begin(); r != rl2.end(); ++r) {
2748
2749                         boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*r);
2750
2751                         if (!mt) {
2752                                 continue;
2753                         }
2754
2755                         if ((*r) != (*rt)) {
2756                                 if (mt->input_active()) {
2757                                         others_are_already_on = true;
2758                                 }
2759                         } else {
2760                                 /* this one needs changing */
2761                                 mt->set_input_active (onoff);
2762                         }
2763                 }
2764                 
2765                 if (flip_others) {
2766
2767                         /* globally reverse other routes */
2768                         
2769                         for (RouteList::iterator r = rl2.begin(); r != rl2.end(); ++r) {
2770                                 if ((*r) != (*rt)) {
2771                                         boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*r);
2772                                         if (mt) {
2773                                                 mt->set_input_active (!others_are_already_on);
2774                                         }
2775                                 }
2776                         }
2777                 }
2778         }
2779 }
2780
2781 void
2782 Session::routes_using_input_from (const string& str, RouteList& rl)
2783 {
2784         boost::shared_ptr<RouteList> r = routes.reader();
2785
2786         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2787                 if ((*i)->input()->connected_to (str)) {
2788                         rl.push_back (*i);
2789                 }
2790         }
2791 }
2792
2793 boost::shared_ptr<Route>
2794 Session::route_by_name (string name)
2795 {
2796         boost::shared_ptr<RouteList> r = routes.reader ();
2797
2798         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2799                 if ((*i)->name() == name) {
2800                         return *i;
2801                 }
2802         }
2803
2804         return boost::shared_ptr<Route> ((Route*) 0);
2805 }
2806
2807 boost::shared_ptr<Route>
2808 Session::route_by_id (PBD::ID id)
2809 {
2810         boost::shared_ptr<RouteList> r = routes.reader ();
2811
2812         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2813                 if ((*i)->id() == id) {
2814                         return *i;
2815                 }
2816         }
2817
2818         return boost::shared_ptr<Route> ((Route*) 0);
2819 }
2820
2821 boost::shared_ptr<Track>
2822 Session::track_by_diskstream_id (PBD::ID id)
2823 {
2824         boost::shared_ptr<RouteList> r = routes.reader ();
2825
2826         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2827                 boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> (*i);
2828                 if (t && t->using_diskstream_id (id)) {
2829                         return t;
2830                 }
2831         }
2832
2833         return boost::shared_ptr<Track> ();
2834 }
2835
2836 boost::shared_ptr<Route>
2837 Session::route_by_remote_id (uint32_t id)
2838 {
2839         boost::shared_ptr<RouteList> r = routes.reader ();
2840
2841         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2842                 if ((*i)->remote_control_id() == id) {
2843                         return *i;
2844                 }
2845         }
2846
2847         return boost::shared_ptr<Route> ((Route*) 0);
2848 }
2849
2850 void
2851 Session::playlist_region_added (boost::weak_ptr<Region> w)
2852 {
2853         boost::shared_ptr<Region> r = w.lock ();
2854         if (!r) {
2855                 return;
2856         }
2857
2858         /* These are the operations that are currently in progress... */
2859         list<GQuark> curr = _current_trans_quarks;
2860         curr.sort ();
2861
2862         /* ...and these are the operations during which we want to update
2863            the session range location markers.
2864         */
2865         list<GQuark> ops;
2866         ops.push_back (Operations::capture);
2867         ops.push_back (Operations::paste);
2868         ops.push_back (Operations::duplicate_region);
2869         ops.push_back (Operations::insert_file);
2870         ops.push_back (Operations::insert_region);
2871         ops.push_back (Operations::drag_region_brush);
2872         ops.push_back (Operations::region_drag);
2873         ops.push_back (Operations::selection_grab);
2874         ops.push_back (Operations::region_fill);
2875         ops.push_back (Operations::fill_selection);
2876         ops.push_back (Operations::create_region);
2877         ops.push_back (Operations::region_copy);
2878         ops.push_back (Operations::fixed_time_region_copy);
2879         ops.sort ();
2880
2881         /* See if any of the current operations match the ones that we want */
2882         list<GQuark> in;
2883         set_intersection (_current_trans_quarks.begin(), _current_trans_quarks.end(), ops.begin(), ops.end(), back_inserter (in));
2884
2885         /* If so, update the session range markers */
2886         if (!in.empty ()) {
2887                 maybe_update_session_range (r->position (), r->last_frame ());
2888         }
2889 }
2890
2891 /** Update the session range markers if a is before the current start or
2892  *  b is after the current end.
2893  */
2894 void
2895 Session::maybe_update_session_range (framepos_t a, framepos_t b)
2896 {
2897         if (_state_of_the_state & Loading) {
2898                 return;
2899         }
2900
2901         if (_session_range_location == 0) {
2902
2903                 add_session_range_location (a, b);
2904
2905         } else {
2906
2907                 if (a < _session_range_location->start()) {
2908                         _session_range_location->set_start (a);
2909                 }
2910
2911                 if (b > _session_range_location->end()) {
2912                         _session_range_location->set_end (b);
2913                 }
2914         }
2915 }
2916
2917 void
2918 Session::playlist_ranges_moved (list<Evoral::RangeMove<framepos_t> > const & ranges)
2919 {
2920         for (list<Evoral::RangeMove<framepos_t> >::const_iterator i = ranges.begin(); i != ranges.end(); ++i) {
2921                 maybe_update_session_range (i->to, i->to + i->length);
2922         }
2923 }
2924
2925 void
2926 Session::playlist_regions_extended (list<Evoral::Range<framepos_t> > const & ranges)
2927 {
2928         for (list<Evoral::Range<framepos_t> >::const_iterator i = ranges.begin(); i != ranges.end(); ++i) {
2929                 maybe_update_session_range (i->from, i->to);
2930         }
2931 }
2932
2933 /* Region management */
2934
2935 boost::shared_ptr<Region>
2936 Session::find_whole_file_parent (boost::shared_ptr<Region const> child) const
2937 {
2938         const RegionFactory::RegionMap& regions (RegionFactory::regions());
2939         RegionFactory::RegionMap::const_iterator i;
2940         boost::shared_ptr<Region> region;
2941
2942         Glib::Threads::Mutex::Lock lm (region_lock);
2943
2944         for (i = regions.begin(); i != regions.end(); ++i) {
2945
2946                 region = i->second;
2947
2948                 if (region->whole_file()) {
2949
2950                         if (child->source_equivalent (region)) {
2951                                 return region;
2952                         }
2953                 }
2954         }
2955
2956         return boost::shared_ptr<Region> ();
2957 }
2958
2959 int
2960 Session::destroy_sources (list<boost::shared_ptr<Source> > srcs)
2961 {
2962         set<boost::shared_ptr<Region> > relevant_regions;
2963
2964         for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ++s) {
2965                 RegionFactory::get_regions_using_source (*s, relevant_regions);
2966         }
2967
2968         for (set<boost::shared_ptr<Region> >::iterator r = relevant_regions.begin(); r != relevant_regions.end(); ) {
2969                 set<boost::shared_ptr<Region> >::iterator tmp;
2970
2971                 tmp = r;
2972                 ++tmp;
2973
2974                 playlists->destroy_region (*r);
2975                 RegionFactory::map_remove (*r);
2976
2977                 (*r)->drop_sources ();
2978                 (*r)->drop_references ();
2979
2980                 relevant_regions.erase (r);
2981
2982                 r = tmp;
2983         }
2984
2985         for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ) {
2986
2987                 {
2988                         Glib::Threads::Mutex::Lock ls (source_lock);
2989                         /* remove from the main source list */
2990                         sources.erase ((*s)->id());
2991                 }
2992
2993                 (*s)->mark_for_remove ();
2994                 (*s)->drop_references ();
2995
2996                 s = srcs.erase (s);
2997         }
2998
2999         return 0;
3000 }
3001
3002 int
3003 Session::remove_last_capture ()
3004 {
3005         list<boost::shared_ptr<Source> > srcs;
3006
3007         boost::shared_ptr<RouteList> rl = routes.reader ();
3008         for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
3009                 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
3010                 if (!tr) {
3011                         continue;
3012                 }
3013
3014                 list<boost::shared_ptr<Source> >& l = tr->last_capture_sources();
3015
3016                 if (!l.empty()) {
3017                         srcs.insert (srcs.end(), l.begin(), l.end());
3018                         l.clear ();
3019                 }
3020         }
3021
3022         destroy_sources (srcs);
3023
3024         save_state (_current_snapshot_name);
3025
3026         return 0;
3027 }
3028
3029 /* Source Management */
3030
3031 void
3032 Session::add_source (boost::shared_ptr<Source> source)
3033 {
3034         pair<SourceMap::key_type, SourceMap::mapped_type> entry;
3035         pair<SourceMap::iterator,bool> result;
3036
3037         entry.first = source->id();
3038         entry.second = source;
3039
3040         {
3041                 Glib::Threads::Mutex::Lock lm (source_lock);
3042                 result = sources.insert (entry);
3043         }
3044
3045         if (result.second) {
3046
3047                 /* yay, new source */
3048
3049                 boost::shared_ptr<FileSource> fs = boost::dynamic_pointer_cast<FileSource> (source);
3050                 
3051                 if (fs) {
3052                         if (!fs->within_session()) {
3053                                 ensure_search_path_includes (Glib::path_get_dirname (fs->path()), fs->type());
3054                         }
3055                 }
3056                 
3057                 set_dirty();
3058
3059                 boost::shared_ptr<AudioFileSource> afs;
3060
3061                 if ((afs = boost::dynamic_pointer_cast<AudioFileSource>(source)) != 0) {
3062                         if (Config->get_auto_analyse_audio()) {
3063                                 Analyser::queue_source_for_analysis (source, false);
3064                         }
3065                 }
3066
3067                 source->DropReferences.connect_same_thread (*this, boost::bind (&Session::remove_source, this, boost::weak_ptr<Source> (source)));
3068         }
3069 }
3070
3071 void
3072 Session::remove_source (boost::weak_ptr<Source> src)
3073 {
3074         if (_state_of_the_state & Deletion) {
3075                 return;
3076         }
3077
3078         SourceMap::iterator i;
3079         boost::shared_ptr<Source> source = src.lock();
3080
3081         if (!source) {
3082                 return;
3083         }
3084
3085         {
3086                 Glib::Threads::Mutex::Lock lm (source_lock);
3087
3088                 if ((i = sources.find (source->id())) != sources.end()) {
3089                         sources.erase (i);
3090                 }
3091         }
3092
3093         if (!(_state_of_the_state & InCleanup)) {
3094
3095                 /* save state so we don't end up with a session file
3096                    referring to non-existent sources.
3097                 */
3098
3099                 save_state (_current_snapshot_name);
3100         }
3101 }
3102
3103 boost::shared_ptr<Source>
3104 Session::source_by_id (const PBD::ID& id)
3105 {
3106         Glib::Threads::Mutex::Lock lm (source_lock);
3107         SourceMap::iterator i;
3108         boost::shared_ptr<Source> source;
3109
3110         if ((i = sources.find (id)) != sources.end()) {
3111                 source = i->second;
3112         }
3113
3114         return source;
3115 }
3116
3117 boost::shared_ptr<Source>
3118 Session::source_by_path_and_channel (const string& path, uint16_t chn)
3119 {
3120         Glib::Threads::Mutex::Lock lm (source_lock);
3121
3122         for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
3123                 boost::shared_ptr<AudioFileSource> afs
3124                         = boost::dynamic_pointer_cast<AudioFileSource>(i->second);
3125
3126                 if (afs && afs->path() == path && chn == afs->channel()) {
3127                         return afs;
3128                 }
3129         }
3130         return boost::shared_ptr<Source>();
3131 }
3132
3133 uint32_t
3134 Session::count_sources_by_origin (const string& path)
3135 {
3136         uint32_t cnt = 0;
3137         Glib::Threads::Mutex::Lock lm (source_lock);
3138
3139         for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
3140                 boost::shared_ptr<FileSource> fs
3141                         = boost::dynamic_pointer_cast<FileSource>(i->second);
3142
3143                 if (fs && fs->origin() == path) {
3144                         ++cnt;
3145                 }
3146         }
3147
3148         return cnt;
3149 }
3150
3151
3152 string
3153 Session::change_source_path_by_name (string path, string oldname, string newname, bool destructive)
3154 {
3155         string look_for;
3156         string old_basename = PBD::basename_nosuffix (oldname);
3157         string new_legalized = legalize_for_path (newname);
3158
3159         /* note: we know (or assume) the old path is already valid */
3160
3161         if (destructive) {
3162
3163                 /* destructive file sources have a name of the form:
3164
3165                     /path/to/Tnnnn-NAME(%[LR])?.wav
3166
3167                     the task here is to replace NAME with the new name.
3168                 */
3169
3170                 string dir;
3171                 string prefix;
3172                 string::size_type dash;
3173
3174                 dir = Glib::path_get_dirname (path);
3175                 path = Glib::path_get_basename (path);
3176
3177                 /* '-' is not a legal character for the NAME part of the path */
3178
3179                 if ((dash = path.find_last_of ('-')) == string::npos) {
3180                         return "";
3181                 }
3182
3183                 prefix = path.substr (0, dash);
3184
3185                 path += prefix;
3186                 path += '-';
3187                 path += new_legalized;
3188                 path += native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
3189                 path = Glib::build_filename (dir, path);
3190
3191         } else {
3192
3193                 /* non-destructive file sources have a name of the form:
3194
3195                     /path/to/NAME-nnnnn(%[LR])?.ext
3196
3197                     the task here is to replace NAME with the new name.
3198                 */
3199
3200                 string dir;
3201                 string suffix;
3202                 string::size_type dash;
3203                 string::size_type postfix;
3204
3205                 dir = Glib::path_get_dirname (path);
3206                 path = Glib::path_get_basename (path);
3207
3208                 /* '-' is not a legal character for the NAME part of the path */
3209
3210                 if ((dash = path.find_last_of ('-')) == string::npos) {
3211                         return "";
3212                 }
3213
3214                 suffix = path.substr (dash+1);
3215
3216                 // Suffix is now everything after the dash. Now we need to eliminate
3217                 // the nnnnn part, which is done by either finding a '%' or a '.'
3218
3219                 postfix = suffix.find_last_of ("%");
3220                 if (postfix == string::npos) {
3221                         postfix = suffix.find_last_of ('.');
3222                 }
3223
3224                 if (postfix != string::npos) {
3225                         suffix = suffix.substr (postfix);
3226                 } else {
3227                         error << "Logic error in Session::change_source_path_by_name(), please report" << endl;
3228                         return "";
3229                 }
3230
3231                 const uint32_t limit = 10000;
3232                 char buf[PATH_MAX+1];
3233
3234                 for (uint32_t cnt = 1; cnt <= limit; ++cnt) {
3235
3236                         snprintf (buf, sizeof(buf), "%s-%u%s", newname.c_str(), cnt, suffix.c_str());
3237
3238                         if (!matching_unsuffixed_filename_exists_in (dir, buf)) {
3239                                 path = Glib::build_filename (dir, buf);
3240                                 break;
3241                         }
3242
3243                         path = "";
3244                 }
3245
3246                 if (path.empty()) {
3247                         fatal << string_compose (_("FATAL ERROR! Could not find a suitable version of %1 for a rename"),
3248                                                  newname) << endl;
3249                         /*NOTREACHED*/
3250                 }
3251         }
3252
3253         return path;
3254 }
3255
3256 /** Return the full path (in some session directory) for a new within-session source.
3257  * \a name must be a session-unique name that does not contain slashes
3258  *         (e.g. as returned by new_*_source_name)
3259  */
3260 string
3261 Session::new_source_path_from_name (DataType type, const string& name)
3262 {
3263         assert(name.find("/") == string::npos);
3264
3265         SessionDirectory sdir(get_best_session_directory_for_new_source());
3266
3267         std::string p;
3268         if (type == DataType::AUDIO) {
3269                 p = sdir.sound_path();
3270         } else if (type == DataType::MIDI) {
3271                 p = sdir.midi_path();
3272         } else {
3273                 error << "Unknown source type, unable to create file path" << endmsg;
3274                 return "";
3275         }
3276
3277         return Glib::build_filename (p, name);
3278 }
3279
3280 string
3281 Session::peak_path (string base) const
3282 {
3283         return Glib::build_filename (_session_dir->peak_path(), base + peakfile_suffix);
3284 }
3285
3286 /** Return a unique name based on \a base for a new internal audio source */
3287 string
3288 Session::new_audio_source_name (const string& base, uint32_t nchan, uint32_t chan, bool destructive)
3289 {
3290         uint32_t cnt;
3291         char buf[PATH_MAX+1];
3292         const uint32_t limit = 10000;
3293         string legalized;
3294         string ext = native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
3295
3296         buf[0] = '\0';
3297         legalized = legalize_for_path (base);
3298
3299         // Find a "version" of the base name that doesn't exist in any of the possible directories.
3300         for (cnt = (destructive ? ++destructive_index : 1); cnt <= limit; ++cnt) {
3301
3302                 vector<space_and_path>::iterator i;
3303                 uint32_t existing = 0;
3304
3305                 for (i = session_dirs.begin(); i != session_dirs.end(); ++i) {
3306
3307                         if (destructive) {
3308
3309                                 if (nchan < 2) {
3310                                         snprintf (buf, sizeof(buf), "T%04d-%s%s",
3311                                                   cnt, legalized.c_str(), ext.c_str());
3312                                 } else if (nchan == 2) {
3313                                         if (chan == 0) {
3314                                                 snprintf (buf, sizeof(buf), "T%04d-%s%%L%s",
3315                                                           cnt, legalized.c_str(), ext.c_str());
3316                                         } else {
3317                                                 snprintf (buf, sizeof(buf), "T%04d-%s%%R%s",
3318                                                           cnt, legalized.c_str(), ext.c_str());
3319                                         }
3320                                 } else if (nchan < 26) {
3321                                         snprintf (buf, sizeof(buf), "T%04d-%s%%%c%s",
3322                                                   cnt, legalized.c_str(), 'a' + chan, ext.c_str());
3323                                 } else {
3324                                         snprintf (buf, sizeof(buf), "T%04d-%s%s",
3325                                                   cnt, legalized.c_str(), ext.c_str());
3326                                 }
3327
3328                         } else {
3329
3330                                 if (nchan < 2) {
3331                                         snprintf (buf, sizeof(buf), "%s-%u%s", legalized.c_str(), cnt, ext.c_str());
3332                                 } else if (nchan == 2) {
3333                                         if (chan == 0) {
3334                                                 snprintf (buf, sizeof(buf), "%s-%u%%L%s", legalized.c_str(), cnt, ext.c_str());
3335                                         } else {
3336                                                 snprintf (buf, sizeof(buf), "%s-%u%%R%s", legalized.c_str(), cnt, ext.c_str());
3337                                         }
3338                                 } else if (nchan < 26) {
3339                                         snprintf (buf, sizeof(buf), "%s-%u%%%c%s", legalized.c_str(), cnt, 'a' + chan, ext.c_str());
3340                                 } else {
3341                                         snprintf (buf, sizeof(buf), "%s-%u%s", legalized.c_str(), cnt, ext.c_str());
3342                                 }
3343                         }
3344
3345                         SessionDirectory sdir((*i).path);
3346
3347                         string spath = sdir.sound_path();
3348
3349                         /* note that we search *without* the extension so that
3350                            we don't end up both "Audio 1-1.wav" and "Audio 1-1.caf"
3351                            in the event that this new name is required for
3352                            a file format change.
3353                         */
3354
3355                         if (matching_unsuffixed_filename_exists_in (spath, buf)) {
3356                                 existing++;
3357                                 break;
3358                         }
3359                 }
3360
3361                 if (existing == 0) {
3362                         break;
3363                 }
3364
3365                 if (cnt > limit) {
3366                         error << string_compose(
3367                                         _("There are already %1 recordings for %2, which I consider too many."),
3368                                         limit, base) << endmsg;
3369                         destroy ();
3370                         throw failed_constructor();
3371                 }
3372         }
3373
3374         return Glib::path_get_basename (buf);
3375 }
3376
3377 /** Create a new within-session audio source */
3378 boost::shared_ptr<AudioFileSource>
3379 Session::create_audio_source_for_session (size_t n_chans, string const & n, uint32_t chan, bool destructive)
3380 {
3381         const string name    = new_audio_source_name (n, n_chans, chan, destructive);
3382         const string path    = new_source_path_from_name(DataType::AUDIO, name);
3383
3384         return boost::dynamic_pointer_cast<AudioFileSource> (
3385                 SourceFactory::createWritable (DataType::AUDIO, *this, path, string(), destructive, frame_rate()));
3386 }
3387
3388 /** Return a unique name based on \a base for a new internal MIDI source */
3389 string
3390 Session::new_midi_source_name (const string& base)
3391 {
3392         uint32_t cnt;
3393         char buf[PATH_MAX+1];
3394         const uint32_t limit = 10000;
3395         string legalized;
3396
3397         buf[0] = '\0';
3398         legalized = legalize_for_path (base);
3399
3400         // Find a "version" of the file name that doesn't exist in any of the possible directories.
3401         for (cnt = 1; cnt <= limit; ++cnt) {
3402
3403                 vector<space_and_path>::iterator i;
3404                 uint32_t existing = 0;
3405
3406                 for (i = session_dirs.begin(); i != session_dirs.end(); ++i) {
3407
3408                         SessionDirectory sdir((*i).path);
3409
3410                         std::string p = Glib::build_filename (sdir.midi_path(), legalized);
3411
3412                         snprintf (buf, sizeof(buf), "%s-%u.mid", p.c_str(), cnt);
3413
3414                         if (Glib::file_test (buf, Glib::FILE_TEST_EXISTS)) {
3415                                 existing++;
3416                         }
3417                 }
3418
3419                 if (existing == 0) {
3420                         break;
3421                 }
3422
3423                 if (cnt > limit) {
3424                         error << string_compose(
3425                                         _("There are already %1 recordings for %2, which I consider too many."),
3426                                         limit, base) << endmsg;
3427                         destroy ();
3428                         throw failed_constructor();
3429                 }
3430         }
3431
3432         return Glib::path_get_basename(buf);
3433 }
3434
3435
3436 /** Create a new within-session MIDI source */
3437 boost::shared_ptr<MidiSource>
3438 Session::create_midi_source_for_session (Track* track, string const & n)
3439 {
3440         /* try to use the existing write source for the track, to keep numbering sane
3441          */
3442
3443         if (track) {
3444                 /*MidiTrack* mt = dynamic_cast<Track*> (track);
3445                   assert (mt);
3446                 */
3447
3448                 list<boost::shared_ptr<Source> > l = track->steal_write_sources ();
3449
3450                 if (!l.empty()) {
3451                         assert (boost::dynamic_pointer_cast<MidiSource> (l.front()));
3452                         return boost::dynamic_pointer_cast<MidiSource> (l.front());
3453                 }
3454         }
3455
3456         const string name = new_midi_source_name (n);
3457         const string path = new_source_path_from_name (DataType::MIDI, name);
3458
3459         return boost::dynamic_pointer_cast<SMFSource> (
3460                 SourceFactory::createWritable (
3461                         DataType::MIDI, *this, path, string(), false, frame_rate()));
3462 }
3463
3464
3465 void
3466 Session::add_playlist (boost::shared_ptr<Playlist> playlist, bool unused)
3467 {
3468         if (playlist->hidden()) {
3469                 return;
3470         }
3471
3472         playlists->add (playlist);
3473
3474         if (unused) {
3475                 playlist->release();
3476         }
3477
3478         set_dirty();
3479 }
3480
3481 void
3482 Session::remove_playlist (boost::weak_ptr<Playlist> weak_playlist)
3483 {
3484         if (_state_of_the_state & Deletion) {
3485                 return;
3486         }
3487
3488         boost::shared_ptr<Playlist> playlist (weak_playlist.lock());
3489
3490         if (!playlist) {
3491                 return;
3492         }
3493
3494         playlists->remove (playlist);
3495
3496         set_dirty();
3497 }
3498
3499 void
3500 Session::set_audition (boost::shared_ptr<Region> r)
3501 {
3502         pending_audition_region = r;
3503         add_post_transport_work (PostTransportAudition);
3504         _butler->schedule_transport_work ();
3505 }
3506
3507 void
3508 Session::audition_playlist ()
3509 {
3510         SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
3511         ev->region.reset ();
3512         queue_event (ev);
3513 }
3514
3515 void
3516 Session::non_realtime_set_audition ()
3517 {
3518         assert (pending_audition_region);
3519         auditioner->audition_region (pending_audition_region);
3520         pending_audition_region.reset ();
3521         AuditionActive (true); /* EMIT SIGNAL */
3522 }
3523
3524 void
3525 Session::audition_region (boost::shared_ptr<Region> r)
3526 {
3527         SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
3528         ev->region = r;
3529         queue_event (ev);
3530 }
3531
3532 void
3533 Session::cancel_audition ()
3534 {
3535         if (auditioner->auditioning()) {
3536                 auditioner->cancel_audition ();
3537                 AuditionActive (false); /* EMIT SIGNAL */
3538         }
3539 }
3540
3541 bool
3542 Session::RoutePublicOrderSorter::operator() (boost::shared_ptr<Route> a, boost::shared_ptr<Route> b)
3543 {
3544         if (a->is_monitor()) {
3545                 return true;
3546         }
3547         if (b->is_monitor()) {
3548                 return false;
3549         }
3550         return a->order_key (MixerSort) < b->order_key (MixerSort);
3551 }
3552
3553 bool
3554 Session::is_auditioning () const
3555 {
3556         /* can be called before we have an auditioner object */
3557         if (auditioner) {
3558                 return auditioner->auditioning();
3559         } else {
3560                 return false;
3561         }
3562 }
3563
3564 void
3565 Session::graph_reordered ()
3566 {
3567         /* don't do this stuff if we are setting up connections
3568            from a set_state() call or creating new tracks. Ditto for deletion.
3569         */
3570
3571         if ((_state_of_the_state & (InitialConnecting|Deletion)) || _adding_routes_in_progress) {
3572                 return;
3573         }
3574
3575         /* every track/bus asked for this to be handled but it was deferred because
3576            we were connecting. do it now.
3577         */
3578
3579         request_input_change_handling ();
3580
3581         resort_routes ();
3582
3583         /* force all diskstreams to update their capture offset values to
3584            reflect any changes in latencies within the graph.
3585         */
3586
3587         boost::shared_ptr<RouteList> rl = routes.reader ();
3588         for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
3589                 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
3590                 if (tr) {
3591                         tr->set_capture_offset ();
3592                 }
3593         }
3594 }
3595
3596 /** @return Number of frames that there is disk space available to write,
3597  *  if known.
3598  */
3599 boost::optional<framecnt_t>
3600 Session::available_capture_duration ()
3601 {
3602         Glib::Threads::Mutex::Lock lm (space_lock);
3603
3604         if (_total_free_4k_blocks_uncertain) {
3605                 return boost::optional<framecnt_t> ();
3606         }
3607         
3608         float sample_bytes_on_disk = 4.0; // keep gcc happy
3609
3610         switch (config.get_native_file_data_format()) {
3611         case FormatFloat:
3612                 sample_bytes_on_disk = 4.0;
3613                 break;
3614
3615         case FormatInt24:
3616                 sample_bytes_on_disk = 3.0;
3617                 break;
3618
3619         case FormatInt16:
3620                 sample_bytes_on_disk = 2.0;
3621                 break;
3622
3623         default:
3624                 /* impossible, but keep some gcc versions happy */
3625                 fatal << string_compose (_("programming error: %1"),
3626                                          X_("illegal native file data format"))
3627                       << endmsg;
3628                 /*NOTREACHED*/
3629         }
3630
3631         double scale = 4096.0 / sample_bytes_on_disk;
3632
3633         if (_total_free_4k_blocks * scale > (double) max_framecnt) {
3634                 return max_framecnt;
3635         }
3636
3637         return (framecnt_t) floor (_total_free_4k_blocks * scale);
3638 }
3639
3640 void
3641 Session::add_bundle (boost::shared_ptr<Bundle> bundle)
3642 {
3643         {
3644                 RCUWriter<BundleList> writer (_bundles);
3645                 boost::shared_ptr<BundleList> b = writer.get_copy ();
3646                 b->push_back (bundle);
3647         }
3648
3649         BundleAdded (bundle); /* EMIT SIGNAL */
3650
3651         set_dirty();
3652 }
3653
3654 void
3655 Session::remove_bundle (boost::shared_ptr<Bundle> bundle)
3656 {
3657         bool removed = false;
3658
3659         {
3660                 RCUWriter<BundleList> writer (_bundles);
3661                 boost::shared_ptr<BundleList> b = writer.get_copy ();
3662                 BundleList::iterator i = find (b->begin(), b->end(), bundle);
3663
3664                 if (i != b->end()) {
3665                         b->erase (i);
3666                         removed = true;
3667                 }
3668         }
3669
3670         if (removed) {
3671                  BundleRemoved (bundle); /* EMIT SIGNAL */
3672         }
3673
3674         set_dirty();
3675 }
3676
3677 boost::shared_ptr<Bundle>
3678 Session::bundle_by_name (string name) const
3679 {
3680         boost::shared_ptr<BundleList> b = _bundles.reader ();
3681
3682         for (BundleList::const_iterator i = b->begin(); i != b->end(); ++i) {
3683                 if ((*i)->name() == name) {
3684                         return* i;
3685                 }
3686         }
3687
3688         return boost::shared_ptr<Bundle> ();
3689 }
3690
3691 void
3692 Session::tempo_map_changed (const PropertyChange&)
3693 {
3694         clear_clicks ();
3695
3696         playlists->update_after_tempo_map_change ();
3697
3698         _locations->apply (*this, &Session::update_locations_after_tempo_map_change);
3699
3700         set_dirty ();
3701 }
3702
3703 void
3704 Session::update_locations_after_tempo_map_change (Locations::LocationList& loc)
3705 {
3706         for (Locations::LocationList::iterator i = loc.begin(); i != loc.end(); ++i) {
3707                 (*i)->recompute_frames_from_bbt ();
3708         }
3709 }
3710
3711 /** Ensures that all buffers (scratch, send, silent, etc) are allocated for
3712  * the given count with the current block size.
3713  */
3714 void
3715 Session::ensure_buffers (ChanCount howmany)
3716 {
3717         BufferManager::ensure_buffers (howmany);
3718 }
3719
3720 void
3721 Session::ensure_buffer_set(BufferSet& buffers, const ChanCount& count)
3722 {
3723         for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
3724                 buffers.ensure_buffers(*t, count.get(*t), _engine.raw_buffer_size(*t));
3725         }
3726 }
3727
3728 uint32_t
3729 Session::next_insert_id ()
3730 {
3731         /* this doesn't really loop forever. just think about it */
3732
3733         while (true) {
3734                 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < insert_bitset.size(); ++n) {
3735                         if (!insert_bitset[n]) {
3736                                 insert_bitset[n] = true;
3737                                 return n;
3738
3739                         }
3740                 }
3741
3742                 /* none available, so resize and try again */
3743
3744                 insert_bitset.resize (insert_bitset.size() + 16, false);
3745         }
3746 }
3747
3748 uint32_t
3749 Session::next_send_id ()
3750 {
3751         /* this doesn't really loop forever. just think about it */
3752
3753         while (true) {
3754                 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < send_bitset.size(); ++n) {
3755                         if (!send_bitset[n]) {
3756                                 send_bitset[n] = true;
3757                                 return n;
3758
3759                         }
3760                 }
3761
3762                 /* none available, so resize and try again */
3763
3764                 send_bitset.resize (send_bitset.size() + 16, false);
3765         }
3766 }
3767
3768 uint32_t
3769 Session::next_aux_send_id ()
3770 {
3771         /* this doesn't really loop forever. just think about it */
3772
3773         while (true) {
3774                 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < aux_send_bitset.size(); ++n) {
3775                         if (!aux_send_bitset[n]) {
3776                                 aux_send_bitset[n] = true;
3777                                 return n;
3778
3779                         }
3780                 }
3781
3782                 /* none available, so resize and try again */
3783
3784                 aux_send_bitset.resize (aux_send_bitset.size() + 16, false);
3785         }
3786 }
3787
3788 uint32_t
3789 Session::next_return_id ()
3790 {
3791         /* this doesn't really loop forever. just think about it */
3792
3793         while (true) {
3794                 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < return_bitset.size(); ++n) {
3795                         if (!return_bitset[n]) {
3796                                 return_bitset[n] = true;
3797                                 return n;
3798
3799                         }
3800                 }
3801
3802                 /* none available, so resize and try again */
3803
3804                 return_bitset.resize (return_bitset.size() + 16, false);
3805         }
3806 }
3807
3808 void
3809 Session::mark_send_id (uint32_t id)
3810 {
3811         if (id >= send_bitset.size()) {
3812                 send_bitset.resize (id+16, false);
3813         }
3814         if (send_bitset[id]) {
3815                 warning << string_compose (_("send ID %1 appears to be in use already"), id) << endmsg;
3816         }
3817         send_bitset[id] = true;
3818 }
3819
3820 void
3821 Session::mark_aux_send_id (uint32_t id)
3822 {
3823         if (id >= aux_send_bitset.size()) {
3824                 aux_send_bitset.resize (id+16, false);
3825         }
3826         if (aux_send_bitset[id]) {
3827                 warning << string_compose (_("aux send ID %1 appears to be in use already"), id) << endmsg;
3828         }
3829         aux_send_bitset[id] = true;
3830 }
3831
3832 void
3833 Session::mark_return_id (uint32_t id)
3834 {
3835         if (id >= return_bitset.size()) {
3836                 return_bitset.resize (id+16, false);
3837         }
3838         if (return_bitset[id]) {
3839                 warning << string_compose (_("return ID %1 appears to be in use already"), id) << endmsg;
3840         }
3841         return_bitset[id] = true;
3842 }
3843
3844 void
3845 Session::mark_insert_id (uint32_t id)
3846 {
3847         if (id >= insert_bitset.size()) {
3848                 insert_bitset.resize (id+16, false);
3849         }
3850         if (insert_bitset[id]) {
3851                 warning << string_compose (_("insert ID %1 appears to be in use already"), id) << endmsg;
3852         }
3853         insert_bitset[id] = true;
3854 }
3855
3856 void
3857 Session::unmark_send_id (uint32_t id)
3858 {
3859         if (id < send_bitset.size()) {
3860                 send_bitset[id] = false;
3861         }
3862 }
3863
3864 void
3865 Session::unmark_aux_send_id (uint32_t id)
3866 {
3867         if (id < aux_send_bitset.size()) {
3868                 aux_send_bitset[id] = false;
3869         }
3870 }
3871
3872 void
3873 Session::unmark_return_id (uint32_t id)
3874 {
3875         if (id < return_bitset.size()) {
3876                 return_bitset[id] = false;
3877         }
3878 }
3879
3880 void
3881 Session::unmark_insert_id (uint32_t id)
3882 {
3883         if (id < insert_bitset.size()) {
3884                 insert_bitset[id] = false;
3885         }
3886 }
3887
3888 void
3889 Session::reset_native_file_format ()
3890 {
3891         boost::shared_ptr<RouteList> rl = routes.reader ();
3892         for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
3893                 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
3894                 if (tr) {
3895                         /* don't save state as we do this, there's no point
3896                          */
3897
3898                         _state_of_the_state = StateOfTheState (_state_of_the_state|InCleanup);
3899                         tr->reset_write_sources (false);
3900                         _state_of_the_state = StateOfTheState (_state_of_the_state & ~InCleanup);
3901                 }
3902         }
3903 }
3904
3905 bool
3906 Session::route_name_unique (string n) const
3907 {
3908         boost::shared_ptr<RouteList> r = routes.reader ();
3909
3910         for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
3911                 if ((*i)->name() == n) {
3912                         return false;
3913                 }
3914         }
3915
3916         return true;
3917 }
3918
3919 bool
3920 Session::route_name_internal (string n) const
3921 {
3922         if (auditioner && auditioner->name() == n) {
3923                 return true;
3924         }
3925
3926         if (_click_io && _click_io->name() == n) {
3927                 return true;
3928         }
3929
3930         return false;
3931 }
3932
3933 int
3934 Session::freeze_all (InterThreadInfo& itt)
3935 {
3936         boost::shared_ptr<RouteList> r = routes.reader ();
3937
3938         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3939
3940                 boost::shared_ptr<Track> t;
3941
3942                 if ((t = boost::dynamic_pointer_cast<Track>(*i)) != 0) {
3943                         /* XXX this is wrong because itt.progress will keep returning to zero at the start
3944                            of every track.
3945                         */
3946                         t->freeze_me (itt);
3947                 }
3948         }
3949
3950         return 0;
3951 }
3952
3953 boost::shared_ptr<Region>
3954 Session::write_one_track (AudioTrack& track, framepos_t start, framepos_t end,
3955                           bool /*overwrite*/, vector<boost::shared_ptr<Source> >& srcs,
3956                           InterThreadInfo& itt, 
3957                           boost::shared_ptr<Processor> endpoint, bool include_endpoint,
3958                           bool for_export)
3959 {
3960         boost::shared_ptr<Region> result;
3961         boost::shared_ptr<Playlist> playlist;
3962         boost::shared_ptr<AudioFileSource> fsource;
3963         uint32_t x;
3964         char buf[PATH_MAX+1];
3965         ChanCount diskstream_channels (track.n_channels());
3966         framepos_t position;
3967         framecnt_t this_chunk;
3968         framepos_t to_do;
3969         BufferSet buffers;
3970         SessionDirectory sdir(get_best_session_directory_for_new_source ());
3971         const string sound_dir = sdir.sound_path();
3972         framepos_t len = end - start;
3973         bool need_block_size_reset = false;
3974         string ext;
3975         ChanCount const max_proc = track.max_processor_streams ();
3976
3977         if (end <= start) {
3978                 error << string_compose (_("Cannot write a range where end <= start (e.g. %1 <= %2)"),
3979                                          end, start) << endmsg;
3980                 return result;
3981         }
3982
3983         const framecnt_t chunk_size = (256 * 1024)/4;
3984
3985         // block all process callback handling
3986
3987         block_processing ();
3988
3989         /* call tree *MUST* hold route_lock */
3990
3991         if ((playlist = track.playlist()) == 0) {
3992                 goto out;
3993         }
3994
3995         ext = native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
3996
3997         for (uint32_t chan_n = 0; chan_n < diskstream_channels.n_audio(); ++chan_n) {
3998
3999                 for (x = 0; x < 99999; ++x) {
4000                         snprintf (buf, sizeof(buf), "%s/%s-%d-bounce-%" PRIu32 "%s", sound_dir.c_str(), playlist->name().c_str(), chan_n, x+1, ext.c_str());
4001                         if (!Glib::file_test (buf, Glib::FILE_TEST_EXISTS)) {
4002                                 break;
4003                         }
4004                 }
4005
4006                 if (x == 99999) {
4007                         error << string_compose (_("too many bounced versions of playlist \"%1\""), playlist->name()) << endmsg;
4008                         goto out;
4009                 }
4010
4011                 try {
4012                         fsource = boost::dynamic_pointer_cast<AudioFileSource> (
4013                                 SourceFactory::createWritable (DataType::AUDIO, *this, buf, string(), false, frame_rate()));
4014                 }
4015
4016                 catch (failed_constructor& err) {
4017                         error << string_compose (_("cannot create new audio file \"%1\" for %2"), buf, track.name()) << endmsg;
4018                         goto out;
4019                 }
4020
4021                 srcs.push_back (fsource);
4022         }
4023
4024         /* tell redirects that care that we are about to use a much larger
4025          * blocksize. this will flush all plugins too, so that they are ready
4026          * to be used for this process.
4027          */
4028
4029         need_block_size_reset = true;
4030         track.set_block_size (chunk_size);
4031
4032         position = start;
4033         to_do = len;
4034
4035         /* create a set of reasonably-sized buffers */
4036         buffers.ensure_buffers (DataType::AUDIO, max_proc.n_audio(), chunk_size);
4037         buffers.set_count (max_proc);
4038
4039         for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
4040                 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4041                 if (afs)
4042                         afs->prepare_for_peakfile_writes ();
4043         }
4044
4045         while (to_do && !itt.cancel) {
4046
4047                 this_chunk = min (to_do, chunk_size);
4048
4049                 if (track.export_stuff (buffers, start, this_chunk, endpoint, include_endpoint, for_export)) {
4050                         goto out;
4051                 }
4052
4053                 uint32_t n = 0;
4054                 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src, ++n) {
4055                         boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4056
4057                         if (afs) {
4058                                 if (afs->write (buffers.get_audio(n).data(), this_chunk) != this_chunk) {
4059                                         goto out;
4060                                 }
4061                         }
4062                 }
4063
4064                 start += this_chunk;
4065                 to_do -= this_chunk;
4066
4067                 itt.progress = (float) (1.0 - ((double) to_do / len));
4068
4069         }
4070
4071         if (!itt.cancel) {
4072
4073                 time_t now;
4074                 struct tm* xnow;
4075                 time (&now);
4076                 xnow = localtime (&now);
4077
4078                 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src) {
4079                         boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4080
4081                         if (afs) {
4082                                 afs->update_header (position, *xnow, now);
4083                                 afs->flush_header ();
4084                         }
4085                 }
4086
4087                 /* construct a region to represent the bounced material */
4088
4089                 PropertyList plist;
4090
4091                 plist.add (Properties::start, 0);
4092                 plist.add (Properties::length, srcs.front()->length(srcs.front()->timeline_position()));
4093                 plist.add (Properties::name, region_name_from_path (srcs.front()->name(), true));
4094
4095                 result = RegionFactory::create (srcs, plist);
4096
4097         }
4098
4099   out:
4100         if (!result) {
4101                 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
4102                         boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4103
4104                         if (afs) {
4105                                 afs->mark_for_remove ();
4106                         }
4107
4108                         (*src)->drop_references ();
4109                 }
4110
4111         } else {
4112                 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
4113                         boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4114
4115                         if (afs)
4116                                 afs->done_with_peakfile_writes ();
4117                 }
4118         }
4119
4120
4121         if (need_block_size_reset) {
4122                 track.set_block_size (get_block_size());
4123         }
4124
4125         unblock_processing ();
4126
4127         return result;
4128 }
4129
4130 gain_t*
4131 Session::gain_automation_buffer() const
4132 {
4133         return ProcessThread::gain_automation_buffer ();
4134 }
4135
4136 gain_t*
4137 Session::send_gain_automation_buffer() const
4138 {
4139         return ProcessThread::send_gain_automation_buffer ();
4140 }
4141
4142 pan_t**
4143 Session::pan_automation_buffer() const
4144 {
4145         return ProcessThread::pan_automation_buffer ();
4146 }
4147
4148 BufferSet&
4149 Session::get_silent_buffers (ChanCount count)
4150 {
4151         return ProcessThread::get_silent_buffers (count);
4152 }
4153
4154 BufferSet&
4155 Session::get_scratch_buffers (ChanCount count)
4156 {
4157         return ProcessThread::get_scratch_buffers (count);
4158 }
4159
4160 BufferSet&
4161 Session::get_mix_buffers (ChanCount count)
4162 {
4163         return ProcessThread::get_mix_buffers (count);
4164 }
4165
4166 uint32_t
4167 Session::ntracks () const
4168 {
4169         uint32_t n = 0;
4170         boost::shared_ptr<RouteList> r = routes.reader ();
4171
4172         for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
4173                 if (boost::dynamic_pointer_cast<Track> (*i)) {
4174                         ++n;
4175                 }
4176         }
4177
4178         return n;
4179 }
4180
4181 uint32_t
4182 Session::nbusses () const
4183 {
4184         uint32_t n = 0;
4185         boost::shared_ptr<RouteList> r = routes.reader ();
4186
4187         for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
4188                 if (boost::dynamic_pointer_cast<Track>(*i) == 0) {
4189                         ++n;
4190                 }
4191         }
4192
4193         return n;
4194 }
4195
4196 void
4197 Session::add_automation_list(AutomationList *al)
4198 {
4199         automation_lists[al->id()] = al;
4200 }
4201
4202 /** @return true if there is at least one record-enabled track, otherwise false */
4203 bool
4204 Session::have_rec_enabled_track () const
4205 {
4206         return g_atomic_int_get (&_have_rec_enabled_track) == 1;
4207 }
4208
4209 /** Update the state of our rec-enabled tracks flag */
4210 void
4211 Session::update_have_rec_enabled_track ()
4212 {
4213         boost::shared_ptr<RouteList> rl = routes.reader ();
4214         RouteList::iterator i = rl->begin();
4215         while (i != rl->end ()) {
4216
4217                 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4218                 if (tr && tr->record_enabled ()) {
4219                         break;
4220                 }
4221
4222                 ++i;
4223         }
4224
4225         int const old = g_atomic_int_get (&_have_rec_enabled_track);
4226
4227         g_atomic_int_set (&_have_rec_enabled_track, i != rl->end () ? 1 : 0);
4228
4229         if (g_atomic_int_get (&_have_rec_enabled_track) != old) {
4230                 RecordStateChanged (); /* EMIT SIGNAL */
4231         }
4232 }
4233
4234 void
4235 Session::listen_position_changed ()
4236 {
4237         boost::shared_ptr<RouteList> r = routes.reader ();
4238
4239         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4240                 (*i)->listen_position_changed ();
4241         }
4242 }
4243
4244 void
4245 Session::solo_control_mode_changed ()
4246 {
4247         /* cancel all solo or all listen when solo control mode changes */
4248
4249         if (soloing()) {
4250                 set_solo (get_routes(), false);
4251         } else if (listening()) {
4252                 set_listen (get_routes(), false);
4253         }
4254 }
4255
4256 /** Called when a property of one of our route groups changes */
4257 void
4258 Session::route_group_property_changed (RouteGroup* rg)
4259 {
4260         RouteGroupPropertyChanged (rg); /* EMIT SIGNAL */
4261 }
4262
4263 /** Called when a route is added to one of our route groups */
4264 void
4265 Session::route_added_to_route_group (RouteGroup* rg, boost::weak_ptr<Route> r)
4266 {
4267         RouteAddedToRouteGroup (rg, r);
4268 }
4269
4270 /** Called when a route is removed from one of our route groups */
4271 void
4272 Session::route_removed_from_route_group (RouteGroup* rg, boost::weak_ptr<Route> r)
4273 {
4274         RouteRemovedFromRouteGroup (rg, r);
4275 }
4276
4277 boost::shared_ptr<RouteList>
4278 Session::get_routes_with_regions_at (framepos_t const p) const
4279 {
4280         boost::shared_ptr<RouteList> r = routes.reader ();
4281         boost::shared_ptr<RouteList> rl (new RouteList);
4282
4283         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4284                 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4285                 if (!tr) {
4286                         continue;
4287                 }
4288
4289                 boost::shared_ptr<Playlist> pl = tr->playlist ();
4290                 if (!pl) {
4291                         continue;
4292                 }
4293
4294                 if (pl->has_region_at (p)) {
4295                         rl->push_back (*i);
4296                 }
4297         }
4298
4299         return rl;
4300 }
4301
4302 void
4303 Session::goto_end ()
4304 {
4305         if (_session_range_location) {
4306                 request_locate (_session_range_location->end(), false);
4307         } else {
4308                 request_locate (0, false);
4309         }
4310 }
4311
4312 void
4313 Session::goto_start ()
4314 {
4315         if (_session_range_location) {
4316                 request_locate (_session_range_location->start(), false);
4317         } else {
4318                 request_locate (0, false);
4319         }
4320 }
4321
4322 framepos_t
4323 Session::current_start_frame () const
4324 {
4325         return _session_range_location ? _session_range_location->start() : 0;
4326 }
4327
4328 framepos_t
4329 Session::current_end_frame () const
4330 {
4331         return _session_range_location ? _session_range_location->end() : 0;
4332 }
4333
4334 void
4335 Session::add_session_range_location (framepos_t start, framepos_t end)
4336 {
4337         _session_range_location = new Location (*this, start, end, _("session"), Location::IsSessionRange);
4338         _locations->add (_session_range_location);
4339 }
4340
4341 void
4342 Session::step_edit_status_change (bool yn)
4343 {
4344         bool send = false;
4345
4346         bool val = false;
4347         if (yn) {
4348                 send = (_step_editors == 0);
4349                 val = true;
4350
4351                 _step_editors++;
4352         } else {
4353                 send = (_step_editors == 1);
4354                 val = false;
4355
4356                 if (_step_editors > 0) {
4357                         _step_editors--;
4358                 }
4359         }
4360
4361         if (send) {
4362                 StepEditStatusChange (val);
4363         }
4364 }
4365
4366
4367 void
4368 Session::start_time_changed (framepos_t old)
4369 {
4370         /* Update the auto loop range to match the session range
4371            (unless the auto loop range has been changed by the user)
4372         */
4373
4374         Location* s = _locations->session_range_location ();
4375         if (s == 0) {
4376                 return;
4377         }
4378
4379         Location* l = _locations->auto_loop_location ();
4380
4381         if (l && l->start() == old) {
4382                 l->set_start (s->start(), true);
4383         }
4384 }
4385
4386 void
4387 Session::end_time_changed (framepos_t old)
4388 {
4389         /* Update the auto loop range to match the session range
4390            (unless the auto loop range has been changed by the user)
4391         */
4392
4393         Location* s = _locations->session_range_location ();
4394         if (s == 0) {
4395                 return;
4396         }
4397
4398         Location* l = _locations->auto_loop_location ();
4399
4400         if (l && l->end() == old) {
4401                 l->set_end (s->end(), true);
4402         }
4403 }
4404
4405 string
4406 Session::source_search_path (DataType type) const
4407 {
4408         vector<string> s;
4409
4410         if (session_dirs.size() == 1) {
4411                 switch (type) {
4412                 case DataType::AUDIO:
4413                         s.push_back (_session_dir->sound_path());
4414                         break;
4415                 case DataType::MIDI:
4416                         s.push_back (_session_dir->midi_path());
4417                         break;
4418                 }
4419         } else {
4420                 for (vector<space_and_path>::const_iterator i = session_dirs.begin(); i != session_dirs.end(); ++i) {
4421                         SessionDirectory sdir (i->path);
4422                         switch (type) {
4423                         case DataType::AUDIO:
4424                                 s.push_back (sdir.sound_path());
4425                                 break;
4426                         case DataType::MIDI:
4427                                 s.push_back (sdir.midi_path());
4428                                 break;
4429                         }
4430                 }
4431         }
4432
4433         if (type == DataType::AUDIO) {
4434                 const string sound_path_2X = _session_dir->sound_path_2X();
4435                 if (Glib::file_test (sound_path_2X, Glib::FILE_TEST_EXISTS|Glib::FILE_TEST_IS_DIR)) {
4436                         if (find (s.begin(), s.end(), sound_path_2X) == s.end()) {
4437                                 s.push_back (sound_path_2X);
4438                         }
4439                 }
4440         }
4441
4442         /* now check the explicit (possibly user-specified) search path
4443          */
4444
4445         vector<string> dirs;
4446
4447         switch (type) {
4448         case DataType::AUDIO:
4449                 split (config.get_audio_search_path (), dirs, ':');
4450                 break;
4451         case DataType::MIDI:
4452                 split (config.get_midi_search_path (), dirs, ':');
4453                 break;
4454         }
4455
4456         for (vector<string>::iterator i = dirs.begin(); i != dirs.end(); ++i) {
4457                 if (find (s.begin(), s.end(), *i) == s.end()) {
4458                         s.push_back (*i);
4459                 }
4460         }
4461         
4462         string search_path;
4463
4464         for (vector<string>::iterator si = s.begin(); si != s.end(); ++si) {
4465                 if (!search_path.empty()) {
4466                         search_path += ':';
4467                 }
4468                 search_path += *si;
4469         }
4470
4471         return search_path;
4472 }
4473
4474 void
4475 Session::ensure_search_path_includes (const string& path, DataType type)
4476 {
4477         string search_path;
4478         vector<string> dirs;
4479
4480         if (path == ".") {
4481                 return;
4482         }
4483
4484         switch (type) {
4485         case DataType::AUDIO:
4486                 search_path = config.get_audio_search_path ();
4487                 break;
4488         case DataType::MIDI:
4489                 search_path = config.get_midi_search_path ();
4490                 break;
4491         }
4492
4493         split (search_path, dirs, ':');
4494
4495         for (vector<string>::iterator i = dirs.begin(); i != dirs.end(); ++i) {
4496                 /* No need to add this new directory if it has the same inode as
4497                    an existing one; checking inode rather than name prevents duplicated
4498                    directories when we are using symlinks.
4499
4500                    On Windows, I think we could just do if (*i == path) here.
4501                 */
4502                 if (PBD::equivalent_paths (*i, path)) {
4503                         return;
4504                 }
4505         }
4506
4507         if (!search_path.empty()) {
4508                 search_path += ':';
4509         }
4510
4511         search_path += path;
4512
4513         switch (type) {
4514         case DataType::AUDIO:
4515                 config.set_audio_search_path (search_path);
4516                 break;
4517         case DataType::MIDI:
4518                 config.set_midi_search_path (search_path);
4519                 break;
4520         }
4521 }
4522
4523 boost::shared_ptr<Speakers>
4524 Session::get_speakers()
4525 {
4526         return _speakers;
4527 }
4528
4529 list<string>
4530 Session::unknown_processors () const
4531 {
4532         list<string> p;
4533
4534         boost::shared_ptr<RouteList> r = routes.reader ();
4535         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4536                 list<string> t = (*i)->unknown_processors ();
4537                 copy (t.begin(), t.end(), back_inserter (p));
4538         }
4539
4540         p.sort ();
4541         p.unique ();
4542
4543         return p;
4544 }
4545
4546 void
4547 Session::update_latency (bool playback)
4548 {
4549         DEBUG_TRACE (DEBUG::Latency, string_compose ("JACK latency callback: %1\n", (playback ? "PLAYBACK" : "CAPTURE")));
4550
4551         if ((_state_of_the_state & (InitialConnecting|Deletion)) || _adding_routes_in_progress) {
4552                 return;
4553         }
4554
4555         boost::shared_ptr<RouteList> r = routes.reader ();
4556         framecnt_t max_latency = 0;
4557
4558         if (playback) {
4559                 /* reverse the list so that we work backwards from the last route to run to the first */
4560                 RouteList* rl = routes.reader().get();
4561                 r.reset (new RouteList (*rl));
4562                 reverse (r->begin(), r->end());
4563         }
4564
4565         /* compute actual latency values for the given direction and store them all in per-port
4566            structures. this will also publish the same values (to JACK) so that computation of latency
4567            for routes can consistently use public latency values.
4568         */
4569
4570         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4571                 max_latency = max (max_latency, (*i)->set_private_port_latencies (playback));
4572         }
4573
4574         /* because we latency compensate playback, our published playback latencies should
4575            be the same for all output ports - all material played back by ardour has
4576            the same latency, whether its caused by plugins or by latency compensation. since
4577            these may differ from the values computed above, reset all playback port latencies
4578            to the same value.
4579         */
4580
4581         DEBUG_TRACE (DEBUG::Latency, string_compose ("Set public port latencies to %1\n", max_latency));
4582
4583         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4584                 (*i)->set_public_port_latencies (max_latency, playback);
4585         }
4586
4587         if (playback) {
4588
4589                 post_playback_latency ();
4590
4591         } else {
4592
4593                 post_capture_latency ();
4594         }
4595
4596         DEBUG_TRACE (DEBUG::Latency, "JACK latency callback: DONE\n");
4597 }
4598
4599 void
4600 Session::post_playback_latency ()
4601 {
4602         set_worst_playback_latency ();
4603
4604         boost::shared_ptr<RouteList> r = routes.reader ();
4605
4606         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4607                 if (!(*i)->is_hidden() && ((*i)->active())) {
4608                         _worst_track_latency = max (_worst_track_latency, (*i)->update_signal_latency ());
4609                 }
4610         }
4611
4612         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4613                 (*i)->set_latency_compensation (_worst_track_latency);
4614         }
4615 }
4616
4617 void
4618 Session::post_capture_latency ()
4619 {
4620         set_worst_capture_latency ();
4621
4622         /* reflect any changes in capture latencies into capture offsets
4623          */
4624
4625         boost::shared_ptr<RouteList> rl = routes.reader();
4626         for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
4627                 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4628                 if (tr) {
4629                         tr->set_capture_offset ();
4630                 }
4631         }
4632 }
4633
4634 void
4635 Session::initialize_latencies ()
4636 {
4637         {
4638                 Glib::Threads::Mutex::Lock lm (_engine.process_lock());
4639                 update_latency (false);
4640                 update_latency (true);
4641         }
4642
4643         set_worst_io_latencies ();
4644 }
4645
4646 void
4647 Session::set_worst_io_latencies ()
4648 {
4649         set_worst_playback_latency ();
4650         set_worst_capture_latency ();
4651 }
4652
4653 void
4654 Session::set_worst_playback_latency ()
4655 {
4656         if (_state_of_the_state & (InitialConnecting|Deletion)) {
4657                 return;
4658         }
4659
4660         _worst_output_latency = 0;
4661
4662         if (!_engine.connected()) {
4663                 return;
4664         }
4665
4666         boost::shared_ptr<RouteList> r = routes.reader ();
4667
4668         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4669                 _worst_output_latency = max (_worst_output_latency, (*i)->output()->latency());
4670         }
4671
4672         DEBUG_TRACE (DEBUG::Latency, string_compose ("Worst output latency: %1\n", _worst_output_latency));
4673 }
4674
4675 void
4676 Session::set_worst_capture_latency ()
4677 {
4678         if (_state_of_the_state & (InitialConnecting|Deletion)) {
4679                 return;
4680         }
4681
4682         _worst_input_latency = 0;
4683
4684         if (!_engine.connected()) {
4685                 return;
4686         }
4687
4688         boost::shared_ptr<RouteList> r = routes.reader ();
4689
4690         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4691                 _worst_input_latency = max (_worst_input_latency, (*i)->input()->latency());
4692         }
4693
4694         DEBUG_TRACE (DEBUG::Latency, string_compose ("Worst input latency: %1\n", _worst_input_latency));
4695 }
4696
4697 void
4698 Session::update_latency_compensation (bool force_whole_graph)
4699 {
4700         bool some_track_latency_changed = false;
4701
4702         if (_state_of_the_state & (InitialConnecting|Deletion)) {
4703                 return;
4704         }
4705
4706         DEBUG_TRACE(DEBUG::Latency, "---------------------------- update latency compensation\n\n");
4707
4708         _worst_track_latency = 0;
4709
4710         boost::shared_ptr<RouteList> r = routes.reader ();
4711
4712         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4713                 if (!(*i)->is_hidden() && ((*i)->active())) {
4714                         framecnt_t tl;
4715                         if ((*i)->signal_latency () != (tl = (*i)->update_signal_latency ())) {
4716                                 some_track_latency_changed = true;
4717                         }
4718                         _worst_track_latency = max (tl, _worst_track_latency);
4719                 }
4720         }
4721
4722         DEBUG_TRACE (DEBUG::Latency, string_compose ("worst signal processing latency: %1 (changed ? %2)\n", _worst_track_latency,
4723                                                      (some_track_latency_changed ? "yes" : "no")));
4724
4725         DEBUG_TRACE(DEBUG::Latency, "---------------------------- DONE update latency compensation\n\n");
4726         
4727         if (some_track_latency_changed || force_whole_graph)  {
4728                 _engine.update_latencies ();
4729         }
4730
4731
4732         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4733                 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4734                 if (!tr) {
4735                         continue;
4736                 }
4737                 tr->set_capture_offset ();
4738         }
4739 }
4740
4741 char
4742 Session::session_name_is_legal (const string& path)
4743 {
4744         char illegal_chars[] = { '/', '\\', ':', ';', '\0' };
4745
4746         for (int i = 0; illegal_chars[i]; ++i) {
4747                 if (path.find (illegal_chars[i]) != string::npos) {
4748                         return illegal_chars[i];
4749                 }
4750         }
4751
4752         return 0;
4753 }
4754
4755 uint32_t 
4756 Session::next_control_id () const
4757 {
4758         int subtract = 0;
4759
4760         /* the monitor bus remote ID is in a different
4761          * "namespace" than regular routes. its existence doesn't
4762          * affect normal (low) numbered routes.
4763          */
4764
4765         if (_monitor_out) {
4766                 subtract++;
4767         }
4768
4769         return nroutes() - subtract;
4770 }
4771
4772 void
4773 Session::notify_remote_id_change ()
4774 {
4775         if (deletion_in_progress()) {
4776                 return;
4777         }
4778
4779         switch (Config->get_remote_model()) {
4780         case MixerSort:
4781         case EditorSort:
4782                 Route::RemoteControlIDChange (); /* EMIT SIGNAL */
4783                 break;
4784         default:
4785                 break;
4786         }
4787 }
4788
4789 void
4790 Session::sync_order_keys (RouteSortOrderKey sort_key_changed)
4791 {
4792         if (deletion_in_progress()) {
4793                 return;
4794         }
4795
4796         /* tell everyone that something has happened to the sort keys
4797            and let them sync up with the change(s)
4798            this will give objects that manage the sort order keys the
4799            opportunity to keep them in sync if they wish to.
4800         */
4801
4802         DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("Sync Order Keys, based on %1\n", enum_2_string (sort_key_changed)));
4803
4804         Route::SyncOrderKeys (sort_key_changed); /* EMIT SIGNAL */
4805
4806         DEBUG_TRACE (DEBUG::OrderKeys, "\tsync done\n");
4807 }
4808
4809 bool
4810 Session::operation_in_progress (GQuark op) const
4811 {
4812         return (find (_current_trans_quarks.begin(), _current_trans_quarks.end(), op) != _current_trans_quarks.end());
4813 }
4814
4815 boost::shared_ptr<Port>
4816 Session::ltc_input_port () const
4817 {
4818         return _ltc_input->nth (0);
4819 }
4820
4821 boost::shared_ptr<Port>
4822 Session::ltc_output_port () const
4823 {
4824         return _ltc_output->nth (0);
4825 }
4826
4827 void
4828 Session::reconnect_ltc_input ()
4829 {
4830         if (_ltc_input) {
4831
4832                 string src = Config->get_ltc_source_port();
4833
4834                 _ltc_input->disconnect (this);
4835
4836                 if (src != _("None") && !src.empty())  {
4837                         _ltc_input->nth (0)->connect (src);
4838                 }
4839         }
4840 }
4841
4842 void
4843 Session::reconnect_ltc_output ()
4844 {
4845         if (_ltc_output) {
4846
4847 #if 0
4848                 string src = Config->get_ltc_sink_port();
4849
4850                 _ltc_output->disconnect (this);
4851
4852                 if (src != _("None") && !src.empty())  {
4853                         _ltc_output->nth (0)->connect (src);
4854                 }
4855 #endif
4856         }
4857 }