diff options
Diffstat (limited to 'libs')
-rw-r--r-- | libs/ardour/ardour/audiosource.h | 1 | ||||
-rw-r--r-- | libs/ardour/audioregion.cc | 13 | ||||
-rw-r--r-- | libs/ardour/audiosource.cc | 12 |
3 files changed, 23 insertions, 3 deletions
diff --git a/libs/ardour/ardour/audiosource.h b/libs/ardour/ardour/audiosource.h index 20acd9fcd8..ef455f9735 100644 --- a/libs/ardour/ardour/audiosource.h +++ b/libs/ardour/ardour/audiosource.h @@ -90,6 +90,7 @@ class AudioSource : public Source, public boost::enable_shared_from_this<ARDOUR: 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, nframes_t npeaks, nframes_t start, nframes_t cnt, double samples_per_visual_peak) const; diff --git a/libs/ardour/audioregion.cc b/libs/ardour/audioregion.cc index 373f9fced7..a25ac839be 100644 --- a/libs/ardour/audioregion.cc +++ b/libs/ardour/audioregion.cc @@ -583,11 +583,18 @@ AudioRegion::_read_at (const SourceList& srcs, nframes_t limit, } else { - /* track is N-channel, this region has less channels; silence the ones - we don't have. + /* track is N-channel, this region has less channels, so use a relevant channel */ - memset (mixdown_buffer, 0, sizeof (Sample) * cnt); + uint32_t channel = n_channels() % chan_n; + + if (srcs[channel]->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 */ + srcs[channel]->dec_read_data_count (to_read); + } if (rops & ReadOpsFades) { diff --git a/libs/ardour/audiosource.cc b/libs/ardour/audiosource.cc index fbac57dc7c..2fc7fd18cd 100644 --- a/libs/ardour/audiosource.cc +++ b/libs/ardour/audiosource.cc @@ -1015,3 +1015,15 @@ AudioSource::check_for_analysis_data_on_disk () return ok; } + +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; + } +} |