From fb1cbbaf4677e871ed551a7b7858937721e29016 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20M=C3=BCller?= Date: Sun, 17 Nov 2019 09:02:18 +0100 Subject: Fix T71322: Crash in Audaspace with some video file Getting upstream audaspace fixes for audio files with more than 8 channels. --- extern/audaspace/plugins/openal/OpenALDevice.cpp | 3 ++- extern/audaspace/src/respec/ChannelMapperReader.cpp | 19 +++++++++++-------- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/extern/audaspace/plugins/openal/OpenALDevice.cpp b/extern/audaspace/plugins/openal/OpenALDevice.cpp index 6ad87c183aa..f41e9c6bef8 100644 --- a/extern/audaspace/plugins/openal/OpenALDevice.cpp +++ b/extern/audaspace/plugins/openal/OpenALDevice.cpp @@ -1167,7 +1167,8 @@ OpenALDevice::OpenALDevice(DeviceSpecs specs, int buffersize, std::string name) if((!m_useMC && specs.channels > CHANNELS_STEREO) || specs.channels == CHANNELS_STEREO_LFE || - specs.channels == CHANNELS_SURROUND5) + specs.channels == CHANNELS_SURROUND5 || + specs.channels > CHANNELS_SURROUND71) specs.channels = CHANNELS_STEREO; alGetError(); diff --git a/extern/audaspace/src/respec/ChannelMapperReader.cpp b/extern/audaspace/src/respec/ChannelMapperReader.cpp index 1af5e70bfc8..e0063d5c4a2 100644 --- a/extern/audaspace/src/respec/ChannelMapperReader.cpp +++ b/extern/audaspace/src/respec/ChannelMapperReader.cpp @@ -97,12 +97,15 @@ void ChannelMapperReader::calculateMapping() for(int i = 0; i < m_source_channels * m_target_channels; i++) m_mapping[i] = 0; - const Channel* source_channels = CHANNEL_MAPS[m_source_channels - 1]; - const Channel* target_channels = CHANNEL_MAPS[m_target_channels - 1]; + const Channels source_channel_count = std::min(m_source_channels, CHANNELS_SURROUND71); + const Channels target_channel_count = std::min(m_target_channels, CHANNELS_SURROUND71); + + const Channel* source_channels = CHANNEL_MAPS[source_channel_count - 1]; + const Channel* target_channels = CHANNEL_MAPS[target_channel_count - 1]; int lfe = -1; - for(int i = 0; i < m_target_channels; i++) + for(int i = 0; i < target_channel_count; i++) { if(target_channels[i] == CHANNEL_LFE) { @@ -111,16 +114,16 @@ void ChannelMapperReader::calculateMapping() } } - const float* source_angles = CHANNEL_ANGLES[m_source_channels - 1]; - const float* target_angles = CHANNEL_ANGLES[m_target_channels - 1]; + const float* source_angles = CHANNEL_ANGLES[source_channel_count - 1]; + const float* target_angles = CHANNEL_ANGLES[target_channel_count - 1]; - if(m_source_channels == CHANNELS_MONO) + if(source_channel_count == CHANNELS_MONO) source_angles = &m_mono_angle; int channel_left, channel_right; float angle_left, angle_right, angle; - for(int i = 0; i < m_source_channels; i++) + for(int i = 0; i < source_channel_count; i++) { if(source_channels[i] == CHANNEL_LFE) { @@ -134,7 +137,7 @@ void ChannelMapperReader::calculateMapping() angle_left = -2 * M_PI; angle_right = 2 * M_PI; - for(int j = 0; j < m_target_channels; j++) + for(int j = 0; j < target_channel_count; j++) { if(j == lfe) continue; -- cgit v1.2.3