meet rhythm ferret: cute, furry and always on time (ardour build now requires fftw3...
[ardour.git] / libs / ardour / ardour / session.h
1 /*
2     Copyright (C) 2000 Paul Davis 
3
4     This program is free software; you can redistribute it and/or modify
5     it under the terms of the GNU General Public License as published by
6     the Free Software Foundation; either version 2 of the License, or
7     (at your option) any later version.
8
9     This program is distributed in the hope that it will be useful,
10     but WITHOUT ANY WARRANTY; without even the implied warranty of
11     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12     GNU General Public License for more details.
13
14     You should have received a copy of the GNU General Public License
15     along with this program; if not, write to the Free Software
16     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17
18 */
19
20 #ifndef __ardour_session_h__
21 #define __ardour_session_h__
22
23
24 #include <string>
25 #include <list>
26 #include <map>
27 #include <vector>
28 #include <set>
29 #include <stack>
30
31 #include <boost/weak_ptr.hpp>
32 #include <boost/dynamic_bitset.hpp>
33
34 #include <stdint.h>
35
36 #include <sndfile.h>
37
38 #include <glibmm/thread.h>
39
40 #include <pbd/error.h>
41 #include <pbd/undo.h>
42 #include <pbd/pool.h>
43 #include <pbd/rcu.h>
44 #include <pbd/statefuldestructible.h>
45
46 #include <midi++/types.h>
47 #include <midi++/mmc.h>
48
49 #include <pbd/stateful.h> 
50 #include <pbd/destructible.h> 
51
52 #include <ardour/ardour.h>
53 #include <ardour/configuration.h>
54 #include <ardour/location.h>
55 #include <ardour/gain.h>
56 #include <ardour/io.h>
57
58 class XMLTree;
59 class XMLNode;
60 class AEffect;
61
62 namespace MIDI {
63         class Port;
64 }
65
66 namespace PBD {
67         class Controllable;
68 }
69
70 namespace ARDOUR {
71
72 class Port;
73 class AudioEngine;
74 class Slave;
75 class Diskstream;       
76 class AudioDiskstream;  
77 class Route;
78 class AuxInput;
79 class Source;
80 class AudioSource;
81 class AudioFileSource;
82 class Auditioner;
83 class Insert;
84 class Send;
85 class Redirect;
86 class PortInsert;
87 class PluginInsert;
88 class Connection;
89 class TempoMap;
90 class AudioTrack;
91 class NamedSelection;
92 class AudioRegion;
93 class Region;
94 class Playlist;
95 class VSTPlugin;
96 class ControlProtocolInfo;
97
98 struct AudioExportSpecification;
99 struct RouteGroup;
100
101 using std::vector;
102 using std::string;
103 using std::map;
104 using std::set;
105
106 class Session : public PBD::StatefulDestructible
107
108 {
109   private:
110         typedef std::pair<boost::weak_ptr<Route>,bool> RouteBooleanState;
111         typedef vector<RouteBooleanState> GlobalRouteBooleanState;
112         typedef std::pair<boost::weak_ptr<Route>,MeterPoint> RouteMeterState;
113         typedef vector<RouteMeterState> GlobalRouteMeterState;
114
115   public:
116         enum RecordState {
117                 Disabled = 0,
118                 Enabled = 1,
119                 Recording = 2
120         };
121
122         struct Event {
123             enum Type {
124                     SetTransportSpeed,
125                     SetDiskstreamSpeed,
126                     Locate,
127                     LocateRoll,
128                     LocateRollLocate,
129                     SetLoop,
130                     PunchIn,
131                     PunchOut,
132                     RangeStop,
133                     RangeLocate,
134                     Overwrite,
135                     SetSlaveSource,
136                     Audition,
137                     InputConfigurationChange,
138                     SetAudioRange,
139                     SetPlayRange,
140                     
141                     /* only one of each of these events
142                        can be queued at any one time
143                     */
144
145                     StopOnce,
146                     AutoLoop
147             };
148
149             enum Action {
150                     Add,
151                     Remove,
152                     Replace,
153                     Clear
154             };
155
156             Type           type;
157             Action         action;
158             nframes_t action_frame;
159             nframes_t target_frame;
160             float          speed;
161
162             union {
163                         void*                ptr;
164                         bool                 yes_or_no;
165                         SlaveSource slave;
166             };
167
168             boost::shared_ptr<Region>     region;
169
170             list<AudioRange>     audio_range;
171             list<MusicRange>     music_range;
172
173             Event(Type t, Action a, nframes_t when, nframes_t where, float spd, bool yn = false)
174                     : type (t), 
175                       action (a),
176                       action_frame (when),
177                       target_frame (where),
178                       speed (spd),
179                       yes_or_no (yn) {}
180
181             void set_ptr (void* p) { 
182                     ptr = p;
183             }
184
185             bool before (const Event& other) const {
186                     return action_frame < other.action_frame;
187             }
188
189             bool after (const Event& other) const {
190                     return action_frame > other.action_frame;
191             }
192
193             static bool compare (const Event *e1, const Event *e2) {
194                     return e1->before (*e2);
195             }
196
197             void *operator new (size_t ignored) {
198                     return pool.alloc ();
199             }
200
201             void operator delete(void *ptr, size_t size) {
202                     pool.release (ptr);
203             }
204
205             static const nframes_t Immediate = 0;
206
207          private:
208             static MultiAllocSingleReleasePool pool;
209         };
210
211         /* creating from an XML file */
212
213         Session (AudioEngine&,
214                  const string& fullpath,
215                  const string& snapshot_name,
216                  string mix_template = "");
217
218         /* creating a new Session */
219
220         Session (AudioEngine&,
221                  string fullpath,
222                  string snapshot_name,
223                  AutoConnectOption input_auto_connect,
224                  AutoConnectOption output_auto_connect,
225                  uint32_t control_out_channels,
226                  uint32_t master_out_channels,
227                  uint32_t n_physical_in,
228                  uint32_t n_physical_out,
229                  nframes_t initial_length);
230         
231         virtual ~Session ();
232
233
234         static int find_session (string str, string& path, string& snapshot, bool& isnew);
235         
236         string path() const { return _path; }
237         string name() const { return _name; }
238         string snap_name() const { return _current_snapshot_name; }
239         string raid_path () const;
240         string export_dir () const;
241
242         void set_snap_name ();
243
244         void set_dirty ();
245         void set_clean ();
246         bool dirty() const { return _state_of_the_state & Dirty; }
247         void set_deletion_in_progress ();
248         bool deletion_in_progress() const { return _state_of_the_state & Deletion; }
249         sigc::signal<void> DirtyChanged;
250
251         std::string sound_dir (bool with_path = true) const;
252         std::string peak_dir () const;
253         std::string dead_sound_dir () const;
254         std::string automation_dir () const;
255         std::string analysis_dir() const;
256         
257         int ensure_subdirs ();
258
259         Glib::ustring peak_path (Glib::ustring) const;
260
261         static string suffixed_search_path (std::string suffix, bool data);
262         static string control_protocol_path ();
263         static string template_path ();
264         static string template_dir ();
265         static void get_template_list (list<string>&);
266         
267         static string change_audio_path_by_name (string oldpath, string oldname, string newname, bool destructive);
268         string audio_path_from_name (string, uint32_t nchans, uint32_t chan, bool destructive);
269
270         void process (nframes_t nframes);
271
272         vector<Sample*>& get_passthru_buffers() { return _passthru_buffers; }
273         vector<Sample*>& get_silent_buffers (uint32_t howmany);
274         vector<Sample*>& get_send_buffers () { return _send_buffers; }
275
276         void add_diskstream (boost::shared_ptr<Diskstream>);
277         boost::shared_ptr<Diskstream> diskstream_by_id (const PBD::ID& id);
278         boost::shared_ptr<Diskstream> diskstream_by_name (string name);
279
280         bool have_captured() const { return _have_captured; }
281
282         void refill_all_diskstream_buffers ();
283         uint32_t diskstream_buffer_size() const { return dstream_buffer_size; }
284         
285         uint32_t get_next_diskstream_id() const { return n_diskstreams(); }
286         uint32_t n_diskstreams() const;
287         
288         typedef std::list<boost::shared_ptr<Diskstream> > DiskstreamList;
289         typedef std::list<boost::shared_ptr<Route> >      RouteList; 
290
291         boost::shared_ptr<RouteList> get_routes() const {
292                 return routes.reader ();
293         }
294
295         uint32_t nroutes() const { return routes.reader()->size(); }
296         uint32_t ntracks () const;
297         uint32_t nbusses () const;
298
299         struct RoutePublicOrderSorter {
300             bool operator() (boost::shared_ptr<Route>, boost::shared_ptr<Route> b);
301         };
302         
303         template<class T> void foreach_route (T *obj, void (T::*func)(Route&));
304         template<class T> void foreach_route (T *obj, void (T::*func)(boost::shared_ptr<Route>));
305         template<class T, class A> void foreach_route (T *obj, void (T::*func)(Route&, A), A arg);
306
307         boost::shared_ptr<Route> route_by_name (string);
308         boost::shared_ptr<Route> route_by_id (PBD::ID);
309         boost::shared_ptr<Route> route_by_remote_id (uint32_t id);
310
311         bool route_name_unique (string) const;
312
313         bool get_record_enabled() const { 
314                 return (record_status () >= Enabled);
315         }
316
317         RecordState record_status() const {
318                 return (RecordState) g_atomic_int_get (&_record_status);
319         }
320
321         bool actively_recording () {
322                 return record_status() == Recording;
323         }
324
325         bool record_enabling_legal () const;
326         void maybe_enable_record ();
327         void disable_record (bool rt_context, bool force = false);
328         void step_back_from_record ();
329         
330         void maybe_write_autosave ();
331
332         /* Proxy signal for region hidden changes */
333
334         sigc::signal<void,boost::shared_ptr<Region> > RegionHiddenChange;
335
336         /* Emitted when all i/o connections are complete */
337         
338         sigc::signal<void> IOConnectionsComplete;
339         
340         /* Record status signals */
341
342         sigc::signal<void> RecordStateChanged;
343
344         /* Transport mechanism signals */
345
346         sigc::signal<void> TransportStateChange; /* generic */
347         sigc::signal<void,nframes_t> PositionChanged; /* sent after any non-sequential motion */
348         sigc::signal<void> DurationChanged;
349         sigc::signal<void> HaltOnXrun;
350         sigc::signal<void> TransportLooped;
351
352         sigc::signal<void,RouteList&> RouteAdded;
353
354         void request_roll_at_and_return (nframes_t start, nframes_t return_to);
355         void request_bounded_roll (nframes_t start, nframes_t end);
356         void request_stop (bool abort = false);
357         void request_locate (nframes_t frame, bool with_roll = false);
358
359         void request_play_loop (bool yn);
360         bool get_play_loop () const { return play_loop; }
361
362         nframes_t  last_transport_start() const { return _last_roll_location; }
363         void goto_end ()   { request_locate (end_location->start(), false);}
364         void goto_start () { request_locate (start_location->start(), false); }
365         void set_session_start (nframes_t start) { start_location->set_start(start); }
366         void set_session_end (nframes_t end) { end_location->set_start(end); _end_location_is_free = false; }
367         void use_rf_shuttle_speed ();
368         void allow_auto_play (bool yn);
369         void request_transport_speed (float speed);
370         void request_overwrite_buffer (Diskstream*);
371         void request_diskstream_speed (Diskstream&, float speed);
372         void request_input_change_handling ();
373
374         bool locate_pending() const { return static_cast<bool>(post_transport_work&PostTransportLocate); }
375         bool transport_locked () const;
376
377         int wipe ();
378
379         int remove_region_from_region_list (boost::shared_ptr<Region>);
380
381         nframes_t get_maximum_extent () const;
382         nframes_t current_end_frame() const { return end_location->start(); }
383         nframes_t current_start_frame() const { return start_location->start(); }
384         nframes_t frame_rate() const   { return _current_frame_rate; }
385         nframes_t frames_per_hour() const { return _frames_per_hour; }
386
387         double frames_per_smpte_frame() const { return _frames_per_smpte_frame; }
388         nframes_t smpte_frames_per_hour() const { return _smpte_frames_per_hour; }
389
390         float smpte_frames_per_second() const;
391         bool smpte_drop_frames() const;
392
393         /* Locations */
394
395         Locations *locations() { return &_locations; }
396
397         sigc::signal<void,Location*>    auto_loop_location_changed;
398         sigc::signal<void,Location*>    auto_punch_location_changed;
399         sigc::signal<void>              locations_modified;
400
401         void set_auto_punch_location (Location *);
402         void set_auto_loop_location (Location *);
403         int location_name(string& result, string base = string(""));
404
405         void reset_input_monitor_state ();
406
407         void add_event (nframes_t action_frame, Event::Type type, nframes_t target_frame = 0);
408         void remove_event (nframes_t frame, Event::Type type);
409         void clear_events (Event::Type type);
410
411         nframes_t get_block_size() const { return current_block_size; }
412         nframes_t worst_output_latency () const { return _worst_output_latency; }
413         nframes_t worst_input_latency () const { return _worst_input_latency; }
414         nframes_t worst_track_latency () const { return _worst_track_latency; }
415
416         int save_state (string snapshot_name, bool pending = false);
417         int restore_state (string snapshot_name);
418         int save_template (string template_name);
419         int save_history (string snapshot_name = "");
420         int restore_history (string snapshot_name);
421         void remove_state (string snapshot_name);
422         void rename_state (string old_name, string new_name);
423         void remove_pending_capture_state ();
424
425         static int rename_template (string old_name, string new_name);
426
427         static int delete_template (string name);
428         
429         sigc::signal<void,string> StateSaved;
430         sigc::signal<void> StateReady;
431
432         vector<string*>* possible_states() const;
433         static vector<string*>* possible_states(string path);
434
435         XMLNode& get_state();
436         int      set_state(const XMLNode& node); // not idempotent
437         XMLNode& get_template();
438         
439         void add_instant_xml (XMLNode&, const std::string& dir);
440
441         enum StateOfTheState {
442                 Clean = 0x0,
443                 Dirty = 0x1,
444                 CannotSave = 0x2,
445                 Deletion = 0x4,
446                 InitialConnecting = 0x8,
447                 Loading = 0x10,
448                 InCleanup = 0x20
449         };
450
451         StateOfTheState state_of_the_state() const { return _state_of_the_state; }
452
453         RouteGroup* add_edit_group (string);
454         RouteGroup* add_mix_group (string);
455
456         void remove_edit_group (RouteGroup&);
457         void remove_mix_group (RouteGroup&);
458
459         RouteGroup *mix_group_by_name (string);
460         RouteGroup *edit_group_by_name (string);
461
462         sigc::signal<void,RouteGroup*> edit_group_added;
463         sigc::signal<void,RouteGroup*> mix_group_added;
464         sigc::signal<void> edit_group_removed;
465         sigc::signal<void> mix_group_removed;
466
467         void foreach_edit_group (sigc::slot<void,RouteGroup*> sl) {
468                 for (list<RouteGroup *>::iterator i = edit_groups.begin(); i != edit_groups.end(); i++) {
469                         sl (*i);
470                 }
471         }
472
473         void foreach_mix_group (sigc::slot<void,RouteGroup*> sl) {
474                 for (list<RouteGroup *>::iterator i = mix_groups.begin(); i != mix_groups.end(); i++) {
475                         sl (*i);
476                 }
477         }
478
479         /* fundamental operations. duh. */
480
481         std::list<boost::shared_ptr<AudioTrack> > new_audio_track (int input_channels, int output_channels, TrackMode mode = Normal, uint32_t how_many = 1);
482         RouteList new_audio_route (int input_channels, int output_channels, uint32_t how_many);
483
484         void   remove_route (boost::shared_ptr<Route>);
485
486         void   resort_routes ();
487         void   resort_routes_using (boost::shared_ptr<RouteList>);
488
489         void    set_remote_control_ids();
490
491         AudioEngine &engine() { return _engine; };
492
493         int32_t  max_level;
494         int32_t  min_level;
495
496         /* Time */
497
498         nframes_t transport_frame () const {return _transport_frame; }
499         nframes_t audible_frame () const;
500         nframes64_t requested_return_frame() const { return _requested_return_frame; }
501
502         enum PullupFormat {
503                 pullup_Plus4Plus1,
504                 pullup_Plus4,
505                 pullup_Plus4Minus1,
506                 pullup_Plus1,
507                 pullup_None,
508                 pullup_Minus1,
509                 pullup_Minus4Plus1,
510                 pullup_Minus4,
511                 pullup_Minus4Minus1
512         };
513
514         int  set_smpte_format (SmpteFormat);
515         void sync_time_vars();
516
517         void bbt_time (nframes_t when, BBT_Time&);
518         void smpte_to_sample( SMPTE::Time& smpte, nframes_t& sample, bool use_offset, bool use_subframes ) const;
519         void sample_to_smpte( nframes_t sample, SMPTE::Time& smpte, bool use_offset, bool use_subframes ) const;
520         void smpte_time (SMPTE::Time &);
521         void smpte_time (nframes_t when, SMPTE::Time&);
522         void smpte_time_subframes (nframes_t when, SMPTE::Time&);
523
524         void smpte_duration (nframes_t, SMPTE::Time&) const;
525         void smpte_duration_string (char *, nframes_t) const;
526
527         void           set_smpte_offset (nframes_t);
528         nframes_t smpte_offset () const { return _smpte_offset; }
529         void           set_smpte_offset_negative (bool);
530         bool           smpte_offset_negative () const { return _smpte_offset_negative; }
531
532         nframes_t convert_to_frames_at (nframes_t position, AnyTime&);
533
534         static sigc::signal<void> StartTimeChanged;
535         static sigc::signal<void> EndTimeChanged;
536         static sigc::signal<void> SMPTEOffsetChanged;
537
538         void        request_slave_source (SlaveSource);
539         bool        synced_to_jack() const { return Config->get_slave_source() == JACK; }
540
541         float       transport_speed() const { return _transport_speed; }
542         bool        transport_stopped() const { return _transport_speed == 0.0f; }
543         bool        transport_rolling() const { return _transport_speed != 0.0f; }
544
545         void set_silent (bool yn);
546         bool silent () { return _silent; }
547
548         int jack_slave_sync (nframes_t);
549
550         TempoMap& tempo_map() { return *_tempo_map; }
551         
552         /* region info  */
553
554         sigc::signal<void,boost::weak_ptr<AudioRegion> > AudioRegionAdded;
555         sigc::signal<void,boost::weak_ptr<AudioRegion> > AudioRegionRemoved;
556
557         int region_name (string& result, string base = string(""), bool newlevel = false) const;
558         string new_region_name (string);
559         string path_from_region_name (string name, string identifier);
560
561         boost::shared_ptr<AudioRegion> find_whole_file_parent (boost::shared_ptr<AudioRegion const>);
562         void find_equivalent_playlist_regions (boost::shared_ptr<Region>, std::vector<boost::shared_ptr<Region> >& result);
563
564         boost::shared_ptr<AudioRegion> XMLRegionFactory (const XMLNode&, bool full);
565
566         template<class T> void foreach_audio_region (T *obj, void (T::*func)(boost::shared_ptr<AudioRegion>));
567
568         /* source management */
569
570         struct import_status : public InterThreadInfo {
571             string doing_what;
572             
573             /* control info */
574             bool sample_convert;
575             SrcQuality quality;
576             volatile bool freeze;
577             std::vector<Glib::ustring> paths;
578             
579             /* result */
580             SourceList sources;
581             
582         };
583
584         void import_audiofiles (import_status&);
585         bool sample_rate_convert (import_status&, string infile, string& outfile);
586         string build_tmp_convert_name (string file);
587
588         SlaveSource post_export_slave;
589         nframes_t post_export_position;
590
591         int start_audio_export (ARDOUR::AudioExportSpecification&);
592         int stop_audio_export (ARDOUR::AudioExportSpecification&);
593         void finalize_audio_export ();
594
595         void add_source (boost::shared_ptr<Source>);
596         void remove_source (boost::weak_ptr<Source>);
597
598         struct cleanup_report {
599             vector<string> paths;
600             int64_t space;
601         };
602
603         int  cleanup_sources (cleanup_report&);
604         int  cleanup_trash_sources (cleanup_report&);
605
606         int destroy_region (boost::shared_ptr<Region>);
607         int destroy_regions (std::list<boost::shared_ptr<Region> >);
608
609         int remove_last_capture ();
610
611         /* handlers should return -1 for "stop cleanup", 0 for
612            "yes, delete this playlist" and 1 for "no, don't delete
613            this playlist.
614         */
615         
616         sigc::signal<int,boost::shared_ptr<ARDOUR::Playlist> > AskAboutPlaylistDeletion;
617
618         /* handlers should return !0 for use pending state, 0 for
619            ignore it.
620         */
621
622         static sigc::signal<int> AskAboutPendingState;
623         
624         boost::shared_ptr<AudioFileSource> create_audio_source_for_session (ARDOUR::AudioDiskstream&, uint32_t which_channel, bool destructive);
625
626         boost::shared_ptr<Source> source_by_id (const PBD::ID&);
627         boost::shared_ptr<Source> source_by_path_and_channel (const Glib::ustring&, uint16_t);
628
629         /* playlist management */
630
631         boost::shared_ptr<Playlist> playlist_by_name (string name);
632         void add_playlist (boost::shared_ptr<Playlist>);
633         sigc::signal<void,boost::shared_ptr<Playlist> > PlaylistAdded;
634         sigc::signal<void,boost::shared_ptr<Playlist> > PlaylistRemoved;
635
636         uint32_t n_playlists() const;
637
638         template<class T> void foreach_playlist (T *obj, void (T::*func)(boost::shared_ptr<Playlist>));
639         void get_playlists (std::vector<boost::shared_ptr<Playlist> >&);
640
641         /* named selections */
642
643         NamedSelection* named_selection_by_name (string name);
644         void add_named_selection (NamedSelection *);
645         void remove_named_selection (NamedSelection *);
646
647         template<class T> void foreach_named_selection (T& obj, void (T::*func)(NamedSelection&));
648         sigc::signal<void> NamedSelectionAdded;
649         sigc::signal<void> NamedSelectionRemoved;
650
651         /* Curves and AutomationLists (TODO when they go away) */
652         void add_curve(Curve*);
653         void add_automation_list(AutomationList*);
654
655         /* fade curves */
656
657         float get_default_fade_length () const { return default_fade_msecs; }
658         float get_default_fade_steepness () const { return default_fade_steepness; }
659         void set_default_fade (float steepness, float msecs);
660
661         /* auditioning */
662
663         boost::shared_ptr<Auditioner> the_auditioner() { return auditioner; }
664         void audition_playlist ();
665         void audition_region (boost::shared_ptr<Region>);
666         void cancel_audition ();
667         bool is_auditioning () const;
668         
669         sigc::signal<void,bool> AuditionActive;
670
671         /* flattening stuff */
672
673         int write_one_audio_track (AudioTrack&, nframes_t start, nframes_t cnt, bool overwrite, vector<boost::shared_ptr<AudioSource> >&,
674                                    InterThreadInfo& wot);
675         int freeze (InterThreadInfo&);
676
677         /* session-wide solo/mute/rec-enable */
678         
679         bool soloing() const { return currently_soloing; }
680
681         void set_all_solo (bool);
682         void set_all_mute (bool);
683
684         sigc::signal<void,bool> SoloActive;
685         sigc::signal<void> SoloChanged;
686         
687         void record_disenable_all ();
688         void record_enable_all ();
689
690         /* control/master out */
691
692         boost::shared_ptr<IO> control_out() const { return _control_out; }
693         boost::shared_ptr<IO> master_out() const { return _master_out; }
694
695         /* insert/send management */
696         
697         uint32_t n_port_inserts() const { return _port_inserts.size(); }
698         uint32_t n_plugin_inserts() const { return _plugin_inserts.size(); }
699         uint32_t n_sends() const { return _sends.size(); }
700
701         static void set_disable_all_loaded_plugins (bool yn) { 
702                 _disable_all_loaded_plugins = yn;
703         }
704         static bool get_disable_all_loaded_plugins() { 
705                 return _disable_all_loaded_plugins;
706         }
707
708         uint32_t next_send_id();
709         uint32_t next_insert_id();
710         void mark_send_id (uint32_t);
711         void mark_insert_id (uint32_t);
712
713         /* s/w "RAID" management */
714         
715         nframes_t available_capture_duration();
716
717         /* I/O Connections */
718
719         template<class T> void foreach_connection (T *obj, void (T::*func)(Connection *));
720         void add_connection (Connection *);
721         void remove_connection (Connection *);
722         Connection *connection_by_name (string) const;
723
724         sigc::signal<void,Connection *> ConnectionAdded;
725         sigc::signal<void,Connection *> ConnectionRemoved;
726
727         /* MIDI */
728
729         int set_mtc_port (string port_tag);
730         int set_mmc_port (string port_tag);
731         int set_midi_port (string port_tag);
732         MIDI::Port *mtc_port() const { return _mtc_port; }
733         MIDI::Port *mmc_port() const { return _mmc_port; }
734         MIDI::Port *midi_port() const { return _midi_port; }
735
736         sigc::signal<void> MTC_PortChanged;
737         sigc::signal<void> MMC_PortChanged;
738         sigc::signal<void> MIDI_PortChanged;
739
740         void set_trace_midi_input (bool, MIDI::Port* port = 0);
741         void set_trace_midi_output (bool, MIDI::Port* port = 0);
742
743         bool get_trace_midi_input(MIDI::Port *port = 0);
744         bool get_trace_midi_output(MIDI::Port *port = 0);
745         
746         void send_midi_message (MIDI::Port * port, MIDI::eventType ev, MIDI::channel_t, MIDI::EventTwoBytes);
747
748         void deliver_midi (MIDI::Port*, MIDI::byte*, int32_t size);
749
750         void set_mmc_receive_device_id (uint32_t id);
751         void set_mmc_send_device_id (uint32_t id);
752         
753         /* Scrubbing */
754
755         void start_scrub (nframes_t where);
756         void stop_scrub ();
757         void set_scrub_speed (float);
758         nframes_t scrub_buffer_size() const;
759         sigc::signal<void> ScrubReady;
760
761         /* History (for editors, mixers, UIs etc.) */
762
763         void undo (uint32_t n) {
764                 _history.undo (n);
765         }
766
767         void redo (uint32_t n) {
768                 _history.redo (n);
769         }
770
771         UndoHistory& history() { return _history; }
772         
773         uint32_t undo_depth() const { return _history.undo_depth(); }
774         uint32_t redo_depth() const { return _history.redo_depth(); }
775         string next_undo() const { return _history.next_undo(); }
776         string next_redo() const { return _history.next_redo(); }
777
778         void begin_reversible_command (string cmd_name);
779         void commit_reversible_command (Command* cmd = 0);
780
781         void add_command (Command *const cmd) {
782                 current_trans->add_command (cmd);
783         }
784
785         std::map<PBD::ID, PBD::StatefulThingWithGoingAway*> registry;
786
787         // these commands are implemented in libs/ardour/session_command.cc
788         Command* memento_command_factory(XMLNode* n);
789         void register_with_memento_command_factory(PBD::ID, PBD::StatefulThingWithGoingAway*);
790
791         Command* global_state_command_factory (const XMLNode& n);
792
793         class GlobalRouteStateCommand : public Command
794         {
795           public:
796                 GlobalRouteStateCommand (Session&, void*);
797                 GlobalRouteStateCommand (Session&, const XMLNode& node);
798                 int set_state (const XMLNode&);
799                 XMLNode& get_state ();
800
801           protected:
802                 GlobalRouteBooleanState before, after;
803                 Session& sess;
804                 void* src;
805                 
806         };
807
808         class GlobalSoloStateCommand : public GlobalRouteStateCommand
809         {
810           public:
811                 GlobalSoloStateCommand (Session &, void *src);
812                 GlobalSoloStateCommand (Session&, const XMLNode&);
813                 void operator()(); //redo
814                 void undo();
815                 XMLNode &get_state();
816                 void mark();
817         };
818
819         class GlobalMuteStateCommand : public GlobalRouteStateCommand
820         {
821           public:
822                 GlobalMuteStateCommand(Session &, void *src);
823                 GlobalMuteStateCommand (Session&, const XMLNode&);
824                 void operator()(); // redo
825                 void undo();
826                 XMLNode &get_state();
827                 void mark();
828         };
829
830         class GlobalRecordEnableStateCommand : public GlobalRouteStateCommand
831         {
832           public:
833                 GlobalRecordEnableStateCommand(Session &, void *src);
834                 GlobalRecordEnableStateCommand (Session&, const XMLNode&);
835                 void operator()(); // redo
836                 void undo();
837                 XMLNode &get_state();
838                 void mark();
839         };
840
841         class GlobalMeteringStateCommand : public Command
842         {
843           public:
844                 GlobalMeteringStateCommand(Session &, void *src);
845                 GlobalMeteringStateCommand (Session&, const XMLNode&);
846                 void operator()();
847                 void undo();
848                 XMLNode &get_state();
849                 int set_state (const XMLNode&);
850                 void mark();
851
852           protected:
853                 Session& sess;
854                 void* src;
855                 GlobalRouteMeterState before;
856                 GlobalRouteMeterState after;
857         };
858
859         /* clicking */
860
861         boost::shared_ptr<IO>  click_io() { return _click_io; }
862                 
863         /* disk, buffer loads */
864
865         uint32_t playback_load ();
866         uint32_t capture_load ();
867         uint32_t playback_load_min ();
868         uint32_t capture_load_min ();
869
870         void reset_playback_load_min ();
871         void reset_capture_load_min ();
872         
873         float read_data_rate () const;
874         float write_data_rate () const;
875
876         /* ranges */
877
878         void set_audio_range (list<AudioRange>&);
879         void set_music_range (list<MusicRange>&);
880
881         void request_play_range (bool yn);
882         bool get_play_range () const { return _play_range; }
883
884         /* favorite dirs */
885         typedef vector<string> FavoriteDirs;
886
887         static int read_favorite_dirs (FavoriteDirs&);
888
889         static int write_favorite_dirs (FavoriteDirs&);
890         
891         /* file suffixes */
892
893         static const char* template_suffix() { return _template_suffix; }
894         static const char* statefile_suffix() { return _statefile_suffix; }
895         static const char* pending_suffix() { return _pending_suffix; }
896
897         /* buffers for gain and pan */
898
899         gain_t* gain_automation_buffer () const { return _gain_automation_buffer; }
900         pan_t** pan_automation_buffer() const { return _pan_automation_buffer; }
901
902         /* buffers for conversion */
903         enum RunContext {
904                 ButlerContext = 0,
905                 TransportContext,
906                 ExportContext
907         };
908         
909         /* VST support */
910
911         static long vst_callback (AEffect* effect,
912                                   long opcode,
913                                   long index,
914                                   long value,
915                                   void* ptr,
916                                   float opt);
917
918         typedef float (*compute_peak_t)                 (Sample *, nframes_t, float);
919         typedef void  (*find_peaks_t)                   (Sample *, nframes_t, float *, float*);
920         typedef void  (*apply_gain_to_buffer_t)         (Sample *, nframes_t, float);
921         typedef void  (*mix_buffers_with_gain_t)        (Sample *, Sample *, nframes_t, float);
922         typedef void  (*mix_buffers_no_gain_t)          (Sample *, Sample *, nframes_t);
923
924         static compute_peak_t           compute_peak;
925         static find_peaks_t             find_peaks;
926         static apply_gain_to_buffer_t   apply_gain_to_buffer;
927         static mix_buffers_with_gain_t  mix_buffers_with_gain;
928         static mix_buffers_no_gain_t    mix_buffers_no_gain;
929
930         static sigc::signal<void> SendFeedback;
931
932         /* Controllables */
933
934         PBD::Controllable* controllable_by_id (const PBD::ID&);
935
936         void add_controllable (PBD::Controllable*);
937         void remove_controllable (PBD::Controllable*);
938
939   protected:
940         friend class AudioEngine;
941         void set_block_size (nframes_t nframes);
942         void set_frame_rate (nframes_t nframes);
943
944   protected:
945         friend class Diskstream;
946         void stop_butler ();
947         void wait_till_butler_finished();
948
949   protected:
950         friend class Route;
951         void schedule_curve_reallocation ();
952         void update_latency_compensation (bool, bool);
953         
954   private:
955         int  create (bool& new_session, const string& mix_template, nframes_t initial_length);
956         void destroy ();
957
958         nframes_t compute_initial_length ();
959
960         static const char* _template_suffix;
961         static const char* _statefile_suffix;
962         static const char* _pending_suffix;
963
964         enum SubState {
965                 PendingDeclickIn   = 0x1,
966                 PendingDeclickOut  = 0x2,
967                 StopPendingCapture = 0x4,
968                 AutoReturning      = 0x10,
969                 PendingLocate      = 0x20,
970                 PendingSetLoop     = 0x40
971         };
972
973         /* stuff used in process() should be close together to
974            maximise cache hits
975         */
976
977         typedef void (Session::*process_function_type)(nframes_t);
978
979         AudioEngine&            _engine;
980         mutable gint             processing_prohibited;
981         process_function_type    process_function;
982         process_function_type    last_process_function;
983         bool                     waiting_for_sync_offset;
984         nframes_t               _base_frame_rate;
985         nframes_t               _current_frame_rate;  //this includes video pullup offset
986         int                      transport_sub_state;
987         mutable gint            _record_status;
988         volatile nframes_t      _transport_frame;
989         Location*                end_location;
990         Location*                start_location;
991         Slave*                  _slave;
992         bool                    _silent;
993         volatile float          _transport_speed;
994         volatile float          _desired_transport_speed;
995         float                   _last_transport_speed;
996         bool                     auto_play_legal;
997         nframes_t               _last_slave_transport_frame;
998         nframes_t                maximum_output_latency;
999         nframes_t                last_stop_frame;
1000         volatile nframes64_t    _requested_return_frame;
1001         vector<Sample *>        _passthru_buffers;
1002         vector<Sample *>        _silent_buffers;
1003         vector<Sample *>        _send_buffers;
1004         nframes_t                current_block_size;
1005         nframes_t               _worst_output_latency;
1006         nframes_t               _worst_input_latency;
1007         nframes_t               _worst_track_latency;
1008         bool                    _have_captured;
1009         float                   _meter_hold;
1010         float                   _meter_falloff;
1011         bool                    _end_location_is_free;
1012
1013         void set_worst_io_latencies ();
1014         void set_worst_io_latencies_x (IOChange asifwecare, void *ignored) {
1015                 set_worst_io_latencies ();
1016         }
1017
1018         void update_latency_compensation_proxy (void* ignored);
1019
1020         void ensure_passthru_buffers (uint32_t howmany);
1021         
1022         void process_scrub          (nframes_t);
1023         void process_without_events (nframes_t);
1024         void process_with_events    (nframes_t);
1025         void process_audition       (nframes_t);
1026         int  process_export         (nframes_t, ARDOUR::AudioExportSpecification*);
1027         
1028         /* slave tracking */
1029
1030         static const int delta_accumulator_size = 25;
1031         int delta_accumulator_cnt;
1032         long delta_accumulator[delta_accumulator_size];
1033         long average_slave_delta;
1034         int  average_dir;
1035         bool have_first_delta_accumulator;
1036         
1037         enum SlaveState {
1038                 Stopped,
1039                 Waiting,
1040                 Running
1041         };
1042         
1043         SlaveState slave_state;
1044         nframes_t slave_wait_end;
1045
1046         void reset_slave_state ();
1047         bool follow_slave (nframes_t, nframes_t);
1048         void set_slave_source (SlaveSource);
1049
1050         bool _exporting;
1051         int prepare_to_export (ARDOUR::AudioExportSpecification&);
1052
1053         void prepare_diskstreams ();
1054         void commit_diskstreams (nframes_t, bool& session_requires_butler);
1055         int  process_routes (nframes_t, nframes_t);
1056         int  silent_process_routes (nframes_t, nframes_t);
1057
1058         bool get_rec_monitors_input () {
1059                 if (actively_recording()) {
1060                         return true;
1061                 } else {
1062                         if (Config->get_auto_input()) {
1063                                 return false;
1064                         } else {
1065                                 return true;
1066                         }
1067                 }
1068         }
1069
1070         int get_transport_declick_required () {
1071
1072                 if (transport_sub_state & PendingDeclickIn) {
1073                         transport_sub_state &= ~PendingDeclickIn;
1074                         return 1;
1075                 } else if (transport_sub_state & PendingDeclickOut) {
1076                         return -1;
1077                 } else {
1078                         return 0;
1079                 }
1080         }
1081
1082         bool maybe_stop (nframes_t limit) {
1083                 if ((_transport_speed > 0.0f && _transport_frame >= limit) || (_transport_speed < 0.0f && _transport_frame == 0)) {
1084                         stop_transport ();
1085                         return true;
1086                 }
1087                 return false;
1088         }
1089
1090         bool maybe_sync_start (nframes_t&, nframes_t&);
1091
1092         void check_declick_out ();
1093
1094         MIDI::MachineControl*    mmc;
1095         MIDI::Port*             _mmc_port;
1096         MIDI::Port*             _mtc_port;
1097         MIDI::Port*             _midi_port;
1098         string                  _path;
1099         string                  _name;
1100         bool                     session_send_mmc;
1101         bool                     session_send_mtc;
1102         bool                     session_midi_feedback;
1103         bool                     play_loop;
1104         bool                     loop_changing;
1105         nframes_t           last_loopend;
1106
1107         RingBuffer<Event*> pending_events;
1108
1109         void hookup_io ();
1110         void when_engine_running ();
1111         void graph_reordered ();
1112
1113         string _current_snapshot_name;
1114
1115         XMLTree* state_tree;
1116         bool     state_was_pending;
1117         StateOfTheState _state_of_the_state;
1118
1119         void     auto_save();
1120         int      load_options (const XMLNode&);
1121         XMLNode& get_options () const;
1122         int      load_state (string snapshot_name);
1123         bool     save_config_options_predicate (ConfigVariableBase::Owner owner) const;
1124
1125         nframes_t   _last_roll_location;
1126         nframes_t   _last_record_location;
1127         bool              pending_locate_roll;
1128         nframes_t    pending_locate_frame;
1129
1130         bool              pending_locate_flush;
1131         bool              pending_abort;
1132         bool              pending_auto_loop;
1133         
1134         Sample*           butler_mixdown_buffer;
1135         float*            butler_gain_buffer;
1136         pthread_t         butler_thread;
1137         Glib::Mutex       butler_request_lock;
1138         Glib::Cond        butler_paused;
1139         bool              butler_should_run;
1140         mutable gint      butler_should_do_transport_work;
1141         int               butler_request_pipe[2];
1142
1143         inline bool transport_work_requested() const { return g_atomic_int_get(&butler_should_do_transport_work); }
1144         
1145         struct ButlerRequest {
1146             enum Type {
1147                     Wake,
1148                     Run,
1149                     Pause,
1150                     Quit
1151             };
1152         };
1153
1154         enum PostTransportWork {
1155                 PostTransportStop               = 0x1,
1156                 PostTransportDisableRecord      = 0x2,
1157                 PostTransportPosition           = 0x8,
1158                 PostTransportDidRecord          = 0x20,
1159                 PostTransportDuration           = 0x40,
1160                 PostTransportLocate             = 0x80,
1161                 PostTransportRoll               = 0x200,
1162                 PostTransportAbort              = 0x800,
1163                 PostTransportOverWrite          = 0x1000,
1164                 PostTransportSpeed              = 0x2000,
1165                 PostTransportAudition           = 0x4000,
1166                 PostTransportScrub              = 0x8000,
1167                 PostTransportReverse            = 0x10000,
1168                 PostTransportInputChange        = 0x20000,
1169                 PostTransportCurveRealloc       = 0x40000
1170         };
1171         
1172         static const PostTransportWork ProcessCannotProceedMask = 
1173                 PostTransportWork (PostTransportInputChange|
1174                                    PostTransportSpeed|
1175                                    PostTransportReverse|
1176                                    PostTransportCurveRealloc|
1177                                    PostTransportScrub|
1178                                    PostTransportAudition|
1179                                    PostTransportLocate|
1180                                    PostTransportStop);
1181         
1182         PostTransportWork post_transport_work;
1183
1184         void             summon_butler ();
1185         void             schedule_butler_transport_work ();
1186         int              start_butler_thread ();
1187         void             terminate_butler_thread ();
1188         static void    *_butler_thread_work (void *arg);
1189         void*            butler_thread_work ();
1190
1191         uint32_t    cumulative_rf_motion;
1192         uint32_t    rf_scale;
1193
1194         void set_rf_speed (float speed);
1195         void reset_rf_scale (nframes_t frames_moved);
1196
1197         Locations        _locations;
1198         void              locations_changed ();
1199         void              locations_added (Location*);
1200         void              handle_locations_changed (Locations::LocationList&);
1201
1202         sigc::connection auto_punch_start_changed_connection;
1203         sigc::connection auto_punch_end_changed_connection;
1204         sigc::connection auto_punch_changed_connection;
1205         void             auto_punch_start_changed (Location *);
1206         void             auto_punch_end_changed (Location *);
1207         void             auto_punch_changed (Location *);
1208
1209         sigc::connection auto_loop_start_changed_connection;
1210         sigc::connection auto_loop_end_changed_connection;
1211         sigc::connection auto_loop_changed_connection;
1212         void             auto_loop_changed (Location *);
1213
1214         typedef list<Event *> Events;
1215         Events           events;
1216         Events           immediate_events;
1217         Events::iterator next_event;
1218
1219         /* there can only ever be one of each of these */
1220
1221         Event *auto_loop_event;
1222         Event *punch_out_event;
1223         Event *punch_in_event;
1224
1225         /* events */
1226
1227         void dump_events () const;
1228         void queue_event (Event *ev);
1229         void merge_event (Event*);
1230         void replace_event (Event::Type, nframes_t action_frame, nframes_t target = 0);
1231         bool _replace_event (Event*);
1232         bool _remove_event (Event *);
1233         void _clear_event_type (Event::Type);
1234
1235         void first_stage_init (string path, string snapshot_name);
1236         int  second_stage_init (bool new_tracks);
1237         void find_current_end ();
1238         void remove_empty_sounds ();
1239
1240         void setup_midi_control ();
1241         int  midi_read (MIDI::Port *);
1242
1243         void enable_record ();
1244         
1245         void increment_transport_position (uint32_t val) {
1246                 if (max_frames - val < _transport_frame) {
1247                         _transport_frame = max_frames;
1248                 } else {
1249                         _transport_frame += val;
1250                 }
1251         }
1252
1253         void decrement_transport_position (uint32_t val) {
1254                 if (val < _transport_frame) {
1255                         _transport_frame -= val;
1256                 } else {
1257                         _transport_frame = 0;
1258                 }
1259         }
1260
1261         void post_transport_motion ();
1262         static void *session_loader_thread (void *arg);
1263
1264         void *do_work();
1265
1266         void set_next_event ();
1267         void process_event (Event *);
1268
1269         /* MIDI Machine Control */
1270
1271         void deliver_mmc (MIDI::MachineControl::Command, nframes_t);
1272         void deliver_midi_message (MIDI::Port * port, MIDI::eventType ev, MIDI::channel_t, MIDI::EventTwoBytes);
1273         void deliver_data (MIDI::Port* port, MIDI::byte*, int32_t size);
1274
1275         void spp_start (MIDI::Parser&);
1276         void spp_continue (MIDI::Parser&);
1277         void spp_stop (MIDI::Parser&);
1278
1279         void mmc_deferred_play (MIDI::MachineControl &);
1280         void mmc_stop (MIDI::MachineControl &);
1281         void mmc_step (MIDI::MachineControl &, int);
1282         void mmc_pause (MIDI::MachineControl &);
1283         void mmc_record_pause (MIDI::MachineControl &);
1284         void mmc_record_strobe (MIDI::MachineControl &);
1285         void mmc_record_exit (MIDI::MachineControl &);
1286         void mmc_track_record_status (MIDI::MachineControl &, uint32_t track, bool enabled);
1287         void mmc_fast_forward (MIDI::MachineControl &);
1288         void mmc_rewind (MIDI::MachineControl &);
1289         void mmc_locate (MIDI::MachineControl &, const MIDI::byte *);
1290         void mmc_shuttle (MIDI::MachineControl &mmc, float speed, bool forw);
1291         void mmc_record_enable (MIDI::MachineControl &mmc, size_t track, bool enabled);
1292
1293         struct timeval last_mmc_step;
1294         double step_speed;
1295
1296         typedef sigc::slot<bool> MidiTimeoutCallback;
1297         typedef list<MidiTimeoutCallback> MidiTimeoutList;
1298
1299         MidiTimeoutList midi_timeouts;
1300         bool mmc_step_timeout ();
1301
1302         MIDI::byte mmc_buffer[32];
1303         MIDI::byte mtc_msg[16];
1304         MIDI::byte mtc_smpte_bits;   /* encoding of SMTPE type for MTC */
1305         MIDI::byte midi_msg[16];
1306         nframes_t  outbound_mtc_smpte_frame;
1307         SMPTE::Time transmitting_smpte_time;
1308         int next_quarter_frame_to_send;
1309         
1310         double _frames_per_smpte_frame; /* has to be floating point because of drop frame */
1311         nframes_t _frames_per_hour;
1312         nframes_t _smpte_frames_per_hour;
1313         nframes_t _smpte_offset;
1314         bool _smpte_offset_negative;
1315
1316         /* cache the most-recently requested time conversions.
1317            this helps when we have multiple clocks showing the
1318            same time (e.g. the transport frame)
1319         */
1320
1321         bool       last_smpte_valid;
1322         nframes_t  last_smpte_when;
1323         SMPTE::Time last_smpte;
1324
1325         int send_full_time_code ();
1326         int send_midi_time_code ();
1327
1328         void send_full_time_code_in_another_thread ();
1329         void send_midi_time_code_in_another_thread ();
1330         void send_time_code_in_another_thread (bool full);
1331         void send_mmc_in_another_thread (MIDI::MachineControl::Command, nframes_t frame = 0);
1332
1333         nframes_t adjust_apparent_position (nframes_t frames);
1334         
1335         void reset_record_status ();
1336         
1337         int no_roll (nframes_t nframes, nframes_t offset);
1338         
1339         bool non_realtime_work_pending() const { return static_cast<bool>(post_transport_work); }
1340         bool process_can_proceed() const { return !(post_transport_work & ProcessCannotProceedMask); }
1341
1342         struct MIDIRequest {
1343             
1344             enum Type {
1345                     SendFullMTC,
1346                     SendMTC,
1347                     SendMMC,
1348                     PortChange,
1349                     SendMessage,
1350                     Deliver,
1351                     Quit
1352             };
1353             
1354             Type type;
1355             MIDI::MachineControl::Command mmc_cmd;
1356             nframes_t locate_frame;
1357
1358             // for SendMessage type
1359
1360             MIDI::Port * port;
1361             MIDI::channel_t chan;
1362             union {
1363                 MIDI::EventTwoBytes data;
1364                 MIDI::byte* buf;
1365             };
1366
1367             union { 
1368                 MIDI::eventType ev;
1369                 int32_t size;
1370             };
1371
1372             MIDIRequest () {}
1373             
1374             void *operator new(size_t ignored) {
1375                     return pool.alloc ();
1376             };
1377
1378             void operator delete(void *ptr, size_t size) {
1379                     pool.release (ptr);
1380             }
1381
1382           private:
1383             static MultiAllocSingleReleasePool pool;
1384         };
1385
1386         Glib::Mutex       midi_lock;
1387         pthread_t       midi_thread;
1388         int             midi_request_pipe[2];
1389         mutable  gint   butler_active;
1390         RingBuffer<MIDIRequest*> midi_requests;
1391
1392         int           start_midi_thread ();
1393         void          terminate_midi_thread ();
1394         void          poke_midi_thread ();
1395         static void *_midi_thread_work (void *arg);
1396         void          midi_thread_work ();
1397         void          change_midi_ports ();
1398         int           use_config_midi_ports ();
1399
1400         bool waiting_to_start;
1401
1402         void set_play_loop (bool yn);
1403         void overwrite_some_buffers (Diskstream*);
1404         void flush_all_redirects ();
1405         void locate (nframes_t, bool with_roll, bool with_flush, bool with_loop=false);
1406         void start_locate (nframes_t, bool with_roll, bool with_flush, bool with_loop=false);
1407         void force_locate (nframes_t frame, bool with_roll = false);
1408         void set_diskstream_speed (Diskstream*, float speed);
1409         void set_transport_speed (float speed, bool abort = false);
1410         void stop_transport (bool abort = false);
1411         void start_transport ();
1412         void actually_start_transport ();
1413         void realtime_stop (bool abort);
1414         void non_realtime_start_scrub ();
1415         void non_realtime_set_speed ();
1416         void non_realtime_stop (bool abort, int entry_request_count, bool& finished);
1417         void non_realtime_overwrite (int entry_request_count, bool& finished);
1418         void butler_transport_work ();
1419         void post_transport ();
1420         void engine_halted ();
1421         void xrun_recovery ();
1422
1423         TempoMap    *_tempo_map;
1424         void          tempo_map_changed (Change);
1425
1426         /* edit/mix groups */
1427
1428         int load_route_groups (const XMLNode&, bool is_edit);
1429         int load_edit_groups (const XMLNode&);
1430         int load_mix_groups (const XMLNode&);
1431
1432
1433         list<RouteGroup *> edit_groups;
1434         list<RouteGroup *> mix_groups;
1435
1436         /* disk-streams */
1437
1438         SerializedRCUManager<DiskstreamList>  diskstreams; 
1439
1440         uint32_t dstream_buffer_size;
1441         int  load_diskstreams (const XMLNode&);
1442
1443         /* routes stuff */
1444
1445         SerializedRCUManager<RouteList>  routes;
1446
1447         void   add_routes (RouteList&, bool save);
1448         uint32_t destructive_index;
1449
1450         int load_routes (const XMLNode&);
1451         boost::shared_ptr<Route> XMLRouteFactory (const XMLNode&);
1452
1453         /* mixer stuff */
1454
1455         bool       solo_update_disabled;
1456         bool       currently_soloing;
1457         
1458         void route_mute_changed (void *src);
1459         void route_solo_changed (void *src, boost::weak_ptr<Route>);
1460         void catch_up_on_solo ();
1461         void update_route_solo_state ();
1462         void modify_solo_mute (bool, bool);
1463         void strip_portname_for_solo (string& portname);
1464
1465         /* REGION MANAGEMENT */
1466
1467         mutable Glib::Mutex region_lock;
1468         typedef map<PBD::ID,boost::shared_ptr<AudioRegion> > AudioRegionList;
1469         AudioRegionList audio_regions;
1470         
1471         void add_region (boost::shared_ptr<Region>);
1472         void region_changed (Change, boost::weak_ptr<Region>);
1473         void remove_region (boost::weak_ptr<Region>);
1474
1475         int load_regions (const XMLNode& node);
1476
1477         /* SOURCES */
1478         
1479         mutable Glib::Mutex audio_source_lock;
1480         typedef std::map<PBD::ID,boost::shared_ptr<AudioSource> > AudioSourceList;
1481
1482         AudioSourceList audio_sources;
1483
1484         int load_sources (const XMLNode& node);
1485         XMLNode& get_sources_as_xml ();
1486
1487         boost::shared_ptr<Source> XMLSourceFactory (const XMLNode&);
1488
1489         /* PLAYLISTS */
1490         
1491         mutable Glib::Mutex playlist_lock;
1492         typedef set<boost::shared_ptr<Playlist> > PlaylistList;
1493         PlaylistList playlists;
1494         PlaylistList unused_playlists;
1495
1496         int load_playlists (const XMLNode&);
1497         int load_unused_playlists (const XMLNode&);
1498         void remove_playlist (boost::weak_ptr<Playlist>);
1499         void track_playlist (bool, boost::weak_ptr<Playlist>);
1500
1501         boost::shared_ptr<Playlist> playlist_factory (string name);
1502         boost::shared_ptr<Playlist> XMLPlaylistFactory (const XMLNode&);
1503
1504         void playlist_length_changed ();
1505         void diskstream_playlist_changed (boost::weak_ptr<Diskstream>);
1506
1507         /* NAMED SELECTIONS */
1508
1509         mutable Glib::Mutex named_selection_lock;
1510         typedef set<NamedSelection *> NamedSelectionList;
1511         NamedSelectionList named_selections;
1512
1513         int load_named_selections (const XMLNode&);
1514
1515         NamedSelection *named_selection_factory (string name);
1516         NamedSelection *XMLNamedSelectionFactory (const XMLNode&);
1517
1518         /* CURVES and AUTOMATION LISTS */
1519         std::map<PBD::ID, Curve*> curves;
1520         std::map<PBD::ID, AutomationList*> automation_lists;
1521
1522         /* DEFAULT FADE CURVES */
1523
1524         float default_fade_steepness;
1525         float default_fade_msecs;
1526
1527         /* AUDITIONING */
1528
1529         boost::shared_ptr<Auditioner> auditioner;
1530         void set_audition (boost::shared_ptr<Region>);
1531         void non_realtime_set_audition ();
1532         boost::shared_ptr<Region> pending_audition_region;
1533
1534         /* EXPORT */
1535
1536         /* FLATTEN */
1537
1538         int flatten_one_track (AudioTrack&, nframes_t start, nframes_t cnt);
1539
1540         /* INSERT AND SEND MANAGEMENT */
1541         
1542         list<PortInsert *>   _port_inserts;
1543         list<PluginInsert *> _plugin_inserts;
1544         list<Send *>         _sends;
1545         boost::dynamic_bitset<uint32_t>  send_bitset;
1546         boost::dynamic_bitset<uint32_t>  insert_bitset;
1547         uint32_t          send_cnt;
1548         uint32_t          insert_cnt;
1549
1550
1551         void add_redirect (Redirect *);
1552         void remove_redirect (Redirect *);
1553
1554         /* S/W RAID */
1555
1556         struct space_and_path {
1557             uint32_t blocks; /* 4kB blocks */
1558             string path;
1559             
1560             space_and_path() { 
1561                     blocks = 0;
1562             }
1563         };
1564
1565         struct space_and_path_ascending_cmp {
1566             bool operator() (space_and_path a, space_and_path b) {
1567                     return a.blocks > b.blocks;
1568             }
1569         };
1570         
1571         void setup_raid_path (string path);
1572
1573         vector<space_and_path> session_dirs;
1574         vector<space_and_path>::iterator last_rr_session_dir;
1575         uint32_t _total_free_4k_blocks;
1576         Glib::Mutex space_lock;
1577
1578         static const char* old_sound_dir_name;
1579         static const char* sound_dir_name;
1580         static const char* dead_sound_dir_name;
1581         static const char* interchange_dir_name;
1582         static const char* peak_dir_name;
1583         static const char* export_dir_name;
1584         
1585         string old_sound_dir (bool with_path = true) const;
1586         string discover_best_sound_dir (bool destructive = false);
1587         int ensure_sound_dir (string, string&);
1588         void refresh_disk_space ();
1589
1590         mutable gint _playback_load;
1591         mutable gint _capture_load;
1592         mutable gint _playback_load_min;
1593         mutable gint _capture_load_min;
1594
1595         /* I/O Connections */
1596
1597         typedef list<Connection *> ConnectionList;
1598         mutable Glib::Mutex connection_lock;
1599         ConnectionList _connections;
1600         int load_connections (const XMLNode&);
1601
1602         void reverse_diskstream_buffers ();
1603
1604         UndoHistory _history;
1605         UndoTransaction* current_trans;
1606
1607         GlobalRouteBooleanState get_global_route_boolean (bool (Route::*method)(void) const);
1608         GlobalRouteMeterState get_global_route_metering ();
1609
1610         void set_global_route_boolean (GlobalRouteBooleanState s, void (Route::*method)(bool, void*), void *arg);
1611         void set_global_route_metering (GlobalRouteMeterState s, void *arg);
1612
1613         void set_global_mute (GlobalRouteBooleanState s, void *src);
1614         void set_global_solo (GlobalRouteBooleanState s, void *src);
1615         void set_global_record_enable (GlobalRouteBooleanState s, void *src);
1616
1617         void jack_timebase_callback (jack_transport_state_t, nframes_t, jack_position_t*, int);
1618         int  jack_sync_callback (jack_transport_state_t, jack_position_t*);
1619         void reset_jack_connection (jack_client_t* jack);
1620         void record_enable_change_all (bool yn);
1621
1622         XMLNode& state(bool);
1623
1624         /* click track */
1625
1626         struct Click {
1627             nframes_t start;
1628             nframes_t duration;
1629             nframes_t offset;
1630             const Sample *data;
1631
1632             Click (nframes_t s, nframes_t d, const Sample *b) 
1633                     : start (s), duration (d), data (b) { offset = 0; }
1634             
1635             void *operator new(size_t ignored) {
1636                     return pool.alloc ();
1637             };
1638
1639             void operator delete(void *ptr, size_t size) {
1640                     pool.release (ptr);
1641             }
1642
1643           private:
1644             static Pool pool;
1645         };
1646  
1647         typedef list<Click*> Clicks;
1648
1649         Clicks          clicks;
1650         bool           _clicking;
1651         boost::shared_ptr<IO> _click_io;
1652         Sample*         click_data;
1653         Sample*         click_emphasis_data;
1654         nframes_t  click_length;
1655         nframes_t  click_emphasis_length;
1656         mutable Glib::RWLock click_lock;
1657
1658         static const Sample         default_click[];
1659         static const nframes_t default_click_length;
1660         static const Sample         default_click_emphasis[];
1661         static const nframes_t default_click_emphasis_length;
1662
1663         Click *get_click();
1664         void   setup_click_sounds (int which);
1665         void   clear_clicks ();
1666         void   click (nframes_t start, nframes_t nframes, nframes_t offset);
1667
1668         vector<Route*> master_outs;
1669         
1670         /* range playback */
1671
1672         list<AudioRange> current_audio_range;
1673         bool _play_range;
1674         void set_play_range (bool yn);
1675         void setup_auto_play ();
1676
1677         /* main outs */
1678         uint32_t main_outs;
1679         
1680         boost::shared_ptr<IO> _master_out;
1681         boost::shared_ptr<IO> _control_out;
1682
1683         gain_t* _gain_automation_buffer;
1684         pan_t** _pan_automation_buffer;
1685         void allocate_pan_automation_buffers (nframes_t nframes, uint32_t howmany, bool force);
1686         uint32_t _npan_buffers;
1687
1688         /* VST support */
1689
1690         long _vst_callback (VSTPlugin*,
1691                             long opcode,
1692                             long index,
1693                             long value,
1694                             void* ptr,
1695                             float opt);
1696
1697         /* number of hardware audio ports we're using,
1698            based on max (requested,available)
1699         */
1700
1701         uint32_t n_physical_audio_outputs;
1702         uint32_t n_physical_audio_inputs;
1703
1704         int find_all_sources (std::string path, std::set<std::string>& result);
1705         int find_all_sources_across_snapshots (std::set<std::string>& result, bool exclude_this_snapshot);
1706
1707         LayerModel layer_model;
1708         CrossfadeModel xfade_model;
1709
1710         typedef std::set<PBD::Controllable*> Controllables;
1711         Glib::Mutex controllables_lock;
1712         Controllables controllables;
1713
1714         void reset_native_file_format();
1715         bool first_file_data_format_reset;
1716         bool first_file_header_format_reset;
1717
1718         void config_changed (const char*);
1719
1720         XMLNode& get_control_protocol_state ();
1721         
1722         void set_history_depth (uint32_t depth);
1723         void sync_order_keys ();
1724
1725         static bool _disable_all_loaded_plugins;
1726 };
1727
1728 } // namespace ARDOUR
1729
1730 #endif /* __ardour_session_h__ */