decoder/vorbis: scale and clip tremor-decoded samples to 15 bits
Tremor decoder is unusable since commit 2ee43c4
. Sound is distorted to
the point where it's nothing but noise.
The data from vorbis_synthesis_pcmout() needs to be scaled and
clipped for 16 bit sample size. For reference see
http://lists.xiph.org/pipermail/tremor/2010-April/001642.html and
http://lists.xiph.org/pipermail/vorbis/2006-October/026513.html.
Signed-off-by: Marcin Jurkowski <marcin1j@gmail.com>
This commit is contained in:
parent
28e864e096
commit
3b23cf0258
2
NEWS
2
NEWS
@ -1,6 +1,8 @@
|
|||||||
ver 0.20.12 (not yet released)
|
ver 0.20.12 (not yet released)
|
||||||
* input
|
* input
|
||||||
- curl: fix seeking
|
- curl: fix seeking
|
||||||
|
* decoder
|
||||||
|
- vorbis: fix Tremor support
|
||||||
* player
|
* player
|
||||||
- log message when decoder is too slow
|
- log message when decoder is too slow
|
||||||
|
|
||||||
|
@ -178,6 +178,20 @@ VorbisDecoder::SubmitInit()
|
|||||||
client.Ready(audio_format, eos_granulepos > 0, duration);
|
client.Ready(audio_format, eos_granulepos > 0, duration);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef HAVE_TREMOR
|
||||||
|
static inline int16_t tremor_clip_sample(int32_t x)
|
||||||
|
{
|
||||||
|
x >>= 9;
|
||||||
|
|
||||||
|
if (x < INT16_MIN)
|
||||||
|
return INT16_MIN;
|
||||||
|
if (x > INT16_MAX)
|
||||||
|
return INT16_MAX;
|
||||||
|
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
bool
|
bool
|
||||||
VorbisDecoder::SubmitSomePcm()
|
VorbisDecoder::SubmitSomePcm()
|
||||||
{
|
{
|
||||||
@ -197,7 +211,7 @@ VorbisDecoder::SubmitSomePcm()
|
|||||||
auto *dest = &buffer[c];
|
auto *dest = &buffer[c];
|
||||||
|
|
||||||
for (size_t i = 0; i < n_frames; ++i) {
|
for (size_t i = 0; i < n_frames; ++i) {
|
||||||
*dest = *src++;
|
*dest = tremor_clip_sample(*src++);
|
||||||
dest += channels;
|
dest += channels;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user