X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fdiskstream.cc;h=e046d5a830beda849f45ab7a77208f8de90a18ba;hb=944c32346b3c6bb87fccb22f159bdd9297bae50d;hp=69c83e30a182f7e3d189d77e7c6adb8e7d9eb962;hpb=040e016137ff15ebfa446f7e1de321d17be45dcd;p=ardour.git diff --git a/libs/ardour/diskstream.cc b/libs/ardour/diskstream.cc index 69c83e30a1..e046d5a830 100644 --- a/libs/ardour/diskstream.cc +++ b/libs/ardour/diskstream.cc @@ -29,10 +29,8 @@ #include #include #include -#include - -#include +#include #include "pbd/error.h" #include "pbd/basename.h" @@ -40,22 +38,12 @@ #include "pbd/xml++.h" #include "pbd/stacktrace.h" -#include "ardour/ardour.h" -#include "ardour/audioengine.h" #include "ardour/debug.h" #include "ardour/diskstream.h" -#include "ardour/utils.h" -#include "ardour/configuration.h" -#include "ardour/audiofilesource.h" -#include "ardour/send.h" +#include "ardour/io.h" #include "ardour/pannable.h" -#include "ardour/panner_shell.h" #include "ardour/playlist.h" -#include "ardour/cycle_timer.h" -#include "ardour/region.h" -#include "ardour/panner.h" #include "ardour/session.h" -#include "ardour/io.h" #include "ardour/track.h" #include "i18n.h" @@ -70,7 +58,7 @@ using namespace PBD; * default from configuration_vars.h). 0 is not a good value for * allocating buffer sizes.. */ -ARDOUR::framecnt_t Diskstream::disk_io_chunk_frames = 1024 * 256; +ARDOUR::framecnt_t Diskstream::disk_io_chunk_frames = 1024 * 256 / sizeof (Sample); PBD::Signal0 Diskstream::DiskOverrun; PBD::Signal0 Diskstream::DiskUnderrun; @@ -84,7 +72,6 @@ Diskstream::Diskstream (Session &sess, const string &name, Flag flag) , _actual_speed (1.0f) , _buffer_reallocation_required (false) , _seek_required (false) - , force_refill (false) , capture_start_frame (0) , capture_captured (0) , was_recording (false) @@ -96,7 +83,6 @@ Diskstream::Diskstream (Session &sess, const string &name, Flag flag) , last_possibly_recording (0) , _alignment_style (ExistingMaterial) , _alignment_choice (Automatic) - , _scrubbing (false) , _slaved (false) , loop_location (0) , overwrite_frame (0) @@ -109,9 +95,6 @@ Diskstream::Diskstream (Session &sess, const string &name, Flag flag) , _target_speed (_speed) , file_frame (0) , playback_sample (0) - , playback_distance (0) - , _read_data_count (0) - , _write_data_count (0) , in_set_state (false) , _flags (flag) , deprecated_io_node (0) @@ -127,7 +110,6 @@ Diskstream::Diskstream (Session& sess, const XMLNode& /*node*/) , _actual_speed (1.0f) , _buffer_reallocation_required (false) , _seek_required (false) - , force_refill (false) , capture_start_frame (0) , capture_captured (0) , was_recording (false) @@ -139,7 +121,6 @@ Diskstream::Diskstream (Session& sess, const XMLNode& /*node*/) , last_possibly_recording (0) , _alignment_style (ExistingMaterial) , _alignment_choice (Automatic) - , _scrubbing (false) , _slaved (false) , loop_location (0) , overwrite_frame (0) @@ -152,9 +133,6 @@ Diskstream::Diskstream (Session& sess, const XMLNode& /*node*/) , _target_speed (_speed) , file_frame (0) , playback_sample (0) - , playback_distance (0) - , _read_data_count (0) - , _write_data_count (0) , in_set_state (false) , _flags (Recordable) , deprecated_io_node (0) @@ -192,7 +170,7 @@ Diskstream::set_track (Track* t) void Diskstream::handle_input_change (IOChange change, void * /*src*/) { - Glib::Mutex::Lock lm (state_lock); + Glib::Threads::Mutex::Lock lm (state_lock); if (change.type & (IOChange::ConfigurationChanged|IOChange::ConnectionsChanged)) { @@ -214,7 +192,7 @@ Diskstream::non_realtime_set_speed () { if (_buffer_reallocation_required) { - Glib::Mutex::Lock lm (state_lock); + Glib::Threads::Mutex::Lock lm (state_lock); allocate_temporary_buffers (); _buffer_reallocation_required = false; @@ -245,8 +223,8 @@ Diskstream::realtime_set_speed (double sp, bool global) if (new_speed != _actual_speed) { - framecnt_t required_wrap_size = (framecnt_t) floor (_session.get_block_size() * - fabs (new_speed)) + 1; + framecnt_t required_wrap_size = (framecnt_t) ceil (_session.get_block_size() * + fabs (new_speed)) + 2; if (required_wrap_size > wrap_buffer_size) { _buffer_reallocation_required = true; @@ -280,26 +258,26 @@ Diskstream::set_capture_offset () void -Diskstream::set_align_style (AlignStyle a) +Diskstream::set_align_style (AlignStyle a, bool force) { if (record_enabled() && _session.actively_recording()) { return; } - if (a != _alignment_style) { + if ((a != _alignment_style) || force) { _alignment_style = a; AlignmentStyleChanged (); } } void -Diskstream::set_align_choice (AlignChoice a) +Diskstream::set_align_choice (AlignChoice a, bool force) { if (record_enabled() && _session.actively_recording()) { return; } - if (a != _alignment_choice) { + if ((a != _alignment_choice) || force) { _alignment_choice = a; switch (_alignment_choice) { @@ -336,7 +314,7 @@ Diskstream::set_loop (Location *location) ARDOUR::framepos_t Diskstream::get_capture_start_frame (uint32_t n) const { - Glib::Mutex::Lock lm (capture_info_lock); + Glib::Threads::Mutex::Lock lm (capture_info_lock); if (capture_info.size() > n) { /* this is a completed capture */ @@ -350,12 +328,12 @@ Diskstream::get_capture_start_frame (uint32_t n) const ARDOUR::framecnt_t Diskstream::get_captured_frames (uint32_t n) const { - Glib::Mutex::Lock lm (capture_info_lock); + Glib::Threads::Mutex::Lock lm (capture_info_lock); if (capture_info.size() > n) { /* this is a completed capture */ return capture_info[n]->frames; - } else { + } else { /* this is the currently in-progress capture */ return capture_captured; } @@ -377,7 +355,7 @@ Diskstream::use_playlist (boost::shared_ptr playlist) bool prior_playlist = false; { - Glib::Mutex::Lock lm (state_lock); + Glib::Threads::Mutex::Lock lm (state_lock); if (playlist == _playlist) { return 0; @@ -481,7 +459,7 @@ Diskstream::get_state () if (_extra_xml) { node->add_child_copy (*_extra_xml); } - + return *node; } @@ -495,13 +473,9 @@ Diskstream::set_state (const XMLNode& node, int /*version*/) } if (deprecated_io_node) { - if ((prop = deprecated_io_node->property ("id")) != 0) { - _id = prop->value (); - } + set_id (*deprecated_io_node); } else { - if ((prop = node.property ("id")) != 0) { - _id = prop->value (); - } + set_id (node); } if ((prop = node.property ("flags")) != 0) { @@ -509,25 +483,17 @@ Diskstream::set_state (const XMLNode& node, int /*version*/) } if ((prop = node.property (X_("capture-alignment"))) != 0) { - _alignment_choice = AlignChoice (string_2_enum (prop->value(), _alignment_choice)); + set_align_choice (AlignChoice (string_2_enum (prop->value(), _alignment_choice)), true); } else { - _alignment_choice = Automatic; + set_align_choice (Automatic, true); } if ((prop = node.property ("playlist")) == 0) { return -1; } - { - bool had_playlist = (_playlist != 0); - - if (find_and_use_playlist (prop->value())) { - return -1; - } - - if (!had_playlist) { - _playlist->set_orig_diskstream_id (id()); - } + if (find_and_use_playlist (prop->value())) { + return -1; } if ((prop = node.property ("speed")) != 0) { @@ -548,11 +514,11 @@ Diskstream::playlist_ranges_moved (list< Evoral::RangeMove > const & automation undo (it must, since automation-follows-regions can lose automation data). Hence we can do nothing here. */ - + if (from_undo) { return; } - + if (!_track || Config->get_automation_follows_regions () == false) { return; } @@ -569,14 +535,14 @@ Diskstream::playlist_ranges_moved (list< Evoral::RangeMove > const & /* move panner automation */ boost::shared_ptr pannable = _track->pannable(); Evoral::ControlSet::Controls& c (pannable->controls()); - + for (Evoral::ControlSet::Controls::iterator ci = c.begin(); ci != c.end(); ++ci) { boost::shared_ptr ac = boost::dynamic_pointer_cast(ci->second); if (!ac) { continue; } boost::shared_ptr alist = ac->alist(); - + XMLNode & before = alist->get_state (); bool const things_moved = alist->move_ranges (movements); if (things_moved) { @@ -604,7 +570,7 @@ Diskstream::move_processor_automation (boost::weak_ptr p, list< Evora set const a = processor->what_can_be_automated (); - for (set::iterator i = a.begin (); i != a.end (); ++i) { + for (set::const_iterator i = a.begin (); i != a.end (); ++i) { boost::shared_ptr al = processor->automation_control(*i)->alist(); XMLNode & before = al->get_state (); bool const things_moved = al->move_ranges (movements); @@ -634,7 +600,7 @@ Diskstream::check_record_status (framepos_t transport_frame, bool can_record) */ rolling = _session.transport_speed() != 0.0f; - possibly_recording = (rolling << 2) | (record_enabled() << 1) | can_record; + possibly_recording = (rolling << 2) | ((int)record_enabled() << 1) | (int)can_record; change = possibly_recording ^ last_possibly_recording; if (possibly_recording == last_possibly_recording) { @@ -657,19 +623,19 @@ Diskstream::check_record_status (framepos_t transport_frame, bool can_record) name(), first_recordable_frame, last_recordable_frame, capture_start_frame, _capture_offset, existing_material_offset, - transport_frame, + transport_frame, _roll_delay, _session.transport_frame(), _session.worst_output_latency(), _session.worst_track_latency())); - + if (_alignment_style == ExistingMaterial) { first_recordable_frame += existing_material_offset; DEBUG_TRACE (DEBUG::CaptureAlignment, string_compose ("\tshift FRF by EMO %1\n", first_recordable_frame)); - } - + } + prepare_record_status (capture_start_frame); } else { @@ -677,22 +643,22 @@ Diskstream::check_record_status (framepos_t transport_frame, bool can_record) if (last_possibly_recording == fully_rec_enabled) { /* we were recording last time */ - + if (change & transport_rolling) { /* transport-change (stopped rolling): last_recordable_frame was set in ::prepare_to_stop(). We had to set it there because we likely rolled past the stopping point to declick out, and then backed up. */ - + } else { /* punch out */ - + last_recordable_frame = _session.transport_frame() + _capture_offset; - + if (_alignment_style == ExistingMaterial) { last_recordable_frame += existing_material_offset; - } + } } } } @@ -707,15 +673,15 @@ Diskstream::route_going_away () } void -Diskstream::calculate_record_range(OverlapType ot, framepos_t transport_frame, framecnt_t nframes, - framecnt_t & rec_nframes, framecnt_t & rec_offset) +Diskstream::calculate_record_range (Evoral::OverlapType ot, framepos_t transport_frame, framecnt_t nframes, + framecnt_t & rec_nframes, framecnt_t & rec_offset) { switch (ot) { - case OverlapNone: + case Evoral::OverlapNone: rec_nframes = 0; break; - case OverlapInternal: + case Evoral::OverlapInternal: /* ---------- recrange |---| transrange */ @@ -723,7 +689,7 @@ Diskstream::calculate_record_range(OverlapType ot, framepos_t transport_frame, f rec_offset = 0; break; - case OverlapStart: + case Evoral::OverlapStart: /* |--------| recrange -----| transrange */ @@ -733,7 +699,7 @@ Diskstream::calculate_record_range(OverlapType ot, framepos_t transport_frame, f } break; - case OverlapEnd: + case Evoral::OverlapEnd: /* |--------| recrange |-------- transrange */ @@ -741,7 +707,7 @@ Diskstream::calculate_record_range(OverlapType ot, framepos_t transport_frame, f rec_offset = 0; break; - case OverlapExternal: + case Evoral::OverlapExternal: /* |--------| recrange -------------- transrange */ @@ -751,7 +717,7 @@ Diskstream::calculate_record_range(OverlapType ot, framepos_t transport_frame, f } DEBUG_TRACE (DEBUG::CaptureAlignment, string_compose ("%1 rec? %2 @ %3 (for %4) FRF %5 LRF %6 : rf %7 @ %8\n", - _name, enum_2_string (ot), transport_frame, nframes, + _name, enum_2_string (ot), transport_frame, nframes, first_recordable_frame, last_recordable_frame, rec_nframes, rec_offset)); } @@ -760,3 +726,16 @@ Diskstream::prepare_to_stop (framepos_t pos) { last_recordable_frame = pos + _capture_offset; } + +void +Diskstream::engage_record_enable () +{ + g_atomic_int_set (&_record_enabled, 1); +} + +void +Diskstream::disengage_record_enable () +{ + g_atomic_int_set (&_record_enabled, 0); +} +