Commit 80b220a3 authored by Max Kellermann's avatar Max Kellermann

decoder/flac: keep track of current frame number

We need this for more exact end-of-subsong detection for CUE files.
parent 5cc3c4f5
...@@ -35,6 +35,8 @@ flac_data_init(struct flac_data *data, struct decoder * decoder, ...@@ -35,6 +35,8 @@ flac_data_init(struct flac_data *data, struct decoder * decoder,
{ {
pcm_buffer_init(&data->buffer); pcm_buffer_init(&data->buffer);
data->next_frame = 0;
data->time = 0; data->time = 0;
data->position = 0; data->position = 0;
data->bit_rate = 0; data->bit_rate = 0;
...@@ -122,6 +124,7 @@ flac_common_write(struct flac_data *data, const FLAC__Frame * frame, ...@@ -122,6 +124,7 @@ flac_common_write(struct flac_data *data, const FLAC__Frame * frame,
buffer, buffer_size, buffer, buffer_size,
data->time, data->bit_rate, data->time, data->bit_rate,
data->replay_gain_info); data->replay_gain_info);
data->next_frame += frame->header.blocksize;
switch (cmd) { switch (cmd) {
case DECODE_COMMAND_NONE: case DECODE_COMMAND_NONE:
case DECODE_COMMAND_START: case DECODE_COMMAND_START:
......
...@@ -148,6 +148,11 @@ typedef size_t flac_read_status_size_t; ...@@ -148,6 +148,11 @@ typedef size_t flac_read_status_size_t;
struct flac_data { struct flac_data {
struct pcm_buffer buffer; struct pcm_buffer buffer;
/**
* The number of the next frame which is going to be decoded.
*/
FLAC__uint64 next_frame;
float time; float time;
unsigned int bit_rate; unsigned int bit_rate;
struct audio_format audio_format; struct audio_format audio_format;
......
...@@ -460,6 +460,7 @@ flac_decode_internal(struct decoder * decoder, ...@@ -460,6 +460,7 @@ flac_decode_internal(struct decoder * decoder,
FLAC__uint64 seek_sample = decoder_seek_where(decoder) * FLAC__uint64 seek_sample = decoder_seek_where(decoder) *
data.audio_format.sample_rate + 0.5; data.audio_format.sample_rate + 0.5;
if (flac_seek_absolute(flac_dec, seek_sample)) { if (flac_seek_absolute(flac_dec, seek_sample)) {
data.next_frame = seek_sample;
data.time = ((float)seek_sample) / data.time = ((float)seek_sample) /
data.audio_format.sample_rate; data.audio_format.sample_rate;
data.position = 0; data.position = 0;
...@@ -634,6 +635,7 @@ flac_container_decode(struct decoder* decoder, ...@@ -634,6 +635,7 @@ flac_container_decode(struct decoder* decoder,
if (seek_sample >= t_start && seek_sample <= t_end && if (seek_sample >= t_start && seek_sample <= t_end &&
flac_seek_absolute(flac_dec, (FLAC__uint64)seek_sample)) { flac_seek_absolute(flac_dec, (FLAC__uint64)seek_sample)) {
data.next_frame = seek_sample;
data.time = (float)(seek_sample - t_start) / data.time = (float)(seek_sample - t_start) /
data.audio_format.sample_rate; data.audio_format.sample_rate;
data.position = 0; data.position = 0;
...@@ -756,6 +758,7 @@ flac_filedecode_internal(struct decoder* decoder, ...@@ -756,6 +758,7 @@ flac_filedecode_internal(struct decoder* decoder,
data.audio_format.sample_rate + 0.5; data.audio_format.sample_rate + 0.5;
if (flac_seek_absolute(flac_dec, seek_sample)) if (flac_seek_absolute(flac_dec, seek_sample))
{ {
data.next_frame = seek_sample;
data.time = ((float)seek_sample) / data.time = ((float)seek_sample) /
data.audio_format.sample_rate; data.audio_format.sample_rate;
data.position = 0; data.position = 0;
......
...@@ -328,6 +328,7 @@ oggflac_decode(struct decoder * mpd_decoder, struct input_stream *input_stream) ...@@ -328,6 +328,7 @@ oggflac_decode(struct decoder * mpd_decoder, struct input_stream *input_stream)
data.audio_format.sample_rate + 0.5; data.audio_format.sample_rate + 0.5;
if (OggFLAC__seekable_stream_decoder_seek_absolute if (OggFLAC__seekable_stream_decoder_seek_absolute
(decoder, seek_sample)) { (decoder, seek_sample)) {
data.next_frame = seek_sample;
data.time = ((float)seek_sample) / data.time = ((float)seek_sample) /
data.audio_format.sample_rate; data.audio_format.sample_rate;
data.position = 0; data.position = 0;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment