fixed number of remaining samples calculation

should fix the small crackling sounds that play every now and again
This commit is contained in:
Vladislav Mikhalin 2024-11-02 18:31:41 +03:00
parent 18a4bd2014
commit f818f3e69f
2 changed files with 7 additions and 5 deletions

View File

@ -107,16 +107,17 @@ void AjmAt9Decoder::Decode(const AjmJobInput* input, AjmJobOutput* output) {
ASSERT_MSG(ret == At9Status::ERR_SUCCESS, "Atrac9Decode failed ret = {:#x}", ret); ASSERT_MSG(ret == At9Status::ERR_SUCCESS, "Atrac9Decode failed ret = {:#x}", ret);
in_buf = in_buf.subspan(bytes_used); in_buf = in_buf.subspan(bytes_used);
superframe_bytes_remain -= bytes_used; superframe_bytes_remain -= bytes_used;
const size_t samples_remain = gapless.total_samples != 0 const size_t samples_remain =
? gapless.total_samples - gapless_decoded_samples gapless.total_samples != 0
: std::numeric_limits<size_t>::max(); ? (gapless.total_samples - gapless_decoded_samples) * codec_info.channels
: std::numeric_limits<size_t>::max();
bool written = false; bool written = false;
if (gapless.skipped_samples < gapless.skip_samples) { if (gapless.skipped_samples < gapless.skip_samples) {
gapless.skipped_samples += codec_info.frameSamples; gapless.skipped_samples += codec_info.frameSamples;
if (gapless.skipped_samples > gapless.skip_samples) { if (gapless.skipped_samples > gapless.skip_samples) {
const u32 nsamples = gapless.skipped_samples - gapless.skip_samples; const u32 nsamples = gapless.skipped_samples - gapless.skip_samples;
const auto start = codec_info.frameSamples - nsamples; const auto start = codec_info.frameSamples - nsamples;
written = write_output({pcm_buffer.data() + start, nsamples}); written = write_output({pcm_buffer.data() + start, nsamples * codec_info.channels});
gapless.skipped_samples = gapless.skip_samples; gapless.skipped_samples = gapless.skip_samples;
total_decoded_samples += nsamples; total_decoded_samples += nsamples;
if (gapless.total_samples != 0) { if (gapless.total_samples != 0) {

View File

@ -145,7 +145,8 @@ void AjmMp3Decoder::Decode(const AjmJobInput* input, AjmJobOutput* output) {
if (gapless.skipped_samples > gapless.skip_samples) { if (gapless.skipped_samples > gapless.skip_samples) {
const u32 nsamples = gapless.skipped_samples - gapless.skip_samples; const u32 nsamples = gapless.skipped_samples - gapless.skip_samples;
const auto start = frame->nb_samples - nsamples; const auto start = frame->nb_samples - nsamples;
write_output({reinterpret_cast<s16*>(frame->data[0]), nsamples}); write_output({reinterpret_cast<s16*>(frame->data[0]),
nsamples * frame->ch_layout.nb_channels});
gapless.skipped_samples = gapless.skip_samples; gapless.skipped_samples = gapless.skip_samples;
total_decoded_samples += nsamples; total_decoded_samples += nsamples;
if (gapless.total_samples != 0) { if (gapless.total_samples != 0) {