X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~mdw/git/disorder/blobdiff_plain/c57f1201efce928c25c7899cc0baab09845c9ba7..c73bd6c1881f5b6ee5f10482fd21531fa6b933f0:/plugins/tracklength.c diff --git a/plugins/tracklength.c b/plugins/tracklength.c index c1b9cb9..42f9432 100644 --- a/plugins/tracklength.c +++ b/plugins/tracklength.c @@ -32,7 +32,15 @@ #include #include -#include +/* libFLAC has had an API change and stupidly taken away the old API */ +#if HAVE_FLAC_FILE_DECODER_H +# include +#else +# include +#define FLAC__FileDecoder FLAC__StreamDecoder +#define FLAC__FileDecoderState FLAC__StreamDecoderState +#endif + #include @@ -159,33 +167,58 @@ static FLAC__StreamDecoderWriteStatus flac_write } static long tl_flac(const char *path) { - FLAC__FileDecoder *fd = 0; - FLAC__FileDecoderState fs; struct flac_state state[1]; state->duration = -1; /* error */ state->path = path; - if(!(fd = FLAC__file_decoder_new())) { - disorder_error(0, "FLAC__file_decoder_new failed"); - goto fail; - } - if(!(FLAC__file_decoder_set_filename(fd, path))) { - disorder_error(0, "FLAC__file_set_filename failed"); - goto fail; - } - FLAC__file_decoder_set_metadata_callback(fd, flac_metadata); - FLAC__file_decoder_set_error_callback(fd, flac_error); - FLAC__file_decoder_set_write_callback(fd, flac_write); - FLAC__file_decoder_set_client_data(fd, state); - if((fs = FLAC__file_decoder_init(fd))) { - disorder_error(0, "FLAC__file_decoder_init: %s", - FLAC__FileDecoderStateString[fs]); - goto fail; +#if HAVE_FLAC_FILE_DECODER_H + { + FLAC__FileDecoder *fd = 0; + FLAC__FileDecoderState fs; + + if(!(fd = FLAC__file_decoder_new())) { + disorder_error(0, "FLAC__file_decoder_new failed"); + goto fail; + } + if(!(FLAC__file_decoder_set_filename(fd, path))) { + disorder_error(0, "FLAC__file_set_filename failed"); + goto fail; + } + FLAC__file_decoder_set_metadata_callback(fd, flac_metadata); + FLAC__file_decoder_set_error_callback(fd, flac_error); + FLAC__file_decoder_set_write_callback(fd, flac_write); + FLAC__file_decoder_set_client_data(fd, state); + if((fs = FLAC__file_decoder_init(fd))) { + disorder_error(0, "FLAC__file_decoder_init: %s", + FLAC__FileDecoderStateString[fs]); + goto fail; + } + FLAC__file_decoder_process_until_end_of_metadata(fd); +fail: + if(fd) + FLAC__file_decoder_delete(fd); } - FLAC__file_decoder_process_until_end_of_metadata(fd); +#else + { + FLAC__StreamDecoder *sd = 0; + FLAC__StreamDecoderInitStatus is; + + if(!(sd = FLAC__stream_decoder_new())) { + disorder_error(0, "FLAC__stream_decoder_new failed"); + goto fail; + } + if((is = FLAC__stream_decoder_init_file(sd, path, flac_write, flac_metadata, + flac_error, state))) { + disorder_error(0, "FLAC__stream_decoder_init_file %s: %s", + path, FLAC__StreamDecoderInitStatusString[is]); + goto fail; + } + FLAC__stream_decoder_process_until_end_of_metadata(sd); fail: - if(fd) - FLAC__file_decoder_delete(fd); + if(sd) + FLAC__stream_decoder_delete(sd); + } +#endif return state->duration; }