decoder/dsf: refactor the main decoder loop
Check for STOP before decoding the first chunk. This reduces the command latency.
This commit is contained in:
parent
b1fb09e183
commit
f2a75fbfc7
@ -254,7 +254,8 @@ dsf_decode_chunk(Decoder &decoder, InputStream &is,
|
|||||||
{
|
{
|
||||||
const size_t block_size = channels * DSF_BLOCK_SIZE;
|
const size_t block_size = channels * DSF_BLOCK_SIZE;
|
||||||
|
|
||||||
for (offset_type i = 0; i < n_blocks;) {
|
auto cmd = decoder_get_command(decoder);
|
||||||
|
for (offset_type i = 0; i < n_blocks && cmd != DecoderCommand::STOP;) {
|
||||||
/* worst-case buffer size */
|
/* worst-case buffer size */
|
||||||
uint8_t buffer[MAX_CHANNELS * DSF_BLOCK_SIZE];
|
uint8_t buffer[MAX_CHANNELS * DSF_BLOCK_SIZE];
|
||||||
if (!decoder_read_full(&decoder, is, buffer, block_size))
|
if (!decoder_read_full(&decoder, is, buffer, block_size))
|
||||||
@ -266,25 +267,12 @@ dsf_decode_chunk(Decoder &decoder, InputStream &is,
|
|||||||
uint8_t interleaved_buffer[MAX_CHANNELS * DSF_BLOCK_SIZE];
|
uint8_t interleaved_buffer[MAX_CHANNELS * DSF_BLOCK_SIZE];
|
||||||
InterleaveDsfBlock(interleaved_buffer, buffer, channels);
|
InterleaveDsfBlock(interleaved_buffer, buffer, channels);
|
||||||
|
|
||||||
const auto cmd = decoder_data(decoder, is,
|
cmd = decoder_data(decoder, is,
|
||||||
interleaved_buffer, block_size,
|
interleaved_buffer, block_size,
|
||||||
sample_rate / 1000);
|
sample_rate / 1000);
|
||||||
switch (cmd) {
|
++i;
|
||||||
case DecoderCommand::NONE:
|
|
||||||
++i;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case DecoderCommand::START:
|
|
||||||
case DecoderCommand::STOP:
|
|
||||||
return false;
|
|
||||||
|
|
||||||
case DecoderCommand::SEEK:
|
|
||||||
|
|
||||||
/* not implemented yet */
|
|
||||||
decoder_seek_error(decoder);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user