Audaspace:

Fix for channel mapping bug. Now 7.1 channels should get mapped correctly.
This commit is contained in:
Joerg Mueller 2012-10-25 10:25:30 +00:00
parent 0632da0829
commit ad2dffe7c6

@ -67,10 +67,12 @@ void AUD_ChannelMapperReader::setMonoAngle(float angle)
float AUD_ChannelMapperReader::angleDistance(float alpha, float beta) float AUD_ChannelMapperReader::angleDistance(float alpha, float beta)
{ {
alpha = fabs(alpha - beta); alpha = beta - alpha;
if(alpha > M_PI) if(alpha > M_PI)
alpha = fabs(alpha - 2 * M_PI); alpha -= 2 * M_PI;
if(alpha < -M_PI)
alpha += 2 * M_PI;
return alpha; return alpha;
} }
@ -107,8 +109,8 @@ void AUD_ChannelMapperReader::calculateMapping()
if(m_source_channels == AUD_CHANNELS_MONO) if(m_source_channels == AUD_CHANNELS_MONO)
source_angles = &m_mono_angle; source_angles = &m_mono_angle;
int channel_min1, channel_min2; int channel_left, channel_right;
float angle_min1, angle_min2, angle; float angle_left, angle_right, angle;
for(int i = 0; i < m_source_channels; i++) for(int i = 0; i < m_source_channels; i++)
{ {
@ -120,38 +122,46 @@ void AUD_ChannelMapperReader::calculateMapping()
continue; continue;
} }
channel_min1 = channel_min2 = -1; channel_left = channel_right = -1;
angle_min1 = angle_min2 = 2 * M_PI; angle_left = -2 * M_PI;
angle_right = 2 * M_PI;
for(int j = 0; j < m_target_channels; j++) for(int j = 0; j < m_target_channels; j++)
{ {
if(j == lfe) if(j == lfe)
continue; continue;
angle = angleDistance(source_angles[i], target_angles[j]); angle = angleDistance(source_angles[i], target_angles[j]);
if(angle < angle_min1) if(angle < 0)
{ {
channel_min2 = channel_min1; if(angle > angle_left)
angle_min2 = angle_min1;
channel_min1 = j;
angle_min1 = angle;
}
else if(angle < angle_min2)
{ {
channel_min2 = j; angle_left = angle;
angle_min2 = angle; channel_left = j;
} }
} }
angle = angle_min1 + angle_min2;
if(channel_min2 == -1 || angle == 0)
{
m_mapping[channel_min1 * m_source_channels + i] = 1;
}
else else
{ {
m_mapping[channel_min1 * m_source_channels + i] = cos(M_PI_2 * angle_min1 / angle); if(angle < angle_right)
m_mapping[channel_min2 * m_source_channels + i] = cos(M_PI_2 * angle_min2 / angle); {
angle_right = angle;
channel_right = j;
}
}
}
angle = angle_right - angle_left;
if(channel_right == -1 || angle == 0)
{
m_mapping[channel_left * m_source_channels + i] = 1;
}
else if(channel_left == -1)
{
m_mapping[channel_right * m_source_channels + i] = 1;
}
else
{
m_mapping[channel_left * m_source_channels + i] = cos(M_PI_2 * angle_left / angle);
m_mapping[channel_right * m_source_channels + i] = cos(M_PI_2 * angle_right / angle);
} }
} }