Hello community,

here is the log from the commit of package mpd for openSUSE:Factory checked in 
at 2018-02-12 10:15:42
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/mpd (Old)
 and      /work/SRC/openSUSE:Factory/.mpd.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "mpd"

Mon Feb 12 10:15:42 2018 rev:3 rq:575392 version:0.20.17

Changes:
--------
--- /work/SRC/openSUSE:Factory/mpd/mpd.changes  2018-02-05 10:53:57.709638960 
+0100
+++ /work/SRC/openSUSE:Factory/.mpd.new/mpd.changes     2018-02-12 
10:15:43.288410130 +0100
@@ -1,0 +2,9 @@
+Sun Feb 11 13:17:41 UTC 2018 - mar...@gmx.de
+
+- Update to version 0.20.17:
+  * output
+    - alsa: fix crash bug with 8 channels
+  * mixer
+    - alsa: fix rounding error at volume 0
+
+-------------------------------------------------------------------

Old:
----
  mpd-0.20.16.tar.xz

New:
----
  mpd-0.20.17.tar.xz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ mpd.spec ++++++
--- /var/tmp/diff_new_pack.cGFVAV/_old  2018-02-12 10:15:44.552364582 +0100
+++ /var/tmp/diff_new_pack.cGFVAV/_new  2018-02-12 10:15:44.556364438 +0100
@@ -23,7 +23,7 @@
 %define _userunitdir %{_prefix}/lib/systemd/user
 %endif
 Name:           mpd
-Version:        0.20.16
+Version:        0.20.17
 Release:        0
 Summary:        Music Player Daemon
 License:        GPL-3.0+

++++++ mpd-0.20.16.tar.xz -> mpd-0.20.17.tar.xz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mpd-0.20.16/Makefile.in new/mpd-0.20.17/Makefile.in
--- old/mpd-0.20.16/Makefile.in 2018-01-23 16:31:44.000000000 +0100
+++ new/mpd-0.20.17/Makefile.in 2018-02-09 18:43:51.000000000 +0100
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.15 from Makefile.am.
+# Makefile.in generated by automake 1.15.1 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2014 Free Software Foundation, Inc.
+# Copyright (C) 1994-2017 Free Software Foundation, Inc.
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -15317,7 +15317,7 @@
          ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \
        || chmod -R a+r "$(distdir)"
 dist-gzip: distdir
-       tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c 
>$(distdir).tar.gz
+       tardir=$(distdir) && $(am__tar) | eval GZIP= gzip $(GZIP_ENV) -c 
>$(distdir).tar.gz
        $(am__post_remove_distdir)
 
 dist-bzip2: distdir
@@ -15342,7 +15342,7 @@
        @echo WARNING: "Support for shar distribution archives is" \
                       "deprecated." >&2
        @echo WARNING: "It will be removed altogether in Automake 2.0" >&2
-       shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
+       shar $(distdir) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).shar.gz
        $(am__post_remove_distdir)
 
 dist-zip: distdir
@@ -15360,7 +15360,7 @@
 distcheck: dist
        case '$(DIST_ARCHIVES)' in \
        *.tar.gz*) \
-         GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\
+         eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).tar.gz | $(am__untar) ;;\
        *.tar.bz2*) \
          bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\
        *.tar.lz*) \
@@ -15370,7 +15370,7 @@
        *.tar.Z*) \
          uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
        *.shar.gz*) \
-         GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\
+         eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).shar.gz | unshar ;;\
        *.zip*) \
          unzip $(distdir).zip ;;\
        esac
@@ -15613,9 +15613,9 @@
        @echo "This command is intended for maintainers to use"
        @echo "it deletes files that may require special tools to rebuild."
        -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
-@ENABLE_DOCUMENTATION_FALSE@install-data-local:
 @ANDROID_FALSE@@ENABLE_DOCUMENTATION_FALSE@@ENABLE_HAIKU_FALSE@clean-local:
 @ENABLE_DOCUMENTATION_FALSE@uninstall-local:
+@ENABLE_DOCUMENTATION_FALSE@install-data-local:
 clean: clean-am
 
 clean-am: clean-binPROGRAMS clean-generic clean-local \
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mpd-0.20.16/NEWS new/mpd-0.20.17/NEWS
--- old/mpd-0.20.16/NEWS        2018-02-03 19:48:26.000000000 +0100
+++ new/mpd-0.20.17/NEWS        2018-02-11 13:02:53.000000000 +0100
@@ -1,3 +1,12 @@
+ver 0.20.17 (2018/02/11)
+* output
+  - alsa: fix crash bug with 8 channels
+* mixer
+  - alsa: fix rounding error at volume 0
+* fix real-time and idle scheduling with Musl
+* Android
+  - fix compatibility with Android 4.0
+
 ver 0.20.16 (2018/02/03)
 * output
   - pulse: fix crash during auto-detection
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mpd-0.20.16/aclocal.m4 new/mpd-0.20.17/aclocal.m4
--- old/mpd-0.20.16/aclocal.m4  2018-01-06 13:16:29.000000000 +0100
+++ new/mpd-0.20.17/aclocal.m4  2018-02-09 18:43:49.000000000 +0100
@@ -1,6 +1,6 @@
-# generated automatically by aclocal 1.15 -*- Autoconf -*-
+# generated automatically by aclocal 1.15.1 -*- Autoconf -*-
 
-# Copyright (C) 1996-2014 Free Software Foundation, Inc.
+# Copyright (C) 1996-2017 Free Software Foundation, Inc.
 
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -20,7 +20,7 @@
 If you have problems, you may need to regenerate the build system entirely.
 To do so, use the procedure documented by the package, typically 
'autoreconf'.])])
 
-# Copyright (C) 2002-2014 Free Software Foundation, Inc.
+# Copyright (C) 2002-2017 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -35,7 +35,7 @@
 [am__api_version='1.15'
 dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
 dnl require some minimum version.  Point them to the right macro.
-m4_if([$1], [1.15], [],
+m4_if([$1], [1.15.1], [],
       [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
 ])
 
@@ -51,14 +51,14 @@
 # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
 # This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
 AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
-[AM_AUTOMAKE_VERSION([1.15])dnl
+[AM_AUTOMAKE_VERSION([1.15.1])dnl
 m4_ifndef([AC_AUTOCONF_VERSION],
   [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
 _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
 
 # AM_AUX_DIR_EXPAND                                         -*- Autoconf -*-
 
-# Copyright (C) 2001-2014 Free Software Foundation, Inc.
+# Copyright (C) 2001-2017 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -110,7 +110,7 @@
 
 # AM_CONDITIONAL                                            -*- Autoconf -*-
 
-# Copyright (C) 1997-2014 Free Software Foundation, Inc.
+# Copyright (C) 1997-2017 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -141,7 +141,7 @@
 Usually this means the macro was only invoked conditionally.]])
 fi])])
 
-# Copyright (C) 1999-2014 Free Software Foundation, Inc.
+# Copyright (C) 1999-2017 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -332,7 +332,7 @@
 
 # Generate code to set up dependency tracking.              -*- Autoconf -*-
 
-# Copyright (C) 1999-2014 Free Software Foundation, Inc.
+# Copyright (C) 1999-2017 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -408,7 +408,7 @@
 
 # Do all the work for Automake.                             -*- Autoconf -*-
 
-# Copyright (C) 1996-2014 Free Software Foundation, Inc.
+# Copyright (C) 1996-2017 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -605,7 +605,7 @@
 done
 echo "timestamp for $_am_arg" 
>`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count])
 
-# Copyright (C) 2001-2014 Free Software Foundation, Inc.
+# Copyright (C) 2001-2017 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -626,7 +626,7 @@
 fi
 AC_SUBST([install_sh])])
 
-# Copyright (C) 2003-2014 Free Software Foundation, Inc.
+# Copyright (C) 2003-2017 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -647,7 +647,7 @@
 
 # Check to see how 'make' treats includes.                 -*- Autoconf -*-
 
-# Copyright (C) 2001-2014 Free Software Foundation, Inc.
+# Copyright (C) 2001-2017 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -697,7 +697,7 @@
 
 # Fake the existence of programs that GNU maintainers use.  -*- Autoconf -*-
 
-# Copyright (C) 1997-2014 Free Software Foundation, Inc.
+# Copyright (C) 1997-2017 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -736,7 +736,7 @@
 
 # Helper functions for option handling.                     -*- Autoconf -*-
 
-# Copyright (C) 2001-2014 Free Software Foundation, Inc.
+# Copyright (C) 2001-2017 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -765,7 +765,7 @@
 AC_DEFUN([_AM_IF_OPTION],
 [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
 
-# Copyright (C) 1999-2014 Free Software Foundation, Inc.
+# Copyright (C) 1999-2017 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -812,7 +812,7 @@
 # For backward compatibility.
 AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])])
 
-# Copyright (C) 2001-2014 Free Software Foundation, Inc.
+# Copyright (C) 2001-2017 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -831,7 +831,7 @@
 
 # Check to make sure that the build environment is sane.    -*- Autoconf -*-
 
-# Copyright (C) 1996-2014 Free Software Foundation, Inc.
+# Copyright (C) 1996-2017 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -912,7 +912,7 @@
 rm -f conftest.file
 ])
 
-# Copyright (C) 2009-2014 Free Software Foundation, Inc.
+# Copyright (C) 2009-2017 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -972,7 +972,7 @@
 _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl
 ])
 
-# Copyright (C) 2001-2014 Free Software Foundation, Inc.
+# Copyright (C) 2001-2017 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -1000,7 +1000,7 @@
 INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
 AC_SUBST([INSTALL_STRIP_PROGRAM])])
 
-# Copyright (C) 2006-2014 Free Software Foundation, Inc.
+# Copyright (C) 2006-2017 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -1019,7 +1019,7 @@
 
 # Check how to create a tarball.                            -*- Autoconf -*-
 
-# Copyright (C) 2004-2014 Free Software Foundation, Inc.
+# Copyright (C) 2004-2017 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mpd-0.20.16/android/AndroidManifest.xml 
new/mpd-0.20.17/android/AndroidManifest.xml
--- old/mpd-0.20.16/android/AndroidManifest.xml 2018-01-05 18:07:19.000000000 
+0100
+++ new/mpd-0.20.17/android/AndroidManifest.xml 2018-02-09 23:14:31.000000000 
+0100
@@ -2,10 +2,10 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android";
           package="org.musicpd"
           android:installLocation="auto"
-          android:versionCode="14"
-          android:versionName="0.20.15">
+          android:versionCode="16"
+          android:versionName="0.20.17">
 
-  <uses-sdk android:minSdkVersion="9" android:targetSdkVersion="17"/>
+  <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="17"/>
 
   <application android:icon="@drawable/icon" android:label="@string/app_name">
     <activity android:name=".Main"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mpd-0.20.16/android/build.py 
new/mpd-0.20.17/android/build.py
--- old/mpd-0.20.16/android/build.py    2018-01-19 22:45:54.000000000 +0100
+++ new/mpd-0.20.17/android/build.py    2018-02-09 23:59:30.000000000 +0100
@@ -46,7 +46,7 @@
 
         self.ndk_arch = 'arm'
         android_abi = 'armeabi-v7a'
-        ndk_platform = 'android-21'
+        ndk_platform = 'android-14'
 
         # select the NDK compiler
         gcc_version = '4.9'
@@ -67,7 +67,7 @@
 
         common_flags = '-Os -g'
         common_flags += ' -fPIC'
-        common_flags += ' -march=armv7-a -mfloat-abi=softfp'
+        common_flags += ' -march=armv7-a -mfpu=vfp -mfloat-abi=softfp'
 
         toolchain_bin = os.path.join(toolchain_path, 'bin')
         llvm_bin = os.path.join(llvm_path, 'bin')
@@ -87,7 +87,7 @@
         self.cppflags = '--sysroot=' + sysroot + \
             ' -isystem ' + os.path.join(install_prefix, 'include') + \
             ' -isystem ' + os.path.join(sysroot, 'usr', 'include', arch) + \
-            ' -D__ANDROID_API__=21'
+            ' -D__ANDROID_API__=14'
         self.ldflags = '--sysroot=' + sysroot + \
             ' -L' + os.path.join(install_prefix, 'lib') + \
             ' -L' + os.path.join(target_root, 'usr', 'lib') + \
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mpd-0.20.16/configure new/mpd-0.20.17/configure
--- old/mpd-0.20.16/configure   2018-01-06 13:16:30.000000000 +0100
+++ new/mpd-0.20.17/configure   2018-02-09 18:43:50.000000000 +0100
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.69 for mpd 0.20.16.
+# Generated by GNU Autoconf 2.69 for mpd 0.20.17.
 #
 # Report bugs to <musicpd-dev-t...@lists.sourceforge.net>.
 #
@@ -580,8 +580,8 @@
 # Identity of this package.
 PACKAGE_NAME='mpd'
 PACKAGE_TARNAME='mpd'
-PACKAGE_VERSION='0.20.16'
-PACKAGE_STRING='mpd 0.20.16'
+PACKAGE_VERSION='0.20.17'
+PACKAGE_STRING='mpd 0.20.17'
 PACKAGE_BUGREPORT='musicpd-dev-t...@lists.sourceforge.net'
 PACKAGE_URL=''
 
@@ -1785,7 +1785,7 @@
   # 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.20.16 to adapt to many kinds of systems.
+\`configure' configures mpd 0.20.17 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1856,7 +1856,7 @@
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of mpd 0.20.16:";;
+     short | recursive ) echo "Configuration of mpd 0.20.17:";;
    esac
   cat <<\_ACEOF
 
@@ -2209,7 +2209,7 @@
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-mpd configure 0.20.16
+mpd configure 0.20.17
 generated by GNU Autoconf 2.69
 
 Copyright (C) 2012 Free Software Foundation, Inc.
@@ -2616,7 +2616,7 @@
 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.20.16, which was
+It was created by mpd $as_me 0.20.17, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   $ $0 $@
@@ -2967,7 +2967,7 @@
 
 VERSION_MAJOR=0
 VERSION_MINOR=20
-VERSION_REVISION=16
+VERSION_REVISION=17
 VERSION_EXTRA=0
 
 
@@ -3486,7 +3486,7 @@
 
 # Define the identity of the package.
  PACKAGE='mpd'
- VERSION='0.20.16'
+ VERSION='0.20.17'
 
 
 cat >>confdefs.h <<_ACEOF
@@ -21779,7 +21779,7 @@
 # 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.20.16, which was
+This file was extended by mpd $as_me 0.20.17, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -21845,7 +21845,7 @@
 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.20.16
+mpd config.status 0.20.17
 configured by $0, generated by GNU Autoconf 2.69,
   with options \\"\$ac_cs_config\\"
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mpd-0.20.16/configure.ac new/mpd-0.20.17/configure.ac
--- old/mpd-0.20.16/configure.ac        2018-01-06 13:16:06.000000000 +0100
+++ new/mpd-0.20.17/configure.ac        2018-02-09 18:43:32.000000000 +0100
@@ -1,10 +1,10 @@
 AC_PREREQ(2.60)
 
-AC_INIT(mpd, 0.20.16, musicpd-dev-t...@lists.sourceforge.net)
+AC_INIT(mpd, 0.20.17, musicpd-dev-t...@lists.sourceforge.net)
 
 VERSION_MAJOR=0
 VERSION_MINOR=20
-VERSION_REVISION=16
+VERSION_REVISION=17
 VERSION_EXTRA=0
 
 AC_CONFIG_SRCDIR([src/Main.cxx])
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mpd-0.20.16/doc/doxygen.conf 
new/mpd-0.20.17/doc/doxygen.conf
--- old/mpd-0.20.16/doc/doxygen.conf    2018-02-03 19:37:52.000000000 +0100
+++ new/mpd-0.20.17/doc/doxygen.conf    2018-02-09 18:43:54.000000000 +0100
@@ -38,7 +38,7 @@
 # could be handy for archiving the generated documentation or if some version
 # control system is used.
 
-PROJECT_NUMBER         = 0.20.16
+PROJECT_NUMBER         = 0.20.17
 
 # Using the PROJECT_BRIEF tag one can provide an optional one line description
 # for a project that appears at the top of each page and should give viewer a
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mpd-0.20.16/doc/user.xml new/mpd-0.20.17/doc/user.xml
--- old/mpd-0.20.16/doc/user.xml        2017-11-14 11:31:31.000000000 +0100
+++ new/mpd-0.20.17/doc/user.xml        2018-02-09 19:15:46.000000000 +0100
@@ -66,6 +66,23 @@
       </para>
     </section>
 
+    <section id="install_android">
+      <title>Installing on Android</title>
+
+      <para>
+        An experimental Android build is available on <ulink
+        url="https://play.google.com/store/apps/details?id=org.musicpd";>Google
+        Play</ulink>.  After installing and launching it, MPD will
+        scan the music in your <filename>Music</filename> directory
+        and you can control it as usual with a MPD client.
+      </para>
+
+      <para>
+        If you need to tweak the configuration, you can create a file
+        called <filename>mpd.conf</filename> on the data partition.
+      </para>
+    </section>
+
     <section id="install_source">
       <title>Compiling from source</title>
 
@@ -323,7 +340,9 @@
         <application>MPD</application> as a user daemon (and not as a
         system daemon), the configuration is read from
         <filename>$XDG_CONFIG_HOME/mpd/mpd.conf</filename> (usually
-        <filename>~/.config/mpd/mpd.conf</filename>).
+        <filename>~/.config/mpd/mpd.conf</filename>).  On Android,
+        <filename>mpd.conf</filename> will be loaded from the
+        top-level directory of the data partition.
       </para>
 
       <para>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mpd-0.20.16/python/build/libs.py 
new/mpd-0.20.17/python/build/libs.py
--- old/mpd-0.20.16/python/build/libs.py        2018-02-03 19:46:45.000000000 
+0100
+++ new/mpd-0.20.17/python/build/libs.py        2018-02-09 23:59:42.000000000 
+0100
@@ -1,4 +1,6 @@
 import re
+from os.path import abspath
+
 from build.project import Project
 from build.zlib import ZlibProject
 from build.autotools import AutotoolsProject
@@ -358,6 +360,8 @@
         '--disable-crypto-auth', '--disable-ntlm-wb', '--disable-tls-srp', 
'--disable-cookies',
         '--without-ssl', '--without-gnutls', '--without-nss', 
'--without-libssh2',
     ],
+
+    patches='src/lib/curl/patches',
 )
 
 boost = BoostProject(
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mpd-0.20.16/python/build/project.py 
new/mpd-0.20.17/python/build/project.py
--- old/mpd-0.20.16/python/build/project.py     2018-01-05 10:17:31.000000000 
+0100
+++ new/mpd-0.20.17/python/build/project.py     2018-02-09 23:14:20.000000000 
+0100
@@ -3,10 +3,12 @@
 
 from build.download import download_and_verify
 from build.tar import untar
+from build.quilt import push_all
 
 class Project:
     def __init__(self, url, md5, installed, name=None, version=None,
                  base=None,
+                 patches=None,
                  edits=None,
                  use_cxx=False):
         if base is None:
@@ -18,7 +20,7 @@
             self.base = base
 
         if name is None or version is None:
-            m = re.match(r'^([-\w]+)-(\d[\d.]*[a-z]?)$', self.base)
+            m = re.match(r'^([-\w]+)-(\d[\d.]*[a-z]?[\d.]*)$', self.base)
             if name is None: name = m.group(1)
             if version is None: version = m.group(2)
 
@@ -29,6 +31,10 @@
         self.md5 = md5
         self.installed = installed
 
+        if patches is not None:
+            srcdir = 
os.path.dirname(os.path.dirname(os.path.dirname(__file__)))
+            patches = os.path.join(srcdir, patches)
+        self.patches = patches
         self.edits = edits
         self.use_cxx = use_cxx
 
@@ -51,6 +57,9 @@
             parent_path = toolchain.build_path
         path = untar(self.download(toolchain), parent_path, self.base)
 
+        if self.patches is not None:
+            push_all(toolchain, path, self.patches)
+
         if self.edits is not None:
             for filename, function in self.edits.items():
                 with open(os.path.join(path, filename), 'r+t') as f:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mpd-0.20.16/python/build/quilt.py 
new/mpd-0.20.17/python/build/quilt.py
--- old/mpd-0.20.16/python/build/quilt.py       1970-01-01 01:00:00.000000000 
+0100
+++ new/mpd-0.20.17/python/build/quilt.py       2018-02-09 22:59:09.000000000 
+0100
@@ -0,0 +1,9 @@
+import subprocess
+
+def run_quilt(toolchain, cwd, patches_path, *args):
+    env = dict(toolchain.env)
+    env['QUILT_PATCHES'] = patches_path
+    subprocess.check_call(['quilt'] + list(args), cwd=cwd, env=env)
+
+def push_all(toolchain, src_path, patches_path):
+    run_quilt(toolchain, src_path, patches_path, 'push', '-a')
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mpd-0.20.16/src/SongSave.cxx 
new/mpd-0.20.17/src/SongSave.cxx
--- old/mpd-0.20.16/src/SongSave.cxx    2017-01-27 08:46:51.000000000 +0100
+++ new/mpd-0.20.17/src/SongSave.cxx    2018-02-09 22:54:34.000000000 +0100
@@ -28,6 +28,7 @@
 #include "tag/TagBuilder.hxx"
 #include "util/StringUtil.hxx"
 #include "util/RuntimeError.hxx"
+#include "util/NumberParser.hxx"
 
 #include <string.h>
 #include <stdlib.h>
@@ -94,7 +95,7 @@
                if ((type = tag_name_parse(line)) != TAG_NUM_OF_ITEM_TYPES) {
                        tag.AddItem(type, value);
                } else if (strcmp(line, "Time") == 0) {
-                       tag.SetDuration(SignedSongTime::FromS(atof(value)));
+                       
tag.SetDuration(SignedSongTime::FromS(ParseDouble(value)));
                } else if (strcmp(line, "Playlist") == 0) {
                        tag.SetHasPlaylist(strcmp(value, "yes") == 0);
                } else if (strcmp(line, SONG_MTIME) == 0) {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mpd-0.20.16/src/db/update/Service.cxx 
new/mpd-0.20.17/src/db/update/Service.cxx
--- old/mpd-0.20.16/src/db/update/Service.cxx   2018-02-01 19:53:28.000000000 
+0100
+++ new/mpd-0.20.17/src/db/update/Service.cxx   2018-02-09 18:48:33.000000000 
+0100
@@ -29,6 +29,7 @@
 #include "Idle.hxx"
 #include "Log.hxx"
 #include "thread/Thread.hxx"
+#include "thread/Name.hxx"
 #include "thread/Util.hxx"
 
 #ifndef NDEBUG
@@ -113,6 +114,8 @@
 {
        assert(walk != nullptr);
 
+       SetThreadName("update");
+
        if (!next.path_utf8.empty())
                FormatDebug(update_domain, "starting: %s",
                            next.path_utf8.c_str());
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/mpd-0.20.16/src/filter/plugins/ConvertFilterPlugin.cxx 
new/mpd-0.20.17/src/filter/plugins/ConvertFilterPlugin.cxx
--- old/mpd-0.20.16/src/filter/plugins/ConvertFilterPlugin.cxx  2017-01-27 
08:46:51.000000000 +0100
+++ new/mpd-0.20.17/src/filter/plugins/ConvertFilterPlugin.cxx  2018-02-09 
19:05:33.000000000 +0100
@@ -53,10 +53,16 @@
        void Set(const AudioFormat &_out_audio_format);
 
        void Reset() override {
-               state.Reset();
+               if (IsActive())
+                       state.Reset();
        }
 
        ConstBuffer<void> FilterPCM(ConstBuffer<void> src) override;
+
+private:
+       bool IsActive() const noexcept {
+               return out_audio_format != in_audio_format;
+       }
 };
 
 class PreparedConvertFilter final : public PreparedFilter {
@@ -80,7 +86,7 @@
                /* no change */
                return;
 
-       if (out_audio_format != in_audio_format) {
+       if (IsActive()) {
                out_audio_format = in_audio_format;
                state.Close();
        }
@@ -111,7 +117,7 @@
 {
        assert(in_audio_format.IsValid());
 
-       if (out_audio_format != in_audio_format)
+       if (IsActive())
                state.Close();
 }
 
@@ -120,11 +126,10 @@
 {
        assert(in_audio_format.IsValid());
 
-       if (out_audio_format == in_audio_format)
+       return IsActive()
+               ? state.Convert(src)
                /* optimized special case: no-op */
-               return src;
-
-       return state.Convert(src);
+               : src;
 }
 
 const FilterPlugin convert_filter_plugin = {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mpd-0.20.16/src/input/plugins/FileInputPlugin.cxx 
new/mpd-0.20.17/src/input/plugins/FileInputPlugin.cxx
--- old/mpd-0.20.16/src/input/plugins/FileInputPlugin.cxx       2017-11-13 
17:14:22.000000000 +0100
+++ new/mpd-0.20.17/src/input/plugins/FileInputPlugin.cxx       2018-02-09 
22:54:37.000000000 +0100
@@ -65,10 +65,13 @@
                throw FormatRuntimeError("Not a regular file: %s",
                                         path.c_str());
 
+#if !defined(__BIONIC__) || __ANDROID_API__ >= 21
+       /* posix_fadvise() requires Android API 21 */
 #ifdef POSIX_FADV_SEQUENTIAL
        posix_fadvise(reader.GetFD().Get(), (off_t)0, info.GetSize(),
                      POSIX_FADV_SEQUENTIAL);
 #endif
+#endif
 
        return InputStreamPtr(new FileInputStream(path.ToUTF8().c_str(),
                                                  std::move(reader), 
info.GetSize(),
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mpd-0.20.16/src/mixer/plugins/volume_mapping.c 
new/mpd-0.20.17/src/mixer/plugins/volume_mapping.c
--- old/mpd-0.20.16/src/mixer/plugins/volume_mapping.c  2018-01-02 
21:47:43.000000000 +0100
+++ new/mpd-0.20.17/src/mixer/plugins/volume_mapping.c  2018-02-10 
09:07:28.000000000 +0100
@@ -139,6 +139,13 @@
                return set_raw[ctl_dir](elem, value);
        }
 
+       /* two special cases to avoid rounding errors at 0% and
+          100% */
+       if (volume <= 0)
+               return set_dB[ctl_dir](elem, min, dir);
+       else if (volume >= 100)
+               return set_dB[ctl_dir](elem, max, dir);
+
        if (use_linear_dB_scale(min, max)) {
                value = lrint_dir(volume * (max - min), dir) + min;
                return set_dB[ctl_dir](elem, value, dir);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mpd-0.20.16/src/pcm/Order.cxx 
new/mpd-0.20.17/src/pcm/Order.cxx
--- old/mpd-0.20.16/src/pcm/Order.cxx   2017-01-27 08:46:51.000000000 +0100
+++ new/mpd-0.20.17/src/pcm/Order.cxx   2018-02-09 19:00:24.000000000 +0100
@@ -88,7 +88,7 @@
 ToAlsaChannelOrder71(PcmBuffer &buffer, ConstBuffer<V> src)
 {
        auto dest = buffer.GetT<V>(src.size);
-       ToAlsaChannelOrder71(dest, src.data, src.size / 6);
+       ToAlsaChannelOrder71(dest, src.data, src.size / 8);
        return { dest, src.size };
 }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mpd-0.20.16/src/protocol/ArgParser.cxx 
new/mpd-0.20.17/src/protocol/ArgParser.cxx
--- old/mpd-0.20.16/src/protocol/ArgParser.cxx  2017-01-27 08:46:51.000000000 
+0100
+++ new/mpd-0.20.17/src/protocol/ArgParser.cxx  2018-02-09 22:54:32.000000000 
+0100
@@ -21,6 +21,7 @@
 #include "ArgParser.hxx"
 #include "Ack.hxx"
 #include "Chrono.hxx"
+#include "util/NumberParser.hxx"
 
 #include <stdlib.h>
 
@@ -151,7 +152,7 @@
 ParseCommandArgFloat(const char *s)
 {
        char *endptr;
-       auto value = strtof(s, &endptr);
+       auto value = ParseFloat(s, &endptr);
        if (endptr == s || *endptr != 0)
                throw FormatProtocolError(ACK_ERROR_ARG,
                                          "Float expected: %s", s);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mpd-0.20.16/src/queue/PlaylistState.cxx 
new/mpd-0.20.17/src/queue/PlaylistState.cxx
--- old/mpd-0.20.16/src/queue/PlaylistState.cxx 2017-01-27 08:46:51.000000000 
+0100
+++ new/mpd-0.20.17/src/queue/PlaylistState.cxx 2018-02-09 22:54:34.000000000 
+0100
@@ -35,6 +35,7 @@
 #include "util/CharUtil.hxx"
 #include "util/StringAPI.hxx"
 #include "util/StringCompare.hxx"
+#include "util/NumberParser.hxx"
 #include "Log.hxx"
 
 #include <string.h>
@@ -148,7 +149,7 @@
        while ((line = file.ReadLine()) != nullptr) {
                const char *p;
                if ((p = StringAfterPrefix(line, PLAYLIST_STATE_FILE_TIME))) {
-                       seek_time = SongTime::FromS(atof(p));
+                       seek_time = SongTime::FromS(ParseDouble(p));
                } else if ((p = StringAfterPrefix(line, 
PLAYLIST_STATE_FILE_REPEAT))) {
                        playlist.SetRepeat(pc, StringIsEqual(p, "1"));
                } else if ((p = StringAfterPrefix(line, 
PLAYLIST_STATE_FILE_SINGLE))) {
@@ -158,12 +159,12 @@
                } else if ((p = StringAfterPrefix(line, 
PLAYLIST_STATE_FILE_CROSSFADE))) {
                        pc.SetCrossFade(atoi(p));
                } else if ((p = StringAfterPrefix(line, 
PLAYLIST_STATE_FILE_MIXRAMPDB))) {
-                       pc.SetMixRampDb(atof(p));
+                       pc.SetMixRampDb(ParseFloat(p));
                } else if ((p = StringAfterPrefix(line, 
PLAYLIST_STATE_FILE_MIXRAMPDELAY))) {
                        /* this check discards "nan" which was used
                           prior to MPD 0.18 */
                        if (IsDigitASCII(*p))
-                               pc.SetMixRampDelay(atof(p));
+                               pc.SetMixRampDelay(ParseFloat(p));
                } else if ((p = StringAfterPrefix(line, 
PLAYLIST_STATE_FILE_RANDOM))) {
                        random_mode = StringIsEqual(p, "1");
                } else if ((p = StringAfterPrefix(line, 
PLAYLIST_STATE_FILE_CURRENT))) {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mpd-0.20.16/src/tag/ReplayGain.cxx 
new/mpd-0.20.17/src/tag/ReplayGain.cxx
--- old/mpd-0.20.16/src/tag/ReplayGain.cxx      2017-06-04 12:30:55.000000000 
+0200
+++ new/mpd-0.20.17/src/tag/ReplayGain.cxx      2018-02-09 22:54:34.000000000 
+0100
@@ -22,6 +22,7 @@
 #include "VorbisComment.hxx"
 #include "ReplayGainInfo.hxx"
 #include "util/ASCII.hxx"
+#include "util/NumberParser.hxx"
 
 #include <assert.h>
 #include <stdlib.h>
@@ -33,16 +34,16 @@
        const char *value;
 
        if ((value = t["replaygain_track_gain"]) != nullptr) {
-               info.track.gain = atof(value);
+               info.track.gain = ParseFloat(value);
                return true;
        } else if ((value = t["replaygain_album_gain"]) != nullptr) {
-               info.album.gain = atof(value);
+               info.album.gain = ParseFloat(value);
                return true;
        } else if ((value = t["replaygain_track_peak"]) != nullptr) {
-               info.track.peak = atof(value);
+               info.track.peak = ParseFloat(value);
                return true;
        } else if ((value = t["replaygain_album_peak"]) != nullptr) {
-               info.album.peak = atof(value);
+               info.album.peak = ParseFloat(value);
                return true;
        } else
                return false;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mpd-0.20.16/src/thread/Util.cxx 
new/mpd-0.20.17/src/thread/Util.cxx
--- old/mpd-0.20.16/src/thread/Util.cxx 2018-01-04 19:32:29.000000000 +0100
+++ new/mpd-0.20.17/src/thread/Util.cxx 2018-02-09 18:39:12.000000000 +0100
@@ -38,10 +38,12 @@
 #include <windows.h>
 #endif
 
-#if defined(__linux__) && !defined(ANDROID)
+#ifdef __linux__
+
+#ifndef ANDROID
 
 static int
-ioprio_set(int which, int who, int ioprio)
+linux_ioprio_set(int which, int who, int ioprio)
 {
        return syscall(__NR_ioprio_set, which, who, ioprio);
 }
@@ -55,7 +57,20 @@
        static constexpr int _IOPRIO_IDLE =
                (_IOPRIO_CLASS_IDLE << _IOPRIO_CLASS_SHIFT) | 7;
 
-       ioprio_set(_IOPRIO_WHO_PROCESS, 0, _IOPRIO_IDLE);
+       linux_ioprio_set(_IOPRIO_WHO_PROCESS, 0, _IOPRIO_IDLE);
+}
+
+#endif /* !ANDROID */
+
+/**
+ * Wrapper for the "sched_setscheduler" system call.  We don't use the
+ * one from the C library because Musl has an intentionally broken
+ * implementation.
+ */
+static int
+linux_sched_setscheduler(pid_t pid, int sched, const struct sched_param *param)
+{
+       return syscall(__NR_sched_setscheduler, pid, sched, param);
 }
 
 #endif
@@ -66,7 +81,7 @@
 #ifdef __linux__
 #ifdef SCHED_IDLE
        static struct sched_param sched_param;
-       sched_setscheduler(0, SCHED_IDLE, &sched_param);
+       linux_sched_setscheduler(0, SCHED_IDLE, &sched_param);
 #endif
 
 #ifndef ANDROID
@@ -92,7 +107,7 @@
        policy |= SCHED_RESET_ON_FORK;
 #endif
 
-       if (sched_setscheduler(0, policy, &sched_param) < 0)
+       if (linux_sched_setscheduler(0, policy, &sched_param) < 0)
                throw MakeErrno("sched_setscheduler failed");
 #endif // __linux__
 };
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mpd-0.20.16/src/util/NumberParser.hxx 
new/mpd-0.20.17/src/util/NumberParser.hxx
--- old/mpd-0.20.16/src/util/NumberParser.hxx   2017-01-27 08:46:51.000000000 
+0100
+++ new/mpd-0.20.17/src/util/NumberParser.hxx   2018-02-09 22:54:32.000000000 
+0100
@@ -78,7 +78,12 @@
 static inline float
 ParseFloat(const char *p, char **endptr=nullptr)
 {
+#if defined(__BIONIC__) && __ANDROID_API__ < 21
+       /* strtof() requires API level 21 */
        return (float)ParseDouble(p, endptr);
+#else
+       return strtof(p, endptr);
+#endif
 }
 
 #endif


Reply via email to