diff options
author | wiz <wiz> | 2007-01-09 23:19:26 +0000 |
---|---|---|
committer | wiz <wiz> | 2007-01-09 23:19:26 +0000 |
commit | e30784a1bd37cc84ae9e02478b69641cb8b21433 (patch) | |
tree | f321072245d8880c9f5e5c02cc27dbbd85b649b2 /audio | |
parent | 09f9eff5c14953618059656be41ed433bb1dba71 (diff) | |
download | pkgsrc-e30784a1bd37cc84ae9e02478b69641cb8b21433.tar.gz |
Update to 0.12.1. Add patches from mpd svn repository to add flac-1.1.3.
ver 0.12.1 (2006/10/10)
* Fix segfault when scanning an MP3 that has a Xing tag with 0 frames
* Fix segfault when there's no audio output specified and one can't be detected
* Fix handling of escaping in quotes
* Allow a quality of -1 to be specified for shout outputs
* A few minor cleanups
ver 0.12.0 (2006/9/22)
* New audio output code which supports:
* A plugin-like architecture
* Non-libao ("native") outputs:
* ALSA
* OSS
* OS X
* Sun
* Media MVP
* PulseAudio
* Shout (Icecast or Shoutcast)
* Playing through multiple outputs at once
* Enabling/disabling outputs while MPD is running
* Saving output state (enabled/disabled) to the state_file
* OggFLAC support
(doesn't currently work with flac-1.1.3)
* Musepack support
* Gapless MP3 playback
* MP3 ReplayGain support (using ID3v2 tags only)
* Support for MP2 files if MP3 support is enabled
* Composer, Performer, Comment, and Disc metadata support
* New outputs command for listing available audio outputs
* New enableoutput and disableoutput commands for enabling/disabling outputs
* New plchangesposid command for a stripped down version of plchanges
* New addid command for adding to the playlist and returning a song ID
* New commands and notcommands commands for checking available commands
* Can now specify any supported metadata type or "any" in search, find, and list
* New volume_normalization parameter for enabling Audio Compress normalization
* New metadata_to_use parameter for choosing supported metadata types
* New pid_file parameter for saving the MPD process ID to the specified file
* The db_file parameter is now required
* The port parameter is now optional (defaults to 6600)
* Can specify bind_to_address multiple times
* New --kill argument for killing MPD if pid_file is specified
* Removed --update-db argument (use the update function in your client instead)
* New mpdconf.example
* New mpd.conf man page
* Removed bundled libmad and libid3tag
* Lots of bug fixes, cleaned up code, and performance improvements
Diffstat (limited to 'audio')
-rw-r--r-- | audio/musicpd/Makefile | 8 | ||||
-rw-r--r-- | audio/musicpd/PLIST | 4 | ||||
-rw-r--r-- | audio/musicpd/distinfo | 13 | ||||
-rw-r--r-- | audio/musicpd/patches/patch-aa | 12 | ||||
-rw-r--r-- | audio/musicpd/patches/patch-ab | 120 | ||||
-rw-r--r-- | audio/musicpd/patches/patch-ac | 581 | ||||
-rw-r--r-- | audio/musicpd/patches/patch-ad | 26 |
7 files changed, 748 insertions, 16 deletions
diff --git a/audio/musicpd/Makefile b/audio/musicpd/Makefile index cceb7807c2a..682d70d731b 100644 --- a/audio/musicpd/Makefile +++ b/audio/musicpd/Makefile @@ -1,10 +1,10 @@ -# $NetBSD: Makefile,v 1.26 2007/01/07 12:25:52 wiz Exp $ +# $NetBSD: Makefile,v 1.27 2007/01/09 23:19:26 wiz Exp $ -DISTNAME= mpd-0.11.5 +DISTNAME= mpd-0.12.1 PKGNAME= ${DISTNAME:S/mpd/musicpd/} -PKGREVISION= 6 CATEGORIES= audio -MASTER_SITES= http://mercury.chem.pitt.edu/~shank/ +MASTER_SITES= http://musicpd.org/uploads/files/ +EXTRACT_SUFX= .tar.bz2 CONFLICTS= mpd-[0-9]* diff --git a/audio/musicpd/PLIST b/audio/musicpd/PLIST index 06811923ecc..2eee0ece19a 100644 --- a/audio/musicpd/PLIST +++ b/audio/musicpd/PLIST @@ -1,9 +1,11 @@ -@comment $NetBSD: PLIST,v 1.2 2005/05/02 20:33:57 reed Exp $ +@comment $NetBSD: PLIST,v 1.3 2007/01/09 23:19:26 wiz Exp $ bin/mpd man/man1/mpd.1 +man/man5/mpd.conf.5 share/doc/mpd/COMMANDS share/doc/mpd/README share/doc/mpd/UPGRADING +share/doc/mpd/mpdconf.example share/examples/mpd/mpd.conf share/examples/rc.d/mpd @dirrm share/examples/mpd diff --git a/audio/musicpd/distinfo b/audio/musicpd/distinfo index 276a6c929d7..4f05c7fd335 100644 --- a/audio/musicpd/distinfo +++ b/audio/musicpd/distinfo @@ -1,6 +1,9 @@ -$NetBSD: distinfo,v 1.10 2006/10/25 23:17:29 dmcmahill Exp $ +$NetBSD: distinfo,v 1.11 2007/01/09 23:19:26 wiz Exp $ -SHA1 (mpd-0.11.5.tar.gz) = 5661008b3eb799f8d76949a37bc439917dbbb68a -RMD160 (mpd-0.11.5.tar.gz) = 4a7dd3473110aa1f860fbd7a760da7fdfe2a9ebf -Size (mpd-0.11.5.tar.gz) = 1127523 bytes -SHA1 (patch-aa) = 67e28d15948f19a5472782b7b18af10a754db6f5 +SHA1 (mpd-0.12.1.tar.bz2) = 8b124bfcf4b1b2c23abd40661bd0ad0b33fadbfe +RMD160 (mpd-0.12.1.tar.bz2) = 3352e60ead352bac0b4776f4b784c9f9505bc9bc +Size (mpd-0.12.1.tar.bz2) = 397761 bytes +SHA1 (patch-aa) = 246424791365a3a9a29c2efe36bbbcd40416ae48 +SHA1 (patch-ab) = 3ddd0f23a9d796d4e4c428819657f9a66cf624ba +SHA1 (patch-ac) = f6876c403c1357e99534878b01044e4a22ed0a97 +SHA1 (patch-ad) = 5ba01e9b2b7f1ecca9565e0809021e47df0c4145 diff --git a/audio/musicpd/patches/patch-aa b/audio/musicpd/patches/patch-aa index 015995e990d..b2f4e0512fe 100644 --- a/audio/musicpd/patches/patch-aa +++ b/audio/musicpd/patches/patch-aa @@ -1,15 +1,15 @@ -$NetBSD: patch-aa,v 1.3 2006/10/25 23:17:30 dmcmahill Exp $ +$NetBSD: patch-aa,v 1.4 2007/01/09 23:19:26 wiz Exp $ http://www.musicpd.org/mantis/view.php?id=1379 setenv() doesn't exist on all systems (e.g. solaris 9) ---- src/main.c.orig 2006-10-25 15:26:10.800946000 -0400 +--- src/main.c.orig 2006-10-10 23:56:58.000000000 +0000 +++ src/main.c -@@ -262,7 +262,14 @@ void changeToUser(Options * options) { - } +@@ -279,7 +279,14 @@ static void changeToUser(void) - if(userpwd->pw_dir) { + /* this is needed by libs such as arts */ + if (userpwd->pw_dir) { - setenv("HOME", userpwd->pw_dir, 1); + char *tmps; + /* HOME=%s so we need 5 for HOME= and 1 for the terminating \0 */ @@ -20,5 +20,5 @@ setenv() doesn't exist on all systems (e.g. solaris 9) + free (tmps); + } } - } + } } diff --git a/audio/musicpd/patches/patch-ab b/audio/musicpd/patches/patch-ab new file mode 100644 index 00000000000..453ceab45b5 --- /dev/null +++ b/audio/musicpd/patches/patch-ab @@ -0,0 +1,120 @@ +$NetBSD: patch-ab,v 1.1 2007/01/09 23:19:26 wiz Exp $ + +--- src/inputPlugins/_flac_common.h.orig 2006-10-10 23:56:55.000000000 +0000 ++++ src/inputPlugins/_flac_common.h +@@ -30,7 +30,114 @@ + #include "../inputStream.h" + #include "../outputBuffer.h" + #include "../decode.h" +-#include <FLAC/seekable_stream_decoder.h> ++#include <FLAC/export.h> ++#if !defined(FLAC_API_VERSION_CURRENT) || FLAC_API_VERSION_CURRENT <= 7 ++# include <FLAC/seekable_stream_decoder.h> ++# define flac_decoder FLAC__SeekableStreamDecoder ++# define flac_new(x) FLAC__seekable_stream_decoder_new(x) ++ ++# define flac_ogg_init(a,b,c,d,e,f,g,h,i,j) (0) ++ ++# define flac_get_decode_position(x,y) \ ++ FLAC__seekable_stream_decoder_get_decode_position(x,y) ++# define flac_get_state(x) FLAC__seekable_stream_decoder_get_state(x) ++# define flac_process_single(x) FLAC__seekable_stream_decoder_process_single(x) ++# define flac_process_metadata(x) \ ++ FLAC__seekable_stream_decoder_process_until_end_of_metadata(x) ++# define flac_seek_absolute(x,y) \ ++ FLAC__seekable_stream_decoder_seek_absolute(x,y) ++# define flac_finish(x) FLAC__seekable_stream_decoder_finish(x) ++# define flac_delete(x) FLAC__seekable_stream_decoder_delete(x) ++ ++# define flac_decoder_eof FLAC__SEEKABLE_STREAM_DECODER_END_OF_STREAM ++ ++# define flac_read_status FLAC__SeekableStreamDecoderReadStatus ++# define flac_read_status_continue \ ++ FLAC__SEEKABLE_STREAM_DECODER_READ_STATUS_OK ++# define flac_read_status_eof FLAC__SEEKABLE_STREAM_DECODER_READ_STATUS_OK ++# define flac_read_status_abort \ ++ FLAC__SEEKABLE_STREAM_DECODER_READ_STATUS_ERROR ++ ++# define flac_seek_status FLAC__SeekableStreamDecoderSeekStatus ++# define flac_seek_status_ok FLAC__SEEKABLE_STREAM_DECODER_SEEK_STATUS_OK ++# define flac_seek_status_error FLAC__SEEKABLE_STREAM_DECODER_SEEK_STATUS_ERROR ++ ++# define flac_tell_status FLAC__SeekableStreamDecoderTellStatus ++# define flac_tell_status_ok FLAC__SEEKABLE_STREAM_DECODER_TELL_STATUS_OK ++# define flac_tell_status_error \ ++ FLAC__SEEKABLE_STREAM_DECODER_TELL_STATUS_ERROR ++# define flac_tell_status_unsupported \ ++ FLAC__SEEKABLE_STREAM_DECODER_TELL_STATUS_ERROR ++ ++# define flac_length_status FLAC__SeekableStreamDecoderLengthStatus ++# define flac_length_status_ok FLAC__SEEKABLE_STREAM_DECODER_LENGTH_STATUS_OK ++# define flac_length_status_error \ ++ FLAC__SEEKABLE_STREAM_DECODER_LENGTH_STATUS_ERROR ++# define flac_length_status_unsupported \ ++ FLAC__SEEKABLE_STREAM_DECODER_LENGTH_STATUS_ERROR ++ ++# ifdef HAVE_OGGFLAC ++# include <OggFLAC/seekable_stream_decoder.h> ++# endif ++#else /* FLAC_API_VERSION_CURRENT >= 7 */ ++ ++ /* OggFLAC support is handled by our flac_plugin already, and ++ * thus we *can* always have it if libFLAC was compiled with it */ ++# ifndef HAVE_OGGFLAC ++# define HAVE_OGGFLAC 1 ++# endif ++# include "_ogg_common.h" ++# undef HAVE_OGGFLAC /* we don't need this defined anymore */ ++ ++# include <FLAC/stream_decoder.h> ++# define flac_decoder FLAC__StreamDecoder ++# define flac_new(x) FLAC__stream_decoder_new(x) ++ ++# define flac_init(a,b,c,d,e,f,g,h,i,j) \ ++ (FLAC__stream_decoder_init_stream(a,b,c,d,e,f,g,h,i,j) \ ++ == FLAC__STREAM_DECODER_INIT_STATUS_OK) ++# define flac_ogg_init(a,b,c,d,e,f,g,h,i,j) \ ++ (FLAC__stream_decoder_init_ogg_stream(a,b,c,d,e,f,g,h,i,j) \ ++ == FLAC__STREAM_DECODER_INIT_STATUS_OK) ++ ++# define flac_get_decode_position(x,y) \ ++ FLAC__stream_decoder_get_decode_position(x,y) ++# define flac_get_state(x) FLAC__stream_decoder_get_state(x) ++# define flac_process_single(x) FLAC__stream_decoder_process_single(x) ++# define flac_process_metadata(x) \ ++ FLAC__stream_decoder_process_until_end_of_metadata(x) ++# define flac_seek_absolute(x,y) FLAC__stream_decoder_seek_absolute(x,y) ++# define flac_finish(x) FLAC__stream_decoder_finish(x) ++# define flac_delete(x) FLAC__stream_decoder_delete(x) ++ ++# define flac_decoder_eof FLAC__STREAM_DECODER_END_OF_STREAM ++ ++# define flac_read_status FLAC__StreamDecoderReadStatus ++# define flac_read_status_continue \ ++ FLAC__STREAM_DECODER_READ_STATUS_CONTINUE ++# define flac_read_status_eof FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM ++# define flac_read_status_abort FLAC__STREAM_DECODER_READ_STATUS_ABORT ++ ++# define flac_seek_status FLAC__StreamDecoderSeekStatus ++# define flac_seek_status_ok FLAC__STREAM_DECODER_SEEK_STATUS_OK ++# define flac_seek_status_error FLAC__STREAM_DECODER_SEEK_STATUS_ERROR ++# define flac_seek_status_unsupported \ ++ FLAC__STREAM_DECODER_SEEK_STATUS_UNSUPPORTED ++ ++# define flac_tell_status FLAC__StreamDecoderTellStatus ++# define flac_tell_status_ok FLAC__STREAM_DECODER_TELL_STATUS_OK ++# define flac_tell_status_error FLAC__STREAM_DECODER_TELL_STATUS_ERROR ++# define flac_tell_status_unsupported \ ++ FLAC__STREAM_DECODER_TELL_STATUS_UNSUPPORTED ++ ++# define flac_length_status FLAC__StreamDecoderLengthStatus ++# define flac_length_status_ok FLAC__STREAM_DECODER_LENGTH_STATUS_OK ++# define flac_length_status_error FLAC__STREAM_DECODER_LENGTH_STATUS_ERROR ++# define flac_length_status_unsupported \ ++ FLAC__STREAM_DECODER_LENGTH_STATUS_UNSUPPORTED ++ ++#endif /* FLAC_API_VERSION_CURRENT >= 7 */ ++ + #include <FLAC/metadata.h> + + #define FLAC_CHUNK_SIZE 4080 diff --git a/audio/musicpd/patches/patch-ac b/audio/musicpd/patches/patch-ac new file mode 100644 index 00000000000..4b304abff16 --- /dev/null +++ b/audio/musicpd/patches/patch-ac @@ -0,0 +1,581 @@ +$NetBSD: patch-ac,v 1.1 2007/01/09 23:19:26 wiz Exp $ + +--- src/inputPlugins/flac_plugin.c.orig 2006-10-10 23:56:56.000000000 +0000 ++++ src/inputPlugins/flac_plugin.c +@@ -16,12 +16,10 @@ + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +-#include "../inputPlugin.h" ++#include "_flac_common.h" + + #ifdef HAVE_FLAC + +-#include "_flac_common.h" +- + #include "../utils.h" + #include "../log.h" + #include "../pcm_utils.h" +@@ -33,166 +31,14 @@ + #include <stdio.h> + #include <string.h> + #include <unistd.h> +-#include <FLAC/seekable_stream_decoder.h> +-#include <FLAC/metadata.h> ++#include <assert.h> + +-/* this code is based on flac123, from flac-tools */ ++/* this code was based on flac123, from flac-tools */ + +-static void flacError(const FLAC__SeekableStreamDecoder *, +- FLAC__StreamDecoderErrorStatus, void *); +-static void flacPrintErroredState(FLAC__SeekableStreamDecoderState state); +-static void flacMetadata(const FLAC__SeekableStreamDecoder *, +- const FLAC__StreamMetadata *, void *); +-static FLAC__StreamDecoderWriteStatus flacWrite(const +- FLAC__SeekableStreamDecoder *, +- const FLAC__Frame *, +- const FLAC__int32 * const buf[], +- void *); +-static FLAC__SeekableStreamDecoderReadStatus flacRead(const +- FLAC__SeekableStreamDecoder +- *, FLAC__byte buf[], +- unsigned *, void *); +-static FLAC__SeekableStreamDecoderSeekStatus flacSeek(const +- FLAC__SeekableStreamDecoder +- *, FLAC__uint64, void *); +-static FLAC__SeekableStreamDecoderTellStatus flacTell(const +- FLAC__SeekableStreamDecoder +- *, FLAC__uint64 *, +- void *); +-static FLAC__SeekableStreamDecoderLengthStatus flacLength(const +- FLAC__SeekableStreamDecoder +- *, FLAC__uint64 *, +- void *); +-static FLAC__bool flacEOF(const FLAC__SeekableStreamDecoder *, void *); +- +-static int flac_decode(OutputBuffer * cb, DecoderControl * dc, +- InputStream * inStream) +-{ +- FLAC__SeekableStreamDecoder *flacDec = NULL; +- FlacData data; +- int status = 1; +- int ret = 0; +- +- init_FlacData(&data, cb, dc, inStream); +- +- if (!(flacDec = FLAC__seekable_stream_decoder_new())) { +- ret = -1; +- goto fail; +- } +- /*status&=FLAC__file_decoder_set_md5_checking(flacDec,1); */ +- status &= FLAC__seekable_stream_decoder_set_read_callback(flacDec, +- flacRead); +- status &= FLAC__seekable_stream_decoder_set_seek_callback(flacDec, +- flacSeek); +- status &= FLAC__seekable_stream_decoder_set_tell_callback(flacDec, +- flacTell); +- status &= FLAC__seekable_stream_decoder_set_length_callback(flacDec, +- flacLength); +- status &= +- FLAC__seekable_stream_decoder_set_eof_callback(flacDec, flacEOF); +- status &= +- FLAC__seekable_stream_decoder_set_write_callback(flacDec, +- flacWrite); +- status &= +- FLAC__seekable_stream_decoder_set_metadata_callback(flacDec, +- flacMetadata); +- status &= +- FLAC__seekable_stream_decoder_set_metadata_respond(flacDec, +- FLAC__METADATA_TYPE_VORBIS_COMMENT); +- status &= +- FLAC__seekable_stream_decoder_set_error_callback(flacDec, +- flacError); +- status &= +- FLAC__seekable_stream_decoder_set_client_data(flacDec, +- (void *)&data); +- if (!status) { +- ERROR("flac problem before init()\n"); +- flacPrintErroredState(FLAC__seekable_stream_decoder_get_state +- (flacDec)); +- ret = -1; +- goto fail; +- } +- +- if (FLAC__seekable_stream_decoder_init(flacDec) != +- FLAC__SEEKABLE_STREAM_DECODER_OK) { +- ERROR("flac problem doing init()\n"); +- flacPrintErroredState(FLAC__seekable_stream_decoder_get_state +- (flacDec)); +- ret = -1; +- goto fail; +- } +- +- if (!FLAC__seekable_stream_decoder_process_until_end_of_metadata +- (flacDec)) { +- ERROR("flac problem reading metadata\n"); +- flacPrintErroredState(FLAC__seekable_stream_decoder_get_state +- (flacDec)); +- ret = -1; +- goto fail; +- } +- +- dc->state = DECODE_STATE_DECODE; +- +- while (1) { +- FLAC__seekable_stream_decoder_process_single(flacDec); +- if (FLAC__seekable_stream_decoder_get_state(flacDec) != +- FLAC__SEEKABLE_STREAM_DECODER_OK) { +- break; +- } +- if (dc->seek) { +- FLAC__uint64 sampleToSeek = dc->seekWhere * +- dc->audioFormat.sampleRate + 0.5; +- if (FLAC__seekable_stream_decoder_seek_absolute(flacDec, +- sampleToSeek)) +- { +- clearOutputBuffer(cb); +- data.time = ((float)sampleToSeek) / +- dc->audioFormat.sampleRate; +- data.position = 0; +- } else +- dc->seekError = 1; +- dc->seek = 0; +- } +- } +- /* I don't think we need this bit here! -shank */ +- /*FLAC__file_decoder_process_until_end_of_file(flacDec); */ +- if (!dc->stop) { +- flacPrintErroredState(FLAC__seekable_stream_decoder_get_state +- (flacDec)); +- FLAC__seekable_stream_decoder_finish(flacDec); +- } +- /* send last little bit */ +- if (data.chunk_length > 0 && !dc->stop) { +- flacSendChunk(&data); +- flushOutputBuffer(data.cb); +- } +- +- /*if(dc->seek) { +- dc->seekError = 1; +- dc->seek = 0; +- } */ +- +- dc->state = DECODE_STATE_STOP; +- dc->stop = 0; +- +-fail: +- if (data.replayGainInfo) +- freeReplayGainInfo(data.replayGainInfo); +- +- if (flacDec) +- FLAC__seekable_stream_decoder_delete(flacDec); +- +- closeInputStream(inStream); +- +- return ret; +-} +- +-static FLAC__SeekableStreamDecoderReadStatus flacRead(const +- FLAC__SeekableStreamDecoder +- * flacDec, +- FLAC__byte buf[], +- unsigned *bytes, +- void *fdata) ++static flac_read_status flacRead(const flac_decoder * flacDec, ++ FLAC__byte buf[], ++ unsigned *bytes, ++ void *fdata) + { + FlacData *data = (FlacData *) fdata; + size_t r; +@@ -207,55 +53,51 @@ static FLAC__SeekableStreamDecoderReadSt + } + *bytes = r; + +- if (*bytes == 0 && !inputStreamAtEOF(data->inStream) && !data->dc->stop) +- return FLAC__SEEKABLE_STREAM_DECODER_READ_STATUS_ERROR; +- +- return FLAC__SEEKABLE_STREAM_DECODER_READ_STATUS_OK; ++ if (r == 0 && !data->dc->stop) { ++ if (inputStreamAtEOF(data->inStream)) ++ return flac_read_status_eof; ++ else ++ return flac_read_status_abort; ++ } ++ return flac_read_status_continue; + } + +-static FLAC__SeekableStreamDecoderSeekStatus flacSeek(const +- FLAC__SeekableStreamDecoder +- * flacDec, +- FLAC__uint64 offset, +- void *fdata) ++static flac_seek_status flacSeek(const flac_decoder * flacDec, ++ FLAC__uint64 offset, ++ void *fdata) + { + FlacData *data = (FlacData *) fdata; + + if (seekInputStream(data->inStream, offset, SEEK_SET) < 0) { +- return FLAC__SEEKABLE_STREAM_DECODER_SEEK_STATUS_ERROR; ++ return flac_seek_status_error; + } + +- return FLAC__SEEKABLE_STREAM_DECODER_SEEK_STATUS_OK; ++ return flac_tell_status_ok; + } + +-static FLAC__SeekableStreamDecoderTellStatus flacTell(const +- FLAC__SeekableStreamDecoder +- * flacDec, +- FLAC__uint64 * offset, +- void *fdata) ++static flac_tell_status flacTell(const flac_decoder * flacDec, ++ FLAC__uint64 * offset, ++ void *fdata) + { + FlacData *data = (FlacData *) fdata; + + *offset = (long)(data->inStream->offset); + +- return FLAC__SEEKABLE_STREAM_DECODER_TELL_STATUS_OK; ++ return flac_tell_status_ok; + } + +-static FLAC__SeekableStreamDecoderLengthStatus flacLength(const +- FLAC__SeekableStreamDecoder +- * flacDec, +- FLAC__uint64 * length, +- void *fdata) ++static flac_length_status flacLength(const flac_decoder * flacDec, ++ FLAC__uint64 * length, ++ void *fdata) + { + FlacData *data = (FlacData *) fdata; + + *length = (size_t) (data->inStream->size); + +- return FLAC__SEEKABLE_STREAM_DECODER_LENGTH_STATUS_OK; ++ return flac_length_status_ok; + } + +-static FLAC__bool flacEOF(const FLAC__SeekableStreamDecoder * flacDec, +- void *fdata) ++static FLAC__bool flacEOF(const flac_decoder * flacDec, void *fdata) + { + FlacData *data = (FlacData *) fdata; + +@@ -264,52 +106,112 @@ static FLAC__bool flacEOF(const FLAC__Se + return false; + } + +-static void flacError(const FLAC__SeekableStreamDecoder * dec, ++static void flacError(const flac_decoder *dec, + FLAC__StreamDecoderErrorStatus status, void *fdata) + { + flac_error_common_cb("flac", status, (FlacData *) fdata); + } + ++#if !defined(FLAC_API_VERSION_CURRENT) || FLAC_API_VERSION_CURRENT <= 7 + static void flacPrintErroredState(FLAC__SeekableStreamDecoderState state) + { ++ const char *str = ""; /* "" to silence compiler warning */ + switch (state) { ++ case FLAC__SEEKABLE_STREAM_DECODER_OK: ++ case FLAC__SEEKABLE_STREAM_DECODER_SEEKING: ++ case FLAC__SEEKABLE_STREAM_DECODER_END_OF_STREAM: ++ return; + case FLAC__SEEKABLE_STREAM_DECODER_MEMORY_ALLOCATION_ERROR: +- ERROR("flac allocation error\n"); ++ str = "allocation error"; + break; + case FLAC__SEEKABLE_STREAM_DECODER_READ_ERROR: +- ERROR("flac read error\n"); ++ str = "read error"; + break; + case FLAC__SEEKABLE_STREAM_DECODER_SEEK_ERROR: +- ERROR("flac seek error\n"); ++ str = "seek error"; + break; + case FLAC__SEEKABLE_STREAM_DECODER_STREAM_DECODER_ERROR: +- ERROR("flac seekable stream error\n"); ++ str = "seekable stream error"; + break; + case FLAC__SEEKABLE_STREAM_DECODER_ALREADY_INITIALIZED: +- ERROR("flac decoder already initialized\n"); ++ str = "decoder already initialized"; + break; + case FLAC__SEEKABLE_STREAM_DECODER_INVALID_CALLBACK: +- ERROR("invalid flac callback\n"); ++ str = "invalid callback"; + break; + case FLAC__SEEKABLE_STREAM_DECODER_UNINITIALIZED: +- ERROR("flac decoder uninitialized\n"); ++ str = "decoder uninitialized"; ++ } ++ ERROR("flac %s\n", str); ++} ++ ++static int flac_init(FLAC__SeekableStreamDecoder *dec, ++ FLAC__SeekableStreamDecoderReadCallback read_cb, ++ FLAC__SeekableStreamDecoderSeekCallback seek_cb, ++ FLAC__SeekableStreamDecoderTellCallback tell_cb, ++ FLAC__SeekableStreamDecoderLengthCallback length_cb, ++ FLAC__SeekableStreamDecoderEofCallback eof_cb, ++ FLAC__SeekableStreamDecoderWriteCallback write_cb, ++ FLAC__SeekableStreamDecoderMetadataCallback metadata_cb, ++ FLAC__SeekableStreamDecoderErrorCallback error_cb, ++ void *data) ++{ ++ int s = 1; ++ s &= FLAC__seekable_stream_decoder_set_read_callback(dec, read_cb); ++ s &= FLAC__seekable_stream_decoder_set_seek_callback(dec, seek_cb); ++ s &= FLAC__seekable_stream_decoder_set_tell_callback(dec, tell_cb); ++ s &= FLAC__seekable_stream_decoder_set_length_callback(dec, length_cb); ++ s &= FLAC__seekable_stream_decoder_set_eof_callback(dec, eof_cb); ++ s &= FLAC__seekable_stream_decoder_set_write_callback(dec, write_cb); ++ s &= FLAC__seekable_stream_decoder_set_metadata_callback(dec, ++ metadata_cb); ++ s &= FLAC__seekable_stream_decoder_set_metadata_respond(dec, ++ FLAC__METADATA_TYPE_VORBIS_COMMENT); ++ s &= FLAC__seekable_stream_decoder_set_error_callback(dec, error_cb); ++ s &= FLAC__seekable_stream_decoder_set_client_data(dec, data); ++ if (!s || (FLAC__seekable_stream_decoder_init(dec) != ++ FLAC__SEEKABLE_STREAM_DECODER_OK)) ++ return 0; ++ return 1; ++} ++#else /* FLAC_API_VERSION_CURRENT >= 7 */ ++static void flacPrintErroredState(FLAC__StreamDecoderState state) ++{ ++ const char *str = ""; /* "" to silence compiler warning */ ++ switch (state) { ++ case FLAC__STREAM_DECODER_SEARCH_FOR_METADATA: ++ case FLAC__STREAM_DECODER_READ_METADATA: ++ case FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC: ++ case FLAC__STREAM_DECODER_READ_FRAME: ++ case FLAC__STREAM_DECODER_END_OF_STREAM: ++ return; ++ case FLAC__STREAM_DECODER_OGG_ERROR: ++ str = "error in the Ogg layer"; + break; +- case FLAC__SEEKABLE_STREAM_DECODER_OK: +- case FLAC__SEEKABLE_STREAM_DECODER_SEEKING: +- case FLAC__SEEKABLE_STREAM_DECODER_END_OF_STREAM: ++ case FLAC__STREAM_DECODER_SEEK_ERROR: ++ str = "seek error"; ++ break; ++ case FLAC__STREAM_DECODER_ABORTED: ++ str = "decoder aborted by read"; ++ break; ++ case FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR: ++ str = "allocation error"; + break; ++ case FLAC__STREAM_DECODER_UNINITIALIZED: ++ str = "decoder uninitialized"; + } ++ ERROR("flac %s\n", str); + } ++#endif /* FLAC_API_VERSION_CURRENT >= 7 */ + +-static void flacMetadata(const FLAC__SeekableStreamDecoder * dec, ++static void flacMetadata(const flac_decoder * dec, + const FLAC__StreamMetadata * block, void *vdata) + { + flac_metadata_common_cb(block, (FlacData *) vdata); + } + +-static FLAC__StreamDecoderWriteStatus flacWrite(const +- FLAC__SeekableStreamDecoder * +- dec, const FLAC__Frame * frame, ++static FLAC__StreamDecoderWriteStatus flacWrite(const flac_decoder *dec, ++ const FLAC__Frame * frame, + const FLAC__int32 * const buf[], + void *vdata) + { +@@ -325,7 +227,7 @@ static FLAC__StreamDecoderWriteStatus fl + timeChange = ((float)samples) / frame->header.sample_rate; + data->time += timeChange; + +- FLAC__seekable_stream_decoder_get_decode_position(dec, &newPosition); ++ flac_get_decode_position(dec, &newPosition); + if (data->position) { + data->bitRate = + ((newPosition - data->position) * 8.0 / timeChange) +@@ -438,12 +340,174 @@ static MpdTag *flacTagDup(char *file) + return ret; + } + ++static int flac_decode_internal(OutputBuffer * cb, DecoderControl * dc, ++ InputStream * inStream, int is_ogg) ++{ ++ flac_decoder *flacDec; ++ FlacData data; ++ const char *err = NULL; ++ ++ if (!(flacDec = flac_new())) ++ return -1; ++ init_FlacData(&data, cb, dc, inStream); ++ if (is_ogg) { ++ if (!flac_ogg_init(flacDec, flacRead, flacSeek, flacTell, ++ flacLength, flacEOF, flacWrite, flacMetadata, ++ flacError, (void *)&data)) { ++ err = "doing Ogg init()"; ++ goto fail; ++ } ++ } else { ++ if (!flac_init(flacDec, flacRead, flacSeek, flacTell, ++ flacLength, flacEOF, flacWrite, flacMetadata, ++ flacError, (void *)&data)) { ++ err = "doing init()"; ++ goto fail; ++ } ++ if (!flac_process_metadata(flacDec)) { ++ err = "problem reading metadata"; ++ goto fail; ++ } ++ } ++ ++ dc->state = DECODE_STATE_DECODE; ++ ++ while (1) { ++ if (!flac_process_single(flacDec)) ++ break; ++ if (flac_get_state(flacDec) == flac_decoder_eof) ++ break; ++ if (dc->seek) { ++ FLAC__uint64 sampleToSeek = dc->seekWhere * ++ dc->audioFormat.sampleRate + 0.5; ++ if (flac_seek_absolute(flacDec, sampleToSeek)) { ++ clearOutputBuffer(cb); ++ data.time = ((float)sampleToSeek) / ++ dc->audioFormat.sampleRate; ++ data.position = 0; ++ } else ++ dc->seekError = 1; ++ dc->seek = 0; ++ } ++ } ++ if (!dc->stop) { ++ flacPrintErroredState(flac_get_state(flacDec)); ++ flac_finish(flacDec); ++ } ++ /* send last little bit */ ++ if (data.chunk_length > 0 && !dc->stop) { ++ flacSendChunk(&data); ++ flushOutputBuffer(data.cb); ++ } ++ ++ /*if(dc->seek) { ++ dc->seekError = 1; ++ dc->seek = 0; ++ } */ ++ ++ dc->state = DECODE_STATE_STOP; ++ dc->stop = 0; ++ ++fail: ++ if (data.replayGainInfo) ++ freeReplayGainInfo(data.replayGainInfo); ++ ++ if (flacDec) ++ flac_delete(flacDec); ++ ++ closeInputStream(inStream); ++ ++ if (err) { ++ ERROR("flac %s\n", err); ++ return -1; ++ } ++ return 0; ++} ++ ++static int flac_decode(OutputBuffer * cb, DecoderControl * dc, ++ InputStream * inStream) ++{ ++ return flac_decode_internal(cb, dc, inStream, 0); ++} ++ ++#if !defined(FLAC_API_VERSION_CURRENT) || FLAC_API_VERSION_CURRENT <= 7 ++# define flac_plugin_init NULL ++#else /* FLAC_API_VERSION_CURRENT >= 7 */ ++/* some of this stuff is duplicated from oggflac_plugin.c */ ++extern InputPlugin oggflacPlugin; ++ ++static MpdTag *oggflac_tag_dup(char *file) ++{ ++ MpdTag *ret = NULL; ++ FLAC__Metadata_Iterator *it; ++ FLAC__StreamMetadata *block; ++ FLAC__Metadata_Chain *chain = FLAC__metadata_chain_new(); ++ ++ if (!(FLAC__metadata_chain_read_ogg(chain, file))) ++ goto out; ++ it = FLAC__metadata_iterator_new(); ++ FLAC__metadata_iterator_init(it, chain); ++ do { ++ if (!(block = FLAC__metadata_iterator_get_block(it))) ++ break; ++ if (block->type == FLAC__METADATA_TYPE_VORBIS_COMMENT) { ++ ret = copyVorbisCommentBlockToMpdTag(block, ret); ++ } else if (block->type == FLAC__METADATA_TYPE_STREAMINFO) { ++ if (!ret) ++ ret = newMpdTag(); ++ ret->time = ((float)block->data.stream_info. ++ total_samples) / ++ block->data.stream_info.sample_rate + 0.5; ++ } ++ } while (FLAC__metadata_iterator_next(it)); ++ FLAC__metadata_iterator_delete(it); ++out: ++ FLAC__metadata_chain_delete(chain); ++ return ret; ++} ++ ++static int oggflac_decode(OutputBuffer * cb, DecoderControl * dc, ++ InputStream * inStream) ++{ ++ return flac_decode_internal(cb, dc, inStream, 1); ++} ++ ++static unsigned int oggflac_try_decode(InputStream * inStream) ++{ ++ return (ogg_stream_type_detect(inStream) == FLAC) ? 1 : 0; ++} ++ ++static char *oggflac_suffixes[] = { "ogg", NULL }; ++static char *oggflac_mime_types[] = { "application/ogg", NULL }; ++ ++static int flac_plugin_init(void) ++{ ++ if (!FLAC_API_SUPPORTS_OGG_FLAC) { ++ DEBUG("libFLAC does not support OggFLAC\n"); ++ return 1; ++ } ++ DEBUG("libFLAC supports OggFLAC, initializing OggFLAC support\n"); ++ assert(oggflacPlugin.name == NULL); ++ oggflacPlugin.name = "oggflac"; ++ oggflacPlugin.tryDecodeFunc = oggflac_try_decode; ++ oggflacPlugin.streamDecodeFunc = oggflac_decode; ++ oggflacPlugin.tagDupFunc = oggflac_tag_dup; ++ oggflacPlugin.streamTypes = INPUT_PLUGIN_STREAM_URL | ++ INPUT_PLUGIN_STREAM_FILE; ++ oggflacPlugin.suffixes = oggflac_suffixes; ++ oggflacPlugin.mimeTypes = oggflac_mime_types; ++ loadInputPlugin(&oggflacPlugin); ++ return 1; ++} ++ ++#endif /* FLAC_API_VERSION_CURRENT >= 7 */ ++ + static char *flacSuffixes[] = { "flac", NULL }; + static char *flac_mime_types[] = { "application/x-flac", NULL }; + + InputPlugin flacPlugin = { + "flac", +- NULL, ++ flac_plugin_init, + NULL, + NULL, + flac_decode, diff --git a/audio/musicpd/patches/patch-ad b/audio/musicpd/patches/patch-ad new file mode 100644 index 00000000000..f99a8fcc250 --- /dev/null +++ b/audio/musicpd/patches/patch-ad @@ -0,0 +1,26 @@ +$NetBSD: patch-ad,v 1.1 2007/01/09 23:19:26 wiz Exp $ + +--- src/inputPlugins/oggflac_plugin.c.orig 2006-10-10 23:56:55.000000000 +0000 ++++ src/inputPlugins/oggflac_plugin.c +@@ -19,11 +19,10 @@ + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +-#include "../inputPlugin.h" ++#include "_flac_common.h" + + #ifdef HAVE_OGGFLAC + +-#include "_flac_common.h" + #include "_ogg_common.h" + + #include "../utils.h" +@@ -37,8 +36,6 @@ + #include <stdio.h> + #include <string.h> + #include <unistd.h> +-#include <OggFLAC/seekable_stream_decoder.h> +-#include <FLAC/metadata.h> + + static void oggflac_cleanup(InputStream * inStream, + FlacData * data, |