33 #include <glibmm/threads.h>
41 #include "ardour/debug.h"
56 ARDOUR::framecnt_t Diskstream::disk_read_chunk_frames = default_disk_read_chunk_frames ();
57 ARDOUR::framecnt_t Diskstream::disk_write_chunk_frames = default_disk_write_chunk_frames ();
59 PBD::Signal0<void> Diskstream::DiskOverrun;
60 PBD::Signal0<void> Diskstream::DiskUnderrun;
62 Diskstream::Diskstream (
Session &sess,
const string &
name, Flag flag)
64 , i_am_the_modifier (0)
67 , _visible_speed (1.0
f)
68 , _actual_speed (1.0
f)
69 , _buffer_reallocation_required (false)
70 , _seek_required (false)
71 , capture_start_frame (0)
72 , capture_captured (0)
73 , was_recording (false)
74 , adjust_capture_position (0)
79 , last_possibly_recording (0)
85 , overwrite_offset (0)
86 , _pending_overwrite (false)
87 , overwrite_queued (false)
88 , wrap_buffer_size (0)
89 , speed_buffer_size (0)
91 , _target_speed (_speed)
94 , in_set_state (false)
96 , deprecated_io_node (0)
102 , i_am_the_modifier (0)
104 , _record_enabled (0)
105 , _visible_speed (1.0
f)
106 , _actual_speed (1.0
f)
107 , _buffer_reallocation_required (false)
108 , _seek_required (false)
109 , capture_start_frame (0)
110 , capture_captured (0)
111 , was_recording (false)
112 , adjust_capture_position (0)
113 , _capture_offset (0)
117 , last_possibly_recording (0)
122 , overwrite_frame (0)
123 , overwrite_offset (0)
124 , _pending_overwrite (false)
125 , overwrite_queued (false)
126 , wrap_buffer_size (0)
127 , speed_buffer_size (0)
129 , _target_speed (_speed)
131 , playback_sample (0)
132 , in_set_state (false)
133 , _flags (Recordable)
134 , deprecated_io_node (0)
223 fabs (new_speed)) + 2;
308 if (location->
start() >= location->
end()) {
362 bool prior_playlist =
false;
375 prior_playlist =
true;
466 id().
print (buf,
sizeof (buf));
484 if ((prop = node.
property (
"name")) != 0) {
494 if ((prop = node.
property (
"flags")) != 0) {
498 if ((prop = node.
property (
X_(
"capture-alignment"))) != 0) {
504 if ((prop = node.
property (
"playlist")) == 0) {
512 if ((prop = node.
property (
"speed")) != 0) {
513 double sp =
atof (prop->
value().c_str());
535 if (!
_track ||
Config->get_automation_follows_regions () ==
false) {
539 list< Evoral::RangeMove<double> > movements;
542 i != movements_frames.end();
552 for (Evoral::ControlSet::Controls::iterator ci = c.begin(); ci != c.end(); ++ci) {
560 bool const things_moved = alist->
move_ranges (movements);
579 list< Evoral::RangeMove<double> > movements;
584 set<Evoral::Parameter>
const a = processor->what_can_be_automated ();
586 for (set<Evoral::Parameter>::const_iterator i = a.begin (); i != a.end (); ++i) {
589 bool const things_moved = al->
move_ranges (movements);
603 int possibly_recording;
606 const int transport_rolling = 0x4;
607 const int track_rec_enabled = 0x2;
608 const int global_rec_enabled = 0x1;
609 const int fully_rec_enabled = (transport_rolling|track_rec_enabled|global_rec_enabled);
616 possibly_recording = (rolling << 2) | ((
int)
record_enabled() << 1) | (
int)can_record;
619 if (possibly_recording == last_possibly_recording) {
625 if (possibly_recording == fully_rec_enabled) {
627 if (last_possibly_recording == fully_rec_enabled) {
638 existing_material_offset,
656 if (last_possibly_recording == fully_rec_enabled) {
660 if (change & transport_rolling) {
679 last_possibly_recording = possibly_recording;
701 rec_nframes = nframes;
711 rec_offset = first_recordable_frame - transport_frame;
728 rec_offset = first_recordable_frame - transport_frame;
framepos_t first_recordable_frame
framecnt_t _capture_offset
PBD::ScopedConnectionList playlist_connections
void handle_input_change(IOChange, void *src)
framepos_t get_capture_start_frame(uint32_t n=0) const
ARDOUR::Session & _session
virtual void playlist_deleted(boost::weak_ptr< Playlist >)
void calculate_record_range(Evoral::OverlapType ot, framepos_t transport_frame, framecnt_t nframes, framecnt_t &rec_nframes, framecnt_t &rec_offset)
PBD::Signal0< void > SpeedChanged
boost::shared_ptr< Playlist > _playlist
PBD::Signal0< void > DropReferences
const std::string & value() const
framecnt_t worst_playback_latency() const
virtual void allocate_temporary_buffers()=0
double transport_speed() const
LIBARDOUR_API uint64_t Destruction
PBD::Signal0< void > Destroyed
virtual void playlist_modified()
virtual bool set_name(const std::string &str)
void disengage_record_enable()
virtual void set_capture_offset()
bool actively_recording() const
shared_ptr< T > dynamic_pointer_cast(shared_ptr< U > const &r)
framecnt_t latency() const
framecnt_t wrap_buffer_size
boost::shared_ptr< Pannable > pannable() const
uint32_t i_am_the_modifier
void add_command(Command *const cmd)
PBD::Signal0< void > PlaylistChanged
framepos_t last_recordable_frame
void set_align_choice(AlignChoice a, bool force=false)
XMLNode * add_child_copy(const XMLNode &)
PBD::Signal0< void > ContentsChanged
LIBPBD_API Transmitter error
virtual void reset_write_sources(bool, bool force=false)=0
void set_track(ARDOUR::Track *)
void request_input_change_handling()
LIBARDOUR_API uint64_t CaptureAlignment
virtual void set_align_style_from_io()
AlignChoice _alignment_choice
virtual void check_record_status(framepos_t transport_frame, bool can_record)
PBD::Signal0< void > AlignmentStyleChanged
virtual bool set_write_source_name(const std::string &str)
virtual int seek(framepos_t which_sample, bool complete_refill=false)=0
std::string _write_source_name
static framecnt_t default_disk_write_chunk_frames()
IOChange input_change_pending
const ChanCount & n_ports() const
Glib::Threads::Mutex state_lock
void engage_record_enable()
XMLProperty * property(const char *)
boost::shared_ptr< ARDOUR::IO > _io
LIBARDOUR_API RCConfiguration * Config
int set_loop(Location *loc)
#define string_2_enum(str, e)
std::vector< CaptureInfo * > capture_info
enum ARDOUR::IOChange::Type type
bool set_name(const std::string &str)
framepos_t transport_frame() const
const PBD::ID & id() const
virtual bool set_name(const std::string &str)
static framecnt_t default_disk_read_chunk_frames()
void print(char *buf, uint32_t bufsize) const
PBD::Signal2< void, std::list< Evoral::RangeMove< framepos_t > > const &, bool > RangesMoved
bool set_id(const XMLNode &)
virtual void playlist_changed(const PBD::PropertyChange &)
void foreach_processor(boost::function< void(boost::weak_ptr< Processor >)> method)
framecnt_t worst_track_latency() const
bool record_enabled() const
PBD::Signal2< void, IOChange, void * > changed
framecnt_t worst_output_latency() const
#define DEBUG_TRACE(bits, str)
void move_processor_automation(boost::weak_ptr< Processor >, std::list< Evoral::RangeMove< framepos_t > > const &)
PBD::Signal1< void, Location * > LoopSet
virtual int set_state(const XMLNode &, int version)
PBD::Property< std::string > _name
std::map< Parameter, boost::shared_ptr< Control > > Controls
framepos_t capture_start_frame
XMLProperty * add_property(const char *name, const std::string &value)
const std::string & name() const
pframes_t get_block_size() const
virtual void playlist_ranges_moved(std::list< Evoral::RangeMove< framepos_t > > const &, bool)
void non_realtime_set_speed()
framecnt_t capture_captured
boost::shared_ptr< IO > input() const
bool move_ranges(std::list< RangeMove< double > > const &)
int last_possibly_recording
virtual bool realtime_set_speed(double, bool global_change)
bool _buffer_reallocation_required
boost::shared_ptr< AutomationList > alist() const
framecnt_t get_captured_frames(uint32_t n=0) const
static const framepos_t max_framepos
virtual void prepare_record_status(framepos_t)
virtual int find_and_use_playlist(const std::string &)=0
virtual void non_realtime_input_change()=0
virtual void prepare_to_stop(framepos_t transport_pos, framepos_t audible_frame)
Glib::Threads::Mutex capture_info_lock
void set_roll_delay(framecnt_t)
static const ChanCount ZERO
boost::shared_ptr< Playlist > playlist()
virtual int use_playlist(boost::shared_ptr< Playlist >)
virtual XMLNode & get_state(void)
void set_align_style(AlignStyle, bool force=false)
XMLNode * deprecated_io_node
PBD::ScopedConnection ic_connection
std::string string_compose(const std::string &fmt, const T1 &o1)
double atof(const string &s)
void request_overwrite_buffer(Track *)
AlignStyle _alignment_style