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);
|
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,
|
|||||||
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;
|
|||||||
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,
|
|||||||
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,
|
|||||||
|
|
||||||
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,
|
|||||||
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)
|
|||||||
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;
|
||||||
|
Loading…
Reference in New Issue
Block a user