1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-26 08:27:45 +00:00

LibAudio: Make playing lossy flacs more truthful

Playing a lossy flac file resulted in hearing something
you'd not like to play.  Instead of your lovely bass, you had sounds
as if you put a CD-ROM disc to a CD player.

It turned out that the size for making signed values was too big,
making all the values unsigned.

I've used lossyWav[1] (the posix port[2] to be exact)
to generate such files.

[1]: https://wiki.hydrogenaud.io/index.php?title=LossyWAV
[2]: https://github.com/MoSal/lossywav-for-posix
This commit is contained in:
Karol Kosek 2021-08-03 20:06:18 +02:00 committed by Andreas Kling
parent 837803531a
commit 91c9d9ee88

View file

@ -596,7 +596,7 @@ Vector<i32> FlacLoaderPlugin::parse_subframe(FlacSubframeHeader& subframe_header
samples.ensure_capacity(m_current_frame->sample_count); samples.ensure_capacity(m_current_frame->sample_count);
for (u32 i = 0; i < m_current_frame->sample_count; ++i) { for (u32 i = 0; i < m_current_frame->sample_count; ++i) {
samples.unchecked_append(sign_extend(constant_value, subframe_header.bits_per_sample)); samples.unchecked_append(sign_extend(constant_value, subframe_header.bits_per_sample - subframe_header.wasted_bits_per_sample));
} }
break; break;
} }
@ -645,8 +645,7 @@ Vector<i32> FlacLoaderPlugin::decode_custom_lpc(FlacSubframeHeader& subframe, In
// warm-up samples // warm-up samples
for (auto i = 0; i < subframe.order; ++i) { for (auto i = 0; i < subframe.order; ++i) {
decoded.unchecked_append(sign_extend(bit_input.read_bits_big_endian(subframe.bits_per_sample - subframe.wasted_bits_per_sample), subframe.bits_per_sample)); decoded.unchecked_append(sign_extend(bit_input.read_bits_big_endian(subframe.bits_per_sample - subframe.wasted_bits_per_sample), subframe.bits_per_sample - subframe.wasted_bits_per_sample));
decoded[i] <<= subframe.wasted_bits_per_sample;
} }
// precision of the coefficients // precision of the coefficients
@ -695,7 +694,7 @@ Vector<i32> FlacLoaderPlugin::decode_fixed_lpc(FlacSubframeHeader& subframe, Inp
// warm-up samples // warm-up samples
for (auto i = 0; i < subframe.order; ++i) { for (auto i = 0; i < subframe.order; ++i) {
decoded.unchecked_append(sign_extend(bit_input.read_bits_big_endian(subframe.bits_per_sample - subframe.wasted_bits_per_sample), subframe.bits_per_sample)); decoded.unchecked_append(sign_extend(bit_input.read_bits_big_endian(subframe.bits_per_sample - subframe.wasted_bits_per_sample), subframe.bits_per_sample - subframe.wasted_bits_per_sample));
} }
decode_residual(decoded, subframe, bit_input); decode_residual(decoded, subframe, bit_input);