forked from bartvdbraak/blender
Audaspace:
Fix for channel mapping bug. Now 7.1 channels should get mapped correctly.
This commit is contained in:
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;
|
{
|
||||||
|
angle_left = angle;
|
||||||
channel_min1 = j;
|
channel_left = j;
|
||||||
angle_min1 = angle;
|
}
|
||||||
}
|
}
|
||||||
else if(angle < angle_min2)
|
else
|
||||||
{
|
{
|
||||||
channel_min2 = j;
|
if(angle < angle_right)
|
||||||
angle_min2 = angle;
|
{
|
||||||
|
angle_right = angle;
|
||||||
|
channel_right = j;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
angle = angle_min1 + angle_min2;
|
angle = angle_right - angle_left;
|
||||||
if(channel_min2 == -1 || angle == 0)
|
if(channel_right == -1 || angle == 0)
|
||||||
{
|
{
|
||||||
m_mapping[channel_min1 * m_source_channels + i] = 1;
|
m_mapping[channel_left * m_source_channels + i] = 1;
|
||||||
|
}
|
||||||
|
else if(channel_left == -1)
|
||||||
|
{
|
||||||
|
m_mapping[channel_right * m_source_channels + i] = 1;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
m_mapping[channel_min1 * m_source_channels + i] = cos(M_PI_2 * angle_min1 / angle);
|
m_mapping[channel_left * m_source_channels + i] = cos(M_PI_2 * angle_left / angle);
|
||||||
m_mapping[channel_min2 * m_source_channels + i] = cos(M_PI_2 * angle_min2 / angle);
|
m_mapping[channel_right * m_source_channels + i] = cos(M_PI_2 * angle_right / angle);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user