decoder/flac: keep track of current frame number

We need this for more exact end-of-subsong detection for CUE files.
This commit is contained in:
Max Kellermann 2009-11-11 15:09:24 +01:00
parent 5cc3c4f503
commit 80b220a3a6
4 changed files with 12 additions and 0 deletions

View File

@ -35,6 +35,8 @@ flac_data_init(struct flac_data *data, struct decoder * decoder,
{
pcm_buffer_init(&data->buffer);
data->next_frame = 0;
data->time = 0;
data->position = 0;
data->bit_rate = 0;
@ -122,6 +124,7 @@ flac_common_write(struct flac_data *data, const FLAC__Frame * frame,
buffer, buffer_size,
data->time, data->bit_rate,
data->replay_gain_info);
data->next_frame += frame->header.blocksize;
switch (cmd) {
case DECODE_COMMAND_NONE:
case DECODE_COMMAND_START:

View File

@ -148,6 +148,11 @@ typedef size_t flac_read_status_size_t;
struct flac_data {
struct pcm_buffer buffer;
/**
* The number of the next frame which is going to be decoded.
*/
FLAC__uint64 next_frame;
float time;
unsigned int bit_rate;
struct audio_format audio_format;

View File

@ -460,6 +460,7 @@ flac_decode_internal(struct decoder * decoder,
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;
@ -634,6 +635,7 @@ flac_container_decode(struct decoder* decoder,
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;
@ -756,6 +758,7 @@ flac_filedecode_internal(struct decoder* 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;

View File

@ -328,6 +328,7 @@ oggflac_decode(struct decoder * mpd_decoder, struct input_stream *input_stream)
data.audio_format.sample_rate + 0.5;
if (OggFLAC__seekable_stream_decoder_seek_absolute
(decoder, seek_sample)) {
data.next_frame = seek_sample;
data.time = ((float)seek_sample) /
data.audio_format.sample_rate;
data.position = 0;