Channel conversion optimization for mono expansion.

This commit is contained in:
David Reid
2022-11-24 14:48:45 +10:00
parent 72f1fe386b
commit c99cb2b901
+34 -6
View File
@@ -51835,16 +51835,44 @@ static ma_result ma_channel_map_apply_mono_in_f32(float* pFramesOut, const ma_ch
{ {
default_handler: default_handler:
{ {
for (iFrame = 0; iFrame < frameCount; iFrame += 1) { if (channelsOut <= MA_MAX_CHANNELS) {
ma_bool32 hasEmptyChannel = MA_FALSE;
ma_channel channelPositions[MA_MAX_CHANNELS];
for (iChannelOut = 0; iChannelOut < channelsOut; iChannelOut += 1) { for (iChannelOut = 0; iChannelOut < channelsOut; iChannelOut += 1) {
ma_channel channelOut = ma_channel_map_get_channel(pChannelMapOut, channelsOut, iChannelOut); channelPositions[iChannelOut] = ma_channel_map_get_channel(pChannelMapOut, channelsOut, iChannelOut);
if (channelOut != MA_CHANNEL_NONE) { if (channelPositions[iChannelOut] == MA_CHANNEL_NONE) {
pFramesOut[iChannelOut] = pFramesIn[0]; hasEmptyChannel = MA_TRUE;
} }
} }
pFramesOut += channelsOut; if (hasEmptyChannel == MA_FALSE) {
pFramesIn += 1; /*
Faster path when there's no MA_CHANNEL_NONE channel positions. This should hopefully
help the compiler with auto-vectorization.
*/
for (iFrame = 0; iFrame < frameCount; iFrame += 1) {
for (iChannelOut = 0; iChannelOut < channelsOut; iChannelOut += 1) {
pFramesOut[iFrame*channelsOut + iChannelOut] = pFramesIn[iFrame + 0];
}
}
} else {
for (iFrame = 0; iFrame < frameCount; iFrame += 1) {
for (iChannelOut = 0; iChannelOut < channelsOut; iChannelOut += 1) {
if (channelPositions[iChannelOut] != MA_CHANNEL_NONE) {
pFramesOut[iFrame*channelsOut + iChannelOut] = pFramesIn[iFrame + 0];
}
}
}
}
} else {
for (iFrame = 0; iFrame < frameCount; iFrame += 1) {
for (iChannelOut = 0; iChannelOut < channelsOut; iChannelOut += 1) {
ma_channel channelOut = ma_channel_map_get_channel(pChannelMapOut, channelsOut, iChannelOut);
if (channelOut != MA_CHANNEL_NONE) {
pFramesOut[iFrame*channelsOut + iChannelOut] = pFramesIn[iFrame + 0];
}
}
}
} }
} }
} break; } break;