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.
This commit is contained in:
parent
71b47ae3ef
commit
cee1ac150e
@ -90,6 +90,31 @@ NToStereo(typename Traits::pointer_type dest,
|
||||
return dest;
|
||||
}
|
||||
|
||||
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>
|
||||
ConvertChannels(PcmBuffer &buffer,
|
||||
@ -109,7 +134,8 @@ ConvertChannels(PcmBuffer &buffer,
|
||||
else if (dest_channels == 2)
|
||||
NToStereo<F>(dest, src_channels, src.begin(), src.end());
|
||||
else
|
||||
return nullptr;
|
||||
NToM<F>(dest, dest_channels,
|
||||
src_channels, src.begin(), src.end());
|
||||
|
||||
return { dest, dest_size };
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user