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;
|
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>>
|
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,
|
||||||
@ -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 };
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user