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:
parent
5cc3c4f503
commit
80b220a3a6
@ -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:
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user