latched rec-enable
[ardour.git] / libs / ardour / session.cc
1 /*
2     Copyright (C) 1999-2004 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     $Id$
19 */
20
21 #include <algorithm>
22 #include <string>
23 #include <vector>
24 #include <sstream>
25 #include <fstream>
26 #include <cstdio> /* sprintf(3) ... grrr */
27 #include <cmath>
28 #include <cerrno>
29 #include <unistd.h>
30 #include <limits.h>
31
32 #include <sigc++/bind.h>
33 #include <sigc++/retype.h>
34
35 #include <pbd/error.h>
36 #include <pbd/lockmonitor.h>
37 #include <pbd/pathscanner.h>
38 #include <pbd/stl_delete.h>
39 #include <pbd/basename.h>
40 #include <pbd/dirname.h>
41
42 #include <ardour/audioengine.h>
43 #include <ardour/configuration.h>
44 #include <ardour/session.h>
45 #include <ardour/diskstream.h>
46 #include <ardour/utils.h>
47 #include <ardour/audioplaylist.h>
48 #include <ardour/audioregion.h>
49 #include <ardour/source.h>
50 #include <ardour/filesource.h>
51 #include <ardour/destructive_filesource.h>
52 #include <ardour/sndfilesource.h>
53 #include <ardour/auditioner.h>
54 #include <ardour/recent_sessions.h>
55 #include <ardour/redirect.h>
56 #include <ardour/send.h>
57 #include <ardour/insert.h>
58 #include <ardour/connection.h>
59 #include <ardour/slave.h>
60 #include <ardour/tempo.h>
61 #include <ardour/audio_track.h>
62 #include <ardour/cycle_timer.h>
63 #include <ardour/named_selection.h>
64 #include <ardour/crossfade.h>
65 #include <ardour/playlist.h>
66 #include <ardour/click.h>
67 #include <ardour/timestamps.h>
68
69 #include "i18n.h"
70
71 using namespace std;
72 using namespace ARDOUR;
73 //using namespace sigc;
74
75 const char* Session::_template_suffix = X_(".template");
76 const char* Session::_statefile_suffix = X_(".ardour");
77 const char* Session::_pending_suffix = X_(".pending");
78 const char* Session::sound_dir_name = X_("sounds");
79 const char* Session::peak_dir_name = X_("peaks");
80 const char* Session::dead_sound_dir_name = X_("dead_sounds");
81
82 Session::compute_peak_t                         Session::compute_peak                   = 0;
83 Session::apply_gain_to_buffer_t         Session::apply_gain_to_buffer   = 0;
84 Session::mix_buffers_with_gain_t        Session::mix_buffers_with_gain  = 0;
85 Session::mix_buffers_no_gain_t          Session::mix_buffers_no_gain    = 0;
86
87 sigc::signal<int> Session::AskAboutPendingState;
88
89 int
90 Session::find_session (string str, string& path, string& snapshot, bool& isnew)
91 {
92         struct stat statbuf;
93         char buf[PATH_MAX+1];
94
95         isnew = false;
96
97         if (!realpath (str.c_str(), buf) && (errno != ENOENT && errno != ENOTDIR)) {
98                 error << string_compose (_("Could not resolve path: %1 (%2)"), buf, strerror(errno)) << endmsg;
99                 return -1;
100         }
101
102         str = buf;
103         
104         /* check to see if it exists, and what it is */
105
106         if (stat (str.c_str(), &statbuf)) {
107                 if (errno == ENOENT) {
108                         isnew = true;
109                 } else {
110                         error << string_compose (_("cannot check session path %1 (%2)"), str, strerror (errno))
111                               << endmsg;
112                         return -1;
113                 }
114         }
115
116         if (!isnew) {
117
118                 /* it exists, so it must either be the name
119                    of the directory, or the name of the statefile
120                    within it.
121                 */
122
123                 if (S_ISDIR (statbuf.st_mode)) {
124
125                         string::size_type slash = str.find_last_of ('/');
126                 
127                         if (slash == string::npos) {
128                                 
129                                 /* a subdirectory of cwd, so statefile should be ... */
130
131                                 string tmp;
132                                 tmp = str;
133                                 tmp += '/';
134                                 tmp += str;
135                                 tmp += _statefile_suffix;
136
137                                 /* is it there ? */
138                                 
139                                 if (stat (tmp.c_str(), &statbuf)) {
140                                         error << string_compose (_("cannot check statefile %1 (%2)"), tmp, strerror (errno))
141                                               << endmsg;
142                                         return -1;
143                                 }
144
145                                 path = str;
146                                 snapshot = str;
147
148                         } else {
149
150                                 /* some directory someplace in the filesystem.
151                                    the snapshot name is the directory name
152                                    itself.
153                                 */
154
155                                 path = str;
156                                 snapshot = str.substr (slash+1);
157                                         
158                         }
159
160                 } else if (S_ISREG (statbuf.st_mode)) {
161                         
162                         string::size_type slash = str.find_last_of ('/');
163                         string::size_type suffix;
164
165                         /* remove the suffix */
166                         
167                         if (slash != string::npos) {
168                                 snapshot = str.substr (slash+1);
169                         } else {
170                                 snapshot = str;
171                         }
172
173                         suffix = snapshot.find (_statefile_suffix);
174                         
175                         if (suffix == string::npos) {
176                                 error << string_compose (_("%1 is not an Ardour snapshot file"), str) << endmsg;
177                                 return -1;
178                         }
179
180                         /* remove suffix */
181
182                         snapshot = snapshot.substr (0, suffix);
183                         
184                         if (slash == string::npos) {
185                                 
186                                 /* we must be in the directory where the 
187                                    statefile lives. get it using cwd().
188                                 */
189
190                                 char cwd[PATH_MAX+1];
191
192                                 if (getcwd (cwd, sizeof (cwd)) == 0) {
193                                         error << string_compose (_("cannot determine current working directory (%1)"), strerror (errno))
194                                               << endmsg;
195                                         return -1;
196                                 }
197
198                                 path = cwd;
199
200                         } else {
201
202                                 /* full path to the statefile */
203
204                                 path = str.substr (0, slash);
205                         }
206                                 
207                 } else {
208
209                         /* what type of file is it? */
210                         error << string_compose (_("unknown file type for session %1"), str) << endmsg;
211                         return -1;
212                 }
213
214         } else {
215
216                 /* its the name of a new directory. get the name
217                    as "dirname" does.
218                 */
219
220                 string::size_type slash = str.find_last_of ('/');
221
222                 if (slash == string::npos) {
223                         
224                         /* no slash, just use the name, but clean it up */
225                         
226                         path = legalize_for_path (str);
227                         snapshot = path;
228                         
229                 } else {
230                         
231                         path = str;
232                         snapshot = str.substr (slash+1);
233                 }
234         }
235
236         return 0;
237 }
238
239 Session::Session (AudioEngine &eng,
240                   string fullpath,
241                   string snapshot_name,
242                   string* mix_template)
243
244         : _engine (eng),
245           _mmc_port (default_mmc_port),
246           _mtc_port (default_mtc_port),
247           _midi_port (default_midi_port),
248           pending_events (2048),
249           midi_requests (128), // the size of this should match the midi request pool size
250           main_outs (0)
251 {
252         bool new_session;
253
254         cerr << "Loading session " << fullpath << " using snapshot " << snapshot_name << endl;
255
256         n_physical_outputs = _engine.n_physical_outputs();
257         n_physical_inputs =  _engine.n_physical_inputs();
258
259         first_stage_init (fullpath, snapshot_name);
260         
261         if (create (new_session, mix_template, _engine.frame_rate() * 60 * 5)) {
262                 throw failed_constructor ();
263         }
264         
265         if (second_stage_init (new_session)) {
266                 throw failed_constructor ();
267         }
268         
269         store_recent_sessions(_name, _path);
270         
271         bool was_dirty = dirty();
272
273         _state_of_the_state = StateOfTheState (_state_of_the_state & ~Dirty);
274
275         if (was_dirty) {
276                 DirtyChanged (); /* EMIT SIGNAL */
277         }
278 }
279
280 Session::Session (AudioEngine &eng,
281                   string fullpath,
282                   string snapshot_name,
283                   AutoConnectOption input_ac,
284                   AutoConnectOption output_ac,
285                   uint32_t control_out_channels,
286                   uint32_t master_out_channels,
287                   uint32_t requested_physical_in,
288                   uint32_t requested_physical_out,
289                   jack_nframes_t initial_length)
290
291         : _engine (eng),
292           _mmc_port (default_mmc_port),
293           _mtc_port (default_mtc_port),
294           _midi_port (default_midi_port),
295           pending_events (2048),
296           midi_requests (16),
297           main_outs (0)
298
299 {
300         bool new_session;
301
302         cerr << "Loading session " << fullpath << " using snapshot " << snapshot_name << endl;
303
304         n_physical_outputs = max (requested_physical_out, _engine.n_physical_outputs());
305         n_physical_inputs = max (requested_physical_in, _engine.n_physical_inputs());
306
307         first_stage_init (fullpath, snapshot_name);
308         
309         if (create (new_session, 0, initial_length)) {
310                 throw failed_constructor ();
311         }
312
313         if (control_out_channels) {
314                 Route* r;
315                 r = new Route (*this, _("monitor"), -1, control_out_channels, -1, control_out_channels, Route::ControlOut);
316                 add_route (r);
317                 _control_out = r;
318         }
319
320         if (master_out_channels) {
321                 Route* r;
322                 r = new Route (*this, _("master"), -1, master_out_channels, -1, master_out_channels, Route::MasterOut);
323                 add_route (r);
324                 _master_out = r;
325         } else {
326                 /* prohibit auto-connect to master, because there isn't one */
327                 output_ac = AutoConnectOption (output_ac & ~AutoConnectMaster);
328         }
329
330         input_auto_connect = input_ac;
331         output_auto_connect = output_ac;
332
333         if (second_stage_init (new_session)) {
334                 throw failed_constructor ();
335         }
336         
337         store_recent_sessions(_name, _path);
338         
339         bool was_dirty = dirty ();
340
341         _state_of_the_state = StateOfTheState (_state_of_the_state & ~Dirty);
342
343         if (was_dirty) {
344                 DirtyChanged (); /* EMIT SIGNAL */
345         }
346 }
347
348 Session::~Session ()
349 {
350         /* if we got to here, leaving pending capture state around
351            is a mistake.
352         */
353
354         remove_pending_capture_state ();
355
356         _state_of_the_state = StateOfTheState (CannotSave|Deletion);
357         _engine.remove_session ();
358         
359         going_away (); /* EMIT SIGNAL */
360         
361         terminate_butler_thread ();
362         terminate_midi_thread ();
363         terminate_feedback ();
364         
365         if (click_data && click_data != default_click) {
366                 delete [] click_data;
367         }
368
369         if (click_emphasis_data && click_emphasis_data != default_click_emphasis) {
370                 delete [] click_emphasis_data;
371         }
372
373         clear_clicks ();
374
375         if (_click_io) {
376                 delete _click_io;
377         }
378
379
380         if (auditioner) {
381                 delete auditioner;
382         }
383
384         for (vector<Sample*>::iterator i = _passthru_buffers.begin(); i != _passthru_buffers.end(); ++i) {
385                 free(*i);
386         }
387
388         for (vector<Sample*>::iterator i = _silent_buffers.begin(); i != _silent_buffers.end(); ++i) {
389                 free(*i);
390         }
391
392 #undef TRACK_DESTRUCTION
393 #ifdef TRACK_DESTRUCTION
394         cerr << "delete named selections\n";
395 #endif /* TRACK_DESTRUCTION */
396         for (NamedSelectionList::iterator i = named_selections.begin(); i != named_selections.end(); ) {
397                 NamedSelectionList::iterator tmp;
398
399                 tmp = i;
400                 ++tmp;
401
402                 delete *i;
403                 i = tmp;
404         }
405
406 #ifdef TRACK_DESTRUCTION
407         cerr << "delete playlists\n";
408 #endif /* TRACK_DESTRUCTION */
409         for (PlaylistList::iterator i = playlists.begin(); i != playlists.end(); ) {
410                 PlaylistList::iterator tmp;
411
412                 tmp = i;
413                 ++tmp;
414
415                 delete *i;
416                 
417                 i = tmp;
418         }
419
420 #ifdef TRACK_DESTRUCTION
421         cerr << "delete audio regions\n";
422 #endif /* TRACK_DESTRUCTION */
423         for (AudioRegionList::iterator i = audio_regions.begin(); i != audio_regions.end(); ) {
424                 AudioRegionList::iterator tmp;
425
426                 tmp =i;
427                 ++tmp;
428
429                 delete (*i).second;
430
431                 i = tmp;
432         }
433         
434 #ifdef TRACK_DESTRUCTION
435         cerr << "delete routes\n";
436 #endif /* TRACK_DESTRUCTION */
437         for (RouteList::iterator i = routes.begin(); i != routes.end(); ) {
438                 RouteList::iterator tmp;
439                 tmp = i;
440                 ++tmp;
441                 delete *i;
442                 i = tmp;
443         }
444
445 #ifdef TRACK_DESTRUCTION
446         cerr << "delete diskstreams\n";
447 #endif /* TRACK_DESTRUCTION */
448         for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ) {
449                 DiskStreamList::iterator tmp;
450
451                 tmp = i;
452                 ++tmp;
453
454                 delete *i;
455
456                 i = tmp;
457         }
458
459 #ifdef TRACK_DESTRUCTION
460         cerr << "delete sources\n";
461 #endif /* TRACK_DESTRUCTION */
462         for (SourceList::iterator i = sources.begin(); i != sources.end(); ) {
463                 SourceList::iterator tmp;
464
465                 tmp = i;
466                 ++tmp;
467
468                 delete (*i).second;
469
470                 i = tmp;
471         }
472
473 #ifdef TRACK_DESTRUCTION
474         cerr << "delete mix groups\n";
475 #endif /* TRACK_DESTRUCTION */
476         for (list<RouteGroup *>::iterator i = mix_groups.begin(); i != mix_groups.end(); ) {
477                 list<RouteGroup*>::iterator tmp;
478
479                 tmp = i;
480                 ++tmp;
481
482                 delete *i;
483
484                 i = tmp;
485         }
486
487 #ifdef TRACK_DESTRUCTION
488         cerr << "delete edit groups\n";
489 #endif /* TRACK_DESTRUCTION */
490         for (list<RouteGroup *>::iterator i = edit_groups.begin(); i != edit_groups.end(); ) {
491                 list<RouteGroup*>::iterator tmp;
492                 
493                 tmp = i;
494                 ++tmp;
495
496                 delete *i;
497
498                 i = tmp;
499         }
500         
501 #ifdef TRACK_DESTRUCTION
502         cerr << "delete connections\n";
503 #endif /* TRACK_DESTRUCTION */
504         for (ConnectionList::iterator i = _connections.begin(); i != _connections.end(); ) {
505                 ConnectionList::iterator tmp;
506
507                 tmp = i;
508                 ++tmp;
509
510                 delete *i;
511
512                 i = tmp;
513         }
514
515         if (butler_mixdown_buffer) {
516                 delete [] butler_mixdown_buffer;
517         }
518
519         if (butler_gain_buffer) {
520                 delete [] butler_gain_buffer;
521         }
522
523         Crossfade::set_buffer_size (0);
524
525         if (mmc) {
526                 delete mmc;
527         }
528
529         if (state_tree) {
530                 delete state_tree;
531         }
532 }
533
534 void
535 Session::set_worst_io_latencies (bool take_lock)
536 {
537         _worst_output_latency = 0;
538         _worst_input_latency = 0;
539
540         if (!_engine.connected()) {
541                 return;
542         }
543
544         if (take_lock) {
545                 route_lock.read_lock ();
546         }
547         
548         for (RouteList::iterator i = routes.begin(); i != routes.end(); ++i) {
549                 _worst_output_latency = max (_worst_output_latency, (*i)->output_latency());
550                 _worst_input_latency = max (_worst_input_latency, (*i)->input_latency());
551         }
552
553         if (take_lock) {
554                 route_lock.unlock ();
555         }
556 }
557
558 void
559 Session::when_engine_running ()
560 {
561         string first_physical_output;
562
563         /* we don't want to run execute this again */
564
565         first_time_running.disconnect ();
566
567         set_block_size (_engine.frames_per_cycle());
568         set_frame_rate (_engine.frame_rate());
569
570         /* every time we reconnect, recompute worst case output latencies */
571
572         _engine.Running.connect (sigc::bind (mem_fun (*this, &Session::set_worst_io_latencies), true));
573
574         if (synced_to_jack()) {
575                 _engine.transport_stop ();
576         }
577
578         if (Config->get_jack_time_master()) {
579                 _engine.transport_locate (_transport_frame);
580         }
581
582         _clicking = false;
583
584         try {
585                 XMLNode* child = 0;
586                 
587                 _click_io = new ClickIO (*this, "click", 0, 0, -1, -1);
588
589                 if (state_tree && (child = find_named_node (*state_tree->root(), "Click")) != 0) {
590
591                         /* existing state for Click */
592                         
593                         if (_click_io->set_state (*child->children().front()) == 0) {
594                                 
595                                 _clicking = click_requested;
596
597                         } else {
598
599                                 error << _("could not setup Click I/O") << endmsg;
600                                 _clicking = false;
601                         }
602
603                 } else {
604                         
605                         /* default state for Click */
606
607                         first_physical_output = _engine.get_nth_physical_output (0);
608                         
609                         if (first_physical_output.length()) {
610                                 if (_click_io->add_output_port (first_physical_output, this)) {
611                                         // relax, even though its an error
612                                 } else {
613                                         _clicking = click_requested;
614                                 }
615                         }
616                 }
617         }
618
619         catch (failed_constructor& err) {
620                 error << _("cannot setup Click I/O") << endmsg;
621         }
622
623         set_worst_io_latencies (true);
624
625         if (_clicking) {
626                  ControlChanged (Clicking); /* EMIT SIGNAL */
627         }
628
629         if (auditioner == 0) {
630
631                 /* we delay creating the auditioner till now because
632                    it makes its own connections to ports named
633                    in the ARDOUR_RC config file. the engine has
634                    to be running for this to work.
635                 */
636
637                 try {
638                         auditioner = new Auditioner (*this);
639                 }
640
641                 catch (failed_constructor& err) {
642                         warning << _("cannot create Auditioner: no auditioning of regions possible") << endmsg;
643                 }
644         }
645
646         /* Create a set of Connection objects that map
647            to the physical outputs currently available
648         */
649
650         /* ONE: MONO */
651
652         for (uint32_t np = 0; np < n_physical_outputs; ++np) {
653                 char buf[32];
654                 snprintf (buf, sizeof (buf), _("out %" PRIu32), np+1);
655
656                 Connection* c = new OutputConnection (buf, true);
657
658                 c->add_port ();
659                 c->add_connection (0, _engine.get_nth_physical_output (np));
660
661                 add_connection (c);
662         }
663
664         for (uint32_t np = 0; np < n_physical_inputs; ++np) {
665                 char buf[32];
666                 snprintf (buf, sizeof (buf), _("in %" PRIu32), np+1);
667
668                 Connection* c = new InputConnection (buf, true);
669
670                 c->add_port ();
671                 c->add_connection (0, _engine.get_nth_physical_input (np));
672
673                 add_connection (c);
674         }
675
676         /* TWO: STEREO */
677
678         for (uint32_t np = 0; np < n_physical_outputs; np +=2) {
679                 char buf[32];
680                 snprintf (buf, sizeof (buf), _("out %" PRIu32 "+%" PRIu32), np+1, np+2);
681
682                 Connection* c = new OutputConnection (buf, true);
683
684                 c->add_port ();
685                 c->add_port ();
686                 c->add_connection (0, _engine.get_nth_physical_output (np));
687                 c->add_connection (1, _engine.get_nth_physical_output (np+1));
688
689                 add_connection (c);
690         }
691
692         for (uint32_t np = 0; np < n_physical_inputs; np +=2) {
693                 char buf[32];
694                 snprintf (buf, sizeof (buf), _("in %" PRIu32 "+%" PRIu32), np+1, np+2);
695
696                 Connection* c = new InputConnection (buf, true);
697
698                 c->add_port ();
699                 c->add_port ();
700                 c->add_connection (0, _engine.get_nth_physical_input (np));
701                 c->add_connection (1, _engine.get_nth_physical_input (np+1));
702
703                 add_connection (c);
704         }
705
706         /* THREE MASTER */
707
708         if (_master_out) {
709
710                 /* create master/control ports */
711                 
712                 if (_master_out) {
713                         uint32_t n;
714
715                         /* force the master to ignore any later call to this */
716                         
717                         if (_master_out->pending_state_node) {
718                                 _master_out->ports_became_legal();
719                         }
720
721                         /* no panner resets till we are through */
722                         
723                         _master_out->defer_pan_reset ();
724                         
725                         while ((int) _master_out->n_inputs() < _master_out->input_maximum()) {
726                                 if (_master_out->add_input_port ("", this)) {
727                                         error << _("cannot setup master inputs") 
728                                               << endmsg;
729                                         break;
730                                 }
731                         }
732                         n = 0;
733                         while ((int) _master_out->n_outputs() < _master_out->output_maximum()) {
734                                 if (_master_out->add_output_port (_engine.get_nth_physical_output (n), this)) {
735                                         error << _("cannot setup master outputs")
736                                               << endmsg;
737                                         break;
738                                 }
739                                 n++;
740                         }
741
742                         _master_out->allow_pan_reset ();
743                         
744                 }
745
746                 Connection* c = new OutputConnection (_("Master Out"), true);
747
748                 for (uint32_t n = 0; n < _master_out->n_inputs (); ++n) {
749                         c->add_port ();
750                         c->add_connection ((int) n, _master_out->input(n)->name());
751                 }
752                 add_connection (c);
753         } 
754
755         hookup_io ();
756
757         /* catch up on send+insert cnts */
758
759         insert_cnt = 0;
760         
761         for (slist<PortInsert*>::iterator i = _port_inserts.begin(); i != _port_inserts.end(); ++i) {
762                 uint32_t id;
763
764                 if (sscanf ((*i)->name().c_str(), "%*s %u", &id) == 1) {
765                         if (id > insert_cnt) {
766                                 insert_cnt = id;
767                         }
768                 }
769         }
770
771         send_cnt = 0;
772
773         for (slist<Send*>::iterator i = _sends.begin(); i != _sends.end(); ++i) {
774                 uint32_t id;
775                 
776                 if (sscanf ((*i)->name().c_str(), "%*s %u", &id) == 1) {
777                         if (id > send_cnt) {
778                                 send_cnt = id;
779                         }
780                 }
781         }
782
783         _state_of_the_state = StateOfTheState (_state_of_the_state & ~(CannotSave|Dirty));
784
785         /* hook us up to the engine */
786
787         _engine.set_session (this);
788
789         _state_of_the_state = Clean;
790
791         DirtyChanged (); /* EMIT SIGNAL */
792 }
793
794 void
795 Session::hookup_io ()
796 {
797         /* stop graph reordering notifications from
798            causing resorts, etc.
799         */
800
801         _state_of_the_state = StateOfTheState (_state_of_the_state | InitialConnecting);
802
803         /* Tell all IO objects to create their ports */
804
805         IO::enable_ports ();
806
807         if (_control_out) {
808                 uint32_t n;
809
810                 while ((int) _control_out->n_inputs() < _control_out->input_maximum()) {
811                         if (_control_out->add_input_port ("", this)) {
812                                 error << _("cannot setup control inputs")
813                                       << endmsg;
814                                 break;
815                         }
816                 }
817                 n = 0;
818                 while ((int) _control_out->n_outputs() < _control_out->output_maximum()) {
819                         if (_control_out->add_output_port (_engine.get_nth_physical_output (n), this)) {
820                                 error << _("cannot set up master outputs")
821                                       << endmsg;
822                                 break;
823                         }
824                         n++;
825                 }
826         }
827
828         /* Tell all IO objects to connect themselves together */
829
830         IO::enable_connecting ();
831
832         /* Now reset all panners */
833
834         IO::reset_panners ();
835
836         /* Anyone who cares about input state, wake up and do something */
837
838         IOConnectionsComplete (); /* EMIT SIGNAL */
839
840         _state_of_the_state = StateOfTheState (_state_of_the_state & ~InitialConnecting);
841
842         /* now handle the whole enchilada as if it was one
843            graph reorder event.
844         */
845
846         graph_reordered ();
847
848         /* update mixer solo state */
849
850         catch_up_on_solo();
851 }
852
853 void
854 Session::playlist_length_changed (Playlist* pl)
855 {
856         /* we can't just increase end_location->end() if pl->get_maximum_extent() 
857            if larger. if the playlist used to be the longest playlist,
858            and its now shorter, we have to decrease end_location->end(). hence,
859            we have to iterate over all diskstreams and check the 
860            playlists currently in use.
861         */
862         find_current_end ();
863 }
864
865 void
866 Session::diskstream_playlist_changed (DiskStream* dstream)
867 {
868         Playlist *playlist;
869
870         if ((playlist = dstream->playlist()) != 0) {
871           playlist->LengthChanged.connect (sigc::bind (mem_fun (this, &Session::playlist_length_changed), playlist));
872         }
873         
874         /* see comment in playlist_length_changed () */
875         find_current_end ();
876 }
877
878 bool
879 Session::record_enabling_legal () const
880 {
881         /* this used to be in here, but survey says.... we don't need to restrict it */
882         // if (record_status() == Recording) {
883         //      return false;
884         // }
885
886         if (all_safe) {
887                 return false;
888         }
889         return true;
890 }
891
892 void
893 Session::set_auto_play (bool yn)
894 {
895         if (auto_play != yn) {
896                 auto_play = yn; 
897                 set_dirty ();
898                 ControlChanged (AutoPlay);
899         }
900 }
901
902 void
903 Session::set_auto_return (bool yn)
904 {
905         if (auto_return != yn) {
906                 auto_return = yn; 
907                 set_dirty ();
908                 ControlChanged (AutoReturn);
909         }
910 }
911
912 void
913 Session::set_crossfades_active (bool yn)
914 {
915         if (crossfades_active != yn) {
916                 crossfades_active = yn; 
917                 set_dirty ();
918                 ControlChanged (CrossFadesActive);
919         }
920 }
921
922 void
923 Session::set_do_not_record_plugins (bool yn)
924 {
925         if (do_not_record_plugins != yn) {
926                 do_not_record_plugins = yn; 
927                 set_dirty ();
928                 ControlChanged (RecordingPlugins); 
929         }
930 }
931
932 void
933 Session::set_auto_input (bool yn)
934 {
935         if (auto_input != yn) {
936                 auto_input = yn;
937                 
938                 if (Config->get_use_hardware_monitoring() && transport_rolling()) {
939                         /* auto-input only makes a difference if we're rolling */
940
941                         /* Even though this can called from RT context we are using
942                            a non-tentative rwlock here,  because the action must occur.
943                            The rarity and short potential lock duration makes this "OK"
944                         */
945                         RWLockMonitor dsm (diskstream_lock, false, __LINE__, __FILE__);
946                         for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) {
947                                 if ((*i)->record_enabled ()) {
948                                         //cerr << "switching to input = " << !auto_input << __FILE__ << __LINE__ << endl << endl;
949                                         (*i)->monitor_input (!auto_input);   
950                                 }
951                         }
952                 }
953
954                 set_dirty();
955                 ControlChanged (AutoInput);
956         }
957 }
958
959 void
960 Session::reset_input_monitor_state ()
961 {
962         if (transport_rolling()) {
963                 RWLockMonitor dsm (diskstream_lock, false, __LINE__, __FILE__);
964                 for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) {
965                         if ((*i)->record_enabled ()) {
966                                 //cerr << "switching to input = " << !auto_input << __FILE__ << __LINE__ << endl << endl;
967                                 (*i)->monitor_input (Config->get_use_hardware_monitoring() && !auto_input);
968                         }
969                 }
970         } else {
971                 RWLockMonitor dsm (diskstream_lock, false, __LINE__, __FILE__);
972                 for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) {
973                         if ((*i)->record_enabled ()) {
974                                 //cerr << "switching to input = " << !auto_input << __FILE__ << __LINE__ << endl << endl;
975                                 (*i)->monitor_input (Config->get_use_hardware_monitoring());
976                         }
977                 }
978         }
979 }
980
981
982 void
983 Session::set_input_auto_connect (bool yn)
984 {
985         if (yn) {
986                 input_auto_connect = AutoConnectOption (input_auto_connect|AutoConnectPhysical);
987         } else {
988                 input_auto_connect = AutoConnectOption (input_auto_connect|~AutoConnectPhysical);
989         }
990         set_dirty ();
991 }
992
993 bool
994 Session::get_input_auto_connect () const
995 {
996         return (input_auto_connect & AutoConnectPhysical);
997 }
998
999 void
1000 Session::set_output_auto_connect (AutoConnectOption aco)
1001 {
1002         output_auto_connect = aco;
1003         set_dirty ();
1004 }
1005
1006 void
1007 Session::auto_punch_start_changed (Location* location)
1008 {
1009         replace_event (Event::PunchIn, location->start());
1010
1011         if (get_record_enabled() && get_punch_in()) {
1012                 /* capture start has been changed, so save new pending state */
1013                 save_state ("", true);
1014         }
1015 }       
1016
1017 void
1018 Session::auto_punch_end_changed (Location* location)
1019 {
1020         jack_nframes_t when_to_stop = location->end();
1021         // when_to_stop += _worst_output_latency + _worst_input_latency;
1022         replace_event (Event::PunchOut, when_to_stop);
1023 }       
1024
1025 void
1026 Session::auto_punch_changed (Location* location)
1027 {
1028         jack_nframes_t when_to_stop = location->end();
1029
1030         replace_event (Event::PunchIn, location->start());
1031         //when_to_stop += _worst_output_latency + _worst_input_latency;
1032         replace_event (Event::PunchOut, when_to_stop);
1033 }       
1034
1035 void
1036 Session::auto_loop_changed (Location* location)
1037 {
1038         replace_event (Event::AutoLoop, location->end(), location->start());
1039
1040         if (transport_rolling() && get_auto_loop()) {
1041
1042                 //if (_transport_frame < location->start() || _transport_frame > location->end()) {
1043
1044                 if (_transport_frame > location->end()) {
1045                         // relocate to beginning of loop
1046                         clear_events (Event::LocateRoll);
1047                         
1048                         request_locate (location->start(), true);
1049
1050                 }
1051                 else if (seamless_loop && !loop_changing) {
1052                         
1053                         // schedule a locate-roll to refill the diskstreams at the
1054                         // previous loop end
1055                         loop_changing = true;
1056
1057                         if (location->end() > last_loopend) {
1058                                 clear_events (Event::LocateRoll);
1059                                 Event *ev = new Event (Event::LocateRoll, Event::Add, last_loopend, last_loopend, 0, true);
1060                                 queue_event (ev);
1061                         }
1062
1063                 }
1064         }       
1065
1066         last_loopend = location->end();
1067         
1068 }
1069
1070 void
1071 Session::set_auto_punch_location (Location* location)
1072 {
1073         Location* existing;
1074
1075         if ((existing = _locations.auto_punch_location()) != 0 && existing != location) {
1076                 auto_punch_start_changed_connection.disconnect();
1077                 auto_punch_end_changed_connection.disconnect();
1078                 auto_punch_changed_connection.disconnect();
1079                 existing->set_auto_punch (false, this);
1080                 remove_event (existing->start(), Event::PunchIn);
1081                 clear_events (Event::PunchOut);
1082                 auto_punch_location_changed (0);
1083         }
1084
1085         set_dirty();
1086
1087         if (location == 0) {
1088                 return;
1089         }
1090         
1091         if (location->end() <= location->start()) {
1092                 error << _("Session: you can't use that location for auto punch (start <= end)") << endmsg;
1093                 return;
1094         }
1095
1096         auto_punch_start_changed_connection.disconnect();
1097         auto_punch_end_changed_connection.disconnect();
1098         auto_punch_changed_connection.disconnect();
1099                 
1100         auto_punch_start_changed_connection = location->start_changed.connect (mem_fun (this, &Session::auto_punch_start_changed));
1101         auto_punch_end_changed_connection = location->end_changed.connect (mem_fun (this, &Session::auto_punch_end_changed));
1102         auto_punch_changed_connection = location->changed.connect (mem_fun (this, &Session::auto_punch_changed));
1103
1104         location->set_auto_punch (true, this);
1105         auto_punch_location_changed (location);
1106 }
1107
1108 void
1109 Session::set_punch_in (bool yn)
1110 {
1111         if (punch_in == yn) {
1112                 return;
1113         }
1114
1115         Location* location;
1116
1117         if ((location = _locations.auto_punch_location()) != 0) {
1118                 if ((punch_in = yn) == true) {
1119                         replace_event (Event::PunchIn, location->start());
1120                 } else {
1121                         remove_event (location->start(), Event::PunchIn);
1122                 }
1123         }
1124
1125         set_dirty();
1126         ControlChanged (PunchIn); /* EMIT SIGNAL */
1127 }
1128
1129 void
1130 Session::set_punch_out (bool yn)
1131 {
1132         if (punch_out == yn) {
1133                 return;
1134         }
1135
1136         Location* location;
1137
1138         if ((location = _locations.auto_punch_location()) != 0) {
1139                 if ((punch_out = yn) == true) {
1140                         replace_event (Event::PunchOut, location->end());
1141                 } else {
1142                         clear_events (Event::PunchOut);
1143                 }
1144         }
1145
1146         set_dirty();
1147         ControlChanged (PunchOut); /* EMIT SIGNAL */
1148 }
1149
1150 void
1151 Session::set_auto_loop_location (Location* location)
1152 {
1153         Location* existing;
1154
1155         if ((existing = _locations.auto_loop_location()) != 0 && existing != location) {
1156                 auto_loop_start_changed_connection.disconnect();
1157                 auto_loop_end_changed_connection.disconnect();
1158                 auto_loop_changed_connection.disconnect();
1159                 existing->set_auto_loop (false, this);
1160                 remove_event (existing->end(), Event::AutoLoop);
1161                 auto_loop_location_changed (0);
1162         }
1163         
1164         set_dirty();
1165
1166         if (location == 0) {
1167                 return;
1168         }
1169
1170         if (location->end() <= location->start()) {
1171                 error << _("Session: you can't use a mark for auto loop") << endmsg;
1172                 return;
1173         }
1174
1175         last_loopend = location->end();
1176         
1177         auto_loop_start_changed_connection.disconnect();
1178         auto_loop_end_changed_connection.disconnect();
1179         auto_loop_changed_connection.disconnect();
1180         
1181         auto_loop_start_changed_connection = location->start_changed.connect (mem_fun (this, &Session::auto_loop_changed));
1182         auto_loop_end_changed_connection = location->end_changed.connect (mem_fun (this, &Session::auto_loop_changed));
1183         auto_loop_changed_connection = location->changed.connect (mem_fun (this, &Session::auto_loop_changed));
1184
1185         location->set_auto_loop (true, this);
1186         auto_loop_location_changed (location);
1187 }
1188
1189 void
1190 Session::locations_added (Location* ignored)
1191 {
1192         set_dirty ();
1193 }
1194
1195 void
1196 Session::locations_changed ()
1197 {
1198         _locations.apply (*this, &Session::handle_locations_changed);
1199 }
1200
1201 void
1202 Session::handle_locations_changed (Locations::LocationList& locations)
1203 {
1204         Locations::LocationList::iterator i;
1205         Location* location;
1206         bool set_loop = false;
1207         bool set_punch = false;
1208
1209         for (i = locations.begin(); i != locations.end(); ++i) {
1210
1211                 location =* i;
1212
1213                 if (location->is_auto_punch()) {
1214                         set_auto_punch_location (location);
1215                         set_punch = true;
1216                 }
1217                 if (location->is_auto_loop()) {
1218                         set_auto_loop_location (location);
1219                         set_loop = true;
1220                 }
1221                 
1222         }
1223
1224         if (!set_loop) {
1225                 set_auto_loop_location (0);
1226         }
1227         if (!set_punch) {
1228                 set_auto_punch_location (0);
1229         }
1230
1231         set_dirty();
1232 }                                                    
1233
1234 void
1235 Session::enable_record ()
1236 {
1237         /* XXX really atomic compare+swap here */
1238         if (atomic_read (&_record_status) != Recording) {
1239                 atomic_set (&_record_status, Recording);
1240                 _last_record_location = _transport_frame;
1241                 send_mmc_in_another_thread (MIDI::MachineControl::cmdRecordStrobe);
1242
1243                 if (Config->get_use_hardware_monitoring() && auto_input) {
1244                         /* Even though this can be called from RT context we are using
1245                            a non-tentative rwlock here,  because the action must occur.
1246                            The rarity and short potential lock duration makes this "OK"
1247                         */
1248                         RWLockMonitor dsm (diskstream_lock, false, __LINE__, __FILE__);
1249                         
1250                         for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) {
1251                                 if ((*i)->record_enabled ()) {
1252                                         (*i)->monitor_input (true);   
1253                                 }
1254                         }
1255                 }
1256
1257                 RecordStateChanged ();
1258         }
1259 }
1260
1261 void
1262 Session::disable_record (bool force)
1263 {
1264         RecordState rs;
1265
1266         if ((rs = (RecordState) atomic_read (&_record_status)) != Disabled) {
1267
1268                 if (!Config->get_latched_record_enable () || force) {
1269                         atomic_set (&_record_status, Disabled);
1270                 } else {
1271                         if (rs == Recording) {
1272                                 atomic_set (&_record_status, Enabled);
1273                         }
1274                 }
1275
1276                 send_mmc_in_another_thread (MIDI::MachineControl::cmdRecordExit);
1277
1278                 if (Config->get_use_hardware_monitoring() && auto_input) {
1279                         /* Even though this can be called from RT context we are using
1280                            a non-tentative rwlock here,  because the action must occur.
1281                            The rarity and short potential lock duration makes this "OK"
1282                         */
1283                         RWLockMonitor dsm (diskstream_lock, false, __LINE__, __FILE__);
1284                         
1285                         for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) {
1286                                 if ((*i)->record_enabled ()) {
1287                                         (*i)->monitor_input (false);   
1288                                 }
1289                         }
1290                 }
1291                 
1292                 RecordStateChanged (); /* emit signal */
1293                 remove_pending_capture_state ();
1294         }
1295 }
1296
1297 void
1298 Session::step_back_from_record ()
1299 {
1300         atomic_set (&_record_status, Enabled);
1301
1302         if (Config->get_use_hardware_monitoring()) {
1303                 /* Even though this can be called from RT context we are using
1304                    a non-tentative rwlock here,  because the action must occur.
1305                    The rarity and short potential lock duration makes this "OK"
1306                 */
1307                 RWLockMonitor dsm (diskstream_lock, false, __LINE__, __FILE__);
1308                 
1309                 for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) {
1310                         if (auto_input && (*i)->record_enabled ()) {
1311                                 //cerr << "switching from input" << __FILE__ << __LINE__ << endl << endl;
1312                                 (*i)->monitor_input (false);   
1313                         }
1314                 }
1315         }
1316 }
1317
1318 void
1319 Session::maybe_enable_record ()
1320 {
1321         atomic_set (&_record_status, Enabled);
1322
1323         save_state ("", true);
1324
1325         if (_transport_speed) {
1326                 if (!punch_in) {
1327                         enable_record ();
1328                 } 
1329         } else {
1330                 send_mmc_in_another_thread (MIDI::MachineControl::cmdRecordPause);
1331                 RecordStateChanged (); /* EMIT SIGNAL */
1332         }
1333
1334         set_dirty();
1335 }
1336
1337 jack_nframes_t
1338 Session::audible_frame () const
1339 {
1340         jack_nframes_t ret;
1341         jack_nframes_t offset;
1342         jack_nframes_t tf;
1343
1344         /* the first of these two possible settings for "offset"
1345            mean that the audible frame is stationary until 
1346            audio emerges from the latency compensation
1347            "pseudo-pipeline".
1348
1349            the second means that the audible frame is stationary
1350            until audio would emerge from a physical port
1351            in the absence of any plugin latency compensation
1352         */
1353
1354         offset = _worst_output_latency;
1355
1356         if (offset > current_block_size) {
1357                 offset -= current_block_size;
1358         } else { 
1359                 /* XXX is this correct? if we have no external
1360                    physical connections and everything is internal
1361                    then surely this is zero? still, how
1362                    likely is that anyway?
1363                 */
1364                 offset = current_block_size;
1365         }
1366
1367         if (synced_to_jack()) {
1368                 tf = _engine.transport_frame();
1369         } else {
1370                 tf = _transport_frame;
1371         }
1372
1373         if (_transport_speed == 0) {
1374                 return tf;
1375         }
1376
1377         if (tf < offset) {
1378                 return 0;
1379         }
1380
1381         ret = tf;
1382
1383         if (!non_realtime_work_pending()) {
1384
1385                 /* MOVING */
1386
1387                 /* take latency into account */
1388                 
1389                 ret -= offset;
1390         }
1391
1392         return ret;
1393 }
1394
1395 void
1396 Session::set_frame_rate (jack_nframes_t frames_per_second)
1397 {
1398         /** \fn void Session::set_frame_size(jack_nframes_t)
1399                 the AudioEngine object that calls this guarantees 
1400                 that it will not be called while we are also in
1401                 ::process(). Its fine to do things that block
1402                 here.
1403         */
1404
1405         _current_frame_rate = frames_per_second;
1406         _frames_per_smpte_frame = (double) _current_frame_rate / (double) smpte_frames_per_second;
1407
1408         Route::set_automation_interval ((jack_nframes_t) ceil ((double) frames_per_second * 0.25));
1409
1410         set_dirty();
1411
1412         /* XXX need to reset/reinstantiate all LADSPA plugins */
1413 }
1414
1415 void
1416 Session::set_block_size (jack_nframes_t nframes)
1417 {
1418         /* the AudioEngine guarantees 
1419            that it will not be called while we are also in
1420            ::process(). It is therefore fine to do things that block
1421            here.
1422         */
1423
1424         { 
1425                 RWLockMonitor lm (route_lock, false, __LINE__, __FILE__);
1426                 RWLockMonitor dsm (diskstream_lock, false, __LINE__, __FILE__);
1427                 vector<Sample*>::iterator i;
1428                 uint32_t np;
1429                         
1430                 current_block_size = nframes;
1431                 
1432                 for (np = 0, i = _passthru_buffers.begin(); i != _passthru_buffers.end(); ++i, ++np) {
1433                         free (*i);
1434                 }
1435
1436                 for (vector<Sample*>::iterator i = _silent_buffers.begin(); i != _silent_buffers.end(); ++i) {
1437                         free (*i);
1438                 }
1439
1440                 _passthru_buffers.clear ();
1441                 _silent_buffers.clear ();
1442
1443                 ensure_passthru_buffers (np);
1444
1445                 if (_gain_automation_buffer) {
1446                         delete [] _gain_automation_buffer;
1447                 }
1448                 _gain_automation_buffer = new gain_t[nframes];
1449
1450                 allocate_pan_automation_buffers (nframes, _npan_buffers, true);
1451
1452                 for (RouteList::iterator i = routes.begin(); i != routes.end(); ++i) {
1453                         (*i)->set_block_size (nframes);
1454                 }
1455                 
1456                 for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) {
1457                         (*i)->set_block_size (nframes);
1458                 }
1459
1460                 set_worst_io_latencies (false);
1461         }
1462 }
1463
1464 void
1465 Session::set_default_fade (float steepness, float fade_msecs)
1466 {
1467 #if 0
1468         jack_nframes_t fade_frames;
1469         
1470         /* Don't allow fade of less 1 frame */
1471         
1472         if (fade_msecs < (1000.0 * (1.0/_current_frame_rate))) {
1473
1474                 fade_msecs = 0;
1475                 fade_frames = 0;
1476
1477         } else {
1478                 
1479                 fade_frames = (jack_nframes_t) floor (fade_msecs * _current_frame_rate * 0.001);
1480                 
1481         }
1482
1483         default_fade_msecs = fade_msecs;
1484         default_fade_steepness = steepness;
1485
1486         {
1487                 // jlc, WTF is this!
1488                 RWLockMonitor lm (route_lock, false, __LINE__, __FILE__);
1489                 AudioRegion::set_default_fade (steepness, fade_frames);
1490         }
1491
1492         set_dirty();
1493
1494         /* XXX have to do this at some point */
1495         /* foreach region using default fade, reset, then 
1496            refill_all_diskstream_buffers ();
1497         */
1498 #endif
1499 }
1500
1501 struct RouteSorter {
1502     bool operator() (Route* r1, Route* r2) {
1503             if (r1->fed_by.find (r2) != r1->fed_by.end()) {
1504                     return false;
1505             } else if (r2->fed_by.find (r1) != r2->fed_by.end()) {
1506                     return true;
1507             } else {
1508                     if (r1->fed_by.empty()) {
1509                             if (r2->fed_by.empty()) {
1510                                     /* no ardour-based connections inbound to either route. just use signal order */
1511                                     return r1->order_key(N_("signal")) < r2->order_key(N_("signal"));
1512                             } else {
1513                                     /* r2 has connections, r1 does not; run r1 early */
1514                                     return true;
1515                             }
1516                     } else {
1517                             return r1->order_key(N_("signal")) < r2->order_key(N_("signal"));
1518                     }
1519             }
1520     }
1521 };
1522
1523 static void
1524 trace_terminal (Route* r1, Route* rbase)
1525 {
1526         Route* r2;
1527
1528         if ((r1->fed_by.find (rbase) != r1->fed_by.end()) && (rbase->fed_by.find (r1) != rbase->fed_by.end())) {
1529                 info << string_compose(_("feedback loop setup between %1 and %2"), r1->name(), rbase->name()) << endmsg;
1530                 return;
1531         } 
1532
1533         /* make a copy of the existing list of routes that feed r1 */
1534
1535         set<Route *> existing = r1->fed_by;
1536
1537         /* for each route that feeds r1, recurse, marking it as feeding
1538            rbase as well.
1539         */
1540
1541         for (set<Route *>::iterator i = existing.begin(); i != existing.end(); ++i) {
1542                 r2 =* i;
1543
1544                 /* r2 is a route that feeds r1 which somehow feeds base. mark
1545                    base as being fed by r2
1546                 */
1547
1548                 rbase->fed_by.insert (r2);
1549
1550                 if (r2 != rbase) {
1551
1552                         /* 2nd level feedback loop detection. if r1 feeds or is fed by r2,
1553                            stop here.
1554                          */
1555
1556                         if ((r1->fed_by.find (r2) != r1->fed_by.end()) && (r2->fed_by.find (r1) != r2->fed_by.end())) {
1557                                 continue;
1558                         }
1559
1560                         /* now recurse, so that we can mark base as being fed by
1561                            all routes that feed r2
1562                         */
1563
1564                         trace_terminal (r2, rbase);
1565                 }
1566
1567         }
1568 }
1569
1570 void
1571 Session::resort_routes (void* src)
1572 {
1573         /* don't do anything here with signals emitted
1574            by Routes while we are being destroyed.
1575         */
1576
1577         if (_state_of_the_state & Deletion) {
1578                 return;
1579         }
1580
1581         /* Caller MUST hold the route_lock */
1582
1583         RouteList::iterator i, j;
1584
1585         for (i = routes.begin(); i != routes.end(); ++i) {
1586
1587                 (*i)->fed_by.clear ();
1588                 
1589                 for (j = routes.begin(); j != routes.end(); ++j) {
1590
1591                         /* although routes can feed themselves, it will
1592                            cause an endless recursive descent if we
1593                            detect it. so don't bother checking for
1594                            self-feeding.
1595                         */
1596
1597                         if (*j == *i) {
1598                                 continue;
1599                         }
1600
1601                         if ((*j)->feeds (*i)) {
1602                                 (*i)->fed_by.insert (*j);
1603                         } 
1604                 }
1605         }
1606         
1607         for (i = routes.begin(); i != routes.end(); ++i) {
1608                 trace_terminal (*i, *i);
1609         }
1610
1611         RouteSorter cmp;
1612         routes.sort (cmp);
1613
1614 #if 0
1615         cerr << "finished route resort\n";
1616         
1617         for (i = routes.begin(); i != routes.end(); ++i) {
1618                 cerr << " " << (*i)->name() << " signal order = " << (*i)->order_key ("signal") << endl;
1619         }
1620         cerr << endl;
1621 #endif
1622
1623 }
1624
1625 AudioTrack*
1626 Session::new_audio_track (int input_channels, int output_channels)
1627 {
1628         AudioTrack *track;
1629         char track_name[32];
1630         uint32_t n = 0;
1631         uint32_t channels_used = 0;
1632         string port;
1633         uint32_t nphysical_in;
1634         uint32_t nphysical_out;
1635
1636         /* count existing audio tracks */
1637
1638         {
1639                 RWLockMonitor lm (route_lock, false, __LINE__, __FILE__);
1640                 for (RouteList::iterator i = routes.begin(); i != routes.end(); ++i) {
1641                         if (dynamic_cast<AudioTrack*>(*i) != 0) {
1642                                 if (!(*i)->hidden()) {
1643                                         n++;
1644                                         channels_used += (*i)->n_inputs();
1645                                 }
1646                         }
1647                 }
1648         }
1649
1650         /* check for duplicate route names, since we might have pre-existing
1651            routes with this name (e.g. create Audio1, Audio2, delete Audio1,
1652            save, close,restart,add new route - first named route is now
1653            Audio2)
1654         */
1655
1656         do {
1657                 snprintf (track_name, sizeof(track_name), "Audio %" PRIu32, n+1);
1658                 if (route_by_name (track_name) == 0) {
1659                         break;
1660                 }
1661                 n++;
1662
1663         } while (n < (UINT_MAX-1));
1664
1665         if (input_auto_connect & AutoConnectPhysical) {
1666                 nphysical_in = n_physical_inputs;
1667         } else {
1668                 nphysical_in = 0;
1669         }
1670
1671         if (output_auto_connect & AutoConnectPhysical) {
1672                 nphysical_out = n_physical_outputs;
1673         } else {
1674                 nphysical_out = 0;
1675         }
1676
1677         try {
1678                 track = new AudioTrack (*this, track_name);
1679
1680                 if (track->ensure_io (input_channels, output_channels, false, this)) {
1681                         error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
1682                                           input_channels, output_channels)
1683                               << endmsg;
1684                 }
1685
1686                 if (nphysical_in) {
1687                         for (uint32_t x = 0; x < track->n_inputs() && x < nphysical_in; ++x) {
1688                                 
1689                                 port = "";
1690                                 
1691                                 if (input_auto_connect & AutoConnectPhysical) {
1692                                         port = _engine.get_nth_physical_input ((channels_used+x)%nphysical_in);
1693                                 } 
1694                                 
1695                                 if (port.length() && track->connect_input (track->input (x), port, this)) {
1696                                         break;
1697                                 }
1698                         }
1699                 }
1700                 
1701                 for (uint32_t x = 0; x < track->n_outputs(); ++x) {
1702                         
1703                         port = "";
1704
1705                         if (nphysical_out && (output_auto_connect & AutoConnectPhysical)) {
1706                                 port = _engine.get_nth_physical_output ((channels_used+x)%nphysical_out);
1707                         } else if (output_auto_connect & AutoConnectMaster) {
1708                                 if (_master_out) {
1709                                         port = _master_out->input (x%_master_out->n_inputs())->name();
1710                                 }
1711                         }
1712
1713                         if (port.length() && track->connect_output (track->output (x), port, this)) {
1714                                 break;
1715                         }
1716                 }
1717
1718                 if (_control_out) {
1719                         vector<string> cports;
1720                         uint32_t ni = _control_out->n_inputs();
1721
1722                         for (n = 0; n < ni; ++n) {
1723                                 cports.push_back (_control_out->input(n)->name());
1724                         }
1725
1726                         track->set_control_outs (cports);
1727                 }
1728
1729                 track->diskstream_changed.connect (mem_fun (this, &Session::resort_routes));
1730
1731                 add_route (track);
1732
1733                 track->set_remote_control_id (ntracks());
1734         }
1735
1736         catch (failed_constructor &err) {
1737                 error << _("Session: could not create new audio track.") << endmsg;
1738                 return 0;
1739         }
1740
1741         return track;
1742 }
1743
1744 Route*
1745 Session::new_audio_route (int input_channels, int output_channels)
1746 {
1747         Route *bus;
1748         char bus_name[32];
1749         uint32_t n = 0;
1750         string port;
1751
1752         /* count existing audio busses */
1753
1754         {
1755                 RWLockMonitor lm (route_lock, false, __LINE__, __FILE__);
1756                 for (RouteList::iterator i = routes.begin(); i != routes.end(); ++i) {
1757                         if (dynamic_cast<AudioTrack*>(*i) == 0) {
1758                                 if (!(*i)->hidden()) {
1759                                         n++;
1760                                 }
1761                         }
1762                 }
1763         }
1764
1765         do {
1766                 snprintf (bus_name, sizeof(bus_name), "Bus %" PRIu32, n+1);
1767                 if (route_by_name (bus_name) == 0) {
1768                         break;
1769                 }
1770                 n++;
1771
1772         } while (n < (UINT_MAX-1));
1773
1774         try {
1775                 bus = new Route (*this, bus_name, -1, -1, -1, -1);
1776
1777                 if (bus->ensure_io (input_channels, output_channels, false, this)) {
1778                         error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
1779                                           input_channels, output_channels)
1780                               << endmsg;
1781                 }
1782
1783                 for (uint32_t x = 0; x < bus->n_inputs(); ++x) {
1784                         
1785                         port = "";
1786
1787                         if (input_auto_connect & AutoConnectPhysical) {
1788                                 port = _engine.get_nth_physical_input ((n+x)%n_physical_inputs);
1789                         } 
1790                         
1791                         if (port.length() && bus->connect_input (bus->input (x), port, this)) {
1792                                 break;
1793                         }
1794                 }
1795
1796                 for (uint32_t x = 0; x < bus->n_outputs(); ++x) {
1797                         
1798                         port = "";
1799
1800                         if (output_auto_connect & AutoConnectPhysical) {
1801                                 port = _engine.get_nth_physical_input ((n+x)%n_physical_outputs);
1802                         } else if (output_auto_connect & AutoConnectMaster) {
1803                                 if (_master_out) {
1804                                         port = _master_out->input (x%_master_out->n_inputs())->name();
1805                                 }
1806                         }
1807
1808                         if (port.length() && bus->connect_output (bus->output (x), port, this)) {
1809                                 break;
1810                         }
1811                 }
1812
1813                 if (_control_out) {
1814                         vector<string> cports;
1815                         uint32_t ni = _control_out->n_inputs();
1816
1817                         for (uint32_t n = 0; n < ni; ++n) {
1818                                 cports.push_back (_control_out->input(n)->name());
1819                         }
1820                         bus->set_control_outs (cports);
1821                 }
1822                 
1823                 add_route (bus);
1824         }
1825
1826         catch (failed_constructor &err) {
1827                 error << _("Session: could not create new route.") << endmsg;
1828                 return 0;
1829         }
1830
1831         return bus;
1832 }
1833
1834 void
1835 Session::add_route (Route* route)
1836 {
1837         { 
1838                 RWLockMonitor lm (route_lock, true, __LINE__, __FILE__);
1839                 routes.push_front (route);
1840                 resort_routes(0);
1841         }
1842
1843         route->solo_changed.connect (sigc::bind (mem_fun (*this, &Session::route_solo_changed), route));
1844         route->mute_changed.connect (mem_fun (*this, &Session::route_mute_changed));
1845         route->output_changed.connect (mem_fun (*this, &Session::set_worst_io_latencies_x));
1846         route->redirects_changed.connect (mem_fun (*this, &Session::update_latency_compensation_proxy));
1847
1848         if (route->master()) {
1849                 _master_out = route;
1850         }
1851
1852         if (route->control()) {
1853                 _control_out = route;
1854         }
1855
1856         set_dirty();
1857         save_state (_current_snapshot_name);
1858
1859         RouteAdded (route); /* EMIT SIGNAL */
1860 }
1861
1862 void
1863 Session::add_diskstream (DiskStream* dstream)
1864 {
1865         /* need to do this in case we're rolling at the time, to prevent false underruns */
1866         dstream->do_refill(0, 0);
1867         
1868         { 
1869                 RWLockMonitor lm (diskstream_lock, true, __LINE__, __FILE__);
1870                 diskstreams.push_back (dstream);
1871         }
1872
1873         /* take a reference to the diskstream, preventing it from
1874            ever being deleted until the session itself goes away,
1875            or chooses to remove it for its own purposes.
1876         */
1877
1878         dstream->ref();
1879         dstream->set_block_size (current_block_size);
1880
1881         dstream->PlaylistChanged.connect (sigc::bind (mem_fun (*this, &Session::diskstream_playlist_changed), dstream));
1882         /* this will connect to future changes, and check the current length */
1883         diskstream_playlist_changed (dstream);
1884
1885         dstream->prepare ();
1886
1887         set_dirty();
1888         save_state (_current_snapshot_name);
1889
1890         DiskStreamAdded (dstream); /* EMIT SIGNAL */
1891 }
1892
1893 void
1894 Session::remove_route (Route& route)
1895 {
1896         {       
1897                 RWLockMonitor lm (route_lock, true, __LINE__, __FILE__);
1898                 routes.remove (&route);
1899                 
1900                 /* deleting the master out seems like a dumb
1901                    idea, but its more of a UI policy issue
1902                    than our concern.
1903                 */
1904
1905                 if (&route == _master_out) {
1906                         _master_out = 0;
1907                 }
1908
1909                 if (&route == _control_out) {
1910                         _control_out = 0;
1911
1912                         /* cancel control outs for all routes */
1913
1914                         vector<string> empty;
1915
1916                         for (RouteList::iterator r = routes.begin(); r != routes.end(); ++r) {
1917                                 (*r)->set_control_outs (empty);
1918                         }
1919                 }
1920
1921                 update_route_solo_state ();
1922         }
1923
1924         {
1925                 RWLockMonitor lm (diskstream_lock, true, __LINE__, __FILE__);
1926
1927                 AudioTrack* at;
1928
1929                 if ((at = dynamic_cast<AudioTrack*>(&route)) != 0) {
1930                         diskstreams.remove (&at->disk_stream());
1931                         at->disk_stream().unref ();
1932                 }
1933
1934                 find_current_end ();
1935         }
1936         
1937         update_latency_compensation (false, false);
1938         set_dirty();
1939         
1940         /* XXX should we disconnect from the Route's signals ? */
1941
1942         save_state (_current_snapshot_name);
1943
1944         delete &route;
1945 }       
1946
1947 void
1948 Session::route_mute_changed (void* src)
1949 {
1950         set_dirty ();
1951 }
1952
1953 void
1954 Session::route_solo_changed (void* src, Route* route)
1955 {      
1956         if (solo_update_disabled) {
1957                 // We know already
1958                 return;
1959         }
1960         
1961         RWLockMonitor lm (route_lock, false, __LINE__, __FILE__);
1962         bool is_track;
1963         
1964         is_track = (dynamic_cast<AudioTrack*>(route) != 0);
1965         
1966         for (RouteList::iterator i = routes.begin(); i != routes.end(); ++i) {
1967                 
1968                 /* soloing a track mutes all other tracks, soloing a bus mutes all other busses */
1969                 
1970                 if (is_track) {
1971                         
1972                         /* don't mess with busses */
1973                         
1974                         if (dynamic_cast<AudioTrack*>(*i) == 0) {
1975                                 continue;
1976                         }
1977                         
1978                 } else {
1979                         
1980                         /* don't mess with tracks */
1981                         
1982                         if (dynamic_cast<AudioTrack*>(*i) != 0) {
1983                                 continue;
1984                         }
1985                 }
1986                 
1987                 if ((*i) != route &&
1988                     ((*i)->mix_group () == 0 ||
1989                      (*i)->mix_group () != route->mix_group () ||
1990                      !route->mix_group ()->is_active())) {
1991                         
1992                         if ((*i)->soloed()) {
1993                                 
1994                                 /* if its already soloed, and solo latching is enabled,
1995                                    then leave it as it is.
1996                                 */
1997                                 
1998                                 if (_solo_latched) {
1999                                         continue;
2000                                 } 
2001                         }
2002                         
2003                         /* do it */
2004
2005                         solo_update_disabled = true;
2006                         (*i)->set_solo (false, src);
2007                         solo_update_disabled = false;
2008                 }
2009         }
2010         
2011         bool something_soloed = false;
2012         bool same_thing_soloed = false;
2013         bool signal = false;
2014
2015         for (RouteList::iterator i = routes.begin(); i != routes.end(); ++i) {
2016                 if ((*i)->soloed()) {
2017                         something_soloed = true;
2018                         if (dynamic_cast<AudioTrack*>(*i)) {
2019                                 if (is_track) {
2020                                         same_thing_soloed = true;
2021                                         break;
2022                                 }
2023                         } else {
2024                                 if (!is_track) {
2025                                         same_thing_soloed = true;
2026                                         break;
2027                                 }
2028                         }
2029                         break;
2030                 }
2031         }
2032         
2033         if (something_soloed != currently_soloing) {
2034                 signal = true;
2035                 currently_soloing = something_soloed;
2036         }
2037         
2038         modify_solo_mute (is_track, same_thing_soloed);
2039
2040         if (signal) {
2041                 SoloActive (currently_soloing);
2042         }
2043
2044         set_dirty();
2045 }
2046
2047 void
2048 Session::set_solo_latched (bool yn)
2049 {
2050         if (yn != _solo_latched) {
2051                 _solo_latched = yn;
2052                 set_dirty ();
2053                 ControlChanged (SoloLatch);
2054         }
2055 }
2056
2057 void
2058 Session::update_route_solo_state ()
2059 {
2060         bool mute = false;
2061         bool is_track = false;
2062         bool signal = false;
2063
2064         /* caller must hold RouteLock */
2065
2066         /* this is where we actually implement solo by changing
2067            the solo mute setting of each track.
2068         */
2069                 
2070         for (RouteList::iterator i = routes.begin(); i != routes.end(); ++i) {
2071                 if ((*i)->soloed()) {
2072                         mute = true;
2073                         if (dynamic_cast<AudioTrack*>(*i)) {
2074                                 is_track = true;
2075                         }
2076                         break;
2077                 }
2078         }
2079
2080         if (mute != currently_soloing) {
2081                 signal = true;
2082                 currently_soloing = mute;
2083         }
2084
2085         if (!is_track && !mute) {
2086
2087                 /* nothing is soloed */
2088
2089                 for (RouteList::iterator i = routes.begin(); i != routes.end(); ++i) {
2090                         (*i)->set_solo_mute (false);
2091                 }
2092                 
2093                 if (signal) {
2094                         SoloActive (false);
2095                 }
2096
2097                 return;
2098         }
2099
2100         modify_solo_mute (is_track, mute);
2101
2102         if (signal) {
2103                 SoloActive (currently_soloing);
2104         }
2105 }
2106
2107 void
2108 Session::modify_solo_mute (bool is_track, bool mute)
2109 {
2110         for (RouteList::iterator i = routes.begin(); i != routes.end(); ++i) {
2111                 
2112                 if (is_track) {
2113                         
2114                         /* only alter track solo mute */
2115                         
2116                         if (dynamic_cast<AudioTrack*>(*i)) {
2117                                 if ((*i)->soloed()) {
2118                                         (*i)->set_solo_mute (!mute);
2119                                 } else {
2120                                         (*i)->set_solo_mute (mute);
2121                                 }
2122                         }
2123
2124                 } else {
2125
2126                         /* only alter bus solo mute */
2127
2128                         if (!dynamic_cast<AudioTrack*>(*i)) {
2129
2130                                 if ((*i)->soloed()) {
2131
2132                                         (*i)->set_solo_mute (false);
2133
2134                                 } else {
2135
2136                                         /* don't mute master or control outs
2137                                            in response to another bus solo
2138                                         */
2139                                         
2140                                         if ((*i) != _master_out &&
2141                                             (*i) != _control_out) {
2142                                                 (*i)->set_solo_mute (mute);
2143                                         }
2144                                 }
2145                         }
2146
2147                 }
2148         }
2149 }       
2150
2151
2152 void
2153 Session::catch_up_on_solo ()
2154 {
2155         /* this is called after set_state() to catch the full solo
2156            state, which can't be correctly determined on a per-route
2157            basis, but needs the global overview that only the session
2158            has.
2159         */
2160         RWLockMonitor lm (route_lock, false, __LINE__, __FILE__);
2161         update_route_solo_state();
2162 }       
2163                 
2164 Route *
2165 Session::route_by_name (string name)
2166 {
2167         RWLockMonitor lm (route_lock, false, __LINE__, __FILE__);
2168
2169         for (RouteList::iterator i = routes.begin(); i != routes.end(); ++i) {
2170                 if ((*i)->name() == name) {
2171                         return* i;
2172                 }
2173         }
2174
2175         return 0;
2176 }
2177
2178 void
2179 Session::find_current_end ()
2180 {
2181         jack_nframes_t max = 0;
2182         jack_nframes_t me; 
2183
2184         if (_state_of_the_state & Loading) {
2185                 return;
2186         }
2187
2188         /* Don't take the diskstream lock. Caller must have other ways to
2189            ensure atomicity.
2190         */
2191
2192         for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) {
2193                 Playlist* pl = (*i)->playlist();
2194                 if ((me = pl->get_maximum_extent()) > max) {
2195                         max = me;
2196                 }
2197         }
2198         
2199         if (max > end_location->end()) {
2200                 end_location->set_end (max);
2201                 set_dirty();
2202                 DurationChanged(); /* EMIT SIGNAL */
2203         }
2204 }
2205
2206 DiskStream *
2207 Session::diskstream_by_name (string name)
2208 {
2209         RWLockMonitor lm (diskstream_lock, false, __LINE__, __FILE__);
2210
2211         for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) {
2212                 if ((*i)->name() == name) {
2213                         return* i;
2214                 }
2215         }
2216
2217         return 0;
2218 }
2219
2220 DiskStream *
2221 Session::diskstream_by_id (id_t id)
2222 {
2223         RWLockMonitor lm (diskstream_lock, false, __LINE__, __FILE__);
2224
2225         for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) {
2226                 if ((*i)->id() == id) {
2227                         return *i;
2228                 }
2229         }
2230
2231         return 0;
2232 }
2233
2234 /* AudioRegion management */
2235
2236 string
2237 Session::new_region_name (string old)
2238 {
2239         string::size_type last_period;
2240         uint32_t number;
2241         string::size_type len = old.length() + 64;
2242         char buf[len];
2243
2244         if ((last_period = old.find_last_of ('.')) == string::npos) {
2245                 
2246                 /* no period present - add one explicitly */
2247
2248                 old += '.';
2249                 last_period = old.length() - 1;
2250                 number = 0;
2251
2252         } else {
2253
2254                 number = atoi (old.substr (last_period+1).c_str());
2255
2256         }
2257
2258         while (number < (UINT_MAX-1)) {
2259
2260                 AudioRegionList::const_iterator i;
2261                 string sbuf;
2262
2263                 number++;
2264
2265                 snprintf (buf, len, "%s%" PRIu32, old.substr (0, last_period + 1).c_str(), number);
2266                 sbuf = buf;
2267
2268                 for (i = audio_regions.begin(); i != audio_regions.end(); ++i) {
2269                         if ((*i).second->name() == sbuf) {
2270                                 break;
2271                         }
2272                 }
2273                 
2274                 if (i == audio_regions.end()) {
2275                         break;
2276                 }
2277         }
2278
2279         if (number != (UINT_MAX-1)) {
2280                 return buf;
2281         } 
2282
2283         error << string_compose (_("cannot create new name for region \"%1\""), old) << endmsg;
2284         return old;
2285 }
2286
2287 int
2288 Session::region_name (string& result, string base, bool newlevel) const
2289 {
2290         char buf[16];
2291         string subbase;
2292
2293         if (base == "") {
2294                 
2295                 LockMonitor lm (region_lock, __LINE__, __FILE__);
2296
2297                 snprintf (buf, sizeof (buf), "%d", (int)audio_regions.size() + 1);
2298
2299                 
2300                 result = "region.";
2301                 result += buf;
2302
2303         } else {
2304
2305                 /* XXX this is going to be slow. optimize me later */
2306                 
2307                 if (newlevel) {
2308                         subbase = base;
2309                 } else {
2310                         string::size_type pos;
2311
2312                         if ((pos = base.find_last_of ('-')) == string::npos) {
2313                                 pos = base.find_last_of ('.');
2314                         }
2315
2316                         /* pos may be npos, but then we just use entire base */
2317
2318                         subbase = base.substr (0, pos);
2319                 }
2320                 
2321                 bool name_taken = true;
2322                 
2323                 {
2324                         LockMonitor lm (region_lock, __LINE__, __FILE__);
2325                         
2326                         for (int n = 1; n < 5000; ++n) {
2327                                 
2328                                 result = subbase;
2329                                 snprintf (buf, sizeof (buf), ".%d", n);
2330                                 result += buf;
2331                                 
2332                                 name_taken = false;
2333                                 
2334                                 for (AudioRegionList::const_iterator i = audio_regions.begin(); i != audio_regions.end(); ++i) {
2335                                         if ((*i).second->name() == result) {
2336                                                 name_taken = true;
2337                                                 break;
2338                                         }
2339                                 }
2340                                 
2341                                 if (!name_taken) {
2342                                         break;
2343                                 }
2344                         }
2345                 }
2346                         
2347                 if (name_taken) {
2348                         fatal << string_compose(_("too many regions with names like %1"), base) << endmsg;
2349                         /*NOTREACHED*/
2350                 }
2351         }
2352
2353         return 0;
2354 }       
2355
2356 void
2357 Session::add_region (Region* region)
2358 {
2359         AudioRegion* ar = 0;
2360         AudioRegion* oar = 0;
2361         bool added = false;
2362
2363         { 
2364                 LockMonitor lm (region_lock, __LINE__, __FILE__);
2365
2366                 if ((ar = dynamic_cast<AudioRegion*> (region)) != 0) {
2367
2368                         AudioRegionList::iterator x;
2369
2370                         for (x = audio_regions.begin(); x != audio_regions.end(); ++x) {
2371
2372                                 oar = dynamic_cast<AudioRegion*> (x->second);
2373
2374                                 if (ar->region_list_equivalent (*oar)) {
2375                                         break;
2376                                 }
2377                         }
2378
2379                         if (x == audio_regions.end()) {
2380
2381                                 pair<AudioRegionList::key_type, AudioRegionList::mapped_type> entry;
2382         
2383                                 entry.first = region->id();
2384                                 entry.second = ar;
2385
2386                                 pair<AudioRegionList::iterator,bool> x = audio_regions.insert (entry);
2387                                 
2388                                 if (!x.second) {
2389                                         return;
2390                                 }
2391
2392                                 added = true;
2393                         } 
2394
2395                 } else {
2396
2397                         fatal << _("programming error: ")
2398                               << X_("unknown region type passed to Session::add_region()")
2399                               << endmsg;
2400                         /*NOTREACHED*/
2401
2402                 }
2403         }
2404
2405         /* mark dirty because something has changed even if we didn't
2406            add the region to the region list.
2407         */
2408         
2409         set_dirty();
2410         
2411         if (added) {
2412                 region->GoingAway.connect (mem_fun (*this, &Session::remove_region));
2413                 region->StateChanged.connect (sigc::bind (mem_fun (*this, &Session::region_changed), region));
2414                 AudioRegionAdded (ar); /* EMIT SIGNAL */
2415         }
2416 }
2417
2418 void
2419 Session::region_changed (Change what_changed, Region* region)
2420 {
2421         if (what_changed & Region::HiddenChanged) {
2422                 /* relay hidden changes */
2423                 RegionHiddenChange (region);
2424         }
2425 }
2426
2427 void
2428 Session::region_renamed (Region* region)
2429 {
2430         add_region (region);
2431 }
2432
2433 void
2434 Session::remove_region (Region* region)
2435 {
2436         AudioRegionList::iterator i;
2437         AudioRegion* ar = 0;
2438         bool removed = false;
2439
2440         { 
2441                 LockMonitor lm (region_lock, __LINE__, __FILE__);
2442
2443                 if ((ar = dynamic_cast<AudioRegion*> (region)) != 0) {
2444                         if ((i = audio_regions.find (region->id())) != audio_regions.end()) {
2445                                 audio_regions.erase (i);
2446                                 removed = true;
2447                         } 
2448                 } else {
2449                         fatal << _("programming error: ") 
2450                               << X_("unknown region type passed to Session::remove_region()")
2451                               << endmsg;
2452                         /*NOTREACHED*/
2453                 }
2454         }
2455
2456         /* mark dirty because something has changed even if we didn't
2457            remove the region from the region list.
2458         */
2459
2460         set_dirty();
2461
2462         if (removed) {
2463                  AudioRegionRemoved(ar); /* EMIT SIGNAL */
2464         }
2465 }
2466
2467 AudioRegion*
2468 Session::find_whole_file_parent (AudioRegion& child)
2469 {
2470         AudioRegionList::iterator i;
2471         AudioRegion* region;
2472         LockMonitor lm (region_lock, __LINE__, __FILE__);
2473
2474         for (i = audio_regions.begin(); i != audio_regions.end(); ++i) {
2475
2476                 region = (*i).second;
2477
2478                 if (region->whole_file()) {
2479
2480                         if (child.source_equivalent (*region)) {
2481                                 return region;
2482                         }
2483                 }
2484         } 
2485
2486         return 0;
2487 }       
2488
2489 void
2490 Session::find_equivalent_playlist_regions (AudioRegion& region, vector<AudioRegion*>& result)
2491 {
2492         for (PlaylistList::iterator i = playlists.begin(); i != playlists.end(); ++i) {
2493
2494                 AudioPlaylist* pl;
2495
2496                 if ((pl = dynamic_cast<AudioPlaylist*>(*i)) == 0) {
2497                         continue;
2498                 }
2499
2500                 pl->get_region_list_equivalent_regions (region, result);
2501         }
2502 }
2503
2504 int
2505 Session::destroy_region (Region* region)
2506 {
2507         AudioRegion* aregion;
2508
2509         if ((aregion = dynamic_cast<AudioRegion*> (region)) == 0) {
2510                 return 0;
2511         }
2512
2513         if (aregion->playlist()) {
2514                 aregion->playlist()->destroy_region (region);
2515         }
2516
2517         vector<Source*> srcs;
2518         
2519         for (uint32_t n = 0; n < aregion->n_channels(); ++n) {
2520                 srcs.push_back (&aregion->source (n));
2521         }
2522
2523         for (vector<Source*>::iterator i = srcs.begin(); i != srcs.end(); ++i) {
2524                 
2525                 if ((*i)->use_cnt() == 0) {
2526                         (*i)->mark_for_remove ();
2527                         delete *i;
2528                 }
2529         }
2530
2531         return 0;
2532 }
2533
2534 int
2535 Session::destroy_regions (list<Region*> regions)
2536 {
2537         for (list<Region*>::iterator i = regions.begin(); i != regions.end(); ++i) {
2538                 destroy_region (*i);
2539         }
2540         return 0;
2541 }
2542
2543 int
2544 Session::remove_last_capture ()
2545 {
2546         list<Region*> r;
2547
2548         RWLockMonitor lm (diskstream_lock, false, __LINE__, __FILE__);
2549         
2550         for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) {
2551                 list<Region*>& l = (*i)->last_capture_regions();
2552                 
2553                 if (!l.empty()) {
2554                         r.insert (r.end(), l.begin(), l.end());
2555                         l.clear ();
2556                 }
2557         }
2558
2559         destroy_regions (r);
2560         return 0;
2561 }
2562
2563 int
2564 Session::remove_region_from_region_list (Region& r)
2565 {
2566         remove_region (&r);
2567         return 0;
2568 }
2569
2570 /* Source Management */
2571
2572 void
2573 Session::add_source (Source* source)
2574 {
2575         pair<SourceList::key_type, SourceList::mapped_type> entry;
2576         
2577         {
2578                 LockMonitor lm (source_lock, __LINE__, __FILE__);
2579                 entry.first = source->id();
2580                 entry.second = source;
2581                 sources.insert (entry);
2582         }
2583         
2584         source->GoingAway.connect (mem_fun (this, &Session::remove_source));
2585         set_dirty();
2586         
2587         SourceAdded (source); /* EMIT SIGNAL */
2588 }
2589
2590 void
2591 Session::remove_source (Source* source)
2592 {
2593         SourceList::iterator i;
2594
2595         { 
2596                 LockMonitor lm (source_lock, __LINE__, __FILE__);
2597
2598                 if ((i = sources.find (source->id())) != sources.end()) {
2599                         sources.erase (i);
2600                 }
2601         }
2602
2603         if (!_state_of_the_state & InCleanup) {
2604
2605                 /* save state so we don't end up with a session file
2606                    referring to non-existent sources.
2607                 */
2608                 
2609                 save_state (_current_snapshot_name);
2610         }
2611
2612         SourceRemoved(source); /* EMIT SIGNAL */
2613 }
2614
2615 Source *
2616 Session::get_source (ARDOUR::id_t id)
2617 {
2618         LockMonitor lm (source_lock, __LINE__, __FILE__);
2619         SourceList::iterator i;
2620         Source* source = 0;
2621
2622         if ((i = sources.find (id)) != sources.end()) {
2623                 source = (*i).second;
2624         }
2625
2626         return source;
2627 }
2628
2629 FileSource *
2630 Session::create_file_source (DiskStream& ds, int32_t chan, bool destructive)
2631 {
2632         string spath;
2633         uint32_t cnt;
2634         char buf[PATH_MAX+1];
2635         const uint32_t limit = 10000;
2636         string legalized;
2637
2638         buf[0] = '\0';
2639         legalized = legalize_for_path (ds.name());
2640
2641         /* find a "version" of the file name that doesn't exist in
2642            any of the possible directories.
2643         */
2644         
2645         for (cnt = 1; cnt <= limit; ++cnt) {
2646
2647                 vector<space_and_path>::iterator i;
2648                 uint32_t existing = 0;
2649
2650                 for (i = session_dirs.begin(); i != session_dirs.end(); ++i) {
2651
2652                         spath = (*i).path;
2653                         spath += sound_dir_name;
2654                         spath += '/';
2655                         spath += legalized;
2656
2657                         if (ds.n_channels() < 2) {
2658                                 snprintf (buf, sizeof(buf), "%s-%u.wav", spath.c_str(), cnt);
2659                         } else if (ds.n_channels() == 2) {
2660                                 if (chan == 0) {
2661                                         snprintf (buf, sizeof(buf), "%s-%u%%L.wav", spath.c_str(), cnt);
2662                                 } else {
2663                                         snprintf (buf, sizeof(buf), "%s-%u%%R.wav", spath.c_str(), cnt);
2664                                 }
2665                         } else if (ds.n_channels() < 26) {
2666                                 snprintf (buf, sizeof(buf), "%s-%u%%%c.wav", spath.c_str(), cnt, 'a' + chan);
2667                         } else {
2668                                 snprintf (buf, sizeof(buf), "%s-%u.wav", spath.c_str(), cnt);
2669                         }
2670
2671                         if (access (buf, F_OK) == 0) {
2672                                 existing++;
2673                         }
2674                 }
2675
2676                 if (existing == 0) {
2677                         break;
2678                 }
2679         }
2680
2681         if (cnt > limit) {
2682                 error << string_compose(_("There are already %1 recordings for %2, which I consider too many."), limit, ds.name()) << endmsg;
2683                 throw failed_constructor();
2684         }
2685
2686         /* we now have a unique name for the file, but figure out where to
2687            actually put it.
2688         */
2689
2690         string foo = buf;
2691
2692         spath = discover_best_sound_dir ();
2693
2694         string::size_type pos = foo.find_last_of ('/');
2695         
2696         if (pos == string::npos) {
2697                 spath += foo;
2698         } else {
2699                 spath += foo.substr (pos + 1);
2700         }
2701
2702         /* this might throw failed_constructor(), which is OK */
2703
2704         if (destructive) {
2705                 return new DestructiveFileSource (spath, frame_rate());
2706         } else {
2707                 return new FileSource (spath, frame_rate());
2708         }
2709 }
2710
2711 /* Playlist management */
2712
2713 Playlist *
2714 Session::get_playlist (string name)
2715 {
2716         Playlist* ret = 0;
2717
2718         if ((ret = playlist_by_name (name)) == 0) {
2719                 ret = new AudioPlaylist (*this, name);
2720         }
2721
2722         return ret;
2723 }
2724
2725 Playlist *
2726 Session::playlist_by_name (string name)
2727 {
2728         LockMonitor lm (playlist_lock, __LINE__, __FILE__);
2729         for (PlaylistList::iterator i = playlists.begin(); i != playlists.end(); ++i) {
2730                 if ((*i)->name() == name) {
2731                         return* i;
2732                 }
2733         }
2734         for (PlaylistList::iterator i = unused_playlists.begin(); i != unused_playlists.end(); ++i) {
2735                 if ((*i)->name() == name) {
2736                         return* i;
2737                 }
2738         }
2739         return 0;
2740 }
2741
2742 void
2743 Session::add_playlist (Playlist* playlist)
2744 {
2745         if (playlist->hidden()) {
2746                 return;
2747         }
2748
2749         { 
2750                 LockMonitor lm (playlist_lock, __LINE__, __FILE__);
2751                 if (find (playlists.begin(), playlists.end(), playlist) == playlists.end()) {
2752                         playlists.insert (playlists.begin(), playlist);
2753                         // playlist->ref();
2754                         playlist->InUse.connect (mem_fun (*this, &Session::track_playlist));
2755                         playlist->GoingAway.connect (mem_fun (*this, &Session::remove_playlist));
2756                 }
2757         }
2758
2759         set_dirty();
2760
2761         PlaylistAdded (playlist); /* EMIT SIGNAL */
2762 }
2763
2764 void
2765 Session::track_playlist (Playlist* pl, bool inuse)
2766 {
2767         PlaylistList::iterator x;
2768
2769         { 
2770                 LockMonitor lm (playlist_lock, __LINE__, __FILE__);
2771
2772                 if (!inuse) {
2773                         //cerr << "shifting playlist to unused: " << pl->name() << endl;
2774
2775                         unused_playlists.insert (pl);
2776                         
2777                         if ((x = playlists.find (pl)) != playlists.end()) {
2778                                 playlists.erase (x);
2779                         }
2780
2781                         
2782                 } else {
2783                         //cerr << "shifting playlist to used: " << pl->name() << endl;
2784                         
2785                         playlists.insert (pl);
2786                         
2787                         if ((x = unused_playlists.find (pl)) != unused_playlists.end()) {
2788                                 unused_playlists.erase (x);
2789                         }
2790                 }
2791         }
2792 }
2793
2794 void
2795 Session::remove_playlist (Playlist* playlist)
2796 {
2797         if (_state_of_the_state & Deletion) {
2798                 return;
2799         }
2800
2801         { 
2802                 LockMonitor lm (playlist_lock, __LINE__, __FILE__);
2803                 // cerr << "removing playlist: " << playlist->name() << endl;
2804
2805                 PlaylistList::iterator i;
2806
2807                 i = find (playlists.begin(), playlists.end(), playlist);
2808
2809                 if (i != playlists.end()) {
2810                         playlists.erase (i);
2811                 }
2812
2813                 i = find (unused_playlists.begin(), unused_playlists.end(), playlist);
2814                 if (i != unused_playlists.end()) {
2815                         unused_playlists.erase (i);
2816                 }
2817                 
2818         }
2819
2820         set_dirty();
2821
2822         PlaylistRemoved (playlist); /* EMIT SIGNAL */
2823 }
2824
2825 void 
2826 Session::set_audition (AudioRegion* r)
2827 {
2828         pending_audition_region = r;
2829         post_transport_work = PostTransportWork (post_transport_work | PostTransportAudition);
2830         schedule_butler_transport_work ();
2831 }
2832
2833 void
2834 Session::non_realtime_set_audition ()
2835 {
2836         if (pending_audition_region == (AudioRegion*) 0xfeedface) {
2837                 auditioner->audition_current_playlist ();
2838         } else if (pending_audition_region) {
2839                 auditioner->audition_region (*pending_audition_region);
2840         }
2841         pending_audition_region = 0;
2842         AuditionActive (true); /* EMIT SIGNAL */
2843 }
2844
2845 void
2846 Session::audition_playlist ()
2847 {
2848         Event* ev = new Event (Event::Audition, Event::Add, Event::Immediate, 0, 0.0);
2849         ev->set_ptr ((void*) 0xfeedface);
2850         queue_event (ev);
2851 }
2852
2853 void
2854 Session::audition_region (AudioRegion& r)
2855 {
2856         Event* ev = new Event (Event::Audition, Event::Add, Event::Immediate, 0, 0.0);
2857         ev->set_ptr (&r);
2858         queue_event (ev);
2859 }
2860
2861 void
2862 Session::cancel_audition ()
2863 {
2864         if (auditioner->active()) {
2865                 auditioner->cancel_audition ();
2866                  AuditionActive (false); /* EMIT SIGNAL */
2867         }
2868 }
2869
2870 bool
2871 Session::RoutePublicOrderSorter::operator() (Route* a, Route* b)
2872 {
2873         return a->order_key(N_("signal")) < b->order_key(N_("signal"));
2874 }
2875
2876 void
2877 Session::remove_empty_sounds ()
2878 {
2879
2880         PathScanner scanner;
2881         string dir;
2882
2883         dir = sound_dir ();
2884
2885         vector<string *>* possible_audiofiles = scanner (dir, "\\.wav$", false, true);
2886         
2887         for (vector<string *>::iterator i = possible_audiofiles->begin(); i != possible_audiofiles->end(); ++i) {
2888
2889                 if (FileSource::is_empty (*(*i))) {
2890
2891                         unlink ((*i)->c_str());
2892                         
2893                         string peak_path = peak_path_from_audio_path (**i);
2894                         unlink (peak_path.c_str());
2895                 }
2896
2897                 delete* i;
2898         }
2899
2900         delete possible_audiofiles;
2901 }
2902
2903 bool
2904 Session::is_auditioning () const
2905 {
2906         /* can be called before we have an auditioner object */
2907         if (auditioner) {
2908                 return auditioner->active();
2909         } else {
2910                 return false;
2911         }
2912 }
2913
2914
2915 string
2916 Session::peak_path_from_audio_path (string audio_path)
2917 {
2918         /* XXX hardly bombproof! fix me */
2919
2920         string res;
2921
2922         res = PBD::dirname (audio_path);
2923         res = PBD::dirname (res);
2924         res += '/';
2925         res += peak_dir_name;
2926         res += '/';
2927         res += PBD::basename_nosuffix (audio_path);
2928         res += ".peak";
2929
2930         return res;
2931 }
2932
2933 string
2934 Session::old_peak_path_from_audio_path (string audio_path)
2935 {
2936         /* This is a hangover from when audio and peak files
2937            lived in the same directory. We need it to to 
2938            be able to open old sessions.
2939         */
2940
2941         /* XXX hardly bombproof! fix me */
2942
2943         string res = audio_path.substr (0, audio_path.find_last_of ('.'));
2944         res += ".peak";
2945         return res;
2946 }
2947
2948 void
2949 Session::set_all_solo (bool yn)
2950 {
2951         {
2952                 RWLockMonitor lm (route_lock, false, __LINE__, __FILE__);
2953                 
2954                 for (RouteList::iterator i = routes.begin(); i != routes.end(); ++i) {
2955                         if (!(*i)->hidden()) {
2956                                 (*i)->set_solo (yn, this);
2957                         }
2958                 }
2959         }
2960
2961         set_dirty();
2962 }
2963                 
2964 void
2965 Session::set_all_mute (bool yn)
2966 {
2967         {
2968                 RWLockMonitor lm (route_lock, false, __LINE__, __FILE__);
2969                 
2970                 for (RouteList::iterator i = routes.begin(); i != routes.end(); ++i) {
2971                         if (!(*i)->hidden()) {
2972                                 (*i)->set_mute (yn, this);
2973                         }
2974                 }
2975         }
2976
2977         set_dirty();
2978 }
2979                 
2980 uint32_t
2981 Session::n_diskstreams () const
2982 {
2983         RWLockMonitor lm (diskstream_lock, false, __LINE__, __FILE__);
2984         uint32_t n = 0;
2985
2986         for (DiskStreamList::const_iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) {
2987                 if (!(*i)->hidden()) {
2988                         n++;
2989                 }
2990         }
2991         return n;
2992 }
2993
2994 void 
2995 Session::foreach_diskstream (void (DiskStream::*func)(void)) 
2996 {
2997         RWLockMonitor lm (diskstream_lock, false, __LINE__, __FILE__);
2998         for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) {
2999                 if (!(*i)->hidden()) {
3000                         ((*i)->*func)();
3001                 }
3002         }
3003 }
3004
3005 void
3006 Session::graph_reordered ()
3007 {
3008         /* don't do this stuff if we are setting up connections
3009            from a set_state() call.
3010         */
3011
3012         if (_state_of_the_state & InitialConnecting) {
3013                 return;
3014         }
3015
3016         RWLockMonitor lm1 (route_lock, true, __LINE__, __FILE__);
3017         RWLockMonitor lm2 (diskstream_lock, false, __LINE__, __FILE__);
3018
3019         resort_routes (0);
3020
3021         /* force all diskstreams to update their capture offset values to 
3022            reflect any changes in latencies within the graph.
3023         */
3024         
3025         for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) {
3026                 (*i)->set_capture_offset ();
3027         }
3028 }
3029
3030 void
3031 Session::record_disenable_all ()
3032 {
3033         record_enable_change_all (false);
3034 }
3035
3036 void
3037 Session::record_enable_all ()
3038 {
3039         record_enable_change_all (true);
3040 }
3041
3042 void
3043 Session::record_enable_change_all (bool yn)
3044 {
3045         RWLockMonitor lm1 (route_lock, false, __LINE__, __FILE__);
3046         
3047         for (RouteList::iterator i = routes.begin(); i != routes.end(); ++i) {
3048                 AudioTrack* at;
3049
3050                 if ((at = dynamic_cast<AudioTrack*>(*i)) != 0) {
3051                         at->set_record_enable (yn, this);
3052                 }
3053         }
3054         
3055         /* since we don't keep rec-enable state, don't mark session dirty */
3056 }
3057
3058 void
3059 Session::add_redirect (Redirect* redirect)
3060 {
3061         Send* send;
3062         Insert* insert;
3063         PortInsert* port_insert;
3064         PluginInsert* plugin_insert;
3065
3066         if ((insert = dynamic_cast<Insert *> (redirect)) != 0) {
3067                 if ((port_insert = dynamic_cast<PortInsert *> (insert)) != 0) {
3068                         _port_inserts.insert (_port_inserts.begin(), port_insert);
3069                 } else if ((plugin_insert = dynamic_cast<PluginInsert *> (insert)) != 0) {
3070                         _plugin_inserts.insert (_plugin_inserts.begin(), plugin_insert);
3071                 } else {
3072                         fatal << _("programming error: unknown type of Insert created!") << endmsg;
3073                         /*NOTREACHED*/
3074                 }
3075         } else if ((send = dynamic_cast<Send *> (redirect)) != 0) {
3076                 _sends.insert (_sends.begin(), send);
3077         } else {
3078                 fatal << _("programming error: unknown type of Redirect created!") << endmsg;
3079                 /*NOTREACHED*/
3080         }
3081
3082         redirect->GoingAway.connect (mem_fun (*this, &Session::remove_redirect));
3083
3084         set_dirty();
3085 }
3086
3087 void
3088 Session::remove_redirect (Redirect* redirect)
3089 {
3090         Send* send;
3091         Insert* insert;
3092         PortInsert* port_insert;
3093         PluginInsert* plugin_insert;
3094
3095         if ((insert = dynamic_cast<Insert *> (redirect)) != 0) {
3096                 if ((port_insert = dynamic_cast<PortInsert *> (insert)) != 0) {
3097                         _port_inserts.remove (port_insert);
3098                 } else if ((plugin_insert = dynamic_cast<PluginInsert *> (insert)) != 0) {
3099                         _plugin_inserts.remove (plugin_insert);
3100                 } else {
3101                         fatal << _("programming error: unknown type of Insert deleted!") << endmsg;
3102                         /*NOTREACHED*/
3103                 }
3104         } else if ((send = dynamic_cast<Send *> (redirect)) != 0) {
3105                 _sends.remove (send);
3106         } else {
3107                 fatal << _("programming error: unknown type of Redirect deleted!") << endmsg;
3108                 /*NOTREACHED*/
3109         }
3110
3111         set_dirty();
3112 }
3113
3114 jack_nframes_t
3115 Session::available_capture_duration ()
3116 {
3117         const double scale = 4096.0 / sizeof (Sample);
3118         
3119         if (_total_free_4k_blocks * scale > (double) max_frames) {
3120                 return max_frames;
3121         }
3122         
3123         return (jack_nframes_t) floor (_total_free_4k_blocks * scale);
3124 }
3125
3126 void
3127 Session::add_connection (ARDOUR::Connection* connection)
3128 {
3129         {
3130                 LockMonitor (connection_lock, __LINE__, __FILE__);
3131                 _connections.push_back (connection);
3132         }
3133         
3134         ConnectionAdded (connection); /* EMIT SIGNAL */
3135
3136         set_dirty();
3137 }
3138
3139 void
3140 Session::remove_connection (ARDOUR::Connection* connection)
3141 {
3142         bool removed = false;
3143
3144         {
3145                 LockMonitor (connection_lock, __LINE__, __FILE__);
3146                 ConnectionList::iterator i = find (_connections.begin(), _connections.end(), connection);
3147                 
3148                 if (i != _connections.end()) {
3149                         _connections.erase (i);
3150                         removed = true;
3151                 }
3152         }
3153
3154         if (removed) {
3155                  ConnectionRemoved (connection); /* EMIT SIGNAL */
3156         }
3157
3158         set_dirty();
3159 }
3160
3161 ARDOUR::Connection *
3162 Session::connection_by_name (string name) const
3163 {
3164         LockMonitor lm (connection_lock, __LINE__, __FILE__);
3165
3166         for (ConnectionList::const_iterator i = _connections.begin(); i != _connections.end(); ++i) {
3167                 if ((*i)->name() == name) {
3168                         return* i;
3169                 }
3170         }
3171
3172         return 0;
3173 }
3174
3175 void
3176 Session::set_edit_mode (EditMode mode)
3177 {
3178         _edit_mode = mode;
3179         
3180         { 
3181                 LockMonitor lm (playlist_lock, __LINE__, __FILE__);
3182                 
3183                 for (PlaylistList::iterator i = playlists.begin(); i != playlists.end(); ++i) {
3184                         (*i)->set_edit_mode (mode);
3185                 }
3186         }
3187
3188         set_dirty ();
3189         ControlChanged (EditingMode); /* EMIT SIGNAL */
3190 }
3191
3192 void
3193 Session::tempo_map_changed (Change ignored)
3194 {
3195         clear_clicks ();
3196         set_dirty ();
3197 }
3198
3199 void
3200 Session::ensure_passthru_buffers (uint32_t howmany)
3201 {
3202         while (howmany > _passthru_buffers.size()) {
3203                 Sample *p;
3204 #ifdef NO_POSIX_MEMALIGN
3205                 p =  (Sample *) malloc(current_block_size * sizeof(Sample));
3206 #else
3207                 posix_memalign((void **)&p,16,current_block_size * 4);
3208 #endif                  
3209                 _passthru_buffers.push_back (p);
3210
3211                 *p = 0;
3212                 
3213 #ifdef NO_POSIX_MEMALIGN
3214                 p =  (Sample *) malloc(current_block_size * sizeof(Sample));
3215 #else
3216                 posix_memalign((void **)&p,16,current_block_size * 4);
3217 #endif                  
3218                 memset (p, 0, sizeof (Sample) * current_block_size);
3219                 _silent_buffers.push_back (p);
3220
3221         }
3222         allocate_pan_automation_buffers (current_block_size, howmany, false);
3223 }
3224
3225 string
3226 Session::next_send_name ()
3227 {
3228         char buf[32];
3229         snprintf (buf, sizeof (buf), "send %" PRIu32, ++send_cnt);
3230         return buf;
3231 }
3232
3233 string
3234 Session::next_insert_name ()
3235 {
3236         char buf[32];
3237         snprintf (buf, sizeof (buf), "insert %" PRIu32, ++insert_cnt);
3238         return buf;
3239 }
3240
3241 /* Named Selection management */
3242
3243 NamedSelection *
3244 Session::named_selection_by_name (string name)
3245 {
3246         LockMonitor lm (named_selection_lock, __LINE__, __FILE__);
3247         for (NamedSelectionList::iterator i = named_selections.begin(); i != named_selections.end(); ++i) {
3248                 if ((*i)->name == name) {
3249                         return* i;
3250                 }
3251         }
3252         return 0;
3253 }
3254
3255 void
3256 Session::add_named_selection (NamedSelection* named_selection)
3257 {
3258         { 
3259                 LockMonitor lm (named_selection_lock, __LINE__, __FILE__);
3260                 named_selections.insert (named_selections.begin(), named_selection);
3261         }
3262
3263         set_dirty();
3264
3265          NamedSelectionAdded (); /* EMIT SIGNAL */
3266 }
3267
3268 void
3269 Session::remove_named_selection (NamedSelection* named_selection)
3270 {
3271         bool removed = false;
3272
3273         { 
3274                 LockMonitor lm (named_selection_lock, __LINE__, __FILE__);
3275
3276                 NamedSelectionList::iterator i = find (named_selections.begin(), named_selections.end(), named_selection);
3277
3278                 if (i != named_selections.end()) {
3279                         delete (*i);
3280                         named_selections.erase (i);
3281                         set_dirty();
3282                         removed = true;
3283                 }
3284         }
3285
3286         if (removed) {
3287                  NamedSelectionRemoved (); /* EMIT SIGNAL */
3288         }
3289 }
3290
3291 void
3292 Session::reset_native_file_format ()
3293 {
3294         // jlc - WHY take routelock?
3295         //RWLockMonitor lm1 (route_lock, true, __LINE__, __FILE__);
3296         RWLockMonitor lm2 (diskstream_lock, false, __LINE__, __FILE__);
3297
3298         for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) {
3299                 (*i)->reset_write_sources (false);
3300         }
3301 }
3302
3303 bool
3304 Session::route_name_unique (string n) const
3305 {
3306         RWLockMonitor lm (route_lock, false, __LINE__, __FILE__);
3307         
3308         for (RouteList::const_iterator i = routes.begin(); i != routes.end(); ++i) {
3309                 if ((*i)->name() == n) {
3310                         return false;
3311                 }
3312         }
3313         
3314         return true;
3315 }
3316
3317 int
3318 Session::remove_file_source (FileSource& fs)
3319 {
3320         return fs.move_to_trash (dead_sound_dir_name);
3321 }
3322
3323 uint32_t
3324 Session::n_playlists () const
3325 {
3326         LockMonitor lm (playlist_lock, __LINE__, __FILE__);
3327         return playlists.size();
3328 }
3329
3330 void
3331 Session::set_solo_model (SoloModel sm)
3332 {
3333         if (sm != _solo_model) {
3334                 _solo_model = sm;
3335                 ControlChanged (SoloingModel);
3336                 set_dirty ();
3337         }
3338 }
3339
3340 void
3341 Session::allocate_pan_automation_buffers (jack_nframes_t nframes, uint32_t howmany, bool force)
3342 {
3343         if (!force && howmany <= _npan_buffers) {
3344                 return;
3345         }
3346
3347         if (_pan_automation_buffer) {
3348
3349                 for (uint32_t i = 0; i < _npan_buffers; ++i) {
3350                         delete [] _pan_automation_buffer[i];
3351                 }
3352
3353                 delete [] _pan_automation_buffer;
3354         }
3355
3356         _pan_automation_buffer = new pan_t*[howmany];
3357         
3358         for (uint32_t i = 0; i < howmany; ++i) {
3359                 _pan_automation_buffer[i] = new pan_t[nframes];
3360         }
3361
3362         _npan_buffers = howmany;
3363 }
3364
3365 void 
3366 Session::add_instant_xml (XMLNode& node, const std::string& dir)
3367 {
3368         Stateful::add_instant_xml (node, dir);
3369         Config->add_instant_xml (node, Config->get_user_ardour_path());
3370 }
3371
3372 int
3373 Session::freeze (InterThreadInfo& itt)
3374 {
3375         RWLockMonitor lm (route_lock, false, __LINE__, __FILE__);
3376
3377         for (RouteList::iterator i = routes.begin(); i != routes.end(); ++i) {
3378
3379                 AudioTrack *at;
3380
3381                 if ((at = dynamic_cast<AudioTrack*>(*i)) != 0) {
3382                         /* XXX this is wrong because itt.progress will keep returning to zero at the start
3383                            of every track.
3384                         */
3385                         at->freeze (itt);
3386                 }
3387         }
3388
3389         return 0;
3390 }
3391
3392 int
3393 Session::write_one_track (AudioTrack& track, jack_nframes_t start, jack_nframes_t len,  bool overwrite, vector<Source*>& srcs,
3394                           InterThreadInfo& itt)
3395 {
3396         int ret = -1;
3397         Playlist* playlist;
3398         FileSource* fsource;
3399         uint32_t x;
3400         char buf[PATH_MAX+1];
3401         string dir;
3402         uint32_t nchans;
3403         jack_nframes_t position;
3404         jack_nframes_t this_chunk;
3405         jack_nframes_t to_do;
3406         vector<Sample*> buffers;
3407         const jack_nframes_t chunk_size = (256 * 1024)/4;
3408
3409         atomic_set (&processing_prohibited, 1);
3410         
3411         /* call tree *MUST* hold route_lock */
3412         
3413         if ((playlist = track.disk_stream().playlist()) == 0) {
3414                 goto out;
3415         }
3416
3417         /* external redirects will be a problem */
3418
3419         if (track.has_external_redirects()) {
3420                 goto out;
3421         }
3422
3423         nchans = track.disk_stream().n_channels();
3424         
3425         dir = discover_best_sound_dir ();
3426
3427         for (uint32_t chan_n=0; chan_n < nchans; ++chan_n) {
3428
3429                 for (x = 0; x < 99999; ++x) {
3430                         snprintf (buf, sizeof(buf), "%s/%s-%d-bounce-%" PRIu32 ".wav", dir.c_str(), playlist->name().c_str(), chan_n, x+1);
3431                         if (access (buf, F_OK) != 0) {
3432                                 break;
3433                         }
3434                 }
3435                 
3436                 if (x == 99999) {
3437                         error << string_compose (_("too many bounced versions of playlist \"%1\""), playlist->name()) << endmsg;
3438                         goto out;
3439                 }
3440                 
3441                 try {
3442                         fsource = new FileSource (buf, frame_rate());
3443                 }
3444                 
3445                 catch (failed_constructor& err) {
3446                         error << string_compose (_("cannot create new audio file \"%1\" for %2"), buf, track.name()) << endmsg;
3447                         goto out;
3448                 }
3449
3450                 srcs.push_back(fsource);
3451         }
3452
3453         /* XXX need to flush all redirects */
3454         
3455         position = start;
3456         to_do = len;
3457
3458         /* create a set of reasonably-sized buffers */
3459
3460         for (vector<Sample*>::iterator i = _passthru_buffers.begin(); i != _passthru_buffers.end(); ++i) {
3461                 Sample* b;
3462 #ifdef NO_POSIX_MEMALIGN
3463                 b =  (Sample *) malloc(chunk_size * sizeof(Sample));
3464 #else
3465                 posix_memalign((void **)&b,16,chunk_size * 4);
3466 #endif                  
3467                 buffers.push_back (b);
3468         }
3469         
3470         while (to_do && !itt.cancel) {
3471                 
3472                 this_chunk = min (to_do, chunk_size);
3473                 
3474                 if (track.export_stuff (buffers, nchans, start, this_chunk)) {
3475                         goto out;
3476                 }
3477
3478                 uint32_t n = 0;
3479                 for (vector<Source*>::iterator src=srcs.begin(); src != srcs.end(); ++src, ++n) {
3480                         if ((*src)->write (buffers[n], this_chunk) != this_chunk) {
3481                                 goto out;
3482                         }
3483                 }
3484                 
3485                 start += this_chunk;
3486                 to_do -= this_chunk;
3487                 
3488                 itt.progress = (float) (1.0 - ((double) to_do / len));
3489
3490         }
3491
3492         if (!itt.cancel) {
3493                 
3494                 time_t now;
3495                 struct tm* xnow;
3496                 time (&now);
3497                 xnow = localtime (&now);
3498                 
3499                 for (vector<Source*>::iterator src=srcs.begin(); src != srcs.end(); ++src) {
3500                         dynamic_cast<FileSource*>((*src))->update_header (position, *xnow, now);
3501                 }
3502                 
3503                 /* build peakfile for new source */
3504                 
3505                 for (vector<Source*>::iterator src=srcs.begin(); src != srcs.end(); ++src) {
3506                         dynamic_cast<FileSource*>(*src)->build_peaks ();
3507                 }
3508                 
3509                 ret = 0;
3510         }
3511                 
3512   out:
3513         if (ret) {
3514                 for (vector<Source*>::iterator src=srcs.begin(); src != srcs.end(); ++src) {
3515                         dynamic_cast<FileSource*>(*src)->mark_for_remove ();
3516                         delete *src;
3517                 }
3518         }
3519
3520         for (vector<Sample*>::iterator i = buffers.begin(); i != buffers.end(); ++i) {
3521                 free(*i);
3522         }
3523
3524         atomic_set (&processing_prohibited, 0);
3525
3526         itt.done = true;
3527
3528         return ret;
3529 }
3530
3531 vector<Sample*>&
3532 Session::get_silent_buffers (uint32_t howmany)
3533 {
3534         for (uint32_t i = 0; i < howmany; ++i) {
3535                 memset (_silent_buffers[i], 0, sizeof (Sample) * current_block_size);
3536         }
3537         return _silent_buffers;
3538 }
3539
3540 uint32_t 
3541 Session::ntracks () const
3542 {
3543         uint32_t n = 0;
3544         RWLockMonitor lm (route_lock, false, __LINE__, __FILE__);
3545
3546         for (RouteList::const_iterator i = routes.begin(); i != routes.end(); ++i) {
3547                 if (dynamic_cast<AudioTrack*> (*i)) {
3548                         ++n;
3549                 }
3550         }
3551
3552         return n;
3553 }
3554
3555 uint32_t 
3556 Session::nbusses () const
3557 {
3558         uint32_t n = 0;
3559         RWLockMonitor lm (route_lock, false, __LINE__, __FILE__);
3560
3561         for (RouteList::const_iterator i = routes.begin(); i != routes.end(); ++i) {
3562                 if (dynamic_cast<AudioTrack*> (*i) == 0) {
3563                         ++n;
3564                 }
3565         }
3566
3567         return n;
3568 }
3569
3570 void
3571 Session::set_layer_model (LayerModel lm)
3572 {
3573         if (lm != layer_model) {
3574                 layer_model = lm;
3575                 set_dirty ();
3576                 ControlChanged (LayeringModel);
3577         }
3578 }
3579
3580 void
3581 Session::set_xfade_model (CrossfadeModel xm)
3582 {
3583         if (xm != xfade_model) {
3584                 xfade_model = xm;
3585                 set_dirty ();
3586                 ControlChanged (CrossfadingModel);
3587         }
3588 }
3589