summaryrefslogtreecommitdiff
path: root/src/lib/mid_side_decoder.cc
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2015-09-11 22:29:28 +0100
committerCarl Hetherington <cth@carlh.net>2015-09-11 22:29:28 +0100
commitb9842263a402b5ce1d2f85a1346ca11a419f816e (patch)
treea7d143006ec15cd216f7df5d448b1b28b7ef9ad7 /src/lib/mid_side_decoder.cc
parent9a2dca23967ff404dab1a36ec3fb9075d5e8e66e (diff)
Fix assertion failure when processors return fewer channels than the DCP has.
Diffstat (limited to 'src/lib/mid_side_decoder.cc')
-rw-r--r--src/lib/mid_side_decoder.cc21
1 files changed, 16 insertions, 5 deletions
diff --git a/src/lib/mid_side_decoder.cc b/src/lib/mid_side_decoder.cc
index 842d5c8ee..4f619ad57 100644
--- a/src/lib/mid_side_decoder.cc
+++ b/src/lib/mid_side_decoder.cc
@@ -59,16 +59,27 @@ MidSideDecoder::clone (int) const
}
shared_ptr<AudioBuffers>
-MidSideDecoder::run (shared_ptr<const AudioBuffers> in)
+MidSideDecoder::run (shared_ptr<const AudioBuffers> in, int channels)
{
- shared_ptr<AudioBuffers> out (new AudioBuffers (3, in->frames ()));
+ int const N = min (channels, 3);
+ shared_ptr<AudioBuffers> out (new AudioBuffers (channels, in->frames ()));
for (int i = 0; i < in->frames(); ++i) {
float const left = in->data()[0][i];
float const right = in->data()[1][i];
float const mid = (left + right) / 2;
- out->data()[0][i] = left - mid;
- out->data()[1][i] = right - mid;
- out->data()[2][i] = mid;
+ if (N > 0) {
+ out->data()[0][i] = left - mid;
+ }
+ if (N > 1) {
+ out->data()[1][i] = right - mid;
+ }
+ if (N > 2) {
+ out->data()[2][i] = mid;
+ }
+ }
+
+ for (int i = N; i < channels; ++i) {
+ out->make_silent (i);
}
return out;