Merge branch 'v0.20.x'
This commit is contained in:
commit
5b0e8c6de0
5
NEWS
5
NEWS
@ -31,6 +31,11 @@ ver 0.21 (not yet released)
|
|||||||
- opus: support for sending metadata using ogg stream chaining
|
- opus: support for sending metadata using ogg stream chaining
|
||||||
* require GCC 5.0
|
* require GCC 5.0
|
||||||
|
|
||||||
|
ver 0.20.19 (not yet released)
|
||||||
|
* protocol
|
||||||
|
- validate absolute seek time, reject negative values
|
||||||
|
* macOS: fix crash bug
|
||||||
|
|
||||||
ver 0.20.18 (2018/02/24)
|
ver 0.20.18 (2018/02/24)
|
||||||
* input
|
* input
|
||||||
- curl: allow authentication methods other than "Basic"
|
- curl: allow authentication methods other than "Basic"
|
||||||
|
@ -3,13 +3,14 @@
|
|||||||
import os, os.path
|
import os, os.path
|
||||||
import sys, subprocess
|
import sys, subprocess
|
||||||
|
|
||||||
if len(sys.argv) < 3:
|
if len(sys.argv) < 4:
|
||||||
print("Usage: build.py SDK_PATH NDK_PATH [configure_args...]", file=sys.stderr)
|
print("Usage: build.py SDK_PATH NDK_PATH ABI [configure_args...]", file=sys.stderr)
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
sdk_path = sys.argv[1]
|
sdk_path = sys.argv[1]
|
||||||
ndk_path = sys.argv[2]
|
ndk_path = sys.argv[2]
|
||||||
configure_args = sys.argv[3:]
|
android_abi = sys.argv[3]
|
||||||
|
configure_args = sys.argv[4:]
|
||||||
|
|
||||||
if not os.path.isfile(os.path.join(sdk_path, 'tools', 'android')):
|
if not os.path.isfile(os.path.join(sdk_path, 'tools', 'android')):
|
||||||
print("SDK not found in", ndk_path, file=sys.stderr)
|
print("SDK not found in", ndk_path, file=sys.stderr)
|
||||||
@ -19,8 +20,27 @@ if not os.path.isdir(ndk_path):
|
|||||||
print("NDK not found in", ndk_path, file=sys.stderr)
|
print("NDK not found in", ndk_path, file=sys.stderr)
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
|
android_abis = {
|
||||||
|
'armeabi-v7a': {
|
||||||
|
'arch': 'arm-linux-androideabi',
|
||||||
|
'ndk_arch': 'arm',
|
||||||
|
'toolchain_arch': 'arm-linux-androideabi',
|
||||||
|
'llvm_triple': 'armv7-none-linux-androideabi',
|
||||||
|
'cflags': '-march=armv7-a -mfpu=vfp -mfloat-abi=softfp',
|
||||||
|
},
|
||||||
|
|
||||||
|
'x86': {
|
||||||
|
'arch': 'i686-linux-android',
|
||||||
|
'ndk_arch': 'x86',
|
||||||
|
'toolchain_arch': 'x86',
|
||||||
|
'llvm_triple': 'i686-none-linux-android',
|
||||||
|
'cflags': '-march=i686 -mtune=intel -mssse3 -mfpmath=sse -m32',
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
# select the NDK target
|
# select the NDK target
|
||||||
arch = 'arm-linux-androideabi'
|
abi_info = android_abis[android_abi]
|
||||||
|
arch = abi_info['arch']
|
||||||
|
|
||||||
# the path to the MPD sources
|
# the path to the MPD sources
|
||||||
mpd_path = os.path.abspath(os.path.join(os.path.dirname(sys.argv[0]) or '.', '..'))
|
mpd_path = os.path.abspath(os.path.join(os.path.dirname(sys.argv[0]) or '.', '..'))
|
||||||
@ -44,8 +64,7 @@ class AndroidNdkToolchain:
|
|||||||
self.src_path = src_path
|
self.src_path = src_path
|
||||||
self.build_path = build_path
|
self.build_path = build_path
|
||||||
|
|
||||||
self.ndk_arch = 'arm'
|
ndk_arch = abi_info['ndk_arch']
|
||||||
android_abi = 'armeabi-v7a'
|
|
||||||
ndk_platform = 'android-14'
|
ndk_platform = 'android-14'
|
||||||
|
|
||||||
# select the NDK compiler
|
# select the NDK compiler
|
||||||
@ -53,7 +72,7 @@ class AndroidNdkToolchain:
|
|||||||
|
|
||||||
ndk_platform_path = os.path.join(ndk_path, 'platforms', ndk_platform)
|
ndk_platform_path = os.path.join(ndk_path, 'platforms', ndk_platform)
|
||||||
sysroot = os.path.join(ndk_path, 'sysroot')
|
sysroot = os.path.join(ndk_path, 'sysroot')
|
||||||
target_root = os.path.join(ndk_platform_path, 'arch-' + self.ndk_arch)
|
target_root = os.path.join(ndk_platform_path, 'arch-' + ndk_arch)
|
||||||
|
|
||||||
install_prefix = os.path.join(arch_path, 'root')
|
install_prefix = os.path.join(arch_path, 'root')
|
||||||
|
|
||||||
@ -61,13 +80,13 @@ class AndroidNdkToolchain:
|
|||||||
self.install_prefix = install_prefix
|
self.install_prefix = install_prefix
|
||||||
self.sysroot = sysroot
|
self.sysroot = sysroot
|
||||||
|
|
||||||
toolchain_path = os.path.join(ndk_path, 'toolchains', arch + '-' + gcc_version, 'prebuilt', build_arch)
|
toolchain_path = os.path.join(ndk_path, 'toolchains', abi_info['toolchain_arch'] + '-' + gcc_version, 'prebuilt', build_arch)
|
||||||
llvm_path = os.path.join(ndk_path, 'toolchains', 'llvm', 'prebuilt', build_arch)
|
llvm_path = os.path.join(ndk_path, 'toolchains', 'llvm', 'prebuilt', build_arch)
|
||||||
llvm_triple = 'armv7-none-linux-androideabi'
|
llvm_triple = abi_info['llvm_triple']
|
||||||
|
|
||||||
common_flags = '-Os -g'
|
common_flags = '-Os -g'
|
||||||
common_flags += ' -fPIC'
|
common_flags += ' -fPIC'
|
||||||
common_flags += ' -march=armv7-a -mfpu=vfp -mfloat-abi=softfp'
|
common_flags += ' ' + abi_info['cflags']
|
||||||
|
|
||||||
toolchain_bin = os.path.join(toolchain_path, 'bin')
|
toolchain_bin = os.path.join(toolchain_path, 'bin')
|
||||||
llvm_bin = os.path.join(llvm_path, 'bin')
|
llvm_bin = os.path.join(llvm_path, 'bin')
|
||||||
@ -95,7 +114,7 @@ class AndroidNdkToolchain:
|
|||||||
' ' + common_flags
|
' ' + common_flags
|
||||||
self.libs = ''
|
self.libs = ''
|
||||||
|
|
||||||
self.is_arm = self.ndk_arch == 'arm'
|
self.is_arm = ndk_arch == 'arm'
|
||||||
self.is_armv7 = self.is_arm and 'armv7' in self.cflags
|
self.is_armv7 = self.is_arm and 'armv7' in self.cflags
|
||||||
self.is_windows = False
|
self.is_windows = False
|
||||||
|
|
||||||
|
53
doc/user.xml
53
doc/user.xml
@ -265,6 +265,59 @@ apt-get install g++ \
|
|||||||
script.
|
script.
|
||||||
</para>
|
</para>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
|
<section id="android_build">
|
||||||
|
<title>Compiling for Android</title>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
MPD can be compiled as an Android app. It can be installed
|
||||||
|
easily with <link linkend="install_android">Google
|
||||||
|
Play</link>, but if you want to build it from source, follow
|
||||||
|
this section.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
You need:
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<itemizedlist>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Android SDK
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
<ulink
|
||||||
|
url="https://developer.android.com/ndk/downloads/index.html">Android
|
||||||
|
NDK</ulink>
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</itemizedlist>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
Just like with the native build, unpack the
|
||||||
|
<application>MPD</application> source tarball and change
|
||||||
|
into the directory. Then, instead of
|
||||||
|
<command>./configure</command>, type:
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<programlisting>./android/build.py SDK_PATH NDK_PATH ABI
|
||||||
|
make android/build/mpd-debug.apk</programlisting>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
<varname>SDK_PATH</varname> is the absolute path where you
|
||||||
|
installed the Android SDK; <varname>NDK_PATH</varname> is
|
||||||
|
the Android NDK installation path; <varname>ABI</varname> is
|
||||||
|
the Android ABI to be built, e.g. "armeabi-v7a".
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
This downloads various library sources, and then configures
|
||||||
|
and builds <application>MPD</application>.
|
||||||
|
</para>
|
||||||
|
</section>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<section id="systemd_socket">
|
<section id="systemd_socket">
|
||||||
|
@ -23,6 +23,11 @@ libvorbis = AutotoolsProject(
|
|||||||
[
|
[
|
||||||
'--disable-shared', '--enable-static',
|
'--disable-shared', '--enable-static',
|
||||||
],
|
],
|
||||||
|
|
||||||
|
edits={
|
||||||
|
# this option is not understood by clang
|
||||||
|
'configure': lambda data: data.replace('-mno-ieee-fp', ' '),
|
||||||
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
opus = AutotoolsProject(
|
opus = AutotoolsProject(
|
||||||
|
19
src/Main.cxx
19
src/Main.cxx
@ -107,10 +107,6 @@
|
|||||||
#include <locale.h>
|
#include <locale.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef __BLOCKS__
|
|
||||||
#include <dispatch/dispatch.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
|
|
||||||
static constexpr size_t KILOBYTE = 1024;
|
static constexpr size_t KILOBYTE = 1024;
|
||||||
@ -536,21 +532,8 @@ try {
|
|||||||
daemonize_begin(options.daemon);
|
daemonize_begin(options.daemon);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef __BLOCKS__
|
|
||||||
/* Runs the OS X native event loop in the main thread, and runs
|
|
||||||
the rest of mpd_main on a new thread. This lets CoreAudio receive
|
|
||||||
route change notifications (e.g. plugging or unplugging headphones).
|
|
||||||
All hardware output on OS X ultimately uses CoreAudio internally.
|
|
||||||
This must be run after forking; if dispatch is called before forking,
|
|
||||||
the child process will have a broken internal dispatch state. */
|
|
||||||
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
|
|
||||||
exit(mpd_main_after_fork(config));
|
|
||||||
});
|
|
||||||
dispatch_main();
|
|
||||||
return EXIT_FAILURE; // unreachable, because dispatch_main never returns
|
|
||||||
#else
|
|
||||||
return mpd_main_after_fork(config);
|
return mpd_main_after_fork(config);
|
||||||
#endif
|
|
||||||
} catch (const std::exception &e) {
|
} catch (const std::exception &e) {
|
||||||
LogError(e);
|
LogError(e);
|
||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
|
@ -164,6 +164,10 @@ SongTime
|
|||||||
ParseCommandArgSongTime(const char *s)
|
ParseCommandArgSongTime(const char *s)
|
||||||
{
|
{
|
||||||
auto value = ParseCommandArgFloat(s);
|
auto value = ParseCommandArgFloat(s);
|
||||||
|
if (value < 0)
|
||||||
|
throw FormatProtocolError(ACK_ERROR_ARG,
|
||||||
|
"Negative value not allowed: %s", s);
|
||||||
|
|
||||||
return SongTime::FromS(value);
|
return SongTime::FromS(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user