Commit cee1ac15 authored by Max Kellermann's avatar Max Kellermann

pcm/PcmChannels: implement fake N-to-M mapping

This is really just a mono mapper, but the important part is that this library cannot fail anymore.
parent 71b47ae3
...@@ -91,6 +91,31 @@ NToStereo(typename Traits::pointer_type dest, ...@@ -91,6 +91,31 @@ NToStereo(typename Traits::pointer_type dest,
} }
template<SampleFormat F, class Traits=SampleTraits<F>> template<SampleFormat F, class Traits=SampleTraits<F>>
static typename Traits::pointer_type
NToM(typename Traits::pointer_type dest,
unsigned dest_channels,
unsigned src_channels,
typename Traits::const_pointer_type src,
typename Traits::const_pointer_type end)
{
assert((end - src) % src_channels == 0);
while (src != end) {
typename Traits::long_type sum = *src++;
for (unsigned c = 1; c < src_channels; ++c)
sum += *src++;
typename Traits::value_type value(sum / int(src_channels));
/* TODO: this is actually only mono ... */
for (unsigned c = 0; c < dest_channels; ++c)
*dest++ = value;
}
return dest;
}
template<SampleFormat F, class Traits=SampleTraits<F>>
static ConstBuffer<typename Traits::value_type> static ConstBuffer<typename Traits::value_type>
ConvertChannels(PcmBuffer &buffer, ConvertChannels(PcmBuffer &buffer,
unsigned dest_channels, unsigned dest_channels,
...@@ -109,7 +134,8 @@ ConvertChannels(PcmBuffer &buffer, ...@@ -109,7 +134,8 @@ ConvertChannels(PcmBuffer &buffer,
else if (dest_channels == 2) else if (dest_channels == 2)
NToStereo<F>(dest, src_channels, src.begin(), src.end()); NToStereo<F>(dest, src_channels, src.begin(), src.end());
else else
return nullptr; NToM<F>(dest, dest_channels,
src_channels, src.begin(), src.end());
return { dest, dest_size }; return { dest, dest_size };
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment