summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorwiz <wiz>2007-01-09 23:19:26 +0000
committerwiz <wiz>2007-01-09 23:19:26 +0000
commitf03ed4ca7b14ae08013332885ff16635231384ef (patch)
treef321072245d8880c9f5e5c02cc27dbbd85b649b2
parentf291ba9def32660075197146cc6631bf8d65fe7b (diff)
downloadpkgsrc-f03ed4ca7b14ae08013332885ff16635231384ef.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
-rw-r--r--audio/musicpd/Makefile8
-rw-r--r--audio/musicpd/PLIST4
-rw-r--r--audio/musicpd/distinfo13
-rw-r--r--audio/musicpd/patches/patch-aa12
-rw-r--r--audio/musicpd/patches/patch-ab120
-rw-r--r--audio/musicpd/patches/patch-ac581
-rw-r--r--audio/musicpd/patches/patch-ad26
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,