virtual ~Session ();
- static int get_info_from_path (const std::string& xmlpath, float& sample_rate, SampleFormat& data_format);
+ static int get_info_from_path (const std::string& xmlpath, float& sample_rate, SampleFormat& data_format, std::string& program_version);
static std::string get_snapshot_from_instant (const std::string& session_dir);
/** a monotonic counter used for naming user-visible things uniquely
*/
RouteList new_route_from_template (uint32_t how_many, PresentationInfo::order_t insert_at, const std::string& template_path, const std::string& name, PlaylistDisposition pd = NewPlaylist);
RouteList new_route_from_template (uint32_t how_many, PresentationInfo::order_t insert_at, XMLNode&, const std::string& name, PlaylistDisposition pd = NewPlaylist);
- std::vector<std::string> get_paths_for_new_sources (bool allow_replacing, const std::string& import_file_path, uint32_t channels);
+ std::vector<std::string> get_paths_for_new_sources (bool allow_replacing, const std::string& import_file_path,
+ uint32_t channels, std::vector<std::string> const & smf_track_names);
int bring_all_sources_into_session (boost::function<void(uint32_t,uint32_t,std::string)> callback);
}
bool record_enabling_legal () const;
- void maybe_enable_record ();
+ void maybe_enable_record (bool rt_context = false);
void disable_record (bool rt_context, bool force = false);
void step_back_from_record ();
framecnt_t nominal_frame_rate () const { return _nominal_frame_rate; }
framecnt_t frames_per_hour () const { return _frames_per_hour; }
- double frames_per_timecode_frame() const { return _frames_per_timecode_frame; }
+ double samples_per_timecode_frame() const { return _samples_per_timecode_frame; }
framecnt_t timecode_frames_per_hour() const { return _timecode_frames_per_hour; }
MIDI::byte get_mtc_timecode_bits() const {
void set_auto_punch_location (Location *);
void set_auto_loop_location (Location *);
void set_session_extents (framepos_t start, framepos_t end);
+ bool end_is_free () const { return _session_range_end_is_free; }
void set_end_is_free (bool);
int location_name(std::string& result, std::string base = std::string(""));
XMLNode& get_state();
int set_state(const XMLNode& node, int version); // not idempotent
XMLNode& get_template();
+ bool export_track_state (boost::shared_ptr<RouteList> rl, const std::string& path);
/// The instant xml file is written to the session directory
void add_instant_xml (XMLNode&, bool write_to_config = true);
bool _reconfigure_on_delete;
};
+ RouteGroup* new_route_group (const std::string&);
void add_route_group (RouteGroup *);
+ void remove_route_group (RouteGroup* rg) { if (rg) remove_route_group (*rg); }
void remove_route_group (RouteGroup&);
void reorder_route_groups (std::list<RouteGroup*>);
);
std::list<boost::shared_ptr<MidiTrack> > new_midi_track (
- const ChanCount& input, const ChanCount& output,
+ const ChanCount& input, const ChanCount& output, bool strict_io,
boost::shared_ptr<PluginInfo> instrument,
Plugin::PresetRecord* pset,
RouteGroup* route_group, uint32_t how_many, std::string name_template,
);
RouteList new_audio_route (int input_channels, int output_channels, RouteGroup* route_group, uint32_t how_many, std::string name_template, PresentationInfo::Flag, PresentationInfo::order_t);
- RouteList new_midi_route (RouteGroup* route_group, uint32_t how_many, std::string name_template, boost::shared_ptr<PluginInfo> instrument, Plugin::PresetRecord*, PresentationInfo::Flag, PresentationInfo::order_t);
+ RouteList new_midi_route (RouteGroup* route_group, uint32_t how_many, std::string name_template, bool strict_io, boost::shared_ptr<PluginInfo> instrument, Plugin::PresetRecord*, PresentationInfo::Flag, PresentationInfo::order_t);
void remove_routes (boost::shared_ptr<RouteList>);
void remove_route (boost::shared_ptr<Route>);
framepos_t transport_frame () const {return _transport_frame; }
framepos_t record_location () const {return _last_record_location; }
- framepos_t audible_frame () const;
+ framepos_t audible_frame (bool* latent_locate = NULL) const;
framepos_t requested_return_frame() const { return _requested_return_frame; }
void set_requested_return_frame(framepos_t return_to);
bool synced_to_mtc () const { return config.get_external_sync() && Config->get_sync_source() == MTC && g_atomic_int_get (const_cast<gint*>(&_mtc_active)); }
bool synced_to_ltc () const { return config.get_external_sync() && Config->get_sync_source() == LTC && g_atomic_int_get (const_cast<gint*>(&_ltc_active)); }
- double transport_speed() const { return _transport_speed; }
+ double transport_speed() const { return _count_in_samples > 0 ? 0. : _transport_speed; }
bool transport_stopped() const { return _transport_speed == 0.0; }
- bool transport_rolling() const { return _transport_speed != 0.0; }
+ bool transport_rolling() const { return _transport_speed != 0.0 && _count_in_samples == 0; }
bool silent () { return _silent; }
uint32_t registered_lua_function_count () const { return _n_lua_scripts; }
void scripts_changed (); // called from lua, updates _n_lua_scripts
+ PBD::Signal0<void> LuaScriptsChanged;
+
/* flattening stuff */
boost::shared_ptr<Region> write_one_track (Track&, framepos_t start, framepos_t end,
/* session-wide solo/mute/rec-enable */
+ bool muted() const;
+ std::vector<boost::weak_ptr<AutomationControl> > cancel_all_mute ();
+
bool soloing() const { return _non_soloed_outs_muted; }
bool listening() const { return _listen_cnt > 0; }
bool solo_isolated() const { return _solo_isolated_cnt > 0; }
PBD::Signal1<void,bool> SoloActive;
PBD::Signal0<void> SoloChanged;
+ PBD::Signal0<void> MuteChanged;
PBD::Signal0<void> IsolatedChanged;
PBD::Signal0<void> MonitorChanged;
void maybe_update_session_range (framepos_t, framepos_t);
+ /* preroll */
+ framecnt_t preroll_samples (framepos_t) const;
+
+ void request_preroll_record_punch (framepos_t start, framecnt_t preroll);
+ void request_preroll_record_trim (framepos_t start, framecnt_t preroll);
+ void request_count_in_record ();
+
+ framepos_t preroll_record_punch_pos () const { return _preroll_record_punch_pos; }
+ bool preroll_record_punch_enabled () const { return _preroll_record_punch_pos >= 0; }
+
+ framecnt_t preroll_record_trim_len () const { return _preroll_record_trim_len; }
+
/* temporary hacks to allow selection to be pushed from GUI into backend.
Whenever we move the selection object into libardour, these will go away.
*/
*/
static PBD::Signal3<int,Session*,std::string,DataType> MissingFile;
+ void set_missing_file_replacement (const std::string& mfr) {
+ _missing_file_replacement = mfr;
+ }
+
/** Emitted when the session wants Ardour to quit */
static PBD::Signal0<void> Quit;
bool _under_nsm_control;
unsigned int _xrun_count;
+ std::string _missing_file_replacement;
+
void mtc_status_changed (bool);
PBD::ScopedConnection mtc_status_connection;
void ltc_status_changed (bool);
* know when to send full MTC messages every so often.
*/
pframes_t _pframes_since_last_mtc;
- bool session_midi_feedback;
bool play_loop;
bool loop_changing;
framepos_t last_loopend;
static const PostTransportWork ProcessCannotProceedMask =
PostTransportWork (
PostTransportInputChange|
- PostTransportSpeed|
PostTransportReverse|
PostTransportCurveRealloc|
PostTransportAudition|
void auto_connect_thread_terminate ();
pthread_t _auto_connect_thread;
- bool _ac_thread_active;
+ gint _ac_thread_active;
pthread_mutex_t _auto_connect_mutex;
pthread_cond_t _auto_connect_cond;
Timecode::Time transmitting_timecode_time;
int next_quarter_frame_to_send;
- double _frames_per_timecode_frame; /* has to be floating point because of drop frame */
+ double _samples_per_timecode_frame; /* has to be floating point because of drop frame */
framecnt_t _frames_per_hour;
framecnt_t _timecode_frames_per_hour;
TempoMap *_tempo_map;
void tempo_map_changed (const PBD::PropertyChange&);
- void gui_tempo_map_changed ();
/* edit/mix groups */
typedef std::list<Click*> Clicks;
Clicks clicks;
bool _clicking;
+ bool _click_rec_only;
boost::shared_ptr<IO> _click_io;
boost::shared_ptr<Amp> _click_gain;
Sample* click_data;
void setup_click_sounds (Sample**, Sample const *, framecnt_t*, framecnt_t, std::string const &);
void clear_clicks ();
void click (framepos_t start, framecnt_t nframes);
+ void run_click (framepos_t start, framecnt_t nframes);
+ void add_click (framepos_t pos, bool emphasis);
+ framecnt_t _count_in_samples;
std::vector<Route*> master_outs;
Evoral::Range<framepos_t> _range_selection;
Evoral::Range<framepos_t> _object_selection;
+ void unset_preroll_record_punch ();
+ void unset_preroll_record_trim ();
+
+ framepos_t _preroll_record_punch_pos;
+ framecnt_t _preroll_record_trim_len;
+ bool _count_in_once;
+
/* main outs */
uint32_t main_outs;
void auto_connect_master_bus ();
- /* Windows VST support */
-
- long _windows_vst_callback (
- WindowsVSTPlugin*,
- long opcode,
- long index,
- long value,
- void* ptr,
- float opt
- );
-
int find_all_sources (std::string path, std::set<std::string>& result);
int find_all_sources_across_snapshots (std::set<std::string>& result, bool exclude_this_snapshot);
void save_as_bring_callback (uint32_t, uint32_t, std::string);
- static int get_session_info_from_path (XMLTree& state_tree, const std::string& xmlpath);
static const uint32_t session_end_shift;
std::string _template_state_dir;