Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoerg Mueller <nexyon@gmail.com>2012-10-25 14:25:30 +0400
committerJoerg Mueller <nexyon@gmail.com>2012-10-25 14:25:30 +0400
commitad2dffe7c6255bd52dd25d2e530828bc0e493077 (patch)
tree68487e9e8eedf3f7b856c1ccb82567037881e026 /intern/audaspace
parent0632da082975d5b8d321abf7183757f484e6fb8a (diff)
Audaspace:
Fix for channel mapping bug. Now 7.1 channels should get mapped correctly.
Diffstat (limited to 'intern/audaspace')
-rw-r--r--intern/audaspace/intern/AUD_ChannelMapperReader.cpp50
1 files changed, 30 insertions, 20 deletions
diff --git a/intern/audaspace/intern/AUD_ChannelMapperReader.cpp b/intern/audaspace/intern/AUD_ChannelMapperReader.cpp
index 61796098bf7..7a179c6f94a 100644
--- a/intern/audaspace/intern/AUD_ChannelMapperReader.cpp
+++ b/intern/audaspace/intern/AUD_ChannelMapperReader.cpp
@@ -67,10 +67,12 @@ void AUD_ChannelMapperReader::setMonoAngle(float angle)
float AUD_ChannelMapperReader::angleDistance(float alpha, float beta)
{
- alpha = fabs(alpha - beta);
+ alpha = beta - alpha;
if(alpha > M_PI)
- alpha = fabs(alpha - 2 * M_PI);
+ alpha -= 2 * M_PI;
+ if(alpha < -M_PI)
+ alpha += 2 * M_PI;
return alpha;
}
@@ -107,8 +109,8 @@ void AUD_ChannelMapperReader::calculateMapping()
if(m_source_channels == AUD_CHANNELS_MONO)
source_angles = &m_mono_angle;
- int channel_min1, channel_min2;
- float angle_min1, angle_min2, angle;
+ int channel_left, channel_right;
+ float angle_left, angle_right, angle;
for(int i = 0; i < m_source_channels; i++)
{
@@ -120,38 +122,46 @@ void AUD_ChannelMapperReader::calculateMapping()
continue;
}
- channel_min1 = channel_min2 = -1;
- angle_min1 = angle_min2 = 2 * M_PI;
+ channel_left = channel_right = -1;
+ angle_left = -2 * M_PI;
+ angle_right = 2 * M_PI;
for(int j = 0; j < m_target_channels; j++)
{
if(j == lfe)
continue;
angle = angleDistance(source_angles[i], target_angles[j]);
- if(angle < angle_min1)
+ if(angle < 0)
{
- channel_min2 = channel_min1;
- angle_min2 = angle_min1;
-
- channel_min1 = j;
- angle_min1 = angle;
+ if(angle > angle_left)
+ {
+ angle_left = angle;
+ channel_left = j;
+ }
}
- else if(angle < angle_min2)
+ else
{
- channel_min2 = j;
- angle_min2 = angle;
+ if(angle < angle_right)
+ {
+ angle_right = angle;
+ channel_right = j;
+ }
}
}
- angle = angle_min1 + angle_min2;
- if(channel_min2 == -1 || angle == 0)
+ 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_min1 * m_source_channels + i] = 1;
+ m_mapping[channel_right * m_source_channels + i] = 1;
}
else
{
- m_mapping[channel_min1 * m_source_channels + i] = cos(M_PI_2 * angle_min1 / angle);
- m_mapping[channel_min2 * m_source_channels + i] = cos(M_PI_2 * angle_min2 / angle);
+ 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);
}
}