[Pkg-mpd-commits] [pkg-mpd] 01/06: Imported Upstream version 0.18.8

Florian Schlichting fsfs at moszumanska.debian.org
Wed Feb 12 22:07:17 UTC 2014


This is an automated email from the git hooks/post-receive script.

fsfs pushed a commit to branch master
in repository pkg-mpd.

commit a17324af24437ecc7309f8bb8d90eacdf3883062
Author: Florian Schlichting <fsfs at debian.org>
Date:   Sun Feb 9 20:35:23 2014 +0100

    Imported Upstream version 0.18.8
---
 Makefile.am                         | 11 +++++
 Makefile.in                         | 81 +++++++++++++++++++++++++++++---
 NEWS                                | 12 ++++-
 configure                           | 58 +++++++++++------------
 configure.ac                        |  4 +-
 doc/developer.xml                   |  2 +-
 doc/doxygen.conf                    |  2 +-
 doc/user.xml                        | 45 ++++++++++++++++++
 src/IcyMetaDataParser.cxx           | 92 ++++++++++++++++++++++++++++---------
 src/OutputAPI.hxx                   |  2 +-
 src/Playlist.hxx                    |  2 +-
 src/PlaylistPrint.cxx               |  4 +-
 src/PlaylistSave.cxx                |  2 +-
 src/PlaylistSave.hxx                |  4 +-
 src/Queue.cxx                       | 50 ++++++++++----------
 src/Queue.hxx                       | 10 ++--
 src/QueuePrint.cxx                  | 12 ++---
 src/QueuePrint.hxx                  | 12 ++---
 src/QueueSave.cxx                   |  4 +-
 src/QueueSave.hxx                   |  6 +--
 src/SongFilter.cxx                  |  2 +-
 src/decoder/FfmpegDecoderPlugin.cxx | 16 ++++++-
 src/decoder/FfmpegMetaData.hxx      |  4 +-
 src/tag/TagConfig.cxx               |  2 +-
 src/util/PeakBuffer.cxx             |  5 +-
 test/test_icy_parser.cxx            | 85 ++++++++++++++++++++++++++++++++++
 test/test_queue_priority.cxx        |  4 +-
 27 files changed, 407 insertions(+), 126 deletions(-)

diff --git a/Makefile.am b/Makefile.am
index 7240cb3..c7cf631 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -1061,6 +1061,7 @@ C_TESTS = \
 	test/test_util \
 	test/test_byte_reverse \
 	test/test_mixramp \
+	test/test_icy_parser \
 	test/test_pcm \
 	test/test_queue_priority
 
@@ -1496,6 +1497,16 @@ test_test_mixramp_LDADD = \
 	$(GLIB_LIBS) \
 	$(CPPUNIT_LIBS)
 
+test_test_icy_parser_SOURCES = \
+	src/Log.cxx \
+	test/test_icy_parser.cxx
+test_test_icy_parser_CPPFLAGS = $(AM_CPPFLAGS) $(CPPUNIT_CFLAGS) -DCPPUNIT_HAVE_RTTI=0
+test_test_icy_parser_CXXFLAGS = $(AM_CXXFLAGS) -Wno-error=deprecated-declarations
+test_test_icy_parser_LDADD = \
+	libtag.a \
+	$(GLIB_LIBS) \
+	$(CPPUNIT_LIBS)
+
 test_test_pcm_SOURCES = \
 	test/test_pcm_util.hxx \
 	test/test_pcm_dither.cxx \
diff --git a/Makefile.in b/Makefile.in
index 1bc4463..0b9b6da 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -908,6 +908,7 @@ am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" \
 @ENABLE_TEST_TRUE at am__EXEEXT_2 = test/test_util$(EXEEXT) \
 @ENABLE_TEST_TRUE@	test/test_byte_reverse$(EXEEXT) \
 @ENABLE_TEST_TRUE@	test/test_mixramp$(EXEEXT) \
+ at ENABLE_TEST_TRUE@	test/test_icy_parser$(EXEEXT) \
 @ENABLE_TEST_TRUE@	test/test_pcm$(EXEEXT) \
 @ENABLE_TEST_TRUE@	test/test_queue_priority$(EXEEXT) \
 @ENABLE_TEST_TRUE@	$(am__EXEEXT_1)
@@ -1538,6 +1539,16 @@ test_test_byte_reverse_OBJECTS = $(am_test_test_byte_reverse_OBJECTS)
 test_test_byte_reverse_LINK = $(CXXLD) \
 	$(test_test_byte_reverse_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
 	$(LDFLAGS) -o $@
+am__test_test_icy_parser_SOURCES_DIST = src/Log.cxx \
+	test/test_icy_parser.cxx
+ at ENABLE_TEST_TRUE@am_test_test_icy_parser_OBJECTS =  \
+ at ENABLE_TEST_TRUE@	src/test_test_icy_parser-Log.$(OBJEXT) \
+ at ENABLE_TEST_TRUE@	test/test_test_icy_parser-test_icy_parser.$(OBJEXT)
+test_test_icy_parser_OBJECTS = $(am_test_test_icy_parser_OBJECTS)
+ at ENABLE_TEST_TRUE@test_test_icy_parser_DEPENDENCIES = libtag.a \
+ at ENABLE_TEST_TRUE@	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
+test_test_icy_parser_LINK = $(CXXLD) $(test_test_icy_parser_CXXFLAGS) \
+	$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
 am__test_test_mixramp_SOURCES_DIST = src/Log.cxx test/test_mixramp.cxx
 @ENABLE_TEST_TRUE at am_test_test_mixramp_OBJECTS =  \
 @ENABLE_TEST_TRUE@	src/test_test_mixramp-Log.$(OBJEXT) \
@@ -1687,9 +1698,9 @@ SOURCES = $(libarchive_a_SOURCES) $(libconf_a_SOURCES) \
 	$(test_run_normalize_SOURCES) $(test_run_output_SOURCES) \
 	$(test_run_resolver_SOURCES) $(test_software_volume_SOURCES) \
 	$(test_test_archive_SOURCES) $(test_test_byte_reverse_SOURCES) \
-	$(test_test_mixramp_SOURCES) $(test_test_pcm_SOURCES) \
-	$(test_test_queue_priority_SOURCES) $(test_test_util_SOURCES) \
-	$(test_test_vorbis_encoder_SOURCES) \
+	$(test_test_icy_parser_SOURCES) $(test_test_mixramp_SOURCES) \
+	$(test_test_pcm_SOURCES) $(test_test_queue_priority_SOURCES) \
+	$(test_test_util_SOURCES) $(test_test_vorbis_encoder_SOURCES) \
 	$(test_visit_archive_SOURCES)
 DIST_SOURCES = $(am__libarchive_a_SOURCES_DIST) $(libconf_a_SOURCES) \
 	$(am__libdb_plugins_a_SOURCES_DIST) \
@@ -1726,6 +1737,7 @@ DIST_SOURCES = $(am__libarchive_a_SOURCES_DIST) $(libconf_a_SOURCES) \
 	$(am__test_software_volume_SOURCES_DIST) \
 	$(am__test_test_archive_SOURCES_DIST) \
 	$(am__test_test_byte_reverse_SOURCES_DIST) \
+	$(am__test_test_icy_parser_SOURCES_DIST) \
 	$(am__test_test_mixramp_SOURCES_DIST) \
 	$(am__test_test_pcm_SOURCES_DIST) \
 	$(am__test_test_queue_priority_SOURCES_DIST) \
@@ -2770,8 +2782,9 @@ SPARSE_SRC = $(addprefix $(top_srcdir)/,$(filter %.c,$(src_mpd_SOURCES)))
 # Test programs
 #
 @ENABLE_TEST_TRUE at C_TESTS = test/test_util test/test_byte_reverse \
- at ENABLE_TEST_TRUE@	test/test_mixramp test/test_pcm \
- at ENABLE_TEST_TRUE@	test/test_queue_priority $(am__append_71)
+ at ENABLE_TEST_TRUE@	test/test_mixramp test/test_icy_parser \
+ at ENABLE_TEST_TRUE@	test/test_pcm test/test_queue_priority \
+ at ENABLE_TEST_TRUE@	$(am__append_71)
 @ENABLE_TEST_TRUE at test_read_conf_LDADD = \
 @ENABLE_TEST_TRUE@	libconf.a \
 @ENABLE_TEST_TRUE@	libutil.a \
@@ -3131,6 +3144,17 @@ SPARSE_SRC = $(addprefix $(top_srcdir)/,$(filter %.c,$(src_mpd_SOURCES)))
 @ENABLE_TEST_TRUE@	$(GLIB_LIBS) \
 @ENABLE_TEST_TRUE@	$(CPPUNIT_LIBS)
 
+ at ENABLE_TEST_TRUE@test_test_icy_parser_SOURCES = \
+ at ENABLE_TEST_TRUE@	src/Log.cxx \
+ at ENABLE_TEST_TRUE@	test/test_icy_parser.cxx
+
+ at ENABLE_TEST_TRUE@test_test_icy_parser_CPPFLAGS = $(AM_CPPFLAGS) $(CPPUNIT_CFLAGS) -DCPPUNIT_HAVE_RTTI=0
+ at ENABLE_TEST_TRUE@test_test_icy_parser_CXXFLAGS = $(AM_CXXFLAGS) -Wno-error=deprecated-declarations
+ at ENABLE_TEST_TRUE@test_test_icy_parser_LDADD = \
+ at ENABLE_TEST_TRUE@	libtag.a \
+ at ENABLE_TEST_TRUE@	$(GLIB_LIBS) \
+ at ENABLE_TEST_TRUE@	$(CPPUNIT_LIBS)
+
 @ENABLE_TEST_TRUE at test_test_pcm_SOURCES = \
 @ENABLE_TEST_TRUE@	test/test_pcm_util.hxx \
 @ENABLE_TEST_TRUE@	test/test_pcm_dither.cxx \
@@ -4560,6 +4584,14 @@ test/test_test_byte_reverse-test_byte_reverse.$(OBJEXT):  \
 test/test_byte_reverse$(EXEEXT): $(test_test_byte_reverse_OBJECTS) $(test_test_byte_reverse_DEPENDENCIES) $(EXTRA_test_test_byte_reverse_DEPENDENCIES) test/$(am__dirstamp)
 	@rm -f test/test_byte_reverse$(EXEEXT)
 	$(AM_V_CXXLD)$(test_test_byte_reverse_LINK) $(test_test_byte_reverse_OBJECTS) $(test_test_byte_reverse_LDADD) $(LIBS)
+src/test_test_icy_parser-Log.$(OBJEXT): src/$(am__dirstamp) \
+	src/$(DEPDIR)/$(am__dirstamp)
+test/test_test_icy_parser-test_icy_parser.$(OBJEXT):  \
+	test/$(am__dirstamp) test/$(DEPDIR)/$(am__dirstamp)
+
+test/test_icy_parser$(EXEEXT): $(test_test_icy_parser_OBJECTS) $(test_test_icy_parser_DEPENDENCIES) $(EXTRA_test_test_icy_parser_DEPENDENCIES) test/$(am__dirstamp)
+	@rm -f test/test_icy_parser$(EXEEXT)
+	$(AM_V_CXXLD)$(test_test_icy_parser_LINK) $(test_test_icy_parser_OBJECTS) $(test_test_icy_parser_LDADD) $(LIBS)
 src/test_test_mixramp-Log.$(OBJEXT): src/$(am__dirstamp) \
 	src/$(DEPDIR)/$(am__dirstamp)
 test/test_test_mixramp-test_mixramp.$(OBJEXT): test/$(am__dirstamp) \
@@ -4852,6 +4884,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at src/$(DEPDIR)/test_run_avahi-Log.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at src/$(DEPDIR)/test_run_avahi-ZeroconfAvahi.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at src/$(DEPDIR)/test_test_archive-Log.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at src/$(DEPDIR)/test_test_icy_parser-Log.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at src/$(DEPDIR)/test_test_mixramp-Log.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at src/$(DEPDIR)/test_test_queue_priority-Queue.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at src/$(DEPDIR)/test_test_vorbis_encoder-AudioFormat.Po at am__quote@
@@ -5078,6 +5111,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at test/$(DEPDIR)/test_run_avahi-run_avahi.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at test/$(DEPDIR)/test_test_archive-test_archive.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at test/$(DEPDIR)/test_test_byte_reverse-test_byte_reverse.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at test/$(DEPDIR)/test_test_icy_parser-test_icy_parser.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at test/$(DEPDIR)/test_test_mixramp-test_mixramp.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at test/$(DEPDIR)/test_test_pcm-test_pcm_channels.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at test/$(DEPDIR)/test_test_pcm-test_pcm_dither.Po at am__quote@
@@ -9253,6 +9287,34 @@ test/test_test_byte_reverse-test_byte_reverse.obj: test/test_byte_reverse.cxx
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_test_byte_reverse_CPPFLAGS) $(CPPFLAGS) $(test_test_byte_reverse_CXXFLAGS) $(CXXFLAGS) -c -o test/test_test_byte_reverse-test_byte_reverse.obj `if test -f 'test/test_byte_reverse.cxx'; then $(CYGPATH_W) 'test/test_byte_reverse.cxx'; else $(CYGPATH_W) '$(srcdir)/test/test_byte_reverse.cxx'; fi`
 
+src/test_test_icy_parser-Log.o: src/Log.cxx
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_test_icy_parser_CPPFLAGS) $(CPPFLAGS) $(test_test_icy_parser_CXXFLAGS) $(CXXFLAGS) -MT src/test_test_icy_parser-Log.o -MD -MP -MF src/$(DEPDIR)/test_test_icy_parser-Log.Tpo -c -o src/test_test_icy_parser-Log.o `test -f 'src/Log.cxx' || echo '$(srcdir)/'`src/Log.cxx
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/test_test_icy_parser-Log.Tpo src/$(DEPDIR)/test_test_icy_parser-Log.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='src/Log.cxx' object='src/test_test_icy_parser-Log.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_test_icy_parser_CPPFLAGS) $(CPPFLAGS) $(test_test_icy_parser_CXXFLAGS) $(CXXFLAGS) -c -o src/test_test_icy_parser-Log.o `test -f 'src/Log.cxx' || echo '$(srcdir)/'`src/Log.cxx
+
+src/test_test_icy_parser-Log.obj: src/Log.cxx
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_test_icy_parser_CPPFLAGS) $(CPPFLAGS) $(test_test_icy_parser_CXXFLAGS) $(CXXFLAGS) -MT src/test_test_icy_parser-Log.obj -MD -MP -MF src/$(DEPDIR)/test_test_icy_parser-Log.Tpo -c -o src/test_test_icy_parser-Log.obj `if test -f 'src/Log.cxx'; then $(CYGPATH_W) 'src/Log.cxx'; else $(CYGPATH_W) '$(srcdir)/src/Log.cxx'; fi`
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/test_test_icy_parser-Log.Tpo src/$(DEPDIR)/test_test_icy_parser-Log.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='src/Log.cxx' object='src/test_test_icy_parser-Log.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_test_icy_parser_CPPFLAGS) $(CPPFLAGS) $(test_test_icy_parser_CXXFLAGS) $(CXXFLAGS) -c -o src/test_test_icy_parser-Log.obj `if test -f 'src/Log.cxx'; then $(CYGPATH_W) 'src/Log.cxx'; else $(CYGPATH_W) '$(srcdir)/src/Log.cxx'; fi`
+
+test/test_test_icy_parser-test_icy_parser.o: test/test_icy_parser.cxx
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_test_icy_parser_CPPFLAGS) $(CPPFLAGS) $(test_test_icy_parser_CXXFLAGS) $(CXXFLAGS) -MT test/test_test_icy_parser-test_icy_parser.o -MD -MP -MF test/$(DEPDIR)/test_test_icy_parser-test_icy_parser.Tpo -c -o test/test_test_icy_parser-test_icy_parser.o `test -f 'test/test_icy_parser.cxx' || echo '$(srcdir)/'`test/test_icy_parser.cxx
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) test/$(DEPDIR)/test_test_icy_parser-test_icy_parser.Tpo test/$(DEPDIR)/test_test_icy_parser-test_icy_parser.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='test/test_icy_parser.cxx' object='test/test_test_icy_parser-test_icy_parser.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_test_icy_parser_CPPFLAGS) $(CPPFLAGS) $(test_test_icy_parser_CXXFLAGS) $(CXXFLAGS) -c -o test/test_test_icy_parser-test_icy_parser.o `test -f 'test/test_icy_parser.cxx' || echo '$(srcdir)/'`test/test_icy_parser.cxx
+
+test/test_test_icy_parser-test_icy_parser.obj: test/test_icy_parser.cxx
+ at am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_test_icy_parser_CPPFLAGS) $(CPPFLAGS) $(test_test_icy_parser_CXXFLAGS) $(CXXFLAGS) -MT test/test_test_icy_parser-test_icy_parser.obj -MD -MP -MF test/$(DEPDIR)/test_test_icy_parser-test_icy_parser.Tpo -c -o test/test_test_icy_parser-test_icy_parser.obj `if test -f 'test/test_icy_parser.cxx'; then $(CYGPATH_W) 'test/test_icy_parser.cxx'; else $(CYGPATH_W) '$(srcdir)/test/test_icy_parser.cxx'; fi`
+ at am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) test/$(DEPDIR)/test_test_icy_parser-test_icy_parser.Tpo test/$(DEPDIR)/test_test_icy_parser-test_icy_parser.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='test/test_icy_parser.cxx' object='test/test_test_icy_parser-test_icy_parser.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(AM_V_CXX at am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_test_icy_parser_CPPFLAGS) $(CPPFLAGS) $(test_test_icy_parser_CXXFLAGS) $(CXXFLAGS) -c -o test/test_test_icy_parser-test_icy_parser.obj `if test -f 'test/test_icy_parser.cxx'; then $(CYGPATH_W) 'test/test_icy_parser.cxx'; else $(CYGPATH_W) '$(srcdir)/test/test_icy_parser.cxx'; fi`
+
 src/test_test_mixramp-Log.o: src/Log.cxx
 @am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_test_mixramp_CPPFLAGS) $(CPPFLAGS) $(test_test_mixramp_CXXFLAGS) $(CXXFLAGS) -MT src/test_test_mixramp-Log.o -MD -MP -MF src/$(DEPDIR)/test_test_mixramp-Log.Tpo -c -o src/test_test_mixramp-Log.o `test -f 'src/Log.cxx' || echo '$(srcdir)/'`src/Log.cxx
 @am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/test_test_mixramp-Log.Tpo src/$(DEPDIR)/test_test_mixramp-Log.Po
@@ -9919,6 +9981,13 @@ test/test_mixramp.log: test/test_mixramp$(EXEEXT)
 	--log-file $$b.log --trs-file $$b.trs \
 	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
 	"$$tst" $(AM_TESTS_FD_REDIRECT)
+test/test_icy_parser.log: test/test_icy_parser$(EXEEXT)
+	@p='test/test_icy_parser$(EXEEXT)'; \
+	b='test/test_icy_parser'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
 test/test_pcm.log: test/test_pcm$(EXEEXT)
 	@p='test/test_pcm$(EXEEXT)'; \
 	b='test/test_pcm'; \
@@ -10227,8 +10296,8 @@ distclean-generic:
 maintainer-clean-generic:
 	@echo "This command is intended for maintainers to use"
 	@echo "it deletes files that may require special tools to rebuild."
- at ENABLE_DOCUMENTATION_FALSE@install-data-local:
 @ENABLE_DOCUMENTATION_FALSE at clean-local:
+ at ENABLE_DOCUMENTATION_FALSE@install-data-local:
 @ENABLE_DOCUMENTATION_FALSE at uninstall-local:
 clean: clean-am
 
diff --git a/NEWS b/NEWS
index d59f461..066e127 100644
--- a/NEWS
+++ b/NEWS
@@ -1,4 +1,14 @@
-ver 0.18.7 (2013/01/13)
+ver 0.18.8 (2014/02/07)
+* decoder
+  - ffmpeg: support libav v10_alpha1
+* encoder
+  - vorbis: fix linker failure
+* output
+  - roar: documentation
+* more robust Icy-Metadata parser
+* fix Solaris build failure
+
+ver 0.18.7 (2014/01/13)
 * playlist
   - pls: fix crash after parser error
   - soundcloud: fix build failure with libyajl 2.0.1
diff --git a/configure b/configure
index 9d83da4..4a9bf41 100755
--- a/configure
+++ b/configure
@@ -1,8 +1,8 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.69 for mpd 0.18.7.
+# Generated by GNU Autoconf 2.69 for mpd 0.18.8.
 #
-# Report bugs to <musicpd-dev-team at lists.sourceforge.net>.
+# Report bugs to <mpd-devel at musicpd.org>.
 #
 #
 # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
@@ -267,10 +267,10 @@ fi
     $as_echo "$0: be upgraded to zsh 4.3.4 or later."
   else
     $as_echo "$0: Please tell bug-autoconf at gnu.org and
-$0: musicpd-dev-team at lists.sourceforge.net about your
-$0: system, including any error possibly output before this
-$0: message. Then install a modern shell, or manually run
-$0: the script under such a shell if you do have one."
+$0: mpd-devel at musicpd.org about your system, including any
+$0: error possibly output before this message. Then install
+$0: a modern shell, or manually run the script under such a
+$0: shell if you do have one."
   fi
   exit 1
 fi
@@ -580,9 +580,9 @@ MAKEFLAGS=
 # Identity of this package.
 PACKAGE_NAME='mpd'
 PACKAGE_TARNAME='mpd'
-PACKAGE_VERSION='0.18.7'
-PACKAGE_STRING='mpd 0.18.7'
-PACKAGE_BUGREPORT='musicpd-dev-team at lists.sourceforge.net'
+PACKAGE_VERSION='0.18.8'
+PACKAGE_STRING='mpd 0.18.8'
+PACKAGE_BUGREPORT='mpd-devel at musicpd.org'
 PACKAGE_URL=''
 
 ac_unique_file="src/Main.cxx"
@@ -1673,7 +1673,7 @@ if test "$ac_init_help" = "long"; then
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-\`configure' configures mpd 0.18.7 to adapt to many kinds of systems.
+\`configure' configures mpd 0.18.8 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1743,7 +1743,7 @@ fi
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of mpd 0.18.7:";;
+     short | recursive ) echo "Configuration of mpd 0.18.8:";;
    esac
   cat <<\_ACEOF
 
@@ -1978,7 +1978,7 @@ Some influential environment variables:
 Use these variables to override the choices made by `configure' or to help
 it to find libraries and programs with nonstandard names/locations.
 
-Report bugs to <musicpd-dev-team at lists.sourceforge.net>.
+Report bugs to <mpd-devel at musicpd.org>.
 _ACEOF
 ac_status=$?
 fi
@@ -2041,7 +2041,7 @@ fi
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-mpd configure 0.18.7
+mpd configure 0.18.8
 generated by GNU Autoconf 2.69
 
 Copyright (C) 2012 Free Software Foundation, Inc.
@@ -2351,9 +2351,9 @@ $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;}
 $as_echo "$as_me: WARNING: $2:     section \"Present But Cannot Be Compiled\"" >&2;}
     { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
-( $as_echo "## ----------------------------------------------------- ##
-## Report this to musicpd-dev-team at lists.sourceforge.net ##
-## ----------------------------------------------------- ##"
+( $as_echo "## ------------------------------------ ##
+## Report this to mpd-devel at musicpd.org ##
+## ------------------------------------ ##"
      ) | sed "s/^/$as_me: WARNING:     /" >&2
     ;;
 esac
@@ -2494,7 +2494,7 @@ cat >config.log <<_ACEOF
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by mpd $as_me 0.18.7, which was
+It was created by mpd $as_me 0.18.8, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   $ $0 $@
@@ -3364,7 +3364,7 @@ fi
 
 # Define the identity of the package.
  PACKAGE='mpd'
- VERSION='0.18.7'
+ VERSION='0.18.8'
 
 
 cat >>confdefs.h <<_ACEOF
@@ -12864,12 +12864,12 @@ if test -n "$PKG_CONFIG"; then
         pkg_cv_VORBISENC_CFLAGS="$VORBISENC_CFLAGS"
     else
         if test -n "$PKG_CONFIG" && \
-    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"vorbisenc\""; } >&5
-  ($PKG_CONFIG --exists --print-errors "vorbisenc") 2>&5
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"vorbisenc vorbis\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "vorbisenc vorbis") 2>&5
   ac_status=$?
   $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
   test $ac_status = 0; }; then
-  pkg_cv_VORBISENC_CFLAGS=`$PKG_CONFIG --cflags "vorbisenc" 2>/dev/null`
+  pkg_cv_VORBISENC_CFLAGS=`$PKG_CONFIG --cflags "vorbisenc vorbis" 2>/dev/null`
 else
   pkg_failed=yes
 fi
@@ -12882,12 +12882,12 @@ if test -n "$PKG_CONFIG"; then
         pkg_cv_VORBISENC_LIBS="$VORBISENC_LIBS"
     else
         if test -n "$PKG_CONFIG" && \
-    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"vorbisenc\""; } >&5
-  ($PKG_CONFIG --exists --print-errors "vorbisenc") 2>&5
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"vorbisenc vorbis\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "vorbisenc vorbis") 2>&5
   ac_status=$?
   $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
   test $ac_status = 0; }; then
-  pkg_cv_VORBISENC_LIBS=`$PKG_CONFIG --libs "vorbisenc" 2>/dev/null`
+  pkg_cv_VORBISENC_LIBS=`$PKG_CONFIG --libs "vorbisenc vorbis" 2>/dev/null`
 else
   pkg_failed=yes
 fi
@@ -12906,9 +12906,9 @@ else
         _pkg_short_errors_supported=no
 fi
         if test $_pkg_short_errors_supported = yes; then
-	        VORBISENC_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "vorbisenc"`
+	        VORBISENC_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "vorbisenc vorbis"`
         else
-	        VORBISENC_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "vorbisenc"`
+	        VORBISENC_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "vorbisenc vorbis"`
         fi
 	# Put the nasty error message in config.log where it belongs
 	echo "$VORBISENC_PKG_ERRORS" >&5
@@ -18460,7 +18460,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by mpd $as_me 0.18.7, which was
+This file was extended by mpd $as_me 0.18.8, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -18520,13 +18520,13 @@ $config_headers
 Configuration commands:
 $config_commands
 
-Report bugs to <musicpd-dev-team at lists.sourceforge.net>."
+Report bugs to <mpd-devel at musicpd.org>."
 
 _ACEOF
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
 ac_cs_version="\\
-mpd config.status 0.18.7
+mpd config.status 0.18.8
 configured by $0, generated by GNU Autoconf 2.69,
   with options \\"\$ac_cs_config\\"
 
diff --git a/configure.ac b/configure.ac
index 2cd0c77..301c3a0 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1,6 +1,6 @@
 AC_PREREQ(2.60)
 
-AC_INIT(mpd, 0.18.7, musicpd-dev-team at lists.sourceforge.net)
+AC_INIT(mpd, 0.18.8, mpd-devel at musicpd.org)
 
 VERSION_MAJOR=0
 VERSION_MINOR=18
@@ -1139,7 +1139,7 @@ fi
 AM_CONDITIONAL(ENABLE_FLAC_ENCODER, test x$enable_flac_encoder = xyes)
 
 dnl ---------------------------- Ogg Vorbis Encoder ---------------------------
-MPD_AUTO_PKG(vorbis_encoder, VORBISENC, [vorbisenc],
+MPD_AUTO_PKG(vorbis_encoder, VORBISENC, [vorbisenc vorbis],
 	[Ogg Vorbis encoder], [libvorbisenc not found])
 
 if test x$enable_vorbis_encoder = xyes; then
diff --git a/doc/developer.xml b/doc/developer.xml
index e902217..729e6a5 100644
--- a/doc/developer.xml
+++ b/doc/developer.xml
@@ -155,7 +155,7 @@ foo(const char *abc, int xyz)
 
     <para>
       Send your patches to the mailing list:
-      musicpd-dev-team at lists.sourceforge.net
+      mpd-devel at musicpd.org
     </para>
   </chapter>
 </book>
diff --git a/doc/doxygen.conf b/doc/doxygen.conf
index 361cef3..a93594c 100644
--- a/doc/doxygen.conf
+++ b/doc/doxygen.conf
@@ -31,7 +31,7 @@ PROJECT_NAME           = MPD
 # This could be handy for archiving the generated documentation or
 # if some version control system is used.
 
-PROJECT_NUMBER = 0.18.7
+PROJECT_NUMBER = 0.18.8
 
 # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
 # base path where the generated documentation will be put.
diff --git a/doc/user.xml b/doc/user.xml
index ccc9e71..6357267 100644
--- a/doc/user.xml
+++ b/doc/user.xml
@@ -1853,6 +1853,51 @@ systemctl start mpd.socket</programlisting>
       </section>
 
       <section>
+        <title><varname>roar</varname></title>
+
+        <para>
+          The <varname>roar</varname> plugin connects to a <ulink
+          url="http://roaraudio.keep-cool.org/">RoarAudio</ulink>
+          server.
+        </para>
+
+        <informaltable>
+          <tgroup cols="2">
+            <thead>
+              <row>
+                <entry>Setting</entry>
+                <entry>Description</entry>
+              </row>
+            </thead>
+            <tbody>
+              <row>
+                <entry>
+                  <varname>server</varname>
+                  <parameter>HOSTNAME</parameter>
+                </entry>
+                <entry>
+                  The host name of the RoarAudio server.  If not
+                  specified, then MPD will connect to the default
+                  locations.
+                </entry>
+              </row>
+
+              <row>
+                <entry>
+                  <varname>role</varname>
+                  <parameter>ROLE</parameter>
+                </entry>
+                <entry>
+                  The "role" that MPD registers itself as in the
+                  RoarAudio server.  The default is "music".
+                </entry>
+              </row>
+            </tbody>
+          </tgroup>
+        </informaltable>
+      </section>
+
+      <section>
         <title><varname>recorder</varname></title>
 
         <para>
diff --git a/src/IcyMetaDataParser.cxx b/src/IcyMetaDataParser.cxx
index 8861efb..bfa2e85 100644
--- a/src/IcyMetaDataParser.cxx
+++ b/src/IcyMetaDataParser.cxx
@@ -81,31 +81,85 @@ icy_add_item(Tag &tag, TagType type, const char *value)
 }
 
 static void
-icy_parse_tag_item(Tag &tag, const char *item)
+icy_parse_tag_item(Tag &tag, const char *name, const char *value)
 {
-	gchar **p = g_strsplit(item, "=", 0);
-
-	if (p[0] != nullptr && p[1] != nullptr) {
-		if (strcmp(p[0], "StreamTitle") == 0)
-			icy_add_item(tag, TAG_TITLE, p[1]);
-		else
-			FormatDebug(icy_metadata_domain,
-				    "unknown icy-tag: '%s'", p[0]);
-	}
+	if (strcmp(name, "StreamTitle") == 0)
+		icy_add_item(tag, TAG_TITLE, value);
+	else
+		FormatDebug(icy_metadata_domain,
+			    "unknown icy-tag: '%s'", name);
+}
+
+/**
+ * Find a single quote that is followed by a semicolon (or by the end
+ * of the string).  If that fails, return the first single quote.  If
+ * that also fails, return #end.
+ */
+static char *
+find_end_quote(char *p, char *const end)
+{
+	char *fallback = std::find(p, end, '\'');
+	if (fallback >= end - 1 || fallback[1] == ';')
+		return fallback;
 
-	g_strfreev(p);
+	p = fallback + 1;
+	while (true) {
+		p = std::find(p, end, '\'');
+		if (p == end)
+			return fallback;
+
+		if (p == end - 1 || p[1] == ';')
+			return p;
+
+		++p;
+	}
 }
 
 static Tag *
-icy_parse_tag(const char *p)
+icy_parse_tag(char *p, char *const end)
 {
+	assert(p != nullptr);
+	assert(end != nullptr);
+	assert(p <= end);
+
 	Tag *tag = new Tag();
-	gchar **items = g_strsplit(p, ";", 0);
 
-	for (unsigned i = 0; items[i] != nullptr; ++i)
-		icy_parse_tag_item(*tag, items[i]);
+	while (p != end) {
+		const char *const name = p;
+		char *eq = std::find(p, end, '=');
+		if (eq == end)
+			break;
+
+		*eq = 0;
+		p = eq + 1;
+
+		if (*p != '\'') {
+			/* syntax error; skip to the next semicolon,
+			   try to recover */
+			char *semicolon = std::find(p, end, ';');
+			if (semicolon == end)
+				break;
+			p = semicolon + 1;
+			continue;
+		}
+
+		++p;
+
+		const char *const value = p;
+		char *quote = find_end_quote(p, end);
+		if (quote == end)
+			break;
+
+		*quote = 0;
+		p = quote + 1;
 
-	g_strfreev(items);
+		icy_parse_tag_item(*tag, name, value);
+
+		char *semicolon = std::find(p, end, ';');
+		if (semicolon == end)
+			break;
+		p = semicolon + 1;
+	}
 
 	return tag;
 }
@@ -152,15 +206,11 @@ IcyMetaDataParser::Meta(const void *data, size_t length)
 		++length;
 
 	if (meta_position == meta_size) {
-		/* null-terminate the string */
-
-		meta_data[meta_size] = 0;
-
 		/* parse */
 
 		delete tag;
 
-		tag = icy_parse_tag(meta_data);
+		tag = icy_parse_tag(meta_data, meta_data + meta_size);
 		g_free(meta_data);
 
 		/* change back to normal data mode */
diff --git a/src/OutputAPI.hxx b/src/OutputAPI.hxx
index 73cbaf1..e905fd9 100644
--- a/src/OutputAPI.hxx
+++ b/src/OutputAPI.hxx
@@ -18,7 +18,7 @@
  */
 
 #ifndef MPD_OUTPUT_API_HXX
-#define MPD_OUTPUT_API_HxX
+#define MPD_OUTPUT_API_HXX
 
 #include "OutputPlugin.hxx"
 #include "OutputInternal.hxx"
diff --git a/src/Playlist.hxx b/src/Playlist.hxx
index 5875ff4..7d7e9b1 100644
--- a/src/Playlist.hxx
+++ b/src/Playlist.hxx
@@ -30,7 +30,7 @@ struct playlist {
 	/**
 	 * The song queue - it contains the "real" playlist.
 	 */
-	struct queue queue;
+	struct Queue queue;
 
 	/**
 	 * This value is true if the player is currently playing (or
diff --git a/src/PlaylistPrint.cxx b/src/PlaylistPrint.cxx
index 8e3beaa..e3d500b 100644
--- a/src/PlaylistPrint.cxx
+++ b/src/PlaylistPrint.cxx
@@ -40,7 +40,7 @@
 void
 playlist_print_uris(Client &client, const playlist &playlist)
 {
-	const queue &queue = playlist.queue;
+	const Queue &queue = playlist.queue;
 
 	queue_print_uris(client, queue, 0, queue.GetLength());
 }
@@ -49,7 +49,7 @@ bool
 playlist_print_info(Client &client, const playlist &playlist,
 		    unsigned start, unsigned end)
 {
-	const queue &queue = playlist.queue;
+	const Queue &queue = playlist.queue;
 
 	if (end > queue.GetLength())
 		/* correct the "end" offset */
diff --git a/src/PlaylistSave.cxx b/src/PlaylistSave.cxx
index 481d9bf..29bf193 100644
--- a/src/PlaylistSave.cxx
+++ b/src/PlaylistSave.cxx
@@ -65,7 +65,7 @@ playlist_print_uri(FILE *file, const char *uri)
 }
 
 PlaylistResult
-spl_save_queue(const char *name_utf8, const queue &queue)
+spl_save_queue(const char *name_utf8, const Queue &queue)
 {
 	if (map_spl_path().IsNull())
 		return PlaylistResult::DISABLED;
diff --git a/src/PlaylistSave.hxx b/src/PlaylistSave.hxx
index 70b40f3..71e0a81 100644
--- a/src/PlaylistSave.hxx
+++ b/src/PlaylistSave.hxx
@@ -25,7 +25,7 @@
 #include <stdio.h>
 
 struct Song;
-struct queue;
+struct Queue;
 struct playlist;
 struct PlayerControl;
 class Error;
@@ -40,7 +40,7 @@ playlist_print_uri(FILE *fp, const char *uri);
  * Saves a queue object into a stored playlist file.
  */
 PlaylistResult
-spl_save_queue(const char *name_utf8, const queue &queue);
+spl_save_queue(const char *name_utf8, const Queue &queue);
 
 /**
  * Saves a playlist object into a stored playlist file.
diff --git a/src/Queue.cxx b/src/Queue.cxx
index 4516094..92beefd 100644
--- a/src/Queue.cxx
+++ b/src/Queue.cxx
@@ -23,7 +23,7 @@
 
 #include <stdlib.h>
 
-queue::queue(unsigned _max_length)
+Queue::Queue(unsigned _max_length)
 	:max_length(_max_length), length(0),
 	 version(1),
 	 items(new Item[max_length]),
@@ -36,7 +36,7 @@ queue::queue(unsigned _max_length)
 {
 }
 
-queue::~queue()
+Queue::~Queue()
 {
 	Clear();
 
@@ -45,7 +45,7 @@ queue::~queue()
 }
 
 int
-queue::GetNextOrder(unsigned _order) const
+Queue::GetNextOrder(unsigned _order) const
 {
 	assert(_order < length);
 
@@ -62,7 +62,7 @@ queue::GetNextOrder(unsigned _order) const
 }
 
 void
-queue::IncrementVersion()
+Queue::IncrementVersion()
 {
 	static unsigned long max = ((uint32_t) 1 << 31) - 1;
 
@@ -77,7 +77,7 @@ queue::IncrementVersion()
 }
 
 void
-queue::ModifyAtOrder(unsigned _order)
+Queue::ModifyAtOrder(unsigned _order)
 {
 	assert(_order < length);
 
@@ -86,7 +86,7 @@ queue::ModifyAtOrder(unsigned _order)
 }
 
 unsigned
-queue::Append(Song *song, uint8_t priority)
+Queue::Append(Song *song, uint8_t priority)
 {
 	assert(!IsFull());
 
@@ -105,7 +105,7 @@ queue::Append(Song *song, uint8_t priority)
 }
 
 void
-queue::SwapPositions(unsigned position1, unsigned position2)
+Queue::SwapPositions(unsigned position1, unsigned position2)
 {
 	unsigned id1 = items[position1].id;
 	unsigned id2 = items[position2].id;
@@ -120,7 +120,7 @@ queue::SwapPositions(unsigned position1, unsigned position2)
 }
 
 void
-queue::MovePostion(unsigned from, unsigned to)
+Queue::MovePostion(unsigned from, unsigned to)
 {
 	const Item tmp = items[from];
 
@@ -156,7 +156,7 @@ queue::MovePostion(unsigned from, unsigned to)
 }
 
 void
-queue::MoveRange(unsigned start, unsigned end, unsigned to)
+Queue::MoveRange(unsigned start, unsigned end, unsigned to)
 {
 	Item tmp[end - start];
 	// Copy the original block [start,end-1]
@@ -198,7 +198,7 @@ queue::MoveRange(unsigned start, unsigned end, unsigned to)
 }
 
 void
-queue::MoveOrder(unsigned from_order, unsigned to_order)
+Queue::MoveOrder(unsigned from_order, unsigned to_order)
 {
 	assert(from_order < length);
 	assert(to_order <= length);
@@ -217,7 +217,7 @@ queue::MoveOrder(unsigned from_order, unsigned to_order)
 }
 
 void
-queue::DeletePosition(unsigned position)
+Queue::DeletePosition(unsigned position)
 {
 	assert(position < length);
 
@@ -254,7 +254,7 @@ queue::DeletePosition(unsigned position)
 }
 
 void
-queue::Clear()
+Queue::Clear()
 {
 	for (unsigned i = 0; i < length; i++) {
 		Item *item = &items[i];
@@ -270,7 +270,7 @@ queue::Clear()
 }
 
 static void
-queue_sort_order_by_priority(struct queue *queue, unsigned start, unsigned end)
+queue_sort_order_by_priority(Queue *queue, unsigned start, unsigned end)
 {
 	assert(queue != nullptr);
 	assert(queue->random);
@@ -278,8 +278,8 @@ queue_sort_order_by_priority(struct queue *queue, unsigned start, unsigned end)
 	assert(end <= queue->length);
 
 	auto cmp = [queue](unsigned a_pos, unsigned b_pos){
-		const queue::Item &a = queue->items[a_pos];
-		const queue::Item &b = queue->items[b_pos];
+		const Queue::Item &a = queue->items[a_pos];
+		const Queue::Item &b = queue->items[b_pos];
 
 		return a.priority > b.priority;
 	};
@@ -288,7 +288,7 @@ queue_sort_order_by_priority(struct queue *queue, unsigned start, unsigned end)
 }
 
 void
-queue::ShuffleOrderRange(unsigned start, unsigned end)
+Queue::ShuffleOrderRange(unsigned start, unsigned end)
 {
 	assert(random);
 	assert(start <= end);
@@ -303,7 +303,7 @@ queue::ShuffleOrderRange(unsigned start, unsigned end)
  * priority group.
  */
 void
-queue::ShuffleOrderRangeWithPriority(unsigned start, unsigned end)
+Queue::ShuffleOrderRangeWithPriority(unsigned start, unsigned end)
 {
 	assert(random);
 	assert(start <= end);
@@ -337,13 +337,13 @@ queue::ShuffleOrderRangeWithPriority(unsigned start, unsigned end)
 }
 
 void
-queue::ShuffleOrder()
+Queue::ShuffleOrder()
 {
 	ShuffleOrderRangeWithPriority(0, length);
 }
 
 void
-queue::ShuffleOrderFirst(unsigned start, unsigned end)
+Queue::ShuffleOrderFirst(unsigned start, unsigned end)
 {
 	rand.AutoCreate();
 
@@ -352,7 +352,7 @@ queue::ShuffleOrderFirst(unsigned start, unsigned end)
 }
 
 void
-queue::ShuffleOrderLast(unsigned start, unsigned end)
+Queue::ShuffleOrderLast(unsigned start, unsigned end)
 {
 	rand.AutoCreate();
 
@@ -361,7 +361,7 @@ queue::ShuffleOrderLast(unsigned start, unsigned end)
 }
 
 void
-queue::ShuffleRange(unsigned start, unsigned end)
+Queue::ShuffleRange(unsigned start, unsigned end)
 {
 	assert(start <= end);
 	assert(end <= length);
@@ -377,7 +377,7 @@ queue::ShuffleRange(unsigned start, unsigned end)
 }
 
 unsigned
-queue::FindPriorityOrder(unsigned start_order, uint8_t priority,
+Queue::FindPriorityOrder(unsigned start_order, uint8_t priority,
 			 unsigned exclude_order) const
 {
 	assert(random);
@@ -394,7 +394,7 @@ queue::FindPriorityOrder(unsigned start_order, uint8_t priority,
 }
 
 unsigned
-queue::CountSamePriority(unsigned start_order, uint8_t priority) const
+Queue::CountSamePriority(unsigned start_order, uint8_t priority) const
 {
 	assert(random);
 	assert(start_order <= length);
@@ -410,7 +410,7 @@ queue::CountSamePriority(unsigned start_order, uint8_t priority) const
 }
 
 bool
-queue::SetPriority(unsigned position, uint8_t priority, int after_order)
+Queue::SetPriority(unsigned position, uint8_t priority, int after_order)
 {
 	assert(position < length);
 
@@ -468,7 +468,7 @@ queue::SetPriority(unsigned position, uint8_t priority, int after_order)
 }
 
 bool
-queue::SetPriorityRange(unsigned start_position, unsigned end_position,
+Queue::SetPriorityRange(unsigned start_position, unsigned end_position,
 			uint8_t priority, int after_order)
 {
 	assert(start_position <= end_position);
diff --git a/src/Queue.hxx b/src/Queue.hxx
index da90d4a..3c6001b 100644
--- a/src/Queue.hxx
+++ b/src/Queue.hxx
@@ -41,7 +41,7 @@ struct Song;
  * - the unique id (which stays the same, regardless of moves)
  * - the order number (which only differs from "position" in random mode)
  */
-struct queue {
+struct Queue {
 	/**
 	 * reserve max_length * HASH_MULT elements in the id
 	 * number space
@@ -103,16 +103,16 @@ struct queue {
 	/** random number generator for shuffle and random mode */
 	LazyRandomEngine rand;
 
-	queue(unsigned max_length);
+	explicit Queue(unsigned max_length);
 
 	/**
 	 * Deinitializes a queue object.  It does not free the queue
 	 * pointer itself.
 	 */
-	~queue();
+	~Queue();
 
-	queue(const queue &other) = delete;
-	queue &operator=(const queue &other) = delete;
+	Queue(const Queue &) = delete;
+	Queue &operator=(const Queue &) = delete;
 
 	unsigned GetLength() const {
 		assert(length <= max_length);
diff --git a/src/QueuePrint.cxx b/src/QueuePrint.cxx
index d5651cd..89f3c0a 100644
--- a/src/QueuePrint.cxx
+++ b/src/QueuePrint.cxx
@@ -38,7 +38,7 @@ extern "C" {
  * @param end the index of the last song (excluding)
  */
 static void
-queue_print_song_info(Client &client, const queue &queue,
+queue_print_song_info(Client &client, const Queue &queue,
 		      unsigned position)
 {
 	song_print_info(client, queue.Get(position));
@@ -51,7 +51,7 @@ queue_print_song_info(Client &client, const queue &queue,
 }
 
 void
-queue_print_info(Client &client, const queue &queue,
+queue_print_info(Client &client, const Queue &queue,
 		 unsigned start, unsigned end)
 {
 	assert(start <= end);
@@ -62,7 +62,7 @@ queue_print_info(Client &client, const queue &queue,
 }
 
 void
-queue_print_uris(Client &client, const queue &queue,
+queue_print_uris(Client &client, const Queue &queue,
 		 unsigned start, unsigned end)
 {
 	assert(start <= end);
@@ -75,7 +75,7 @@ queue_print_uris(Client &client, const queue &queue,
 }
 
 void
-queue_print_changes_info(Client &client, const queue &queue,
+queue_print_changes_info(Client &client, const Queue &queue,
 			 uint32_t version)
 {
 	for (unsigned i = 0; i < queue.GetLength(); i++) {
@@ -85,7 +85,7 @@ queue_print_changes_info(Client &client, const queue &queue,
 }
 
 void
-queue_print_changes_position(Client &client, const queue &queue,
+queue_print_changes_position(Client &client, const Queue &queue,
 			     uint32_t version)
 {
 	for (unsigned i = 0; i < queue.GetLength(); i++)
@@ -95,7 +95,7 @@ queue_print_changes_position(Client &client, const queue &queue,
 }
 
 void
-queue_find(Client &client, const queue &queue,
+queue_find(Client &client, const Queue &queue,
 	   const SongFilter &filter)
 {
 	for (unsigned i = 0; i < queue.GetLength(); i++) {
diff --git a/src/QueuePrint.hxx b/src/QueuePrint.hxx
index dbcb5ef..bc91bb5 100644
--- a/src/QueuePrint.hxx
+++ b/src/QueuePrint.hxx
@@ -27,28 +27,28 @@
 
 #include <stdint.h>
 
-struct queue;
+struct Queue;
 class SongFilter;
 class Client;
 
 void
-queue_print_info(Client &client, const queue &queue,
+queue_print_info(Client &client, const Queue &queue,
 		 unsigned start, unsigned end);
 
 void
-queue_print_uris(Client &client, const queue &queue,
+queue_print_uris(Client &client, const Queue &queue,
 		 unsigned start, unsigned end);
 
 void
-queue_print_changes_info(Client &client, const queue &queue,
+queue_print_changes_info(Client &client, const Queue &queue,
 			 uint32_t version);
 
 void
-queue_print_changes_position(Client &client, const queue &queue,
+queue_print_changes_position(Client &client, const Queue &queue,
 			     uint32_t version);
 
 void
-queue_find(Client &client, const queue &queue,
+queue_find(Client &client, const Queue &queue,
 	   const SongFilter &filter);
 
 #endif
diff --git a/src/QueueSave.cxx b/src/QueueSave.cxx
index 6a1a519..2ab5f62 100644
--- a/src/QueueSave.cxx
+++ b/src/QueueSave.cxx
@@ -60,7 +60,7 @@ queue_save_song(FILE *fp, int idx, const Song &song)
 }
 
 void
-queue_save(FILE *fp, const queue &queue)
+queue_save(FILE *fp, const Queue &queue)
 {
 	for (unsigned i = 0; i < queue.GetLength(); i++) {
 		uint8_t prio = queue.GetPriorityAtPosition(i);
@@ -72,7 +72,7 @@ queue_save(FILE *fp, const queue &queue)
 }
 
 void
-queue_load_song(TextFile &file, const char *line, queue &queue)
+queue_load_song(TextFile &file, const char *line, Queue &queue)
 {
 	if (queue.IsFull())
 		return;
diff --git a/src/QueueSave.hxx b/src/QueueSave.hxx
index 13322cc..6c618c0 100644
--- a/src/QueueSave.hxx
+++ b/src/QueueSave.hxx
@@ -27,16 +27,16 @@
 
 #include <stdio.h>
 
-struct queue;
+struct Queue;
 class TextFile;
 
 void
-queue_save(FILE *fp, const queue &queue);
+queue_save(FILE *fp, const Queue &queue);
 
 /**
  * Loads one song from the state file and appends it to the queue.
  */
 void
-queue_load_song(TextFile &file, const char *line, queue &queue);
+queue_load_song(TextFile &file, const char *line, Queue &queue);
 
 #endif
diff --git a/src/SongFilter.cxx b/src/SongFilter.cxx
index 8d90c5f..49c966b 100644
--- a/src/SongFilter.cxx
+++ b/src/SongFilter.cxx
@@ -101,7 +101,7 @@ bool
 SongFilter::Item::Match(const Tag &_tag) const
 {
 	bool visited_types[TAG_NUM_OF_ITEM_TYPES];
-	std::fill_n(visited_types, TAG_NUM_OF_ITEM_TYPES, false);
+	std::fill_n(visited_types, size_t(TAG_NUM_OF_ITEM_TYPES), false);
 
 	for (unsigned i = 0; i < _tag.num_items; i++) {
 		visited_types[_tag.items[i]->type] = true;
diff --git a/src/decoder/FfmpegDecoderPlugin.cxx b/src/decoder/FfmpegDecoderPlugin.cxx
index 47e1a33..593f42d 100644
--- a/src/decoder/FfmpegDecoderPlugin.cxx
+++ b/src/decoder/FfmpegDecoderPlugin.cxx
@@ -38,7 +38,10 @@ extern "C" {
 #include <libavutil/avutil.h>
 #include <libavutil/log.h>
 #include <libavutil/mathematics.h>
-#include <libavutil/dict.h>
+
+#if LIBAVUTIL_VERSION_MAJOR >= 53
+#include <libavutil/frame.h>
+#endif
 }
 
 #include <assert.h>
@@ -223,6 +226,9 @@ copy_interleave_frame(const AVCodecContext *codec_context,
 					   codec_context->channels,
 					   frame->nb_samples,
 					   codec_context->sample_fmt, 1);
+	if (data_size <= 0)
+		return data_size;
+
 	if (av_sample_fmt_is_planar(codec_context->sample_fmt) &&
 	    codec_context->channels > 1) {
 		if(*global_buffer_size < data_size) {
@@ -451,7 +457,11 @@ ffmpeg_decode(Decoder &decoder, InputStream &input)
 	decoder_initialized(decoder, audio_format,
 			    input.seekable, total_time);
 
+#if LIBAVUTIL_VERSION_MAJOR >= 53
+	AVFrame *frame = av_frame_alloc();
+#else
 	AVFrame *frame = avcodec_alloc_frame();
+#endif
 	if (!frame) {
 		LogError(ffmpeg_domain, "Could not allocate frame");
 		avformat_close_input(&format_context);
@@ -495,7 +505,9 @@ ffmpeg_decode(Decoder &decoder, InputStream &input)
 		}
 	} while (cmd != DecoderCommand::STOP);
 
-#if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(54, 28, 0)
+#if LIBAVUTIL_VERSION_MAJOR >= 53
+	av_frame_free(&frame);
+#elif LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(54, 28, 0)
 	avcodec_free_frame(&frame);
 #else
 	av_freep(&frame);
diff --git a/src/decoder/FfmpegMetaData.hxx b/src/decoder/FfmpegMetaData.hxx
index 0fd73df..998cdf5 100644
--- a/src/decoder/FfmpegMetaData.hxx
+++ b/src/decoder/FfmpegMetaData.hxx
@@ -21,8 +21,6 @@
 #define MPD_FFMPEG_METADATA_HXX
 
 extern "C" {
-#include <libavformat/avformat.h>
-#include <libavutil/avutil.h>
 #include <libavutil/dict.h>
 }
 
@@ -35,6 +33,6 @@ struct tag_handler;
 
 void
 ffmpeg_scan_dictionary(AVDictionary *dict,
-		       const struct tag_handler *handler, void *handler_ctx);
+		       const tag_handler *handler, void *handler_ctx);
 
 #endif
diff --git a/src/tag/TagConfig.cxx b/src/tag/TagConfig.cxx
index 96fd184..b8be4fc 100644
--- a/src/tag/TagConfig.cxx
+++ b/src/tag/TagConfig.cxx
@@ -39,7 +39,7 @@ TagLoadConfig()
 	if (value == nullptr)
 		return;
 
-	std::fill_n(ignore_tag_items, TAG_NUM_OF_ITEM_TYPES, true);
+	std::fill_n(ignore_tag_items, size_t(TAG_NUM_OF_ITEM_TYPES), true);
 
 	if (StringEqualsCaseASCII(value, "none"))
 		return;
diff --git a/src/util/PeakBuffer.cxx b/src/util/PeakBuffer.cxx
index a3659b8..d9b193d 100644
--- a/src/util/PeakBuffer.cxx
+++ b/src/util/PeakBuffer.cxx
@@ -130,8 +130,9 @@ PeakBuffer::Append(const void *data, size_t length)
 			return true;
 	}
 
-	if (peak_buffer == nullptr && peak_size > 0) {
-		peak_buffer = (fifo_buffer *)HugeAllocate(peak_size);
+	if (peak_buffer == nullptr) {
+		if (peak_size > 0)
+			peak_buffer = (fifo_buffer *)HugeAllocate(peak_size);
 		if (peak_buffer == nullptr)
 			return false;
 
diff --git a/test/test_icy_parser.cxx b/test/test_icy_parser.cxx
new file mode 100644
index 0000000..2abf60f
--- /dev/null
+++ b/test/test_icy_parser.cxx
@@ -0,0 +1,85 @@
+/*
+ * Unit tests for class IcyMetaDataParser.
+ */
+
+#include "config.h"
+
+/* include the .cxx file to get access to internal functions */
+#include "IcyMetaDataParser.cxx"
+
+#include <cppunit/TestFixture.h>
+#include <cppunit/extensions/TestFactoryRegistry.h>
+#include <cppunit/ui/text/TestRunner.h>
+#include <cppunit/extensions/HelperMacros.h>
+
+#include <string>
+
+#include <string.h>
+
+static Tag *
+icy_parse_tag(const char *p)
+{
+	char *q = strdup(p);
+	Tag *tag = icy_parse_tag(q, q + strlen(q));
+	free(q);
+	return tag;
+}
+
+static void
+CompareTagTitle(const Tag &tag, const std::string &title)
+{
+	CPPUNIT_ASSERT_EQUAL(1u, tag.num_items);
+
+	const TagItem &item = *tag.items[0];
+	CPPUNIT_ASSERT_EQUAL(TAG_TITLE, item.type);
+	CPPUNIT_ASSERT_EQUAL(title, std::string(item.value));
+}
+
+static void
+TestIcyParserTitle(const char *input, const char *title)
+{
+	Tag *tag = icy_parse_tag(input);
+	CompareTagTitle(*tag, title);
+	delete tag;
+}
+
+static void
+TestIcyParserEmpty(const char *input)
+{
+	Tag *tag = icy_parse_tag(input);
+	CPPUNIT_ASSERT_EQUAL(0u, tag->num_items);
+	delete tag;
+}
+
+class IcyTest : public CppUnit::TestFixture {
+	CPPUNIT_TEST_SUITE(IcyTest);
+	CPPUNIT_TEST(TestIcyMetadataParser);
+	CPPUNIT_TEST_SUITE_END();
+
+public:
+	void TestIcyMetadataParser() {
+		TestIcyParserEmpty("foo=bar;");
+		TestIcyParserTitle("StreamTitle='foo bar'", "foo bar");
+		TestIcyParserTitle("StreamTitle='foo bar';", "foo bar");
+		TestIcyParserTitle("StreamTitle='foo\"bar';", "foo\"bar");
+		TestIcyParserTitle("StreamTitle='foo=bar';", "foo=bar");
+		TestIcyParserTitle("a=b;StreamTitle='foo';", "foo");
+		TestIcyParserTitle("a=;StreamTitle='foo';", "foo");
+		TestIcyParserTitle("a=b;StreamTitle='foo';c=d", "foo");
+		TestIcyParserTitle("a=b;StreamTitle='foo'", "foo");
+		TestIcyParserTitle("a='b;c';StreamTitle='foo;bar'", "foo;bar");
+		TestIcyParserTitle("a='b'c';StreamTitle='foo'bar'", "foo'bar");
+		TestIcyParserTitle("StreamTitle='fo'o'b'ar';a='b'c'd'", "fo'o'b'ar");
+	}
+};
+
+CPPUNIT_TEST_SUITE_REGISTRATION(IcyTest);
+
+int
+main(gcc_unused int argc, gcc_unused char **argv)
+{
+	CppUnit::TextUi::TestRunner runner;
+	auto &registry = CppUnit::TestFactoryRegistry::getRegistry();
+	runner.addTest(registry.makeTest());
+	return runner.run() ? EXIT_SUCCESS : EXIT_FAILURE;
+}
diff --git a/test/test_queue_priority.cxx b/test/test_queue_priority.cxx
index a103779..fca18fc 100644
--- a/test/test_queue_priority.cxx
+++ b/test/test_queue_priority.cxx
@@ -26,7 +26,7 @@ Song::Free()
 }
 
 static void
-check_descending_priority(const struct queue *queue,
+check_descending_priority(const Queue *queue,
 			  unsigned start_order)
 {
 	assert(start_order < queue->GetLength());
@@ -55,7 +55,7 @@ QueuePriorityTest::TestPriority()
 {
 	static Song songs[16];
 
-	struct queue queue(32);
+	Queue queue(32);
 
 	for (unsigned i = 0; i < ARRAY_SIZE(songs); ++i)
 		queue.Append(&songs[i], 0);

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-mpd/pkg-mpd.git



More information about the Pkg-mpd-commits mailing list