# HG changeset patch # User benoit # Date 1278925853 0 # Node ID 36f7c2d7b3fb17d333b567788db99d6610bac90c # Parent 9109a7e48d6ee2168c07f7a8d8f125cb908f960a Fix side channels when XCh extension is present. Patch by Nick Brereton $name AT n$surname DOT net diff -r 9109a7e48d6e -r 36f7c2d7b3fb dca.c --- a/dca.c Mon Jul 12 09:00:17 2010 +0000 +++ b/dca.c Mon Jul 12 09:10:53 2010 +0000 @@ -1394,6 +1394,20 @@ /* filter to get final output */ for (i = 0; i < (s->sample_blocks / 8); i++) { dca_filter_channels(s, i); + + /* If this was marked as a DTS-ES stream we need to subtract back- */ + /* channel from SL & SR to remove matrixed back-channel signal */ + if((s->source_pcm_res & 1) && s->xch_present) { + float* back_chan = s->samples + s->channel_order_tab[s->xch_base_channel] * 256; + float* lt_chan = s->samples + s->channel_order_tab[s->xch_base_channel - 2] * 256; + float* rt_chan = s->samples + s->channel_order_tab[s->xch_base_channel - 1] * 256; + int j; + for(j = 0; j < 256; ++j) { + lt_chan[j] -= (back_chan[j] - s->add_bias) * 0.707107f; + rt_chan[j] -= (back_chan[j] - s->add_bias) * 0.707107f; + } + } + s->dsp.float_to_int16_interleave(samples, s->samples_chanptr, 256, channels); samples += 256 * channels; }