summaryrefslogtreecommitdiff
path: root/libs
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2010-08-17 15:39:50 +0000
committerPaul Davis <paul@linuxaudiosystems.com>2010-08-17 15:39:50 +0000
commit8d8bc9baca511399f89c0f4b0657b2d2f957824c (patch)
treea030329767ab44f07ade92c8c3001cfa3962873c /libs
parentc24d323d0c2f00cb9c6e93b5338b1ed9886a6a1e (diff)
forward port 2.X various changes (not all, but i have a list) ending with 6928
git-svn-id: svn://localhost/ardour2/branches/3.0@7643 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs')
-rw-r--r--libs/ardour/ardour/audiosource.h1
-rw-r--r--libs/ardour/ardour/rc_configuration_vars.h1
-rw-r--r--libs/ardour/audioregion.cc21
-rw-r--r--libs/ardour/audiosource.cc11
4 files changed, 33 insertions, 1 deletions
diff --git a/libs/ardour/ardour/audiosource.h b/libs/ardour/ardour/audiosource.h
index 2d749dd673..249757f9b4 100644
--- a/libs/ardour/ardour/audiosource.h
+++ b/libs/ardour/ardour/audiosource.h
@@ -70,6 +70,7 @@ class AudioSource : virtual public Source,
uint32_t read_data_count() const { return _read_data_count; }
uint32_t write_data_count() const { return _write_data_count; }
+ void dec_read_data_count(nframes_t);
int read_peaks (PeakData *peaks, framecnt_t npeaks,
framepos_t start, framecnt_t cnt, double samples_per_visual_peak) const;
diff --git a/libs/ardour/ardour/rc_configuration_vars.h b/libs/ardour/ardour/rc_configuration_vars.h
index 244744cfe2..a637ac4bb8 100644
--- a/libs/ardour/ardour/rc_configuration_vars.h
+++ b/libs/ardour/ardour/rc_configuration_vars.h
@@ -123,6 +123,7 @@ CONFIG_VARIABLE (float, meter_falloff, "meter-falloff", 32.0f)
/* miscellany */
+CONFIG_VARIABLE (bool, replicate_missing_region_channels, "replicate-missing-region-channels", false)
CONFIG_VARIABLE (bool, hiding_groups_deactivates_groups, "hiding-groups-deactivates-groups", true)
CONFIG_VARIABLE (bool, verify_remove_last_capture, "verify-remove-last-capture", true)
CONFIG_VARIABLE (bool, no_new_session_dialog, "no-new-session-dialog", false)
diff --git a/libs/ardour/audioregion.cc b/libs/ardour/audioregion.cc
index a1cb58458b..992ae7fab2 100644
--- a/libs/ardour/audioregion.cc
+++ b/libs/ardour/audioregion.cc
@@ -356,6 +356,10 @@ AudioRegion::_read_at (const SourceList& /*srcs*/, framecnt_t limit,
framecnt_t to_read;
bool raw = (rops == ReadOpsNone);
+ if (n_channels() == 0) {
+ return 0;
+ }
+
if (muted() && !raw) {
return 0; /* read nothing */
}
@@ -407,7 +411,22 @@ AudioRegion::_read_at (const SourceList& /*srcs*/, framecnt_t limit,
we don't have.
*/
- memset (mixdown_buffer, 0, sizeof (Sample) * cnt);
+ if (Config->get_replicate_missing_region_channels()) {
+ /* track is N-channel, this region has less channels, so use a relevant channel
+ */
+
+ uint32_t channel = n_channels() % chan_n;
+ boost::shared_ptr<AudioSource> src = audio_source (channel);
+
+ if (src->read (mixdown_buffer, _start + internal_offset, to_read) != to_read) {
+ return 0; /* "read nothing" */
+ }
+
+ /* adjust read data count appropriately since this was a duplicate read */
+ src->dec_read_data_count (to_read);
+ } else {
+ memset (mixdown_buffer, 0, sizeof (Sample) * cnt);
+ }
}
if (rops & ReadOpsFades) {
diff --git a/libs/ardour/audiosource.cc b/libs/ardour/audiosource.cc
index f309f599c5..083cf3bea9 100644
--- a/libs/ardour/audiosource.cc
+++ b/libs/ardour/audiosource.cc
@@ -945,3 +945,14 @@ AudioSource::available_peaks (double zoom_factor) const
return (end/sizeof(PeakData)) * _FPP;
}
+void
+AudioSource::dec_read_data_count (nframes_t cnt)
+{
+ uint32_t val = cnt * sizeof (Sample);
+
+ if (val < _read_data_count) {
+ _read_data_count -= val;
+ } else {
+ _read_data_count = 0;
+ }
+}