decoder/flac: merged code into flac_decoder_loop()
The decoder loop of flac_decode_internal(), flac_container_decode() and flac_filedecode_internal() is merged into this one function. This unifies the code, and uses the frame number to identify the end of a CUE sub song.
This commit is contained in:
parent
80b220a3a6
commit
c1186693b5
@ -390,6 +390,57 @@ flac_tag_dup(const char *file)
|
|||||||
return flac_tag_load(file, NULL);
|
return flac_tag_load(file, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
flac_decoder_loop(struct flac_data *data, flac_decoder *flac_dec,
|
||||||
|
FLAC__uint64 t_start, FLAC__uint64 t_end)
|
||||||
|
{
|
||||||
|
struct decoder *decoder = data->decoder;
|
||||||
|
enum decoder_command cmd;
|
||||||
|
|
||||||
|
while (true) {
|
||||||
|
if (data->tag != NULL && !tag_is_empty(data->tag)) {
|
||||||
|
cmd = decoder_tag(data->decoder, data->input_stream,
|
||||||
|
data->tag);
|
||||||
|
tag_free(data->tag);
|
||||||
|
data->tag = tag_new();
|
||||||
|
} else
|
||||||
|
cmd = decoder_get_command(decoder);
|
||||||
|
|
||||||
|
if (cmd == DECODE_COMMAND_SEEK) {
|
||||||
|
FLAC__uint64 seek_sample = t_start +
|
||||||
|
decoder_seek_where(decoder) *
|
||||||
|
data->audio_format.sample_rate;
|
||||||
|
if (seek_sample >= t_start &&
|
||||||
|
(t_end == 0 || seek_sample <= t_end) &&
|
||||||
|
flac_seek_absolute(flac_dec, seek_sample)) {
|
||||||
|
data->next_frame = seek_sample;
|
||||||
|
data->time = (float)(seek_sample - t_start) /
|
||||||
|
data->audio_format.sample_rate;
|
||||||
|
data->position = 0;
|
||||||
|
decoder_command_finished(decoder);
|
||||||
|
} else
|
||||||
|
decoder_seek_error(decoder);
|
||||||
|
} else if (cmd == DECODE_COMMAND_STOP ||
|
||||||
|
flac_get_state(flac_dec) == flac_decoder_eof)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (t_end != 0 && data->next_frame >= t_end)
|
||||||
|
/* end of this sub track */
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (!flac_process_single(flac_dec)) {
|
||||||
|
cmd = decoder_get_command(decoder);
|
||||||
|
if (cmd != DECODE_COMMAND_SEEK)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cmd != DECODE_COMMAND_STOP) {
|
||||||
|
flacPrintErroredState(flac_get_state(flac_dec));
|
||||||
|
flac_finish(flac_dec);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
flac_decode_internal(struct decoder * decoder,
|
flac_decode_internal(struct decoder * decoder,
|
||||||
struct input_stream *input_stream,
|
struct input_stream *input_stream,
|
||||||
@ -397,7 +448,6 @@ flac_decode_internal(struct decoder * decoder,
|
|||||||
{
|
{
|
||||||
flac_decoder *flac_dec;
|
flac_decoder *flac_dec;
|
||||||
struct flac_data data;
|
struct flac_data data;
|
||||||
enum decoder_command cmd;
|
|
||||||
const char *err = NULL;
|
const char *err = NULL;
|
||||||
|
|
||||||
if (!(flac_dec = flac_new()))
|
if (!(flac_dec = flac_new()))
|
||||||
@ -448,39 +498,7 @@ flac_decode_internal(struct decoder * decoder,
|
|||||||
decoder_initialized(decoder, &data.audio_format,
|
decoder_initialized(decoder, &data.audio_format,
|
||||||
input_stream->seekable, data.total_time);
|
input_stream->seekable, data.total_time);
|
||||||
|
|
||||||
while (true) {
|
flac_decoder_loop(&data, flac_dec, 0, 0);
|
||||||
if (!tag_is_empty(data.tag)) {
|
|
||||||
cmd = decoder_tag(decoder, input_stream, data.tag);
|
|
||||||
tag_free(data.tag);
|
|
||||||
data.tag = tag_new();
|
|
||||||
} else
|
|
||||||
cmd = decoder_get_command(decoder);
|
|
||||||
|
|
||||||
if (cmd == DECODE_COMMAND_SEEK) {
|
|
||||||
FLAC__uint64 seek_sample = decoder_seek_where(decoder) *
|
|
||||||
data.audio_format.sample_rate + 0.5;
|
|
||||||
if (flac_seek_absolute(flac_dec, seek_sample)) {
|
|
||||||
data.next_frame = seek_sample;
|
|
||||||
data.time = ((float)seek_sample) /
|
|
||||||
data.audio_format.sample_rate;
|
|
||||||
data.position = 0;
|
|
||||||
decoder_command_finished(decoder);
|
|
||||||
} else
|
|
||||||
decoder_seek_error(decoder);
|
|
||||||
} else if (cmd == DECODE_COMMAND_STOP ||
|
|
||||||
flac_get_state(flac_dec) == flac_decoder_eof)
|
|
||||||
break;
|
|
||||||
|
|
||||||
if (!flac_process_single(flac_dec)) {
|
|
||||||
cmd = decoder_get_command(decoder);
|
|
||||||
if (cmd != DECODE_COMMAND_SEEK)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (cmd != DECODE_COMMAND_STOP) {
|
|
||||||
flacPrintErroredState(flac_get_state(flac_dec));
|
|
||||||
flac_finish(flac_dec);
|
|
||||||
}
|
|
||||||
|
|
||||||
fail:
|
fail:
|
||||||
flac_data_deinit(&data);
|
flac_data_deinit(&data);
|
||||||
@ -615,44 +633,9 @@ flac_container_decode(struct decoder* decoder,
|
|||||||
|
|
||||||
// seek to song start (order is important: after decoder init)
|
// seek to song start (order is important: after decoder init)
|
||||||
flac_seek_absolute(flac_dec, (FLAC__uint64)t_start);
|
flac_seek_absolute(flac_dec, (FLAC__uint64)t_start);
|
||||||
|
data.next_frame = t_start;
|
||||||
|
|
||||||
while (true)
|
flac_decoder_loop(&data, flac_dec, t_start, t_end);
|
||||||
{
|
|
||||||
if (!flac_process_single(flac_dec))
|
|
||||||
break;
|
|
||||||
|
|
||||||
// we only need to break at the end of track if we are in "cue mode"
|
|
||||||
if (data.time >= data.total_time)
|
|
||||||
{
|
|
||||||
flacPrintErroredState(flac_get_state(flac_dec));
|
|
||||||
flac_finish(flac_dec);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (decoder_get_command(decoder) == DECODE_COMMAND_SEEK)
|
|
||||||
{
|
|
||||||
FLAC__uint64 seek_sample = t_start +
|
|
||||||
(decoder_seek_where(decoder) * data.audio_format.sample_rate);
|
|
||||||
|
|
||||||
if (seek_sample >= t_start && seek_sample <= t_end &&
|
|
||||||
flac_seek_absolute(flac_dec, (FLAC__uint64)seek_sample)) {
|
|
||||||
data.next_frame = seek_sample;
|
|
||||||
data.time = (float)(seek_sample - t_start) /
|
|
||||||
data.audio_format.sample_rate;
|
|
||||||
data.position = 0;
|
|
||||||
|
|
||||||
decoder_command_finished(decoder);
|
|
||||||
} else
|
|
||||||
decoder_seek_error(decoder);
|
|
||||||
}
|
|
||||||
else if (flac_get_state(flac_dec) == flac_decoder_eof)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (decoder_get_command(decoder) != DECODE_COMMAND_STOP)
|
|
||||||
{
|
|
||||||
flacPrintErroredState(flac_get_state(flac_dec));
|
|
||||||
flac_finish(flac_dec);
|
|
||||||
}
|
|
||||||
|
|
||||||
fail:
|
fail:
|
||||||
if (pathname)
|
if (pathname)
|
||||||
@ -747,36 +730,7 @@ flac_filedecode_internal(struct decoder* decoder,
|
|||||||
decoder_initialized(decoder, &data.audio_format,
|
decoder_initialized(decoder, &data.audio_format,
|
||||||
true, data.total_time);
|
true, data.total_time);
|
||||||
|
|
||||||
while (true)
|
flac_decoder_loop(&data, flac_dec, 0, 0);
|
||||||
{
|
|
||||||
if (!flac_process_single(flac_dec))
|
|
||||||
break;
|
|
||||||
|
|
||||||
if (decoder_get_command(decoder) == DECODE_COMMAND_SEEK)
|
|
||||||
{
|
|
||||||
FLAC__uint64 seek_sample = decoder_seek_where(decoder) *
|
|
||||||
data.audio_format.sample_rate + 0.5;
|
|
||||||
if (flac_seek_absolute(flac_dec, seek_sample))
|
|
||||||
{
|
|
||||||
data.next_frame = seek_sample;
|
|
||||||
data.time = ((float)seek_sample) /
|
|
||||||
data.audio_format.sample_rate;
|
|
||||||
data.position = 0;
|
|
||||||
decoder_command_finished(decoder);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
decoder_seek_error(decoder);
|
|
||||||
|
|
||||||
}
|
|
||||||
else if (flac_get_state(flac_dec) == flac_decoder_eof)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (decoder_get_command(decoder) != DECODE_COMMAND_STOP)
|
|
||||||
{
|
|
||||||
flacPrintErroredState(flac_get_state(flac_dec));
|
|
||||||
flac_finish(flac_dec);
|
|
||||||
}
|
|
||||||
|
|
||||||
fail:
|
fail:
|
||||||
flac_data_deinit(&data);
|
flac_data_deinit(&data);
|
||||||
|
Loading…
Reference in New Issue
Block a user