static bool mp3_open(struct input_stream *is, struct mp3_data *data, struct decoder *decoder, struct tag **tag) { mp3_data_init(data, decoder, is); *tag = NULL; if (!mp3_decode_first_frame(data, tag)) { mp3_data_finish(data); if (tag && *tag) tag_free(*tag); return false; } return true; }
/* this is primarily used for getting total time for tags */ static int mad_decoder_total_file_time(struct input_stream *is) { struct mp3_data data; int ret; mp3_data_init(&data, NULL, is); if (!mp3_decode_first_frame(&data, NULL)) ret = -1; else ret = data.total_time + 0.5; mp3_data_finish(&data); return ret; }
/* this is primarily used for getting total time for tags */ static int mp3_total_file_time(const char *file) { struct input_stream input_stream; struct mp3_data data; int ret; if (!input_stream_open(&input_stream, file)) return -1; mp3_data_init(&data, NULL, &input_stream); if (!mp3_decode_first_frame(&data, NULL, NULL)) ret = -1; else ret = data.total_time + 0.5; mp3_data_finish(&data); input_stream_close(&input_stream); return ret; }