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:
		| @@ -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; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Max Kellermann
					Max Kellermann