diff --git a/libs/libsacd/dsf.c b/libs/libsacd/dsf.c index 51b08bc8..2450547f 100644 --- a/libs/libsacd/dsf.c +++ b/libs/libsacd/dsf.c @@ -170,7 +170,23 @@ static int dsf_create(scarletbook_output_format_t *ft) static int dsf_close(scarletbook_output_format_t *ft) { dsf_handle_t *handle = (dsf_handle_t *) ft->priv; + int i; + + // write out what was left in the ring buffers + for (i = 0; i < handle->channel_count; i++) + { + if (handle->buffer_ptr[i] > handle->buffer[i]) { + handle->sample_count += handle->buffer_ptr[i] - handle->buffer[i]; + fwrite(handle->buffer[i], 1, SACD_BLOCK_SIZE_PER_CHANNEL, ft->fd); + memset(handle->buffer[i], 0, SACD_BLOCK_SIZE_PER_CHANNEL); + + handle->buffer_ptr[i] = handle->buffer[i]; + handle->audio_data_size += SACD_BLOCK_SIZE_PER_CHANNEL; + } + } + + // write the footer fwrite(handle->footer, 1, handle->footer_size, ft->fd); fseek(ft->fd, 0, SEEK_SET); @@ -209,17 +225,15 @@ static size_t dsf_write_frame(scarletbook_output_format_t *ft, const uint8_t *bu handle->buffer_ptr[i]++; buf_ptr++; + } else { + handle->sample_count += handle->buffer_ptr[i] - handle->buffer[i]; - continue; - } - - handle->sample_count += handle->buffer_ptr[i] - handle->buffer[i]; - - fwrite(handle->buffer[i], 1, SACD_BLOCK_SIZE_PER_CHANNEL, ft->fd); - memset(handle->buffer[i], 0, SACD_BLOCK_SIZE_PER_CHANNEL); - handle->buffer_ptr[i] = handle->buffer[i]; + fwrite(handle->buffer[i], 1, SACD_BLOCK_SIZE_PER_CHANNEL, ft->fd); + memset(handle->buffer[i], 0, SACD_BLOCK_SIZE_PER_CHANNEL); - handle->audio_data_size += SACD_BLOCK_SIZE_PER_CHANNEL; + handle->buffer_ptr[i] = handle->buffer[i]; + handle->audio_data_size += SACD_BLOCK_SIZE_PER_CHANNEL; + } } }