diff -urN TiMidity++-2.13.2.orig/configure.in TiMidity++-2.13.2/configure.in --- TiMidity++-2.13.2.orig/configure.in 2004-10-03 15:39:52 +0300 +++ TiMidity++-2.13.2/configure.in 2007-02-19 13:06:42 +0200 @@ -1216,11 +1216,39 @@ EXTRACT_CPPFLAGS(CPPFLAGS,CFLAGS,$LIBFLAC_CFLAGS) LIBS="$LIBS $LIBFLAC_LIBS" ]) - AM_PATH_LIBOGGFLAC([ - EXTRADEFS="$EXTRADEFS -DAU_OGGFLAC" - EXTRACT_CPPFLAGS(CPPFLAGS,CFLAGS,$LIBOGGFLAC_CFLAGS) - LIBS="$LIBS $LIBOGGFLAC_LIBS" - ]) + # in FLAC-1.1.3, libOggFLAC was merged into libFLAC + # FLAC_API_VERSION_CURRENT first appears in FLAC-1.1.3 + AC_MSG_CHECKING(for legacy libFLAC (<1.1.13)) + ac_save_LIBS="$LIBS" + LIBS= + AC_TRY_RUN([ + #include + int main () { return FLAC_API_VERSION_CURRENT<8; } + ],legacy_flac=no,legacy_flac=yes,legacy_flac=no) + AC_MSG_RESULT($legacy_flac) + LIBS="$ac_save_LIBS" + if test "x$legacy_flac" = xyes; then + AM_PATH_LIBOGGFLAC([ + EXTRADEFS="$EXTRADEFS -DAU_OGGFLAC" + EXTRACT_CPPFLAGS(CPPFLAGS,CFLAGS,$LIBOGGFLAC_CFLAGS) + LIBS="$LIBS $LIBOGGFLAC_LIBS" + ]) + else + + AC_MSG_CHECKING(for Ogg support in libFLAC ) + ac_save_LIBS="$LIBS" + LIBS="-lFLAC -lm -logg" + AC_TRY_RUN([ + #include + int main () { return !FLAC_API_SUPPORTS_OGG_FLAC; } + ],ogg_flac=yes,ogg_flac=yes,ogg_flac=no) + AC_MSG_RESULT($ogg_flac) + LIBS="$ac_save_LIBS" + if test "x$ogg_flac" = xyes; then + LIBS="$LIBS -logg" + CFLAGS="$CFLAGS -DAU_OGGFLAC" + fi + fi else AC_MSG_RESULT(no) fi diff -urN TiMidity++-2.13.2.orig/timidity/flac_a.c TiMidity++-2.13.2/timidity/flac_a.c --- TiMidity++-2.13.2.orig/timidity/flac_a.c 2004-05-23 07:35:44 +0300 +++ TiMidity++-2.13.2/timidity/flac_a.c 2007-02-19 13:06:55 +0200 @@ -38,14 +38,22 @@ #if defined(AU_FLAC_DLL) || defined(AU_OGGFLAC_DLL) #include -#define FLAC__EXPORT_H /* don't include "OggFLAC/export.h" */ -#define FLAC_API -#define OggFLAC__EXPORT_H /* don't include "FLAC/export.h" */ -#define OggFLAC_API +#include /* need export.h to figure out API version from FLAC_API_VERSION_CURRENT */ +#undef FLAC_API +#undef OggFLAC_API #endif #include -#ifdef AU_OGGFLAC + +/* by LEGACY_FLAC we mean before FLAC 1.1.3 */ +/* in FLAC 1.1.3, libOggFLAC is merged into libFLAC and all encoding layers are merged into the stream encoder */ +#if !defined(FLAC_API_VERSION_CURRENT) || FLAC_API_VERSION_CURRENT < 8 +#define LEGACY_FLAC +#else +#undef LEGACY_FLAC +#endif + +#if defined(LEGACY_FLAC) && defined(AU_OGGFLAC) #include #endif @@ -100,17 +108,21 @@ unsigned long out_bytes; union { FLAC__StreamEncoderState flac; +#ifdef LEGACY_FLAC FLAC__SeekableStreamEncoderState s_flac; #ifdef AU_OGGFLAC OggFLAC__StreamEncoderState ogg; #endif +#endif } state; union { union { FLAC__StreamEncoder *stream; +#ifdef LEGACY_FLAC FLAC__SeekableStreamEncoder *s_stream; +#endif } flac; -#ifdef AU_OGGFLAC +#if defined(LEGACY_FLAC) && defined(AU_OGGFLAC) union { OggFLAC__StreamEncoder *stream; } ogg; @@ -158,7 +170,7 @@ static long serial_number = 0; FLAC_ctx *flac_ctx = NULL; -#ifdef AU_OGGFLAC +#if defined(LEGACY_FLAC) && defined(AU_OGGFLAC) static FLAC__StreamEncoderWriteStatus ogg_stream_encoder_write_callback(const OggFLAC__StreamEncoder *encoder, const FLAC__byte buffer[], @@ -168,8 +180,13 @@ static FLAC__StreamEncoderWriteStatus flac_stream_encoder_write_callback(const FLAC__StreamEncoder *encoder, const FLAC__byte buffer[], +#ifdef LEGACY_FLAC unsigned bytes, unsigned samples, +#else + size_t bytes, unsigned samples, +#endif unsigned current_frame, void *client_data); +#ifdef LEGACY_FLAC static void flac_stream_encoder_metadata_callback(const FLAC__StreamEncoder *encoder, const FLAC__StreamMetadata *metadata, void *client_data); @@ -181,6 +198,7 @@ static void flac_seekable_stream_encoder_metadata_callback(const FLAC__SeekableStreamEncoder *encoder, const FLAC__StreamMetadata *metadata, void *client_data); +#endif /* preset */ void flac_set_compression_level(int compression_level) @@ -281,7 +299,11 @@ #ifdef AU_OGGFLAC void flac_set_option_oggflac(int isogg) { +#ifdef LEGACY_FLAC flac_options.isogg = isogg; +#else + flac_options.isogg = (FLAC_API_SUPPORTS_OGG_FLAC && isogg); +#endif } #endif @@ -295,6 +317,7 @@ dpm.fd = -1; if (ctx != NULL) { +#ifdef LEGACY_FLAC #ifdef AU_OGGFLAC if (flac_options.isogg) { if (ctx->encoder.ogg.stream) { @@ -317,6 +340,12 @@ FLAC__stream_encoder_delete(ctx->encoder.flac.stream); } } +#else + if (ctx->encoder.flac.stream) { + FLAC__stream_encoder_finish(ctx->encoder.flac.stream); + FLAC__stream_encoder_delete(ctx->encoder.flac.stream); + } +#endif free(ctx); flac_ctx = NULL; } @@ -329,6 +358,9 @@ FLAC__StreamMetadata padding; FLAC__StreamMetadata *metadata[4]; int num_metadata = 0; +#ifndef LEGACY_FLAC + FLAC__StreamEncoderInitStatus init_status; +#endif FLAC_ctx *ctx; @@ -371,6 +403,7 @@ metadata[num_metadata++] = &padding; } +#ifdef LEGACY_FLAC #ifdef AU_OGGFLAC if (flac_options.isogg) { if ((ctx->encoder.ogg.stream = OggFLAC__stream_encoder_new()) == NULL) { @@ -542,6 +575,67 @@ return -1; } } +#else /* !LEGACY_FLAC */ + if ((ctx->encoder.flac.stream = FLAC__stream_encoder_new()) == NULL) { + ctl->cmsg(CMSG_ERROR, VERB_NORMAL, "cannot create FLAC stream"); + flac_session_close(); + return -1; + } + +#ifdef AU_OGGFLAC + if (flac_options.isogg) { + /* set sequential number for serial */ + serial_number++; + if (serial_number == 1) { + srand(time(NULL)); + serial_number = rand(); + } + FLAC__stream_encoder_set_ogg_serial_number(ctx->encoder.flac.stream, serial_number); + } +#endif /* AU_OGGFLAC */ + FLAC__stream_encoder_set_channels(ctx->encoder.flac.stream, nch); + /* 16bps only */ + FLAC__stream_encoder_set_bits_per_sample(ctx->encoder.flac.stream, 16); + + FLAC__stream_encoder_set_verify(ctx->encoder.flac.stream, flac_options.verify); + + if (!FLAC__format_sample_rate_is_valid(dpm.rate)) { + ctl->cmsg(CMSG_ERROR, VERB_NORMAL, "invalid sampling rate %d", dpm.rate); + flac_session_close(); + return -1; + } + FLAC__stream_encoder_set_sample_rate(ctx->encoder.flac.stream, dpm.rate); + + FLAC__stream_encoder_set_qlp_coeff_precision(ctx->encoder.flac.stream, flac_options.qlp_coeff_precision); + /* expensive! */ + FLAC__stream_encoder_set_do_qlp_coeff_prec_search(ctx->encoder.flac.stream, flac_options.qlp_coeff_precision_search); + + if (nch == 2) { + FLAC__stream_encoder_set_do_mid_side_stereo(ctx->encoder.flac.stream, flac_options.mid_side); + FLAC__stream_encoder_set_loose_mid_side_stereo(ctx->encoder.flac.stream, flac_options.adaptive_mid_side); + } + + FLAC__stream_encoder_set_max_lpc_order(ctx->encoder.flac.stream, flac_options.max_lpc_order); + FLAC__stream_encoder_set_min_residual_partition_order(ctx->encoder.flac.stream, flac_options.min_residual_partition_order); + FLAC__stream_encoder_set_max_residual_partition_order(ctx->encoder.flac.stream, flac_options.max_residual_partition_order); + + FLAC__stream_encoder_set_blocksize(ctx->encoder.flac.stream, flac_options.blocksize); + + if (0 < num_metadata) + FLAC__stream_encoder_set_metadata(ctx->encoder.flac.stream, metadata, num_metadata); + +#ifdef AU_OGGFLAC + if (flac_options.isogg) + init_status = FLAC__stream_encoder_init_ogg_stream(ctx->encoder.flac.stream, NULL, flac_stream_encoder_write_callback, NULL, NULL, NULL, ctx); + else +#endif + init_status = FLAC__stream_encoder_init_stream(ctx->encoder.flac.stream, flac_stream_encoder_write_callback, NULL, NULL, NULL, ctx); + if (init_status != FLAC__STREAM_ENCODER_INIT_STATUS_OK) { + ctl->cmsg(CMSG_ERROR, VERB_NORMAL, "cannot create FLAC encoder (init status: %s)", FLAC__StreamEncoderInitStatusString[init_status]); + flac_session_close(); + return -1; + } +#endif return 0; } @@ -638,7 +732,7 @@ return 0; } -#ifdef AU_OGGFLAC +#if defined(LEGACY_FLAC) && defined(AU_OGGFLAC) static FLAC__StreamEncoderWriteStatus ogg_stream_encoder_write_callback(const OggFLAC__StreamEncoder *encoder, const FLAC__byte buffer[], @@ -658,7 +752,11 @@ static FLAC__StreamEncoderWriteStatus flac_stream_encoder_write_callback(const FLAC__StreamEncoder *encoder, const FLAC__byte buffer[], +#ifdef LEGACY_FLAC unsigned bytes, unsigned samples, +#else + size_t bytes, unsigned samples, +#endif unsigned current_frame, void *client_data) { FLAC_ctx *ctx = (FLAC_ctx *)client_data; @@ -670,6 +768,7 @@ else return FLAC__STREAM_ENCODER_WRITE_STATUS_FATAL_ERROR; } +#ifdef LEGACY_FLAC static void flac_stream_encoder_metadata_callback(const FLAC__StreamEncoder *encoder, const FLAC__StreamMetadata *metadata, void *client_data) @@ -695,6 +794,7 @@ void *client_data) { } +#endif static int output_data(char *buf, int32 nbytes) { @@ -723,6 +823,7 @@ oggbuf[i] = *s++; } +#ifdef LEGACY_FLAC #ifdef AU_OGGFLAC if (flac_options.isogg) { ctx->state.ogg = OggFLAC__stream_encoder_get_state(ctx->encoder.ogg.stream); @@ -793,6 +894,29 @@ return -1; } } +#else /* !LEGACY_FLAC */ + ctx->state.flac = FLAC__stream_encoder_get_state(ctx->encoder.flac.stream); + if (ctx->state.flac != FLAC__STREAM_ENCODER_OK) { + if (ctx->state.flac == FLAC__STREAM_ENCODER_VERIFY_DECODER_ERROR | + FLAC__STREAM_ENCODER_VERIFY_MISMATCH_IN_AUDIO_DATA) { + ctl->cmsg(CMSG_ERROR, VERB_NORMAL, "FLAC stream verify error (%s)", + FLAC__StreamDecoderStateString[FLAC__stream_encoder_get_verify_decoder_state(ctx->encoder.flac.stream)]); + } + else { + ctl->cmsg(CMSG_ERROR, VERB_NORMAL, "cannot encode FLAC stream (%s)", + FLAC__StreamEncoderStateString[ctx->state.flac]); + } + flac_session_close(); + return -1; + } + + if (!FLAC__stream_encoder_process_interleaved(ctx->encoder.flac.stream, oggbuf, + nbytes / nch / 2 )) { + ctl->cmsg(CMSG_ERROR, VERB_NORMAL, "cannot encode FLAC stream"); + flac_session_close(); + return -1; + } +#endif ctx->in_bytes += nbytes; free(oggbuf); @@ -813,6 +937,7 @@ return; } +#ifdef LEGACY_FLAC if (flac_options.isogg) { #ifdef AU_OGGFLAC if ((ctx->state.ogg = OggFLAC__stream_encoder_get_state(ctx->encoder.ogg.stream)) != OggFLAC__STREAM_ENCODER_OK) { @@ -838,6 +963,13 @@ /* fall through */ } } +#else /* !LEGACY_FLAC */ + if ((ctx->state.flac = FLAC__stream_encoder_get_state(ctx->encoder.flac.stream)) != FLAC__STREAM_ENCODER_OK) { + ctl->cmsg(CMSG_ERROR, VERB_NORMAL, "FLAC stream encoder is invalid (%s)", + FLAC__StreamEncoderStateString[ctx->state.flac]); + /* fall through */ + } +#endif ctl->cmsg(CMSG_INFO, VERB_NORMAL, "Wrote %lu/%lu bytes(%g%% compressed)", ctx->out_bytes, ctx->in_bytes, ((double)ctx->out_bytes / (double)ctx->in_bytes) * 100.);