X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fardour%2Fsession.h;h=8aea4929105ed65452da92126a3c8c5bcc72c4cc;hb=2315c433e276110d8c1ac7cc5c8935c31b6f5879;hp=c3f2dc30bf14508991aeb980ddfdfa441644784f;hpb=7eba21ca19897c7e7c89d676527d774dd2d95721;p=ardour.git diff --git a/libs/ardour/ardour/session.h b/libs/ardour/ardour/session.h index c3f2dc30bf..8aea492910 100644 --- a/libs/ardour/ardour/session.h +++ b/libs/ardour/ardour/session.h @@ -15,7 +15,6 @@ along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - $Id$ */ #ifndef __ardour_session_h__ @@ -30,6 +29,7 @@ #include #include +#include #include @@ -107,9 +107,9 @@ class Session : public PBD::StatefulDestructible { private: - typedef std::pair,bool> RouteBooleanState; + typedef std::pair,bool> RouteBooleanState; typedef vector GlobalRouteBooleanState; - typedef std::pair,MeterPoint> RouteMeterState; + typedef std::pair,MeterPoint> RouteMeterState; typedef vector GlobalRouteMeterState; public: @@ -125,6 +125,7 @@ class Session : public PBD::StatefulDestructible SetDiskstreamSpeed, Locate, LocateRoll, + LocateRollLocate, SetLoop, PunchIn, PunchOut, @@ -164,7 +165,7 @@ class Session : public PBD::StatefulDestructible SlaveSource slave; }; - boost::shared_ptr region; + boost::shared_ptr region; list audio_range; list music_range; @@ -210,9 +211,9 @@ class Session : public PBD::StatefulDestructible /* creating from an XML file */ Session (AudioEngine&, - string fullpath, - string snapshot_name, - string* mix_template = 0); + const string& fullpath, + const string& snapshot_name, + string mix_template = ""); /* creating a new Session */ @@ -236,12 +237,14 @@ class Session : public PBD::StatefulDestructible string name() const { return _name; } string snap_name() const { return _current_snapshot_name; } string raid_path () const; + string export_dir () const; void set_snap_name (); void set_dirty (); void set_clean (); bool dirty() const { return _state_of_the_state & Dirty; } + void set_deletion_in_progress (); bool deletion_in_progress() const { return _state_of_the_state & Deletion; } sigc::signal DirtyChanged; @@ -250,7 +253,7 @@ class Session : public PBD::StatefulDestructible std::string dead_sound_dir () const; std::string automation_dir () const; - string peak_path_from_audio_path (string) const; + Glib::ustring peak_path (Glib::ustring) const; static string suffixed_search_path (std::string suffix, bool data); static string control_protocol_path (); @@ -321,6 +324,8 @@ class Session : public PBD::StatefulDestructible void disable_record (bool rt_context, bool force = false); void step_back_from_record (); + void maybe_write_autosave (); + /* Proxy signal for region hidden changes */ sigc::signal > RegionHiddenChange; @@ -331,7 +336,7 @@ class Session : public PBD::StatefulDestructible /* Record status signals */ - sigc::signal RecordStateChanged; + sigc::signal RecordStateChanged; /* Transport mechanism signals */ @@ -339,10 +344,11 @@ class Session : public PBD::StatefulDestructible sigc::signal PositionChanged; /* sent after any non-sequential motion */ sigc::signal DurationChanged; sigc::signal HaltOnXrun; + sigc::signal TransportLooped; sigc::signal RouteAdded; - void request_roll (); + void request_roll_at_and_return (nframes_t start, nframes_t return_to); void request_bounded_roll (nframes_t start, nframes_t end); void request_stop (bool abort = false); void request_locate (nframes_t frame, bool with_roll = false); @@ -356,6 +362,7 @@ class Session : public PBD::StatefulDestructible void set_session_start (nframes_t start) { start_location->set_start(start); } void set_session_end (nframes_t end) { end_location->set_start(end); _end_location_is_free = false; } void use_rf_shuttle_speed (); + void allow_auto_play (bool yn); void request_transport_speed (float speed); void request_overwrite_buffer (Diskstream*); void request_diskstream_speed (Diskstream&, float speed); @@ -377,6 +384,9 @@ class Session : public PBD::StatefulDestructible double frames_per_smpte_frame() const { return _frames_per_smpte_frame; } nframes_t smpte_frames_per_hour() const { return _smpte_frames_per_hour; } + float smpte_frames_per_second() const; + bool smpte_drop_frames() const; + /* Locations */ Locations *locations() { return &_locations; } @@ -387,6 +397,7 @@ class Session : public PBD::StatefulDestructible void set_auto_punch_location (Location *); void set_auto_loop_location (Location *); + int location_name(string& result, string base = string("")); void reset_input_monitor_state (); @@ -404,6 +415,9 @@ class Session : public PBD::StatefulDestructible int save_template (string template_name); int save_history (string snapshot_name = ""); int restore_history (string snapshot_name); + void remove_state (string snapshot_name); + void rename_state (string old_name, string new_name); + void remove_pending_capture_state (); static int rename_template (string old_name, string new_name); @@ -469,6 +483,8 @@ class Session : public PBD::StatefulDestructible void resort_routes (); void resort_routes_using (boost::shared_ptr); + void set_remote_control_ids(); + AudioEngine &engine() { return _engine; }; int32_t max_level; @@ -478,19 +494,7 @@ class Session : public PBD::StatefulDestructible nframes_t transport_frame () const {return _transport_frame; } nframes_t audible_frame () const; - - enum SmpteFormat { - smpte_23976, - smpte_24, - smpte_24976, - smpte_25, - smpte_2997, - smpte_2997drop, - smpte_30, - smpte_30drop, - smpte_5994, - smpte_60, - }; + nframes64_t requested_return_frame() const { return _requested_return_frame; } enum PullupFormat { pullup_Plus4Plus1, @@ -501,11 +505,10 @@ class Session : public PBD::StatefulDestructible pullup_Minus1, pullup_Minus4Plus1, pullup_Minus4, - pullup_Minus4Minus1, + pullup_Minus4Minus1 }; - int set_smpte_type (float fps, bool drop_frames); - + int set_smpte_format (SmpteFormat); void sync_time_vars(); void bbt_time (nframes_t when, BBT_Time&); @@ -536,20 +539,23 @@ class Session : public PBD::StatefulDestructible bool transport_stopped() const { return _transport_speed == 0.0f; } bool transport_rolling() const { return _transport_speed != 0.0f; } + void set_silent (bool yn); + bool silent () { return _silent; } + int jack_slave_sync (nframes_t); TempoMap& tempo_map() { return *_tempo_map; } /* region info */ - sigc::signal > AudioRegionAdded; - sigc::signal > AudioRegionRemoved; + sigc::signal > AudioRegionAdded; + sigc::signal > AudioRegionRemoved; int region_name (string& result, string base = string(""), bool newlevel = false) const; string new_region_name (string); string path_from_region_name (string name, string identifier); - boost::shared_ptr find_whole_file_parent (boost::shared_ptr); + boost::shared_ptr find_whole_file_parent (boost::shared_ptr); void find_equivalent_playlist_regions (boost::shared_ptr, std::vector >& result); boost::shared_ptr XMLRegionFactory (const XMLNode&, bool full); @@ -562,13 +568,13 @@ class Session : public PBD::StatefulDestructible string doing_what; /* control info */ - bool multichan; bool sample_convert; + SrcQuality quality; volatile bool freeze; - string pathname; + std::vector paths; /* result */ - std::vector > new_regions; + SourceList sources; }; @@ -581,14 +587,14 @@ class Session : public PBD::StatefulDestructible int start_audio_export (ARDOUR::AudioExportSpecification&); int stop_audio_export (ARDOUR::AudioExportSpecification&); - + void finalize_audio_export (); + void add_source (boost::shared_ptr); void remove_source (boost::weak_ptr); - int cleanup_audio_file_source (boost::shared_ptr); struct cleanup_report { vector paths; - int32_t space; + int64_t space; }; int cleanup_sources (cleanup_report&); @@ -604,8 +610,7 @@ class Session : public PBD::StatefulDestructible this playlist. */ - sigc::signal AskAboutPlaylistDeletion; - + sigc::signal > AskAboutPlaylistDeletion; /* handlers should return !0 for use pending state, 0 for ignore it. @@ -613,23 +618,22 @@ class Session : public PBD::StatefulDestructible static sigc::signal AskAboutPendingState; - sigc::signal > SourceAdded; - sigc::signal > SourceRemoved; - boost::shared_ptr create_audio_source_for_session (ARDOUR::AudioDiskstream&, uint32_t which_channel, bool destructive); boost::shared_ptr source_by_id (const PBD::ID&); + boost::shared_ptr source_by_path_and_channel (const Glib::ustring&, uint16_t); /* playlist management */ - Playlist* playlist_by_name (string name); - void add_playlist (Playlist *); - sigc::signal PlaylistAdded; - sigc::signal PlaylistRemoved; + boost::shared_ptr playlist_by_name (string name); + void add_playlist (boost::shared_ptr); + sigc::signal > PlaylistAdded; + sigc::signal > PlaylistRemoved; uint32_t n_playlists() const; - template void foreach_playlist (T *obj, void (T::*func)(Playlist *)); + template void foreach_playlist (T *obj, void (T::*func)(boost::shared_ptr)); + void get_playlists (std::vector >&); /* named selections */ @@ -675,6 +679,7 @@ class Session : public PBD::StatefulDestructible void set_all_mute (bool); sigc::signal SoloActive; + sigc::signal SoloChanged; void record_disenable_all (); void record_enable_all (); @@ -690,9 +695,11 @@ class Session : public PBD::StatefulDestructible uint32_t n_plugin_inserts() const { return _plugin_inserts.size(); } uint32_t n_sends() const { return _sends.size(); } - string next_send_name(); - string next_insert_name(); - + uint32_t next_send_id(); + uint32_t next_insert_id(); + void mark_send_id (uint32_t); + void mark_insert_id (uint32_t); + /* s/w "RAID" management */ nframes_t available_capture_duration(); @@ -730,6 +737,9 @@ class Session : public PBD::StatefulDestructible void deliver_midi (MIDI::Port*, MIDI::byte*, int32_t size); + void set_mmc_receive_device_id (uint32_t id); + void set_mmc_send_device_id (uint32_t id); + /* Scrubbing */ void start_scrub (nframes_t where); @@ -741,16 +751,19 @@ class Session : public PBD::StatefulDestructible /* History (for editors, mixers, UIs etc.) */ void undo (uint32_t n) { - history.undo (n); + _history.undo (n); } + void redo (uint32_t n) { - history.redo (n); + _history.redo (n); } - uint32_t undo_depth() const { return history.undo_depth(); } - uint32_t redo_depth() const { return history.redo_depth(); } - string next_undo() const { return history.next_undo(); } - string next_redo() const { return history.next_redo(); } + UndoHistory& history() { return _history; } + + uint32_t undo_depth() const { return _history.undo_depth(); } + uint32_t redo_depth() const { return _history.redo_depth(); } + string next_undo() const { return _history.next_undo(); } + string next_redo() const { return _history.next_redo(); } void begin_reversible_command (string cmd_name); void commit_reversible_command (Command* cmd = 0); @@ -762,80 +775,81 @@ class Session : public PBD::StatefulDestructible std::map registry; // these commands are implemented in libs/ardour/session_command.cc - Command *memento_command_factory(XMLNode *n); - void register_with_memento_command_factory(PBD::ID, PBD::StatefulThingWithGoingAway *); + Command* memento_command_factory(XMLNode* n); + void register_with_memento_command_factory(PBD::ID, PBD::StatefulThingWithGoingAway*); + + Command* global_state_command_factory (const XMLNode& n); + + class GlobalRouteStateCommand : public Command + { + public: + GlobalRouteStateCommand (Session&, void*); + GlobalRouteStateCommand (Session&, const XMLNode& node); + int set_state (const XMLNode&); + XMLNode& get_state (); + + protected: + GlobalRouteBooleanState before, after; + Session& sess; + void* src; + + }; - class GlobalSoloStateCommand : public Command + class GlobalSoloStateCommand : public GlobalRouteStateCommand { - GlobalRouteBooleanState before, after; - Session &sess; - void *src; - public: - GlobalSoloStateCommand(Session &, void *src); - void operator()(); - void undo(); - XMLNode &get_state(); - void mark(); + public: + GlobalSoloStateCommand (Session &, void *src); + GlobalSoloStateCommand (Session&, const XMLNode&); + void operator()(); //redo + void undo(); + XMLNode &get_state(); + void mark(); }; - class GlobalMuteStateCommand : public Command + class GlobalMuteStateCommand : public GlobalRouteStateCommand { - GlobalRouteBooleanState before, after; - Session &sess; - void *src; - public: - GlobalMuteStateCommand(Session &, void *src); - void operator()(); - void undo(); - XMLNode &get_state(); - void mark(); + public: + GlobalMuteStateCommand(Session &, void *src); + GlobalMuteStateCommand (Session&, const XMLNode&); + void operator()(); // redo + void undo(); + XMLNode &get_state(); + void mark(); }; - class GlobalRecordEnableStateCommand : public Command + class GlobalRecordEnableStateCommand : public GlobalRouteStateCommand { - GlobalRouteBooleanState before, after; - Session &sess; - void *src; - public: - GlobalRecordEnableStateCommand(Session &, void *src); - void operator()(); - void undo(); - XMLNode &get_state(); - void mark(); + public: + GlobalRecordEnableStateCommand(Session &, void *src); + GlobalRecordEnableStateCommand (Session&, const XMLNode&); + void operator()(); // redo + void undo(); + XMLNode &get_state(); + void mark(); }; class GlobalMeteringStateCommand : public Command { - GlobalRouteMeterState before, after; - Session &sess; - void *src; - public: - GlobalMeteringStateCommand(Session &, void *src); - void operator()(); - void undo(); - XMLNode &get_state(); - void mark(); + public: + GlobalMeteringStateCommand(Session &, void *src); + GlobalMeteringStateCommand (Session&, const XMLNode&); + void operator()(); + void undo(); + XMLNode &get_state(); + int set_state (const XMLNode&); + void mark(); + + protected: + Session& sess; + void* src; + GlobalRouteMeterState before; + GlobalRouteMeterState after; }; /* clicking */ boost::shared_ptr click_io() { return _click_io; } - /* tempo FX */ - - struct TimeStretchRequest { - boost::shared_ptr region; - float fraction; /* session: read ; GUI: write */ - float progress; /* session: write ; GUI: read */ - bool running; /* read/write */ - bool quick_seek; /* GUI: write */ - bool antialias; /* GUI: write */ - - TimeStretchRequest () {} - }; - - boost::shared_ptr tempoize_region (TimeStretchRequest&); - /* disk, buffer loads */ uint32_t playback_load (); @@ -891,12 +905,14 @@ class Session : public PBD::StatefulDestructible void* ptr, float opt); - typedef float (*compute_peak_t) (Sample *, nframes_t, float); + typedef float (*compute_peak_t) (Sample *, nframes_t, float); + typedef void (*find_peaks_t) (Sample *, nframes_t, float *, float*); typedef void (*apply_gain_to_buffer_t) (Sample *, nframes_t, float); typedef void (*mix_buffers_with_gain_t) (Sample *, Sample *, nframes_t, float); typedef void (*mix_buffers_no_gain_t) (Sample *, Sample *, nframes_t); - static compute_peak_t compute_peak; + static compute_peak_t compute_peak; + static find_peaks_t find_peaks; static apply_gain_to_buffer_t apply_gain_to_buffer; static mix_buffers_with_gain_t mix_buffers_with_gain; static mix_buffers_no_gain_t mix_buffers_no_gain; @@ -926,7 +942,10 @@ class Session : public PBD::StatefulDestructible void update_latency_compensation (bool, bool); private: - int create (bool& new_session, string* mix_template, nframes_t initial_length); + int create (bool& new_session, const string& mix_template, nframes_t initial_length); + void destroy (); + + nframes_t compute_initial_length (); static const char* _template_suffix; static const char* _statefile_suffix; @@ -947,32 +966,35 @@ class Session : public PBD::StatefulDestructible typedef void (Session::*process_function_type)(nframes_t); - AudioEngine &_engine; - mutable gint processing_prohibited; + AudioEngine& _engine; + mutable gint processing_prohibited; process_function_type process_function; process_function_type last_process_function; bool waiting_for_sync_offset; - nframes_t _base_frame_rate; - nframes_t _current_frame_rate; //this includes video pullup offset + nframes_t _base_frame_rate; + nframes_t _current_frame_rate; //this includes video pullup offset int transport_sub_state; - mutable gint _record_status; - nframes_t _transport_frame; + mutable gint _record_status; + volatile nframes_t _transport_frame; Location* end_location; Location* start_location; - Slave *_slave; + Slave* _slave; + bool _silent; volatile float _transport_speed; volatile float _desired_transport_speed; float _last_transport_speed; - nframes_t _last_slave_transport_frame; - nframes_t maximum_output_latency; - nframes_t last_stop_frame; + bool auto_play_legal; + nframes_t _last_slave_transport_frame; + nframes_t maximum_output_latency; + nframes_t last_stop_frame; + volatile nframes64_t _requested_return_frame; vector _passthru_buffers; vector _silent_buffers; vector _send_buffers; - nframes_t current_block_size; - nframes_t _worst_output_latency; - nframes_t _worst_input_latency; - nframes_t _worst_track_latency; + nframes_t current_block_size; + nframes_t _worst_output_latency; + nframes_t _worst_input_latency; + nframes_t _worst_track_latency; bool _have_captured; float _meter_hold; float _meter_falloff; @@ -1076,7 +1098,6 @@ class Session : public PBD::StatefulDestructible void hookup_io (); void when_engine_running (); - sigc::connection first_time_running; void graph_reordered (); string _current_snapshot_name; @@ -1108,6 +1129,8 @@ class Session : public PBD::StatefulDestructible bool butler_should_run; mutable gint butler_should_do_transport_work; int butler_request_pipe[2]; + + inline bool transport_work_requested() const { return g_atomic_int_get(&butler_should_do_transport_work); } struct ButlerRequest { enum Type { @@ -1250,8 +1273,7 @@ class Session : public PBD::StatefulDestructible void mmc_record_pause (MIDI::MachineControl &); void mmc_record_strobe (MIDI::MachineControl &); void mmc_record_exit (MIDI::MachineControl &); - void mmc_track_record_status (MIDI::MachineControl &, - uint32_t track, bool enabled); + void mmc_track_record_status (MIDI::MachineControl &, uint32_t track, bool enabled); void mmc_fast_forward (MIDI::MachineControl &); void mmc_rewind (MIDI::MachineControl &); void mmc_locate (MIDI::MachineControl &, const MIDI::byte *); @@ -1280,7 +1302,7 @@ class Session : public PBD::StatefulDestructible nframes_t _smpte_frames_per_hour; nframes_t _smpte_offset; bool _smpte_offset_negative; - + /* cache the most-recently requested time conversions. this helps when we have multiple clocks showing the same time (e.g. the transport frame) @@ -1381,9 +1403,8 @@ class Session : public PBD::StatefulDestructible void realtime_stop (bool abort); void non_realtime_start_scrub (); void non_realtime_set_speed (); - void non_realtime_stop (bool abort); - void non_realtime_overwrite (); - void non_realtime_buffer_fill (); + void non_realtime_stop (bool abort, int entry_request_count, bool& finished); + void non_realtime_overwrite (int entry_request_count, bool& finished); void butler_transport_work (); void post_transport (); void engine_halted (); @@ -1458,20 +1479,20 @@ class Session : public PBD::StatefulDestructible /* PLAYLISTS */ mutable Glib::Mutex playlist_lock; - typedef set PlaylistList; + typedef set > PlaylistList; PlaylistList playlists; PlaylistList unused_playlists; int load_playlists (const XMLNode&); int load_unused_playlists (const XMLNode&); - void remove_playlist (Playlist *); - void track_playlist (Playlist *, bool); + void remove_playlist (boost::weak_ptr); + void track_playlist (bool, boost::weak_ptr); - Playlist *playlist_factory (string name); - Playlist *XMLPlaylistFactory (const XMLNode&); + boost::shared_ptr playlist_factory (string name); + boost::shared_ptr XMLPlaylistFactory (const XMLNode&); - void playlist_length_changed (Playlist *); - void diskstream_playlist_changed (boost::shared_ptr); + void playlist_length_changed (); + void diskstream_playlist_changed (boost::weak_ptr); /* NAMED SELECTIONS */ @@ -1511,9 +1532,12 @@ class Session : public PBD::StatefulDestructible list _port_inserts; list _plugin_inserts; list _sends; + boost::dynamic_bitset send_bitset; + boost::dynamic_bitset insert_bitset; uint32_t send_cnt; uint32_t insert_cnt; + void add_redirect (Redirect *); void remove_redirect (Redirect *); @@ -1546,7 +1570,9 @@ class Session : public PBD::StatefulDestructible static const char* dead_sound_dir_name; static const char* interchange_dir_name; static const char* peak_dir_name; - + static const char* export_dir_name; + + string old_sound_dir (bool with_path = true) const; string discover_best_sound_dir (bool destructive = false); int ensure_sound_dir (string, string&); void refresh_disk_space (); @@ -1565,7 +1591,7 @@ class Session : public PBD::StatefulDestructible void reverse_diskstream_buffers (); - UndoHistory history; + UndoHistory _history; UndoTransaction* current_trans; GlobalRouteBooleanState get_global_route_boolean (bool (Route::*method)(void) const); @@ -1580,6 +1606,7 @@ class Session : public PBD::StatefulDestructible void jack_timebase_callback (jack_transport_state_t, nframes_t, jack_position_t*, int); int jack_sync_callback (jack_transport_state_t, jack_position_t*); + void reset_jack_connection (jack_client_t* jack); void record_enable_change_all (bool yn); XMLNode& state(bool); @@ -1661,10 +1688,8 @@ class Session : public PBD::StatefulDestructible based on max (requested,available) */ - uint32_t n_physical_outputs; - uint32_t n_physical_inputs; - - void remove_pending_capture_state (); + uint32_t n_physical_audio_outputs; + uint32_t n_physical_audio_inputs; int find_all_sources (std::string path, std::set& result); int find_all_sources_across_snapshots (std::set& result, bool exclude_this_snapshot); @@ -1682,9 +1707,10 @@ class Session : public PBD::StatefulDestructible void config_changed (const char*); - void add_control_protocol (const ControlProtocolInfo* const, XMLNode*); XMLNode& get_control_protocol_state (); + void set_history_depth (uint32_t depth); + void sync_order_keys (); }; } // namespace ARDOUR