bool srcHasSR = false;
bool srcHasRL = false;
bool srcHasRR = false;
+ bool srcHasBC = false;
bool dstHasSL = false;
bool dstHasSR = false;
bool dstHasRL = false;
bool dstHasRR = false;
+ bool dstHasBC = false;
for (unsigned int c = 0; c < rhs.m_channelCount; ++c)
switch(rhs.m_channels[c])
case AE_CH_SR: dstHasSR = true; break;
case AE_CH_BL: dstHasRL = true; break;
case AE_CH_BR: dstHasRR = true; break;
+ case AE_CH_BC: dstHasBC = true; break;
default:
break;
}
case AE_CH_SR: srcHasSR = true; break;
case AE_CH_BL: srcHasRL = true; break;
case AE_CH_BR: srcHasRR = true; break;
+ case AE_CH_BC: srcHasBC = true; break;
default:
break;
}
if (srcHasRR && !dstHasRR && dstHasSR)
newInfo += AE_CH_SR;
+ // mix back center if not available in destination layout
+ // prefer mixing into backs if available
+ if (srcHasBC && !dstHasBC)
+ {
+ if (dstHasRL && !newInfo.HasChannel(AE_CH_BL))
+ newInfo += AE_CH_BL;
+ else if (dstHasSL && !newInfo.HasChannel(AE_CH_SL))
+ newInfo += AE_CH_SL;
+
+ if (dstHasRR && !newInfo.HasChannel(AE_CH_BR))
+ newInfo += AE_CH_BR;
+ else if (dstHasSR && !newInfo.HasChannel(AE_CH_SR))
+ newInfo += AE_CH_SR;
+ }
+
*this = newInfo;
}