Compare commits
25 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
cf86dfd317 | ||
|
|
a057b4f6d8 | ||
|
|
62b03cfddf | ||
|
|
18b827b979 | ||
|
|
0a379fc514 | ||
|
|
445c11b8d9 | ||
|
|
8d290ad509 | ||
|
|
b90c48b50f | ||
|
|
d19e7db09e | ||
|
|
9939904b02 | ||
|
|
ca23b15f5c | ||
|
|
ffa676f577 | ||
|
|
6d023c4df3 | ||
|
|
b31bd37a30 | ||
|
|
78faee8c7c | ||
|
|
40e2a703d0 | ||
|
|
b01edcb9bc | ||
|
|
f7fffc9be8 | ||
|
|
50e8634097 | ||
|
|
e3994e517e | ||
|
|
2bb7785189 | ||
|
|
90c8408111 | ||
|
|
64786ec12a | ||
|
|
b3c82f8886 | ||
|
|
063259dc52 |
36
.travis.yml
Normal file
36
.travis.yml
Normal file
@@ -0,0 +1,36 @@
|
||||
dist: trusty
|
||||
language: cpp
|
||||
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- libcppunit-dev
|
||||
- libboost-dev
|
||||
|
||||
os:
|
||||
- linux
|
||||
- osx
|
||||
|
||||
env:
|
||||
global:
|
||||
- MAKEFLAGS="-j2"
|
||||
|
||||
before_install:
|
||||
# C++14
|
||||
- test "$TRAVIS_OS_NAME" != "linux" || sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test
|
||||
- test "$TRAVIS_OS_NAME" != "linux" || sudo apt-get update -qq
|
||||
- test "$TRAVIS_OS_NAME" != "osx" || brew update
|
||||
|
||||
install:
|
||||
# C++14
|
||||
- test "$TRAVIS_OS_NAME" != "linux" || sudo apt-get install -qq g++-5
|
||||
- test "$TRAVIS_OS_NAME" != "osx" || brew install cppunit
|
||||
|
||||
script:
|
||||
- OPTIONS="--enable-test"
|
||||
- test "$TRAVIS_OS_NAME" != "linux" || export CC=gcc-5 CXX=g++-5
|
||||
- test "$TRAVIS_OS_NAME" != "osx" || OPTIONS="$OPTIONS --enable-osx"
|
||||
- ./autogen.sh
|
||||
- ./configure --disable-silent-rules --disable-dependency-tracking $OPTIONS
|
||||
- make
|
||||
- make check
|
||||
206
INSTALL
206
INSTALL
@@ -1,206 +0,0 @@
|
||||
Music Player Daemon (MPD) - INSTALL
|
||||
|
||||
|
||||
Introduction
|
||||
------------
|
||||
|
||||
This document is a very small amount of documentation about what is needed to
|
||||
install MPD. If more information is desired, read the user manual:
|
||||
|
||||
http://www.musicpd.org/doc/user/
|
||||
|
||||
Dependencies
|
||||
------------
|
||||
|
||||
gcc 4.7 or later - http://gcc.gnu.org/
|
||||
clang 3.2 or later - http://clang.llvm.org/
|
||||
Any other C++11 compliant compiler should also work.
|
||||
|
||||
Boost 1.46 - http://www.boost.org/
|
||||
|
||||
|
||||
Optional Output Dependencies
|
||||
----------------------------
|
||||
|
||||
You will need at least one of these to compile MPD.
|
||||
|
||||
Most of these are available as packages on major distributions. Be sure to
|
||||
install both the library package as well as the development package.
|
||||
|
||||
AO - http://www.xiph.org/ao/
|
||||
A portable library that abstracts many audio output types as one API. Should
|
||||
be used only if there is no native plugin available or if the native plugin
|
||||
doesn't work. You will need libao.
|
||||
|
||||
ALSA - http://www.alsa-project.org/
|
||||
The Advanced Linux Sound Architecture. Recommended audio output if you use
|
||||
Linux. You will need libasound.
|
||||
|
||||
FIFO
|
||||
This is a mostly undocumented, developer plugin to transmit raw data.
|
||||
|
||||
OSS - http://www.opensound.com
|
||||
Open Sound System.
|
||||
|
||||
PulseAudio - http://www.pulseaudio.org/
|
||||
An advanced sound daemon. You will need libpulse.
|
||||
|
||||
JACK - http://www.jackaudio.org/
|
||||
A low-latency sound daemon.
|
||||
|
||||
libshout - http://www.icecast.org/
|
||||
For streaming to an Icecast or Shoutcast server.
|
||||
You also need an encoder: either libvorbisenc (ogg), or liblame (mp3).
|
||||
|
||||
OpenAL - http://kcat.strangesoft.net/openal.html
|
||||
Open Audio Library
|
||||
|
||||
|
||||
Optional Input Dependencies
|
||||
---------------------------
|
||||
|
||||
You will need at least one of these to compile MPD.
|
||||
|
||||
Most of these are available as packages on major distributions. Be sure to
|
||||
install both the library package as well as the development package.
|
||||
|
||||
MAD - http://www.underbit.com/products/mad/
|
||||
For MP3 support. You will need libmad, and optionally libid3tag if you want
|
||||
ID3 tag support.
|
||||
|
||||
libmpg123 - http://www.mpg123.de/
|
||||
Alternative for MP3 support.
|
||||
|
||||
Ogg Vorbis - http://www.xiph.org/ogg/vorbis/
|
||||
For Ogg Vorbis support. You will need libogg and libvorbis.
|
||||
|
||||
libopus - http://www.opus-codec.org/
|
||||
Opus codec support
|
||||
|
||||
FLAC - http://flac.sourceforge.net/
|
||||
For FLAC support. You will need version 1.2 or higher of libFLAC.
|
||||
|
||||
Audio File - http://www.68k.org/~michael/audiofile/
|
||||
For WAVE, AIFF, and AU support. You will need libaudiofile.
|
||||
|
||||
FAAD2 - http://www.audiocoding.com/
|
||||
For MP4/AAC support.
|
||||
|
||||
libmpcdec - http://www.musepack.net/
|
||||
For Musepack support.
|
||||
|
||||
MikMod - http://mikmod.raphnet.net/
|
||||
For MOD support. You will need libmikmod.
|
||||
|
||||
libavcodec, libavformat (ffmpeg or libav) - http://ffmpeg.mplayerhq.hu/ http://libav.org/
|
||||
Multi-codec library.
|
||||
|
||||
libsidplay2 - http://sidplay2.sourceforge.net/
|
||||
For C64 SID support.
|
||||
|
||||
libfluidsynth - http://fluidsynth.resonance.org/
|
||||
For MIDI support.
|
||||
|
||||
libwildmidi 0.2.3 - http://wildmidi.sourceforge.net/
|
||||
For MIDI support.
|
||||
|
||||
libsndfile - http://www.mega-nerd.com/libsndfile/
|
||||
WAVE, AIFF, and many others.
|
||||
|
||||
libwavpack - http://www.wavpack.com/
|
||||
For WavPack playback.
|
||||
|
||||
libadplug - http://adplug.sourceforge.net/
|
||||
For AdLib playback.
|
||||
|
||||
|
||||
Optional Miscellaneous Dependencies
|
||||
-----------------------------------
|
||||
|
||||
Avahi - http://www.avahi.org/
|
||||
For Zeroconf support.
|
||||
|
||||
libsamplerate - http://www.mega-nerd.com/SRC/
|
||||
For advanced samplerate conversions.
|
||||
|
||||
libcurl - http://curl.haxx.se/
|
||||
For playing HTTP streams.
|
||||
|
||||
libmms - https://launchpad.net/libmms
|
||||
For playing MMS streams.
|
||||
|
||||
SQLite - http://www.sqlite.org/
|
||||
For the sticker database.
|
||||
|
||||
libcdio - http://www.gnu.org/software/libcdio/
|
||||
For playing audio CDs.
|
||||
|
||||
libsystemd-daemon - http://freedesktop.org/wiki/Software/systemd/
|
||||
For systemd activation.
|
||||
|
||||
|
||||
pkg-config
|
||||
----------
|
||||
|
||||
MPD uses pkg-config to locate most external libraries. If you do not
|
||||
have pkg-config, or if your version of the library does not ship the
|
||||
".pc" file, you have to provide the library's build options in
|
||||
environment variables. These variables are documented in "./configure
|
||||
--help". Example:
|
||||
|
||||
FLAC_CFLAGS=-I/usr/include/FLAC FLAC_LIBS=-lFLAC ./configure
|
||||
|
||||
|
||||
Download
|
||||
--------
|
||||
|
||||
Get the latest release from of MPD from <http://www.musicpd.org/>.
|
||||
|
||||
Compile
|
||||
-------
|
||||
|
||||
1) unpack the archive
|
||||
|
||||
$ tar xf mpd-x.x.x.tar.xz
|
||||
|
||||
2) change to directory created
|
||||
|
||||
$ cd mpd-x.x.x
|
||||
|
||||
3) Run configure script (this will determine what dependencies you have)
|
||||
|
||||
$ ./configure
|
||||
|
||||
4) Compile
|
||||
|
||||
$ make
|
||||
|
||||
Install (Optional)
|
||||
-------
|
||||
|
||||
(as root)
|
||||
$ make install
|
||||
|
||||
Run
|
||||
---
|
||||
|
||||
1) run mpd:
|
||||
|
||||
$ mpd <config file>
|
||||
|
||||
First default is $XDG_CONFIG_HOME/mpd/mpd.conf then ~/.mpdconf then
|
||||
~/.mpd/mpd.conf then /etc/mpd.conf. If neither of these exist a mpd
|
||||
configuration file must be specified at runtime.
|
||||
|
||||
A sample config file is included with the source of MPD, mpdconf.example.
|
||||
|
||||
The first time MPD is run it will attempt to discover all music in your
|
||||
music root, recursively. This can be affected by the symbolic link
|
||||
options specified in the example mpd.conf.
|
||||
|
||||
Using MPD
|
||||
---------
|
||||
|
||||
You can download many different interfaces for MPD at
|
||||
|
||||
http://www.musicpd.org/clients/
|
||||
13
NEWS
13
NEWS
@@ -1,3 +1,16 @@
|
||||
ver 0.20.9 (2017/06/04)
|
||||
* decoder
|
||||
- ffmpeg: support *.adx
|
||||
* fix byte order detection on FreeBSD/aarch64
|
||||
* fix more random crashes when compiled with clang
|
||||
|
||||
ver 0.20.8 (2017/05/19)
|
||||
* output
|
||||
- osx: fix build failure due to missing "noexcept"
|
||||
* playlist
|
||||
- m3u: support MIME type `audio/mpegurl`
|
||||
* fix build failure with GCC 4.x
|
||||
|
||||
ver 0.20.7 (2017/05/15)
|
||||
* database
|
||||
- simple: fix false positive directory loop detection with NFS
|
||||
|
||||
@@ -7,7 +7,8 @@ server's audio device. The daemon stores info about all available music,
|
||||
and this info can be easily searched and retrieved. Player control, info
|
||||
retrieval, and playlist management can all be managed remotely.
|
||||
|
||||
For basic installation information see the INSTALL file.
|
||||
For basic installation instructions
|
||||
[read the manual](https://www.musicpd.org/doc/user/install.html).
|
||||
|
||||
# Users
|
||||
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
AC_PREREQ(2.60)
|
||||
|
||||
AC_INIT(mpd, 0.20.7, musicpd-dev-team@lists.sourceforge.net)
|
||||
AC_INIT(mpd, 0.20.9, musicpd-dev-team@lists.sourceforge.net)
|
||||
|
||||
VERSION_MAJOR=0
|
||||
VERSION_MINOR=20
|
||||
VERSION_REVISION=7
|
||||
VERSION_REVISION=9
|
||||
VERSION_EXTRA=0
|
||||
|
||||
AC_CONFIG_SRCDIR([src/Main.cxx])
|
||||
|
||||
182
doc/user.xml
182
doc/user.xml
@@ -80,8 +80,35 @@
|
||||
cd mpd-version</programlisting>
|
||||
|
||||
<para>
|
||||
Make sure that all the required libraries and build tools are
|
||||
installed. The <filename>INSTALL</filename> file has a list.
|
||||
In any case, you need:
|
||||
</para>
|
||||
|
||||
<itemizedlist>
|
||||
<listitem>
|
||||
<para>
|
||||
a C++14 compiler (e.g. <ulink
|
||||
url="http://gcc.gnu.org/">gcc 4.9</ulink> or <ulink
|
||||
url="http://clang.llvm.org/">clang 3.9</ulink>)
|
||||
</para>
|
||||
</listitem>
|
||||
|
||||
<listitem>
|
||||
<para>
|
||||
<ulink url="http://www.boost.org/">Boost 1.46</ulink>
|
||||
</para>
|
||||
</listitem>
|
||||
|
||||
<listitem>
|
||||
<para>
|
||||
<ulink url="https://www.freedesktop.org/wiki/Software/pkg-config/">pkg-config</ulink>
|
||||
</para>
|
||||
</listitem>
|
||||
</itemizedlist>
|
||||
|
||||
<para>
|
||||
Each plugin usually needs a codec library, which you also need
|
||||
to install. Check the plugin reference for details about
|
||||
required libraries.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
@@ -1035,6 +1062,40 @@ systemctl start mpd.socket</programlisting>
|
||||
</informaltable>
|
||||
</section>
|
||||
|
||||
<section id="stickers">
|
||||
<title>The Sticker Database</title>
|
||||
|
||||
<para>
|
||||
"Stickers" are pieces of information attached to songs.
|
||||
Some clients use them to store ratings and other volatile
|
||||
data. This feature requires <ulink
|
||||
url="http://www.sqlite.org/">SQLite</ulink>, compile-time
|
||||
configure option <parameter>--enable-sqlite</parameter>.
|
||||
</para>
|
||||
|
||||
<informaltable>
|
||||
<tgroup cols="2">
|
||||
<thead>
|
||||
<row>
|
||||
<entry>Setting</entry>
|
||||
<entry>Description</entry>
|
||||
</row>
|
||||
</thead>
|
||||
<tbody>
|
||||
<row>
|
||||
<entry>
|
||||
<varname>sticker_file</varname>
|
||||
<parameter>PATH</parameter>
|
||||
</entry>
|
||||
<entry>
|
||||
The location of the sticker database.
|
||||
</entry>
|
||||
</row>
|
||||
</tbody>
|
||||
</tgroup>
|
||||
</informaltable>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<title>Resource Limitations</title>
|
||||
|
||||
@@ -1165,6 +1226,55 @@ systemctl start mpd.socket</programlisting>
|
||||
</tgroup>
|
||||
</informaltable>
|
||||
</section>
|
||||
|
||||
<section id="zeroconf">
|
||||
<title>Zeroconf</title>
|
||||
|
||||
<para>
|
||||
If Zeroconf support (<ulink
|
||||
url="http://avahi.org/">Avahi</ulink> or Apple's Bonjour)
|
||||
was enabled at compile time with
|
||||
<parameter>--with-zeroconf=...</parameter>, MPD can announce
|
||||
its presence on the network. The following settings control
|
||||
this feature:
|
||||
</para>
|
||||
|
||||
<informaltable>
|
||||
<tgroup cols="2">
|
||||
<thead>
|
||||
<row>
|
||||
<entry>Setting</entry>
|
||||
<entry>Description</entry>
|
||||
</row>
|
||||
</thead>
|
||||
<tbody>
|
||||
|
||||
<row>
|
||||
<entry>
|
||||
<varname>zeroconf_enabled</varname>
|
||||
<parameter>yes|no</parameter>
|
||||
</entry>
|
||||
<entry>
|
||||
Enables or disables this feature. Default is
|
||||
<parameter>yes</parameter>.
|
||||
</entry>
|
||||
</row>
|
||||
|
||||
<row>
|
||||
<entry>
|
||||
<varname>zeroconf_name</varname>
|
||||
<parameter>NAME</parameter>
|
||||
</entry>
|
||||
<entry>
|
||||
The service name to publish via Zeroconf. The
|
||||
default is "<parameter>Music Player</parameter>".
|
||||
</entry>
|
||||
</row>
|
||||
|
||||
</tbody>
|
||||
</tgroup>
|
||||
</informaltable>
|
||||
</section>
|
||||
</section>
|
||||
</chapter>
|
||||
|
||||
@@ -2078,7 +2188,9 @@ run</programlisting>
|
||||
<title><varname>cdio_paranoia</varname></title>
|
||||
|
||||
<para>
|
||||
Plays audio CDs. The URI has the form:
|
||||
Plays audio CDs using <ulink
|
||||
url="http://www.gnu.org/software/libcdio/"><filename>libcdio</filename></ulink>.
|
||||
The URI has the form:
|
||||
"<filename>cdda://[DEVICE][/TRACK]</filename>". The
|
||||
simplest form <filename>cdda://</filename> plays the whole
|
||||
disc in the default drive.
|
||||
@@ -2114,7 +2226,8 @@ run</programlisting>
|
||||
<title><varname>curl</varname></title>
|
||||
|
||||
<para>
|
||||
Opens remote files or streams over HTTP.
|
||||
Opens remote files or streams over HTTP using <ulink
|
||||
url="http://curl.haxx.se/"><filename>libcurl</filename></ulink>.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
@@ -2207,7 +2320,8 @@ run</programlisting>
|
||||
<title><varname>mms</varname></title>
|
||||
|
||||
<para>
|
||||
Plays streams with the MMS protocol.
|
||||
Plays streams with the MMS protocol using <ulink
|
||||
url="https://launchpad.net/libmms"><filename>libmms</filename></ulink>.
|
||||
</para>
|
||||
</section>
|
||||
|
||||
@@ -2263,7 +2377,8 @@ run</programlisting>
|
||||
<title><varname>adplug</varname></title>
|
||||
|
||||
<para>
|
||||
Decodes AdLib files.
|
||||
Decodes AdLib files using <ulink
|
||||
url="http://adplug.sourceforge.net/">libadplug</ulink>.
|
||||
</para>
|
||||
|
||||
<informaltable>
|
||||
@@ -2294,8 +2409,8 @@ run</programlisting>
|
||||
<title><varname>audiofile</varname></title>
|
||||
|
||||
<para>
|
||||
Decodes WAV and AIFF files using
|
||||
<filename>libaudiofile</filename>.
|
||||
Decodes WAV and AIFF files using <ulink
|
||||
url="http://audiofile.68k.org/"><filename>libaudiofile</filename></ulink>.
|
||||
</para>
|
||||
</section>
|
||||
|
||||
@@ -2303,7 +2418,8 @@ run</programlisting>
|
||||
<title><varname>faad</varname></title>
|
||||
|
||||
<para>
|
||||
Decodes AAC files using <filename>libfaad</filename>.
|
||||
Decodes AAC files using <ulink
|
||||
url="http://www.audiocoding.com/"><filename>libfaad</filename></ulink>.
|
||||
</para>
|
||||
</section>
|
||||
|
||||
@@ -2311,8 +2427,8 @@ run</programlisting>
|
||||
<title><varname>ffmpeg</varname></title>
|
||||
|
||||
<para>
|
||||
Decodes various codecs using
|
||||
<application>FFmpeg</application>.
|
||||
Decodes various codecs using <ulink
|
||||
url="https://ffmpeg.org/"><application>FFmpeg</application></ulink>.
|
||||
</para>
|
||||
|
||||
<informaltable>
|
||||
@@ -2363,7 +2479,7 @@ run</programlisting>
|
||||
|
||||
<para>
|
||||
Decodes FLAC files using
|
||||
<application>libFLAC</application>.
|
||||
<ulink url="https://xiph.org/flac/"><application>libFLAC</application></ulink>.
|
||||
</para>
|
||||
</section>
|
||||
|
||||
@@ -2483,7 +2599,8 @@ run</programlisting>
|
||||
<title><varname>mad</varname></title>
|
||||
|
||||
<para>
|
||||
Decodes MP3 files using <application>libmad</application>.
|
||||
Decodes MP3 files using <ulink
|
||||
url="http://www.underbit.com/products/mad/"><application>libmad</application></ulink>.
|
||||
</para>
|
||||
</section>
|
||||
|
||||
@@ -2563,8 +2680,8 @@ run</programlisting>
|
||||
<title><varname>mpcdec</varname></title>
|
||||
|
||||
<para>
|
||||
Decodes Musepack files using
|
||||
<application>libmpcdec</application>.
|
||||
Decodes Musepack files using <ulink
|
||||
url="http://www.musepack.net/"><application>libmpcdec</application></ulink>.
|
||||
</para>
|
||||
</section>
|
||||
|
||||
@@ -2572,7 +2689,17 @@ run</programlisting>
|
||||
<title><varname>mpg123</varname></title>
|
||||
|
||||
<para>
|
||||
Decodes MP3 files using <application>libmpg123</application>.
|
||||
Decodes MP3 files using <ulink
|
||||
url="http://www.mpg123.de/"><application>libmpg123</application></ulink>.
|
||||
</para>
|
||||
</section>
|
||||
|
||||
<section id="opus_decoder">
|
||||
<title><varname>opus</varname></title>
|
||||
|
||||
<para>
|
||||
Decodes Opus files using <ulink
|
||||
url="http://www.opus-codec.org/"><application>libopus</application></ulink>.
|
||||
</para>
|
||||
</section>
|
||||
|
||||
@@ -2592,8 +2719,8 @@ run</programlisting>
|
||||
<title><varname>sidplay</varname></title>
|
||||
|
||||
<para>
|
||||
C64 SID decoder based on
|
||||
<application>libsidplay</application>.
|
||||
C64 SID decoder based on <ulink
|
||||
url="http://sidplay2.sourceforge.net/"><application>libsidplay</application></ulink>.
|
||||
</para>
|
||||
|
||||
<informaltable>
|
||||
@@ -2649,8 +2776,8 @@ run</programlisting>
|
||||
<title><varname>sndfile</varname></title>
|
||||
|
||||
<para>
|
||||
Decodes WAV and AIFF files using
|
||||
<filename>libsndfile</filename>.
|
||||
Decodes WAV and AIFF files using <ulink
|
||||
url="http://www.mega-nerd.com/libsndfile/"><filename>libsndfile</filename></ulink>.
|
||||
</para>
|
||||
</section>
|
||||
|
||||
@@ -2658,8 +2785,8 @@ run</programlisting>
|
||||
<title><varname>vorbis</varname></title>
|
||||
|
||||
<para>
|
||||
Decodes Ogg-Vorbis files using
|
||||
<application>libvorbis</application>.
|
||||
Decodes Ogg-Vorbis files using <ulink
|
||||
url="http://www.xiph.org/ogg/vorbis/"><application>libvorbis</application></ulink>.
|
||||
</para>
|
||||
</section>
|
||||
|
||||
@@ -2668,7 +2795,7 @@ run</programlisting>
|
||||
|
||||
<para>
|
||||
Decodes WavPack files using
|
||||
<application>libwavpack</application>.
|
||||
<ulink url="http://www.wavpack.com/"><application>libwavpack</application></ulink>.
|
||||
</para>
|
||||
</section>
|
||||
|
||||
@@ -3492,7 +3619,7 @@ run</programlisting>
|
||||
</informaltable>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<section id="jack_output">
|
||||
<title><varname>jack</varname></title>
|
||||
|
||||
<para>
|
||||
@@ -3772,7 +3899,7 @@ run</programlisting>
|
||||
</informaltable>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<section id="openal_output">
|
||||
<title><varname>openal</varname></title>
|
||||
|
||||
<para>
|
||||
@@ -3923,7 +4050,7 @@ run</programlisting>
|
||||
<para>
|
||||
The <varname>pulse</varname> plugin connects to a <ulink
|
||||
url="http://www.freedesktop.org/wiki/Software/PulseAudio/"><application>PulseAudio</application></ulink>
|
||||
server.
|
||||
server. Requires <filename>libpulse</filename>.
|
||||
</para>
|
||||
|
||||
<informaltable>
|
||||
@@ -4111,7 +4238,8 @@ run</programlisting>
|
||||
url="http://www.shoutcast.com/"><application>ShoutCast</application></ulink>
|
||||
or <ulink
|
||||
url="http://icecast.org/"><application>IceCast</application></ulink>
|
||||
server. It forwards tags to this server.
|
||||
server using <filename>libshout</filename>. It forwards
|
||||
tags to this server.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
|
||||
@@ -58,8 +58,8 @@ libmad = AutotoolsProject(
|
||||
)
|
||||
|
||||
ffmpeg = FfmpegProject(
|
||||
'http://ffmpeg.org/releases/ffmpeg-3.3.tar.xz',
|
||||
'599e7f7c017221c22011c4037b88bdcd1c47cd40c1e466838bc3c465f3e9569d',
|
||||
'http://ffmpeg.org/releases/ffmpeg-3.3.1.tar.xz',
|
||||
'b702a7fc656ac23e276b8c823a2f646e4e6f6309bb2788435a708e69bea98f2f',
|
||||
'lib/libavcodec.a',
|
||||
[
|
||||
'--disable-shared', '--enable-static',
|
||||
|
||||
@@ -127,7 +127,7 @@ struct AudioFormat {
|
||||
void ApplyMask(AudioFormat mask) noexcept;
|
||||
|
||||
gcc_pure
|
||||
AudioFormat WithMask(AudioFormat mask) const {
|
||||
AudioFormat WithMask(AudioFormat mask) const noexcept {
|
||||
AudioFormat result = *this;
|
||||
result.ApplyMask(mask);
|
||||
return result;
|
||||
|
||||
@@ -152,7 +152,7 @@ public:
|
||||
bool IsRemote() const noexcept;
|
||||
|
||||
gcc_pure
|
||||
bool IsFile() const {
|
||||
bool IsFile() const noexcept {
|
||||
return !IsRemote();
|
||||
}
|
||||
|
||||
@@ -162,11 +162,11 @@ public:
|
||||
gcc_pure
|
||||
bool IsInDatabase() const noexcept;
|
||||
|
||||
const Tag &GetTag() const {
|
||||
const Tag &GetTag() const noexcept {
|
||||
return tag;
|
||||
}
|
||||
|
||||
Tag &WritableTag() {
|
||||
Tag &WritableTag() noexcept {
|
||||
return tag;
|
||||
}
|
||||
|
||||
|
||||
12
src/Main.cxx
12
src/Main.cxx
@@ -121,8 +121,16 @@ static constexpr size_t KILOBYTE = 1024;
|
||||
static constexpr size_t MEGABYTE = 1024 * KILOBYTE;
|
||||
|
||||
static constexpr size_t DEFAULT_BUFFER_SIZE = 4 * MEGABYTE;
|
||||
static constexpr size_t MIN_BUFFER_SIZE = std::max(CHUNK_SIZE * 32,
|
||||
64 * KILOBYTE);
|
||||
|
||||
static
|
||||
#if GCC_OLDER_THAN(5,0)
|
||||
/* gcc 4.x has no "constexpr" for std::max() */
|
||||
const
|
||||
#else
|
||||
constexpr
|
||||
#endif
|
||||
size_t MIN_BUFFER_SIZE = std::max(CHUNK_SIZE * 32,
|
||||
64 * KILOBYTE);
|
||||
|
||||
static constexpr unsigned DEFAULT_BUFFER_BEFORE_PLAY = 10;
|
||||
|
||||
|
||||
@@ -31,45 +31,45 @@ class MixRampInfo {
|
||||
public:
|
||||
MixRampInfo() = default;
|
||||
|
||||
void Clear() {
|
||||
void Clear() noexcept {
|
||||
start.clear();
|
||||
end.clear();
|
||||
}
|
||||
|
||||
gcc_pure
|
||||
bool IsDefined() const {
|
||||
bool IsDefined() const noexcept {
|
||||
return !start.empty() || !end.empty();
|
||||
}
|
||||
|
||||
gcc_pure
|
||||
const char *GetStart() const {
|
||||
const char *GetStart() const noexcept {
|
||||
return start.empty() ? nullptr : start.c_str();
|
||||
}
|
||||
|
||||
gcc_pure
|
||||
const char *GetEnd() const {
|
||||
const char *GetEnd() const noexcept {
|
||||
return end.empty() ? nullptr : end.c_str();
|
||||
}
|
||||
|
||||
void SetStart(const char *new_value) {
|
||||
void SetStart(const char *new_value) noexcept {
|
||||
if (new_value == nullptr)
|
||||
start.clear();
|
||||
else
|
||||
start = new_value;
|
||||
}
|
||||
|
||||
void SetStart(std::string &&new_value) {
|
||||
void SetStart(std::string &&new_value) noexcept {
|
||||
start = std::move(new_value);
|
||||
}
|
||||
|
||||
void SetEnd(const char *new_value) {
|
||||
void SetEnd(const char *new_value) noexcept {
|
||||
if (new_value == nullptr)
|
||||
end.clear();
|
||||
else
|
||||
end = new_value;
|
||||
}
|
||||
|
||||
void SetEnd(std::string &&new_value) {
|
||||
void SetEnd(std::string &&new_value) noexcept {
|
||||
end = std::move(new_value);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -60,7 +60,7 @@ public:
|
||||
* music_buffer_new().
|
||||
*/
|
||||
gcc_pure
|
||||
unsigned GetSize() const {
|
||||
unsigned GetSize() const noexcept {
|
||||
return buffer.GetCapacity();
|
||||
}
|
||||
|
||||
|
||||
@@ -39,7 +39,7 @@ MusicPipe::Contains(const MusicChunk *chunk) const noexcept
|
||||
#endif
|
||||
|
||||
MusicChunk *
|
||||
MusicPipe::Shift()
|
||||
MusicPipe::Shift() noexcept
|
||||
{
|
||||
const std::lock_guard<Mutex> protect(mutex);
|
||||
|
||||
@@ -73,7 +73,7 @@ MusicPipe::Shift()
|
||||
}
|
||||
|
||||
void
|
||||
MusicPipe::Clear(MusicBuffer &buffer)
|
||||
MusicPipe::Clear(MusicBuffer &buffer) noexcept
|
||||
{
|
||||
MusicChunk *chunk;
|
||||
|
||||
@@ -82,7 +82,7 @@ MusicPipe::Clear(MusicBuffer &buffer)
|
||||
}
|
||||
|
||||
void
|
||||
MusicPipe::Push(MusicChunk *chunk)
|
||||
MusicPipe::Push(MusicChunk *chunk) noexcept
|
||||
{
|
||||
assert(!chunk->IsEmpty());
|
||||
assert(chunk->length == 0 || chunk->audio_format.IsValid());
|
||||
|
||||
@@ -77,7 +77,7 @@ public:
|
||||
* audio_format.
|
||||
*/
|
||||
gcc_pure
|
||||
bool CheckFormat(AudioFormat other) const {
|
||||
bool CheckFormat(AudioFormat other) const noexcept {
|
||||
return !audio_format.IsDefined() ||
|
||||
audio_format == other;
|
||||
}
|
||||
@@ -94,37 +94,37 @@ public:
|
||||
* nullptr if the pipe is empty.
|
||||
*/
|
||||
gcc_pure
|
||||
const MusicChunk *Peek() const {
|
||||
const MusicChunk *Peek() const noexcept {
|
||||
return head;
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes the first chunk from the head, and returns it.
|
||||
*/
|
||||
MusicChunk *Shift();
|
||||
MusicChunk *Shift() noexcept;
|
||||
|
||||
/**
|
||||
* Clears the whole pipe and returns the chunks to the buffer.
|
||||
*
|
||||
* @param buffer the buffer object to return the chunks to
|
||||
*/
|
||||
void Clear(MusicBuffer &buffer);
|
||||
void Clear(MusicBuffer &buffer) noexcept;
|
||||
|
||||
/**
|
||||
* Pushes a chunk to the tail of the pipe.
|
||||
*/
|
||||
void Push(MusicChunk *chunk);
|
||||
void Push(MusicChunk *chunk) noexcept;
|
||||
|
||||
/**
|
||||
* Returns the number of chunks currently in this pipe.
|
||||
*/
|
||||
gcc_pure
|
||||
unsigned GetSize() const {
|
||||
unsigned GetSize() const noexcept {
|
||||
return size;
|
||||
}
|
||||
|
||||
gcc_pure
|
||||
bool IsEmpty() const {
|
||||
bool IsEmpty() const noexcept {
|
||||
return GetSize() == 0;
|
||||
}
|
||||
};
|
||||
|
||||
@@ -100,7 +100,7 @@ public:
|
||||
}
|
||||
|
||||
gcc_pure
|
||||
bool IsExpired() const {
|
||||
bool IsExpired() const noexcept {
|
||||
return !FullyBufferedSocket::IsDefined();
|
||||
}
|
||||
|
||||
|
||||
@@ -45,68 +45,57 @@ public:
|
||||
: default_value;
|
||||
}
|
||||
|
||||
gcc_pure
|
||||
int ParseInt(unsigned idx) const {
|
||||
assert(idx < size);
|
||||
return ParseCommandArgInt(data[idx]);
|
||||
}
|
||||
|
||||
gcc_pure
|
||||
int ParseInt(unsigned idx, int min_value, int max_value) const {
|
||||
assert(idx < size);
|
||||
return ParseCommandArgInt(data[idx], min_value, max_value);
|
||||
}
|
||||
|
||||
gcc_pure
|
||||
int ParseUnsigned(unsigned idx) const {
|
||||
assert(idx < size);
|
||||
return ParseCommandArgUnsigned(data[idx]);
|
||||
}
|
||||
|
||||
gcc_pure
|
||||
int ParseUnsigned(unsigned idx, unsigned max_value) const {
|
||||
assert(idx < size);
|
||||
return ParseCommandArgUnsigned(data[idx], max_value);
|
||||
}
|
||||
|
||||
gcc_pure
|
||||
bool ParseBool(unsigned idx) const {
|
||||
assert(idx < size);
|
||||
return ParseCommandArgBool(data[idx]);
|
||||
}
|
||||
|
||||
gcc_pure
|
||||
RangeArg ParseRange(unsigned idx) const {
|
||||
assert(idx < size);
|
||||
return ParseCommandArgRange(data[idx]);
|
||||
}
|
||||
|
||||
gcc_pure
|
||||
float ParseFloat(unsigned idx) const {
|
||||
assert(idx < size);
|
||||
return ParseCommandArgFloat(data[idx]);
|
||||
}
|
||||
|
||||
gcc_pure
|
||||
SongTime ParseSongTime(unsigned idx) const {
|
||||
assert(idx < size);
|
||||
return ParseCommandArgSongTime(data[idx]);
|
||||
}
|
||||
|
||||
gcc_pure
|
||||
SignedSongTime ParseSignedSongTime(unsigned idx) const {
|
||||
assert(idx < size);
|
||||
return ParseCommandArgSignedSongTime(data[idx]);
|
||||
}
|
||||
|
||||
gcc_pure
|
||||
int ParseOptional(unsigned idx, int default_value) const {
|
||||
return idx < size
|
||||
? ParseInt(idx)
|
||||
: default_value;
|
||||
}
|
||||
|
||||
gcc_pure
|
||||
RangeArg ParseOptional(unsigned idx, RangeArg default_value) const {
|
||||
return idx < size
|
||||
? ParseRange(idx)
|
||||
|
||||
@@ -82,12 +82,12 @@ struct ConfigBlock {
|
||||
* object that was synthesized and not loaded from a
|
||||
* configuration file.
|
||||
*/
|
||||
bool IsNull() const {
|
||||
bool IsNull() const noexcept {
|
||||
return line < 0;
|
||||
}
|
||||
|
||||
gcc_pure
|
||||
bool IsEmpty() const {
|
||||
bool IsEmpty() const noexcept {
|
||||
return block_params.empty();
|
||||
}
|
||||
|
||||
|
||||
@@ -29,7 +29,7 @@
|
||||
|
||||
struct StringLess {
|
||||
gcc_pure
|
||||
bool operator()(const char *a, const char *b) const {
|
||||
bool operator()(const char *a, const char *b) const noexcept {
|
||||
return strcmp(a, b) < 0;
|
||||
}
|
||||
};
|
||||
|
||||
@@ -106,7 +106,6 @@ public:
|
||||
TagType tag_type, tag_mask_t group_mask,
|
||||
VisitTag visit_tag) const = 0;
|
||||
|
||||
gcc_pure
|
||||
virtual DatabaseStats GetStats(const DatabaseSelection &selection) const = 0;
|
||||
|
||||
/**
|
||||
@@ -127,7 +126,7 @@ public:
|
||||
* Returns 0 if that is not not known/available.
|
||||
*/
|
||||
gcc_pure
|
||||
virtual time_t GetUpdateStamp() const = 0;
|
||||
virtual time_t GetUpdateStamp() const noexcept = 0;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
@@ -44,16 +44,16 @@ struct LightDirectory {
|
||||
constexpr LightDirectory(const char *_uri, time_t _mtime)
|
||||
:uri(_uri), mtime(_mtime) {}
|
||||
|
||||
static constexpr LightDirectory Root() {
|
||||
static constexpr LightDirectory Root() noexcept {
|
||||
return LightDirectory("", 0);
|
||||
}
|
||||
|
||||
bool IsRoot() const {
|
||||
bool IsRoot() const noexcept {
|
||||
return *uri == 0;
|
||||
}
|
||||
|
||||
gcc_pure
|
||||
const char *GetPath() const {
|
||||
const char *GetPath() const noexcept {
|
||||
return uri;
|
||||
}
|
||||
};
|
||||
|
||||
@@ -45,7 +45,7 @@ struct PlaylistInfo {
|
||||
constexpr CompareName(const char *_name):name(_name) {}
|
||||
|
||||
gcc_pure
|
||||
bool operator()(const PlaylistInfo &pi) const {
|
||||
bool operator()(const PlaylistInfo &pi) const noexcept {
|
||||
return pi.name.compare(name) == 0;
|
||||
}
|
||||
};
|
||||
|
||||
@@ -127,7 +127,7 @@ public:
|
||||
|
||||
unsigned Update(const char *uri_utf8, bool discard) override;
|
||||
|
||||
time_t GetUpdateStamp() const override {
|
||||
time_t GetUpdateStamp() const noexcept override {
|
||||
return update_stamp;
|
||||
}
|
||||
|
||||
|
||||
@@ -187,7 +187,7 @@ public:
|
||||
}
|
||||
|
||||
gcc_pure
|
||||
const char *GetPath() const {
|
||||
const char *GetPath() const noexcept {
|
||||
return path.c_str();
|
||||
}
|
||||
|
||||
|
||||
@@ -76,7 +76,7 @@ public:
|
||||
const ConfigBlock &block);
|
||||
|
||||
gcc_pure
|
||||
Directory &GetRoot() {
|
||||
Directory &GetRoot() noexcept {
|
||||
assert(root != NULL);
|
||||
|
||||
return *root;
|
||||
@@ -125,7 +125,7 @@ public:
|
||||
|
||||
DatabaseStats GetStats(const DatabaseSelection &selection) const override;
|
||||
|
||||
time_t GetUpdateStamp() const override {
|
||||
time_t GetUpdateStamp() const noexcept override {
|
||||
return mtime;
|
||||
}
|
||||
|
||||
|
||||
@@ -60,7 +60,7 @@ public:
|
||||
* Parent's ObjectId
|
||||
*/
|
||||
std::string parent_id;
|
||||
|
||||
|
||||
std::string url;
|
||||
|
||||
/**
|
||||
@@ -80,7 +80,7 @@ public:
|
||||
|
||||
UPnPDirObject &operator=(UPnPDirObject &&) = default;
|
||||
|
||||
void Clear() {
|
||||
void Clear() noexcept {
|
||||
id.clear();
|
||||
parent_id.clear();
|
||||
url.clear();
|
||||
@@ -90,7 +90,7 @@ public:
|
||||
}
|
||||
|
||||
gcc_pure
|
||||
bool Check() const {
|
||||
bool Check() const noexcept {
|
||||
return !id.empty() && !parent_id.empty() && !name.empty() &&
|
||||
(type != UPnPDirObject::Type::ITEM ||
|
||||
item_class != UPnPDirObject::ItemClass::UNKNOWN);
|
||||
|
||||
@@ -93,7 +93,7 @@ public:
|
||||
|
||||
DatabaseStats GetStats(const DatabaseSelection &selection) const override;
|
||||
|
||||
time_t GetUpdateStamp() const override {
|
||||
time_t GetUpdateStamp() const noexcept override {
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
#include <string.h>
|
||||
|
||||
bool
|
||||
ExcludeList::LoadFile(Path path_fs)
|
||||
ExcludeList::LoadFile(Path path_fs) noexcept
|
||||
try {
|
||||
#ifdef HAVE_CLASS_GLOB
|
||||
TextFile file(path_fs);
|
||||
@@ -67,7 +67,7 @@ try {
|
||||
}
|
||||
|
||||
bool
|
||||
ExcludeList::Check(Path name_fs) const
|
||||
ExcludeList::Check(Path name_fs) const noexcept
|
||||
{
|
||||
assert(!name_fs.IsNull());
|
||||
|
||||
|
||||
@@ -50,7 +50,7 @@ public:
|
||||
:parent(&_parent) {}
|
||||
|
||||
gcc_pure
|
||||
bool IsEmpty() const {
|
||||
bool IsEmpty() const noexcept {
|
||||
#ifdef HAVE_CLASS_GLOB
|
||||
return ((parent == nullptr) || parent->IsEmpty()) && patterns.empty();
|
||||
#else
|
||||
@@ -62,13 +62,13 @@ public:
|
||||
/**
|
||||
* Loads and parses a .mpdignore file.
|
||||
*/
|
||||
bool LoadFile(Path path_fs);
|
||||
bool LoadFile(Path path_fs) noexcept;
|
||||
|
||||
/**
|
||||
* Checks whether one of the patterns in the .mpdignore file matches
|
||||
* the specified file name.
|
||||
*/
|
||||
bool Check(Path name_fs) const;
|
||||
bool Check(Path name_fs) const noexcept;
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -277,7 +277,7 @@ DecoderBridge::Ready(const AudioFormat audio_format,
|
||||
}
|
||||
|
||||
DecoderCommand
|
||||
DecoderBridge::GetCommand()
|
||||
DecoderBridge::GetCommand() noexcept
|
||||
{
|
||||
return LockGetVirtualCommand();
|
||||
}
|
||||
@@ -326,7 +326,7 @@ DecoderBridge::CommandFinished()
|
||||
}
|
||||
|
||||
SongTime
|
||||
DecoderBridge::GetSeekTime()
|
||||
DecoderBridge::GetSeekTime() noexcept
|
||||
{
|
||||
assert(dc.pipe != nullptr);
|
||||
|
||||
@@ -341,7 +341,7 @@ DecoderBridge::GetSeekTime()
|
||||
}
|
||||
|
||||
uint64_t
|
||||
DecoderBridge::GetSeekFrame()
|
||||
DecoderBridge::GetSeekFrame() noexcept
|
||||
{
|
||||
return GetSeekTime().ToScale<uint64_t>(dc.in_audio_format.sample_rate);
|
||||
}
|
||||
|
||||
@@ -134,10 +134,10 @@ public:
|
||||
/* virtual methods from DecoderClient */
|
||||
void Ready(AudioFormat audio_format,
|
||||
bool seekable, SignedSongTime duration) override;
|
||||
DecoderCommand GetCommand() override;
|
||||
DecoderCommand GetCommand() noexcept override;
|
||||
void CommandFinished() override;
|
||||
SongTime GetSeekTime() override;
|
||||
uint64_t GetSeekFrame() override;
|
||||
SongTime GetSeekTime() noexcept override;
|
||||
uint64_t GetSeekFrame() noexcept override;
|
||||
void SeekError() override;
|
||||
InputStreamPtr OpenUri(const char *uri) override;
|
||||
size_t Read(InputStream &is, void *buffer, size_t length) override;
|
||||
|
||||
@@ -58,7 +58,7 @@ public:
|
||||
* command pending
|
||||
*/
|
||||
gcc_pure
|
||||
virtual DecoderCommand GetCommand() = 0;
|
||||
virtual DecoderCommand GetCommand() noexcept = 0;
|
||||
|
||||
/**
|
||||
* Called by the decoder when it has performed the requested command
|
||||
@@ -73,7 +73,7 @@ public:
|
||||
* @return the destination position for the seek in milliseconds
|
||||
*/
|
||||
gcc_pure
|
||||
virtual SongTime GetSeekTime() = 0;
|
||||
virtual SongTime GetSeekTime() noexcept = 0;
|
||||
|
||||
/**
|
||||
* Call this when you have received the DecoderCommand::SEEK command.
|
||||
@@ -81,7 +81,7 @@ public:
|
||||
* @return the destination position for the seek in frames
|
||||
*/
|
||||
gcc_pure
|
||||
virtual uint64_t GetSeekFrame() = 0;
|
||||
virtual uint64_t GetSeekFrame() noexcept = 0;
|
||||
|
||||
/**
|
||||
* Call this instead of CommandFinished() when seeking has
|
||||
|
||||
@@ -54,11 +54,11 @@ public:
|
||||
size_t _size)
|
||||
:client(_client), is(_is), buffer(_size) {}
|
||||
|
||||
const InputStream &GetStream() const {
|
||||
const InputStream &GetStream() const noexcept {
|
||||
return is;
|
||||
}
|
||||
|
||||
void Clear() {
|
||||
void Clear() noexcept {
|
||||
buffer.Clear();
|
||||
}
|
||||
|
||||
@@ -75,7 +75,7 @@ public:
|
||||
* How many bytes are stored in the buffer?
|
||||
*/
|
||||
gcc_pure
|
||||
size_t GetAvailable() const {
|
||||
size_t GetAvailable() const noexcept {
|
||||
return buffer.GetAvailable();
|
||||
}
|
||||
|
||||
@@ -84,7 +84,7 @@ public:
|
||||
* you have to call Consume() to do that. The returned buffer
|
||||
* becomes invalid after a Fill() or a Consume() call.
|
||||
*/
|
||||
ConstBuffer<void> Read() const {
|
||||
ConstBuffer<void> Read() const noexcept {
|
||||
auto r = buffer.Read();
|
||||
return { r.data, r.size };
|
||||
}
|
||||
@@ -102,7 +102,7 @@ public:
|
||||
*
|
||||
* @param nbytes the number of bytes to consume
|
||||
*/
|
||||
void Consume(size_t nbytes) {
|
||||
void Consume(size_t nbytes) noexcept {
|
||||
buffer.Consume(nbytes);
|
||||
}
|
||||
|
||||
|
||||
@@ -227,29 +227,29 @@ struct DecoderControl {
|
||||
}
|
||||
|
||||
gcc_pure
|
||||
bool LockIsIdle() const {
|
||||
bool LockIsIdle() const noexcept {
|
||||
const std::lock_guard<Mutex> protect(mutex);
|
||||
return IsIdle();
|
||||
}
|
||||
|
||||
bool IsStarting() const {
|
||||
bool IsStarting() const noexcept {
|
||||
return state == DecoderState::START;
|
||||
}
|
||||
|
||||
gcc_pure
|
||||
bool LockIsStarting() const {
|
||||
bool LockIsStarting() const noexcept {
|
||||
const std::lock_guard<Mutex> protect(mutex);
|
||||
return IsStarting();
|
||||
}
|
||||
|
||||
bool HasFailed() const {
|
||||
bool HasFailed() const noexcept {
|
||||
assert(command == DecoderCommand::NONE);
|
||||
|
||||
return state == DecoderState::ERROR;
|
||||
}
|
||||
|
||||
gcc_pure
|
||||
bool LockHasFailed() const {
|
||||
bool LockHasFailed() const noexcept {
|
||||
const std::lock_guard<Mutex> protect(mutex);
|
||||
return HasFailed();
|
||||
}
|
||||
|
||||
@@ -881,7 +881,8 @@ ffmpeg_scan_stream(InputStream &is,
|
||||
* more formats.
|
||||
*/
|
||||
static const char *const ffmpeg_suffixes[] = {
|
||||
"16sv", "3g2", "3gp", "4xm", "8svx", "aa3", "aac", "ac3", "afc", "aif",
|
||||
"16sv", "3g2", "3gp", "4xm", "8svx",
|
||||
"aa3", "aac", "ac3", "adx", "afc", "aif",
|
||||
"aifc", "aiff", "al", "alaw", "amr", "anim", "apc", "ape", "asf",
|
||||
"atrac", "au", "aud", "avi", "avm2", "avs", "bap", "bfi", "c93", "cak",
|
||||
"cin", "cmv", "cpk", "daud", "dct", "divx", "dts", "dv", "dvd", "dxa",
|
||||
@@ -934,6 +935,7 @@ static const char *const ffmpeg_mime_types[] = {
|
||||
"audio/x-16sv",
|
||||
"audio/x-aac",
|
||||
"audio/x-ac3",
|
||||
"audio/x-adx",
|
||||
"audio/x-aiff"
|
||||
"audio/x-alaw",
|
||||
"audio/x-au",
|
||||
|
||||
@@ -42,25 +42,27 @@ public:
|
||||
return chain;
|
||||
}
|
||||
|
||||
bool Read(const char *path) {
|
||||
bool Read(const char *path) noexcept {
|
||||
return ::FLAC__metadata_chain_read(chain, path);
|
||||
}
|
||||
|
||||
bool Read(FLAC__IOHandle handle, FLAC__IOCallbacks callbacks) {
|
||||
bool Read(FLAC__IOHandle handle,
|
||||
FLAC__IOCallbacks callbacks) noexcept {
|
||||
return ::FLAC__metadata_chain_read_with_callbacks(chain,
|
||||
handle,
|
||||
callbacks);
|
||||
}
|
||||
|
||||
bool Read(InputStream &is) {
|
||||
bool Read(InputStream &is) noexcept {
|
||||
return Read(::ToFlacIOHandle(is), ::GetFlacIOCallbacks(is));
|
||||
}
|
||||
|
||||
bool ReadOgg(const char *path) {
|
||||
bool ReadOgg(const char *path) noexcept {
|
||||
return ::FLAC__metadata_chain_read_ogg(chain, path);
|
||||
}
|
||||
|
||||
bool ReadOgg(FLAC__IOHandle handle, FLAC__IOCallbacks callbacks) {
|
||||
bool ReadOgg(FLAC__IOHandle handle,
|
||||
FLAC__IOCallbacks callbacks) noexcept {
|
||||
return ::FLAC__metadata_chain_read_ogg_with_callbacks(chain,
|
||||
handle,
|
||||
callbacks);
|
||||
@@ -71,12 +73,12 @@ public:
|
||||
}
|
||||
|
||||
gcc_pure
|
||||
FLAC__Metadata_ChainStatus GetStatus() const {
|
||||
FLAC__Metadata_ChainStatus GetStatus() const noexcept {
|
||||
return ::FLAC__metadata_chain_status(chain);
|
||||
}
|
||||
|
||||
gcc_pure
|
||||
const char *GetStatusString() const {
|
||||
const char *GetStatusString() const noexcept {
|
||||
return FLAC__Metadata_ChainStatusString[GetStatus()];
|
||||
}
|
||||
|
||||
@@ -99,12 +101,12 @@ public:
|
||||
::FLAC__metadata_iterator_delete(iterator);
|
||||
}
|
||||
|
||||
bool Next() {
|
||||
bool Next() noexcept {
|
||||
return ::FLAC__metadata_iterator_next(iterator);
|
||||
}
|
||||
|
||||
gcc_pure
|
||||
FLAC__StreamMetadata *GetBlock() {
|
||||
FLAC__StreamMetadata *GetBlock() noexcept {
|
||||
return ::FLAC__metadata_iterator_get_block(iterator);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -52,14 +52,14 @@ static constexpr unsigned opus_output_buffer_frames = opus_sample_rate / 4;
|
||||
|
||||
gcc_pure
|
||||
static bool
|
||||
IsOpusHead(const ogg_packet &packet)
|
||||
IsOpusHead(const ogg_packet &packet) noexcept
|
||||
{
|
||||
return packet.bytes >= 8 && memcmp(packet.packet, "OpusHead", 8) == 0;
|
||||
}
|
||||
|
||||
gcc_pure
|
||||
static bool
|
||||
IsOpusTags(const ogg_packet &packet)
|
||||
IsOpusTags(const ogg_packet &packet) noexcept
|
||||
{
|
||||
return packet.bytes >= 8 && memcmp(packet.packet, "OpusTags", 8) == 0;
|
||||
}
|
||||
|
||||
@@ -199,7 +199,7 @@ public:
|
||||
* Are we currently running inside this EventLoop's thread?
|
||||
*/
|
||||
gcc_pure
|
||||
bool IsInside() const {
|
||||
bool IsInside() const noexcept {
|
||||
assert(!thread.IsNull());
|
||||
|
||||
return thread.IsInside();
|
||||
@@ -207,7 +207,7 @@ public:
|
||||
|
||||
#ifndef NDEBUG
|
||||
gcc_pure
|
||||
bool IsInsideOrVirgin() const {
|
||||
bool IsInsideOrVirgin() const noexcept {
|
||||
return virgin || IsInside();
|
||||
}
|
||||
#endif
|
||||
@@ -219,7 +219,7 @@ public:
|
||||
* are not yet/anymore handled.
|
||||
*/
|
||||
gcc_pure
|
||||
bool IsInsideOrNull() const {
|
||||
bool IsInsideOrNull() const noexcept {
|
||||
return thread.IsNull() || thread.IsInside();
|
||||
}
|
||||
};
|
||||
|
||||
@@ -77,12 +77,12 @@ public:
|
||||
* @see IsNull()
|
||||
*/
|
||||
gcc_const
|
||||
static AllocatedPath Null() {
|
||||
static AllocatedPath Null() noexcept {
|
||||
return AllocatedPath(nullptr);
|
||||
}
|
||||
|
||||
gcc_pure
|
||||
operator Path() const {
|
||||
operator Path() const noexcept {
|
||||
return Path::FromFS(c_str());
|
||||
}
|
||||
|
||||
@@ -90,36 +90,39 @@ public:
|
||||
* Join two path components with the path separator.
|
||||
*/
|
||||
gcc_pure gcc_nonnull_all
|
||||
static AllocatedPath Build(const_pointer_type a, const_pointer_type b) {
|
||||
static AllocatedPath Build(const_pointer_type a,
|
||||
const_pointer_type b) noexcept {
|
||||
return Build(a, PathTraitsFS::GetLength(a),
|
||||
b, PathTraitsFS::GetLength(b));
|
||||
}
|
||||
|
||||
gcc_pure gcc_nonnull_all
|
||||
static AllocatedPath Build(Path a, const_pointer_type b) {
|
||||
static AllocatedPath Build(Path a, const_pointer_type b) noexcept {
|
||||
return Build(a.c_str(), b);
|
||||
}
|
||||
|
||||
gcc_pure gcc_nonnull_all
|
||||
static AllocatedPath Build(Path a, Path b) {
|
||||
static AllocatedPath Build(Path a, Path b) noexcept {
|
||||
return Build(a, b.c_str());
|
||||
}
|
||||
|
||||
gcc_pure gcc_nonnull_all
|
||||
static AllocatedPath Build(const_pointer_type a, const AllocatedPath &b) {
|
||||
static AllocatedPath Build(const_pointer_type a,
|
||||
const AllocatedPath &b) noexcept {
|
||||
return Build(a, PathTraitsFS::GetLength(a),
|
||||
b.value.c_str(), b.value.size());
|
||||
}
|
||||
|
||||
gcc_pure gcc_nonnull_all
|
||||
static AllocatedPath Build(const AllocatedPath &a, const_pointer_type b) {
|
||||
static AllocatedPath Build(const AllocatedPath &a,
|
||||
const_pointer_type b) noexcept {
|
||||
return Build(a.value.c_str(), a.value.size(),
|
||||
b, PathTraitsFS::GetLength(b));
|
||||
}
|
||||
|
||||
gcc_pure
|
||||
static AllocatedPath Build(const AllocatedPath &a,
|
||||
const AllocatedPath &b) {
|
||||
const AllocatedPath &b) noexcept {
|
||||
return Build(a.value.c_str(), a.value.size(),
|
||||
b.value.c_str(), b.value.size());
|
||||
}
|
||||
@@ -129,13 +132,13 @@ public:
|
||||
* character set to a #Path instance.
|
||||
*/
|
||||
gcc_pure
|
||||
static AllocatedPath FromFS(const_pointer_type fs) {
|
||||
static AllocatedPath FromFS(const_pointer_type fs) noexcept {
|
||||
return AllocatedPath(fs);
|
||||
}
|
||||
|
||||
gcc_pure
|
||||
static AllocatedPath FromFS(const_pointer_type _begin,
|
||||
const_pointer_type _end) {
|
||||
const_pointer_type _end) noexcept {
|
||||
return AllocatedPath(_begin, _end);
|
||||
}
|
||||
|
||||
@@ -144,7 +147,7 @@ public:
|
||||
* character set to a #Path instance.
|
||||
*/
|
||||
gcc_pure
|
||||
static AllocatedPath FromFS(string &&fs) {
|
||||
static AllocatedPath FromFS(string &&fs) noexcept {
|
||||
return AllocatedPath(std::move(fs));
|
||||
}
|
||||
|
||||
@@ -176,12 +179,12 @@ public:
|
||||
}
|
||||
|
||||
gcc_pure
|
||||
bool operator==(const AllocatedPath &other) const {
|
||||
bool operator==(const AllocatedPath &other) const noexcept {
|
||||
return value == other.value;
|
||||
}
|
||||
|
||||
gcc_pure
|
||||
bool operator!=(const AllocatedPath &other) const {
|
||||
bool operator!=(const AllocatedPath &other) const noexcept {
|
||||
return value != other.value;
|
||||
}
|
||||
|
||||
@@ -197,7 +200,7 @@ public:
|
||||
* Check if this is a "nulled" instance. A "nulled" instance
|
||||
* must not be used.
|
||||
*/
|
||||
bool IsNull() const {
|
||||
bool IsNull() const noexcept {
|
||||
return value.empty();
|
||||
}
|
||||
|
||||
@@ -206,7 +209,7 @@ public:
|
||||
*
|
||||
* @see IsNull()
|
||||
*/
|
||||
void SetNull() {
|
||||
void SetNull() noexcept {
|
||||
value.clear();
|
||||
}
|
||||
|
||||
@@ -215,7 +218,7 @@ public:
|
||||
* elements (which may not be the number of characters).
|
||||
*/
|
||||
gcc_pure
|
||||
size_t length() const {
|
||||
size_t length() const noexcept {
|
||||
return value.length();
|
||||
}
|
||||
|
||||
@@ -225,7 +228,7 @@ public:
|
||||
* instance ends.
|
||||
*/
|
||||
gcc_pure
|
||||
const_pointer_type c_str() const {
|
||||
const_pointer_type c_str() const noexcept {
|
||||
return value.c_str();
|
||||
}
|
||||
|
||||
@@ -234,7 +237,7 @@ public:
|
||||
* null-terminated.
|
||||
*/
|
||||
gcc_pure
|
||||
const_pointer_type data() const {
|
||||
const_pointer_type data() const noexcept {
|
||||
return value.data();
|
||||
}
|
||||
|
||||
|
||||
@@ -54,7 +54,7 @@ public:
|
||||
#endif
|
||||
|
||||
gcc_pure
|
||||
bool Check(const char *name_fs) const {
|
||||
bool Check(const char *name_fs) const noexcept {
|
||||
#ifdef HAVE_FNMATCH
|
||||
return fnmatch(pattern.c_str(), name_fs, 0) == 0;
|
||||
#elif defined(WIN32)
|
||||
|
||||
@@ -92,7 +92,7 @@ public:
|
||||
* elements (which may not be the number of characters).
|
||||
*/
|
||||
gcc_pure
|
||||
size_t length() const {
|
||||
size_t length() const noexcept {
|
||||
assert(!IsNull());
|
||||
|
||||
return PathTraitsFS::GetLength(c_str());
|
||||
@@ -104,7 +104,7 @@ public:
|
||||
* instance ends.
|
||||
*/
|
||||
gcc_pure
|
||||
const_pointer_type c_str() const {
|
||||
const_pointer_type c_str() const noexcept {
|
||||
return Base::c_str();
|
||||
}
|
||||
|
||||
@@ -113,7 +113,7 @@ public:
|
||||
* null-terminated.
|
||||
*/
|
||||
gcc_pure
|
||||
const_pointer_type data() const {
|
||||
const_pointer_type data() const noexcept {
|
||||
return c_str();
|
||||
}
|
||||
|
||||
|
||||
@@ -63,7 +63,7 @@ struct PathTraitsFS {
|
||||
|
||||
static constexpr const_pointer_type CURRENT_DIRECTORY = PATH_LITERAL(".");
|
||||
|
||||
static constexpr bool IsSeparator(value_type ch) {
|
||||
static constexpr bool IsSeparator(value_type ch) noexcept {
|
||||
return
|
||||
#ifdef WIN32
|
||||
ch == '/' ||
|
||||
@@ -72,7 +72,7 @@ struct PathTraitsFS {
|
||||
}
|
||||
|
||||
gcc_pure gcc_nonnull_all
|
||||
static const_pointer_type FindLastSeparator(const_pointer_type p) {
|
||||
static const_pointer_type FindLastSeparator(const_pointer_type p) noexcept {
|
||||
#if !CLANG_CHECK_VERSION(3,6)
|
||||
/* disabled on clang due to -Wtautological-pointer-compare */
|
||||
assert(p != nullptr);
|
||||
@@ -90,13 +90,13 @@ struct PathTraitsFS {
|
||||
|
||||
#ifdef WIN32
|
||||
gcc_pure gcc_nonnull_all
|
||||
static constexpr bool IsDrive(const_pointer_type p) {
|
||||
static constexpr bool IsDrive(const_pointer_type p) noexcept {
|
||||
return IsAlphaASCII(p[0]) && p[1] == ':';
|
||||
}
|
||||
#endif
|
||||
|
||||
gcc_pure gcc_nonnull_all
|
||||
static bool IsAbsolute(const_pointer_type p) {
|
||||
static bool IsAbsolute(const_pointer_type p) noexcept {
|
||||
#if !CLANG_CHECK_VERSION(3,6)
|
||||
/* disabled on clang due to -Wtautological-pointer-compare */
|
||||
assert(p != nullptr);
|
||||
@@ -110,12 +110,12 @@ struct PathTraitsFS {
|
||||
}
|
||||
|
||||
gcc_pure gcc_nonnull_all
|
||||
static size_t GetLength(const_pointer_type p) {
|
||||
static size_t GetLength(const_pointer_type p) noexcept {
|
||||
return StringLength(p);
|
||||
}
|
||||
|
||||
gcc_pure gcc_nonnull_all
|
||||
static const_pointer_type Find(const_pointer_type p, value_type ch) {
|
||||
static const_pointer_type Find(const_pointer_type p, value_type ch) noexcept {
|
||||
return StringFind(p, ch);
|
||||
}
|
||||
|
||||
@@ -179,7 +179,7 @@ struct PathTraitsUTF8 {
|
||||
}
|
||||
|
||||
gcc_pure gcc_nonnull_all
|
||||
static const_pointer_type FindLastSeparator(const_pointer_type p) {
|
||||
static const_pointer_type FindLastSeparator(const_pointer_type p) noexcept {
|
||||
#if !CLANG_CHECK_VERSION(3,6)
|
||||
/* disabled on clang due to -Wtautological-pointer-compare */
|
||||
assert(p != nullptr);
|
||||
@@ -190,13 +190,13 @@ struct PathTraitsUTF8 {
|
||||
|
||||
#ifdef WIN32
|
||||
gcc_pure gcc_nonnull_all
|
||||
static constexpr bool IsDrive(const_pointer_type p) {
|
||||
static constexpr bool IsDrive(const_pointer_type p) noexcept {
|
||||
return IsAlphaASCII(p[0]) && p[1] == ':';
|
||||
}
|
||||
#endif
|
||||
|
||||
gcc_pure gcc_nonnull_all
|
||||
static bool IsAbsolute(const_pointer_type p) {
|
||||
static bool IsAbsolute(const_pointer_type p) noexcept {
|
||||
#if !CLANG_CHECK_VERSION(3,6)
|
||||
/* disabled on clang due to -Wtautological-pointer-compare */
|
||||
assert(p != nullptr);
|
||||
@@ -210,12 +210,12 @@ struct PathTraitsUTF8 {
|
||||
}
|
||||
|
||||
gcc_pure gcc_nonnull_all
|
||||
static size_t GetLength(const_pointer_type p) {
|
||||
static size_t GetLength(const_pointer_type p) noexcept {
|
||||
return StringLength(p);
|
||||
}
|
||||
|
||||
gcc_pure gcc_nonnull_all
|
||||
static const_pointer_type Find(const_pointer_type p, value_type ch) {
|
||||
static const_pointer_type Find(const_pointer_type p, value_type ch) noexcept {
|
||||
return StringFind(p, ch);
|
||||
}
|
||||
|
||||
@@ -255,7 +255,7 @@ struct PathTraitsUTF8 {
|
||||
const_pointer_type b, size_t b_size) noexcept;
|
||||
|
||||
gcc_pure gcc_nonnull_all
|
||||
static string Build(const_pointer_type a, const_pointer_type b) {
|
||||
static string Build(const_pointer_type a, const_pointer_type b) noexcept {
|
||||
return Build(a, GetLength(a), b, GetLength(b));
|
||||
}
|
||||
};
|
||||
|
||||
@@ -67,7 +67,7 @@ BufferedReader::ReadFull(size_t size)
|
||||
}
|
||||
|
||||
size_t
|
||||
BufferedReader::ReadFromBuffer(WritableBuffer<void> dest)
|
||||
BufferedReader::ReadFromBuffer(WritableBuffer<void> dest) noexcept
|
||||
{
|
||||
auto src = Read();
|
||||
size_t nbytes = std::min(src.size, dest.size);
|
||||
|
||||
@@ -47,7 +47,7 @@ public:
|
||||
* Reset the internal state. Should be called after rewinding
|
||||
* the underlying #Reader.
|
||||
*/
|
||||
void Reset() {
|
||||
void Reset() noexcept {
|
||||
buffer.Clear();
|
||||
eof = false;
|
||||
line_number = 0;
|
||||
@@ -56,7 +56,7 @@ public:
|
||||
bool Fill(bool need_more);
|
||||
|
||||
gcc_pure
|
||||
WritableBuffer<void> Read() const {
|
||||
WritableBuffer<void> Read() const noexcept {
|
||||
return buffer.Read().ToVoid();
|
||||
}
|
||||
|
||||
@@ -67,7 +67,7 @@ public:
|
||||
*/
|
||||
void *ReadFull(size_t size);
|
||||
|
||||
void Consume(size_t n) {
|
||||
void Consume(size_t n) noexcept {
|
||||
buffer.Consume(n);
|
||||
}
|
||||
|
||||
@@ -75,7 +75,7 @@ public:
|
||||
* Read (and consume) data from the input buffer into the
|
||||
* given buffer. Does not attempt to refill the buffer.
|
||||
*/
|
||||
size_t ReadFromBuffer(WritableBuffer<void> dest);
|
||||
size_t ReadFromBuffer(WritableBuffer<void> dest) noexcept;
|
||||
|
||||
/**
|
||||
* Read data into the given buffer and consume it from our
|
||||
@@ -86,7 +86,7 @@ public:
|
||||
|
||||
char *ReadLine();
|
||||
|
||||
unsigned GetLineNumber() const {
|
||||
unsigned GetLineNumber() const noexcept {
|
||||
return line_number;
|
||||
}
|
||||
};
|
||||
|
||||
@@ -52,14 +52,14 @@ AsyncInputStream::~AsyncInputStream()
|
||||
}
|
||||
|
||||
void
|
||||
AsyncInputStream::SetTag(Tag *_tag)
|
||||
AsyncInputStream::SetTag(Tag *_tag) noexcept
|
||||
{
|
||||
delete tag;
|
||||
tag = _tag;
|
||||
}
|
||||
|
||||
void
|
||||
AsyncInputStream::Pause()
|
||||
AsyncInputStream::Pause() noexcept
|
||||
{
|
||||
assert(io_thread_inside());
|
||||
|
||||
@@ -141,7 +141,7 @@ AsyncInputStream::Seek(offset_type new_offset)
|
||||
}
|
||||
|
||||
void
|
||||
AsyncInputStream::SeekDone()
|
||||
AsyncInputStream::SeekDone() noexcept
|
||||
{
|
||||
assert(io_thread_inside());
|
||||
assert(IsSeekPending());
|
||||
@@ -201,7 +201,7 @@ AsyncInputStream::Read(void *ptr, size_t read_size)
|
||||
}
|
||||
|
||||
void
|
||||
AsyncInputStream::CommitWriteBuffer(size_t nbytes)
|
||||
AsyncInputStream::CommitWriteBuffer(size_t nbytes) noexcept
|
||||
{
|
||||
buffer.Append(nbytes);
|
||||
|
||||
@@ -212,7 +212,7 @@ AsyncInputStream::CommitWriteBuffer(size_t nbytes)
|
||||
}
|
||||
|
||||
void
|
||||
AsyncInputStream::AppendToBuffer(const void *data, size_t append_size)
|
||||
AsyncInputStream::AppendToBuffer(const void *data, size_t append_size) noexcept
|
||||
{
|
||||
auto w = buffer.Write();
|
||||
assert(!w.IsEmpty());
|
||||
@@ -238,7 +238,7 @@ AsyncInputStream::AppendToBuffer(const void *data, size_t append_size)
|
||||
}
|
||||
|
||||
void
|
||||
AsyncInputStream::DeferredResume()
|
||||
AsyncInputStream::DeferredResume() noexcept
|
||||
{
|
||||
const std::lock_guard<Mutex> protect(mutex);
|
||||
|
||||
@@ -251,7 +251,7 @@ AsyncInputStream::DeferredResume()
|
||||
}
|
||||
|
||||
void
|
||||
AsyncInputStream::DeferredSeek()
|
||||
AsyncInputStream::DeferredSeek() noexcept
|
||||
{
|
||||
const std::lock_guard<Mutex> protect(mutex);
|
||||
if (seek_state != SeekState::SCHEDULED)
|
||||
|
||||
@@ -92,15 +92,15 @@ protected:
|
||||
/**
|
||||
* Pass an tag from the I/O thread to the client thread.
|
||||
*/
|
||||
void SetTag(Tag *_tag);
|
||||
void SetTag(Tag *_tag) noexcept;
|
||||
|
||||
void ClearTag() {
|
||||
void ClearTag() noexcept {
|
||||
SetTag(nullptr);
|
||||
}
|
||||
|
||||
void Pause();
|
||||
void Pause() noexcept;
|
||||
|
||||
bool IsPaused() const {
|
||||
bool IsPaused() const noexcept {
|
||||
return paused;
|
||||
}
|
||||
|
||||
@@ -109,15 +109,15 @@ protected:
|
||||
* continue feeding Read() calls from the buffer until it runs
|
||||
* empty.
|
||||
*/
|
||||
void SetClosed() {
|
||||
void SetClosed() noexcept {
|
||||
open = false;
|
||||
}
|
||||
|
||||
bool IsBufferEmpty() const {
|
||||
bool IsBufferEmpty() const noexcept {
|
||||
return buffer.IsEmpty();
|
||||
}
|
||||
|
||||
bool IsBufferFull() const {
|
||||
bool IsBufferFull() const noexcept {
|
||||
return buffer.IsFull();
|
||||
}
|
||||
|
||||
@@ -125,21 +125,21 @@ protected:
|
||||
* Determine how many bytes can be added to the buffer.
|
||||
*/
|
||||
gcc_pure
|
||||
size_t GetBufferSpace() const {
|
||||
size_t GetBufferSpace() const noexcept {
|
||||
return buffer.GetSpace();
|
||||
}
|
||||
|
||||
CircularBuffer<uint8_t>::Range PrepareWriteBuffer() {
|
||||
CircularBuffer<uint8_t>::Range PrepareWriteBuffer() noexcept {
|
||||
return buffer.Write();
|
||||
}
|
||||
|
||||
void CommitWriteBuffer(size_t nbytes);
|
||||
void CommitWriteBuffer(size_t nbytes) noexcept;
|
||||
|
||||
/**
|
||||
* Append data to the buffer. The size must fit into the
|
||||
* buffer; see GetBufferSpace().
|
||||
*/
|
||||
void AppendToBuffer(const void *data, size_t append_size);
|
||||
void AppendToBuffer(const void *data, size_t append_size) noexcept;
|
||||
|
||||
/**
|
||||
* Implement code here that will resume the stream after it
|
||||
@@ -154,7 +154,7 @@ protected:
|
||||
*/
|
||||
virtual void DoSeek(offset_type new_offset) = 0;
|
||||
|
||||
bool IsSeekPending() const {
|
||||
bool IsSeekPending() const noexcept {
|
||||
return seek_state == SeekState::PENDING;
|
||||
}
|
||||
|
||||
@@ -162,14 +162,14 @@ protected:
|
||||
* Call this after seeking has finished. It will notify the
|
||||
* client thread.
|
||||
*/
|
||||
void SeekDone();
|
||||
void SeekDone() noexcept;
|
||||
|
||||
private:
|
||||
void Resume();
|
||||
|
||||
/* for DeferredCall */
|
||||
void DeferredResume();
|
||||
void DeferredSeek();
|
||||
void DeferredResume() noexcept;
|
||||
void DeferredSeek() noexcept;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
@@ -184,20 +184,20 @@ public:
|
||||
void LockWaitReady();
|
||||
|
||||
gcc_pure
|
||||
bool HasMimeType() const {
|
||||
bool HasMimeType() const noexcept {
|
||||
assert(ready);
|
||||
|
||||
return !mime.empty();
|
||||
}
|
||||
|
||||
gcc_pure
|
||||
const char *GetMimeType() const {
|
||||
const char *GetMimeType() const noexcept {
|
||||
assert(ready);
|
||||
|
||||
return mime.empty() ? nullptr : mime.c_str();
|
||||
}
|
||||
|
||||
void ClearMimeType() {
|
||||
void ClearMimeType() noexcept {
|
||||
mime.clear();
|
||||
}
|
||||
|
||||
@@ -215,35 +215,35 @@ public:
|
||||
}
|
||||
|
||||
gcc_pure
|
||||
bool KnownSize() const {
|
||||
bool KnownSize() const noexcept {
|
||||
assert(ready);
|
||||
|
||||
return size != UNKNOWN_SIZE;
|
||||
}
|
||||
|
||||
gcc_pure
|
||||
offset_type GetSize() const {
|
||||
offset_type GetSize() const noexcept {
|
||||
assert(ready);
|
||||
assert(KnownSize());
|
||||
|
||||
return size;
|
||||
}
|
||||
|
||||
void AddOffset(offset_type delta) {
|
||||
void AddOffset(offset_type delta) noexcept {
|
||||
assert(ready);
|
||||
|
||||
offset += delta;
|
||||
}
|
||||
|
||||
gcc_pure
|
||||
offset_type GetOffset() const {
|
||||
offset_type GetOffset() const noexcept {
|
||||
assert(ready);
|
||||
|
||||
return offset;
|
||||
}
|
||||
|
||||
gcc_pure
|
||||
offset_type GetRest() const {
|
||||
offset_type GetRest() const noexcept {
|
||||
assert(ready);
|
||||
assert(KnownSize());
|
||||
|
||||
@@ -251,7 +251,7 @@ public:
|
||||
}
|
||||
|
||||
gcc_pure
|
||||
bool IsSeekable() const {
|
||||
bool IsSeekable() const noexcept {
|
||||
assert(ready);
|
||||
|
||||
return seekable;
|
||||
|
||||
@@ -63,7 +63,7 @@ public:
|
||||
*/
|
||||
static int SocketFunction(CURL *easy,
|
||||
curl_socket_t s, int action,
|
||||
void *userp, void *socketp);
|
||||
void *userp, void *socketp) noexcept;
|
||||
|
||||
virtual bool OnSocketReady(unsigned flags) override;
|
||||
|
||||
@@ -75,7 +75,7 @@ private:
|
||||
}
|
||||
|
||||
gcc_const
|
||||
static unsigned CurlPollToFlags(int action) {
|
||||
static unsigned CurlPollToFlags(int action) noexcept {
|
||||
switch (action) {
|
||||
case CURL_POLL_NONE:
|
||||
return 0;
|
||||
@@ -108,7 +108,7 @@ CurlGlobal::CurlGlobal(EventLoop &_loop)
|
||||
int
|
||||
CurlSocket::SocketFunction(gcc_unused CURL *easy,
|
||||
curl_socket_t s, int action,
|
||||
void *userp, void *socketp) {
|
||||
void *userp, void *socketp) noexcept {
|
||||
auto &global = *(CurlGlobal *)userp;
|
||||
CurlSocket *cs = (CurlSocket *)socketp;
|
||||
|
||||
|
||||
@@ -147,16 +147,16 @@ public:
|
||||
~NfsConnection();
|
||||
|
||||
gcc_pure
|
||||
const char *GetServer() const {
|
||||
const char *GetServer() const noexcept {
|
||||
return server.c_str();
|
||||
}
|
||||
|
||||
gcc_pure
|
||||
const char *GetExportName() const {
|
||||
const char *GetExportName() const noexcept {
|
||||
return export_name.c_str();
|
||||
}
|
||||
|
||||
EventLoop &GetEventLoop() {
|
||||
EventLoop &GetEventLoop() noexcept {
|
||||
return SocketMonitor::GetEventLoop();
|
||||
}
|
||||
|
||||
|
||||
@@ -114,12 +114,12 @@ public:
|
||||
std::list<std::string> getSearchCapabilities(UpnpClient_Handle handle) const;
|
||||
|
||||
gcc_pure
|
||||
std::string GetURI() const {
|
||||
std::string GetURI() const noexcept {
|
||||
return "upnp://" + m_deviceId + "/" + m_serviceType;
|
||||
}
|
||||
|
||||
/** Retrieve the "friendly name" for this server, useful for display. */
|
||||
const char *getFriendlyName() const {
|
||||
const char *getFriendlyName() const noexcept {
|
||||
return m_friendlyName.c_str();
|
||||
}
|
||||
};
|
||||
|
||||
@@ -84,7 +84,6 @@ public:
|
||||
* @return the current volume (0..100 including) or -1 if
|
||||
* unavailable
|
||||
*/
|
||||
gcc_pure
|
||||
virtual int GetVolume() = 0;
|
||||
|
||||
/**
|
||||
|
||||
@@ -48,12 +48,12 @@ class SmbclientNeighborExplorer final : public NeighborExplorer {
|
||||
Server(const Server &) = delete;
|
||||
|
||||
gcc_pure
|
||||
bool operator==(const Server &other) const {
|
||||
bool operator==(const Server &other) const noexcept {
|
||||
return name == other.name;
|
||||
}
|
||||
|
||||
gcc_pure
|
||||
NeighborInfo Export() const {
|
||||
NeighborInfo Export() const noexcept {
|
||||
return { "smb://" + name + "/", comment };
|
||||
}
|
||||
};
|
||||
|
||||
@@ -43,12 +43,12 @@ class UpnpNeighborExplorer final
|
||||
Server(const Server &) = delete;
|
||||
|
||||
gcc_pure
|
||||
bool operator==(const Server &other) const {
|
||||
bool operator==(const Server &other) const noexcept {
|
||||
return name == other.name;
|
||||
}
|
||||
|
||||
gcc_pure
|
||||
NeighborInfo Export() const {
|
||||
NeighborInfo Export() const noexcept {
|
||||
return { "smb://" + name + "/", comment };
|
||||
}
|
||||
};
|
||||
|
||||
@@ -76,47 +76,47 @@ public:
|
||||
|
||||
AllocatedSocketAddress &operator=(const AllocatedSocketAddress &) = delete;
|
||||
|
||||
AllocatedSocketAddress &operator=(AllocatedSocketAddress &&src) {
|
||||
AllocatedSocketAddress &operator=(AllocatedSocketAddress &&src) noexcept {
|
||||
std::swap(address, src.address);
|
||||
std::swap(size, src.size);
|
||||
return *this;
|
||||
}
|
||||
|
||||
gcc_pure
|
||||
bool operator==(SocketAddress other) const {
|
||||
bool operator==(SocketAddress other) const noexcept {
|
||||
return (SocketAddress)*this == other;
|
||||
}
|
||||
|
||||
bool operator!=(SocketAddress &other) const {
|
||||
bool operator!=(SocketAddress &other) const noexcept {
|
||||
return !(*this == other);
|
||||
}
|
||||
|
||||
gcc_const
|
||||
static AllocatedSocketAddress Null() {
|
||||
static AllocatedSocketAddress Null() noexcept {
|
||||
return AllocatedSocketAddress(nullptr, 0);
|
||||
}
|
||||
|
||||
bool IsNull() const {
|
||||
bool IsNull() const noexcept {
|
||||
return address == nullptr;
|
||||
}
|
||||
|
||||
size_type GetSize() const {
|
||||
size_type GetSize() const noexcept {
|
||||
return size;
|
||||
}
|
||||
|
||||
const struct sockaddr *GetAddress() const {
|
||||
const struct sockaddr *GetAddress() const noexcept {
|
||||
return address;
|
||||
}
|
||||
|
||||
operator SocketAddress() const {
|
||||
operator SocketAddress() const noexcept {
|
||||
return SocketAddress(address, size);
|
||||
}
|
||||
|
||||
operator const struct sockaddr *() const {
|
||||
operator const struct sockaddr *() const noexcept {
|
||||
return address;
|
||||
}
|
||||
|
||||
int GetFamily() const {
|
||||
int GetFamily() const noexcept {
|
||||
return address->sa_family;
|
||||
}
|
||||
|
||||
@@ -124,11 +124,11 @@ public:
|
||||
* Does the object have a well-defined address? Check !IsNull()
|
||||
* before calling this method.
|
||||
*/
|
||||
bool IsDefined() const {
|
||||
bool IsDefined() const noexcept {
|
||||
return GetFamily() != AF_UNSPEC;
|
||||
}
|
||||
|
||||
void Clear() {
|
||||
void Clear() noexcept {
|
||||
free(address);
|
||||
address = nullptr;
|
||||
size = 0;
|
||||
|
||||
@@ -51,52 +51,52 @@ public:
|
||||
|
||||
StaticSocketAddress &operator=(SocketAddress other) noexcept;
|
||||
|
||||
operator SocketAddress() const {
|
||||
operator SocketAddress() const noexcept {
|
||||
return SocketAddress(reinterpret_cast<const struct sockaddr *>(&address),
|
||||
size);
|
||||
}
|
||||
|
||||
struct sockaddr *GetAddress() {
|
||||
struct sockaddr *GetAddress() noexcept {
|
||||
return reinterpret_cast<struct sockaddr *>(&address);
|
||||
}
|
||||
|
||||
const struct sockaddr *GetAddress() const {
|
||||
const struct sockaddr *GetAddress() const noexcept {
|
||||
return reinterpret_cast<const struct sockaddr *>(&address);
|
||||
}
|
||||
|
||||
constexpr size_type GetCapacity() const {
|
||||
constexpr size_type GetCapacity() const noexcept {
|
||||
return sizeof(address);
|
||||
}
|
||||
|
||||
size_type GetSize() const {
|
||||
size_type GetSize() const noexcept {
|
||||
return size;
|
||||
}
|
||||
|
||||
void SetSize(size_type _size) {
|
||||
void SetSize(size_type _size) noexcept {
|
||||
assert(_size > 0);
|
||||
assert(size_t(_size) <= sizeof(address));
|
||||
|
||||
size = _size;
|
||||
}
|
||||
|
||||
int GetFamily() const {
|
||||
int GetFamily() const noexcept {
|
||||
return address.ss_family;
|
||||
}
|
||||
|
||||
bool IsDefined() const {
|
||||
bool IsDefined() const noexcept {
|
||||
return GetFamily() != AF_UNSPEC;
|
||||
}
|
||||
|
||||
void Clear() {
|
||||
void Clear() noexcept {
|
||||
address.ss_family = AF_UNSPEC;
|
||||
}
|
||||
|
||||
gcc_pure
|
||||
bool operator==(SocketAddress other) const {
|
||||
bool operator==(SocketAddress other) const noexcept {
|
||||
return (SocketAddress)*this == other;
|
||||
}
|
||||
|
||||
bool operator!=(SocketAddress &other) const {
|
||||
bool operator!=(SocketAddress &other) const noexcept {
|
||||
return !(*this == other);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -85,7 +85,7 @@ public:
|
||||
* those which are disabled right now.
|
||||
*/
|
||||
gcc_pure
|
||||
unsigned Size() const {
|
||||
unsigned Size() const noexcept {
|
||||
return outputs.size();
|
||||
}
|
||||
|
||||
@@ -186,7 +186,7 @@ public:
|
||||
* finished yet.
|
||||
*/
|
||||
gcc_pure
|
||||
SignedSongTime GetElapsedTime() const {
|
||||
SignedSongTime GetElapsedTime() const noexcept {
|
||||
return elapsed_time;
|
||||
}
|
||||
|
||||
|
||||
@@ -132,7 +132,7 @@ public:
|
||||
}
|
||||
|
||||
gcc_pure
|
||||
const char *GetDevice() {
|
||||
const char *GetDevice() const noexcept {
|
||||
return device.empty() ? default_device : device.c_str();
|
||||
}
|
||||
|
||||
|
||||
@@ -79,7 +79,7 @@ public:
|
||||
size_t Play(const void *chunk, size_t size);
|
||||
void Cancel();
|
||||
|
||||
std::chrono::steady_clock::duration Delay();
|
||||
std::chrono::steady_clock::duration Delay() noexcept;
|
||||
|
||||
void FillBuffer(void* _buffer, size_t size,
|
||||
gcc_unused const media_raw_audio_format& _format);
|
||||
@@ -309,7 +309,7 @@ HaikuOutput::Play(const void *chunk, size_t size)
|
||||
}
|
||||
|
||||
inline std::chrono::steady_clock::duration
|
||||
HaikuOutput::Delay()
|
||||
HaikuOutput::Delay() noexcept
|
||||
{
|
||||
unsigned delay = buffer_filled ? 0 : buffer_delay;
|
||||
|
||||
|
||||
@@ -670,7 +670,7 @@ osx_output_play(AudioOutput *ao, const void *chunk, size_t size)
|
||||
}
|
||||
|
||||
static std::chrono::steady_clock::duration
|
||||
osx_output_delay(AudioOutput *ao)
|
||||
osx_output_delay(AudioOutput *ao) noexcept
|
||||
{
|
||||
OSXOutput *od = (OSXOutput *)ao;
|
||||
return od->ring_buffer->write_available()
|
||||
|
||||
@@ -73,19 +73,19 @@ class OpenALOutput {
|
||||
|
||||
private:
|
||||
gcc_pure
|
||||
ALint GetSourceI(ALenum param) const {
|
||||
ALint GetSourceI(ALenum param) const noexcept {
|
||||
ALint value;
|
||||
alGetSourcei(source, param, &value);
|
||||
return value;
|
||||
}
|
||||
|
||||
gcc_pure
|
||||
bool HasProcessed() const {
|
||||
bool HasProcessed() const noexcept {
|
||||
return GetSourceI(AL_BUFFERS_PROCESSED) > 0;
|
||||
}
|
||||
|
||||
gcc_pure
|
||||
bool IsPlaying() const {
|
||||
bool IsPlaying() const noexcept {
|
||||
return GetSourceI(AL_SOURCE_STATE) == AL_PLAYING;
|
||||
}
|
||||
|
||||
|
||||
@@ -100,7 +100,7 @@ public:
|
||||
void Open(AudioFormat &audio_format);
|
||||
void Close();
|
||||
|
||||
std::chrono::steady_clock::duration Delay();
|
||||
std::chrono::steady_clock::duration Delay() noexcept;
|
||||
size_t Play(const void *chunk, size_t size);
|
||||
void Cancel();
|
||||
bool Pause();
|
||||
@@ -740,7 +740,7 @@ PulseOutput::StreamPause(bool pause)
|
||||
}
|
||||
|
||||
inline std::chrono::steady_clock::duration
|
||||
PulseOutput::Delay()
|
||||
PulseOutput::Delay() noexcept
|
||||
{
|
||||
Pulse::LockGuard lock(mainloop);
|
||||
|
||||
|
||||
@@ -97,7 +97,7 @@ class RecorderOutput {
|
||||
|
||||
private:
|
||||
gcc_pure
|
||||
bool HasDynamicPath() const {
|
||||
bool HasDynamicPath() const noexcept {
|
||||
return !format_path.empty();
|
||||
}
|
||||
|
||||
|
||||
@@ -191,7 +191,7 @@ public:
|
||||
* Caller must lock the mutex.
|
||||
*/
|
||||
gcc_pure
|
||||
bool HasClients() const {
|
||||
bool HasClients() const noexcept {
|
||||
return !clients.empty();
|
||||
}
|
||||
|
||||
@@ -199,7 +199,7 @@ public:
|
||||
* Check whether there is at least one client.
|
||||
*/
|
||||
gcc_pure
|
||||
bool LockHasClients() const {
|
||||
bool LockHasClients() const noexcept {
|
||||
const std::lock_guard<Mutex> protect(mutex);
|
||||
return HasClients();
|
||||
}
|
||||
|
||||
@@ -96,7 +96,7 @@ public:
|
||||
void Open(AudioFormat &audio_format);
|
||||
void Close();
|
||||
|
||||
std::chrono::steady_clock::duration Delay() {
|
||||
std::chrono::steady_clock::duration Delay() noexcept {
|
||||
return pause && !cancel
|
||||
? std::chrono::milliseconds(100)
|
||||
: std::chrono::steady_clock::duration::zero();
|
||||
|
||||
@@ -63,11 +63,12 @@ public:
|
||||
/**
|
||||
* Resamples a block of PCM data.
|
||||
*
|
||||
* Throws std::runtime_error on error.
|
||||
*
|
||||
* @param src the input buffer
|
||||
* @return the destination buffer (will be invalidated by
|
||||
* filter_close() or filter_filter())
|
||||
*/
|
||||
gcc_pure
|
||||
virtual ConstBuffer<void> Resample(ConstBuffer<void> src) = 0;
|
||||
};
|
||||
|
||||
|
||||
@@ -247,7 +247,7 @@ private:
|
||||
* finished.
|
||||
*/
|
||||
gcc_pure
|
||||
bool IsDecoderAtCurrentSong() const {
|
||||
bool IsDecoderAtCurrentSong() const noexcept {
|
||||
assert(pipe != nullptr);
|
||||
|
||||
return dc.pipe == pipe;
|
||||
@@ -259,7 +259,7 @@ private:
|
||||
* switched to that song yet.
|
||||
*/
|
||||
gcc_pure
|
||||
bool IsDecoderAtNextSong() const {
|
||||
bool IsDecoderAtNextSong() const noexcept {
|
||||
return dc.pipe != nullptr && !IsDecoderAtCurrentSong();
|
||||
}
|
||||
|
||||
|
||||
@@ -146,6 +146,7 @@ static const char *const extm3u_suffixes[] = {
|
||||
|
||||
static const char *const extm3u_mime_types[] = {
|
||||
"audio/x-mpegurl",
|
||||
"audio/mpegurl",
|
||||
nullptr
|
||||
};
|
||||
|
||||
|
||||
@@ -66,6 +66,7 @@ static const char *const m3u_suffixes[] = {
|
||||
|
||||
static const char *const m3u_mime_types[] = {
|
||||
"audio/x-mpegurl",
|
||||
"audio/mpegurl",
|
||||
nullptr
|
||||
};
|
||||
|
||||
|
||||
@@ -162,14 +162,14 @@ struct Queue {
|
||||
}
|
||||
|
||||
gcc_pure
|
||||
unsigned OrderToPosition(unsigned _order) const {
|
||||
unsigned OrderToPosition(unsigned _order) const noexcept {
|
||||
assert(_order < length);
|
||||
|
||||
return order[_order];
|
||||
}
|
||||
|
||||
gcc_pure
|
||||
unsigned PositionToOrder(unsigned position) const {
|
||||
unsigned PositionToOrder(unsigned position) const noexcept {
|
||||
assert(position < length);
|
||||
|
||||
for (unsigned i = 0;; ++i) {
|
||||
@@ -181,7 +181,7 @@ struct Queue {
|
||||
}
|
||||
|
||||
gcc_pure
|
||||
uint8_t GetPriorityAtPosition(unsigned position) const {
|
||||
uint8_t GetPriorityAtPosition(unsigned position) const noexcept {
|
||||
assert(position < length);
|
||||
|
||||
return items[position].priority;
|
||||
|
||||
@@ -149,7 +149,7 @@ CompositeStorage::Directory::Make(const char *uri)
|
||||
}
|
||||
|
||||
bool
|
||||
CompositeStorage::Directory::Unmount()
|
||||
CompositeStorage::Directory::Unmount() noexcept
|
||||
{
|
||||
if (storage == nullptr)
|
||||
return false;
|
||||
@@ -160,7 +160,7 @@ CompositeStorage::Directory::Unmount()
|
||||
}
|
||||
|
||||
bool
|
||||
CompositeStorage::Directory::Unmount(const char *uri)
|
||||
CompositeStorage::Directory::Unmount(const char *uri) noexcept
|
||||
{
|
||||
if (StringIsEmpty(uri))
|
||||
return Unmount();
|
||||
|
||||
@@ -55,7 +55,7 @@ class CompositeStorage final : public Storage {
|
||||
~Directory();
|
||||
|
||||
gcc_pure
|
||||
bool IsEmpty() const {
|
||||
bool IsEmpty() const noexcept {
|
||||
return storage == nullptr && children.empty();
|
||||
}
|
||||
|
||||
@@ -64,8 +64,8 @@ class CompositeStorage final : public Storage {
|
||||
|
||||
Directory &Make(const char *uri);
|
||||
|
||||
bool Unmount();
|
||||
bool Unmount(const char *uri);
|
||||
bool Unmount() noexcept;
|
||||
bool Unmount(const char *uri) noexcept;
|
||||
|
||||
gcc_pure
|
||||
bool MapToRelativeUTF8(std::string &buffer,
|
||||
|
||||
@@ -39,7 +39,6 @@ public:
|
||||
/**
|
||||
* Throws #std::runtime_error on error.
|
||||
*/
|
||||
gcc_pure
|
||||
virtual StorageFileInfo GetInfo(bool follow) = 0;
|
||||
};
|
||||
|
||||
@@ -52,7 +51,6 @@ public:
|
||||
/**
|
||||
* Throws #std::runtime_error on error.
|
||||
*/
|
||||
gcc_pure
|
||||
virtual StorageFileInfo GetInfo(const char *uri_utf8, bool follow) = 0;
|
||||
|
||||
/**
|
||||
|
||||
@@ -511,7 +511,7 @@ private:
|
||||
* to the base file name.
|
||||
*/
|
||||
gcc_pure
|
||||
StringView HrefToEscapedName(const char *href) const {
|
||||
StringView HrefToEscapedName(const char *href) const noexcept {
|
||||
const char *path = uri_get_path(href);
|
||||
if (path == nullptr)
|
||||
return nullptr;
|
||||
|
||||
@@ -52,6 +52,15 @@
|
||||
# define IS_LITTLE_ENDIAN false
|
||||
# define IS_BIG_ENDIAN true
|
||||
# endif
|
||||
#elif defined(__BYTE_ORDER__)
|
||||
/* GCC-specific macros */
|
||||
# if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
|
||||
# define IS_LITTLE_ENDIAN true
|
||||
# define IS_BIG_ENDIAN false
|
||||
# else
|
||||
# define IS_LITTLE_ENDIAN false
|
||||
# define IS_BIG_ENDIAN true
|
||||
# endif
|
||||
#else
|
||||
/* generic compile-time check */
|
||||
# include <endian.h>
|
||||
|
||||
@@ -53,7 +53,7 @@ ParseMixRampTag(MixRampInfo &info, const char *name, const char *value)
|
||||
const char *value;
|
||||
|
||||
gcc_pure
|
||||
const char *operator[](const char *n) const {
|
||||
const char *operator[](const char *n) const noexcept {
|
||||
return StringEqualsCaseASCII(name, n)
|
||||
? value
|
||||
: nullptr;
|
||||
@@ -70,7 +70,7 @@ ParseMixRampVorbis(MixRampInfo &info, const char *entry)
|
||||
const char *entry;
|
||||
|
||||
gcc_pure
|
||||
const char *operator[](const char *n) const {
|
||||
const char *operator[](const char *n) const noexcept {
|
||||
return vorbis_comment_value(entry, n);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -60,7 +60,7 @@ ParseReplayGainTag(ReplayGainInfo &info, const char *name, const char *value)
|
||||
const char *value;
|
||||
|
||||
gcc_pure
|
||||
const char *operator[](const char *n) const {
|
||||
const char *operator[](const char *n) const noexcept {
|
||||
return StringEqualsCaseASCII(name, n)
|
||||
? value
|
||||
: nullptr;
|
||||
@@ -77,7 +77,7 @@ ParseReplayGainVorbis(ReplayGainInfo &info, const char *entry)
|
||||
const char *entry;
|
||||
|
||||
gcc_pure
|
||||
const char *operator[](const char *n) const {
|
||||
const char *operator[](const char *n) const noexcept {
|
||||
return vorbis_comment_value(entry, n);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -67,7 +67,7 @@ CopyTagMask(TagBuilder &dest, const Tag &src, tag_mask_t mask)
|
||||
|
||||
void
|
||||
TagSet::InsertUnique(const Tag &src, TagType type, const char *value,
|
||||
tag_mask_t group_mask)
|
||||
tag_mask_t group_mask) noexcept
|
||||
{
|
||||
TagBuilder builder;
|
||||
if (value == nullptr)
|
||||
@@ -85,7 +85,7 @@ TagSet::InsertUnique(const Tag &src, TagType type, const char *value,
|
||||
bool
|
||||
TagSet::CheckUnique(TagType dest_type,
|
||||
const Tag &tag, TagType src_type,
|
||||
tag_mask_t group_mask)
|
||||
tag_mask_t group_mask) noexcept
|
||||
{
|
||||
bool found = false;
|
||||
|
||||
@@ -101,7 +101,7 @@ TagSet::CheckUnique(TagType dest_type,
|
||||
|
||||
void
|
||||
TagSet::InsertUnique(const Tag &tag,
|
||||
TagType type, tag_mask_t group_mask)
|
||||
TagType type, tag_mask_t group_mask) noexcept
|
||||
{
|
||||
static_assert(sizeof(group_mask) * 8 >= TAG_NUM_OF_ITEM_TYPES,
|
||||
"Mask is too small");
|
||||
|
||||
@@ -33,7 +33,7 @@
|
||||
*/
|
||||
struct TagLess {
|
||||
gcc_pure
|
||||
bool operator()(const Tag &a, const Tag &b) const {
|
||||
bool operator()(const Tag &a, const Tag &b) const noexcept {
|
||||
if (a.num_items != b.num_items)
|
||||
return a.num_items < b.num_items;
|
||||
|
||||
@@ -59,15 +59,15 @@ struct TagLess {
|
||||
class TagSet : public std::set<Tag, TagLess> {
|
||||
public:
|
||||
void InsertUnique(const Tag &tag,
|
||||
TagType type, tag_mask_t group_mask);
|
||||
TagType type, tag_mask_t group_mask) noexcept;
|
||||
|
||||
private:
|
||||
void InsertUnique(const Tag &src, TagType type, const char *value,
|
||||
tag_mask_t group_mask);
|
||||
tag_mask_t group_mask) noexcept;
|
||||
|
||||
bool CheckUnique(TagType dest_type,
|
||||
const Tag &tag, TagType src_type,
|
||||
tag_mask_t group_mask);
|
||||
tag_mask_t group_mask) noexcept;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
@@ -82,7 +82,7 @@ public:
|
||||
* Returns true if the object contains any information.
|
||||
*/
|
||||
gcc_pure
|
||||
bool IsDefined() const {
|
||||
bool IsDefined() const noexcept {
|
||||
return !duration.IsNegative() || has_playlist || !IsEmpty();
|
||||
}
|
||||
|
||||
|
||||
@@ -53,7 +53,7 @@ public:
|
||||
#endif
|
||||
|
||||
gcc_const
|
||||
static ThreadId Null() {
|
||||
static ThreadId Null() noexcept {
|
||||
#ifdef WIN32
|
||||
return 0;
|
||||
#else
|
||||
@@ -63,7 +63,7 @@ public:
|
||||
}
|
||||
|
||||
gcc_pure
|
||||
bool IsNull() const {
|
||||
bool IsNull() const noexcept {
|
||||
return *this == Null();
|
||||
}
|
||||
|
||||
@@ -80,7 +80,7 @@ public:
|
||||
}
|
||||
|
||||
gcc_pure
|
||||
bool operator==(const ThreadId &other) const {
|
||||
bool operator==(const ThreadId &other) const noexcept {
|
||||
#ifdef WIN32
|
||||
return id == other.id;
|
||||
#else
|
||||
|
||||
@@ -77,7 +77,7 @@ public:
|
||||
* Check if this thread is the current thread.
|
||||
*/
|
||||
gcc_pure
|
||||
bool IsInside() const {
|
||||
bool IsInside() const noexcept {
|
||||
#ifdef WIN32
|
||||
return GetCurrentThreadId() == id;
|
||||
#else
|
||||
|
||||
@@ -140,7 +140,7 @@ struct ConstBuffer {
|
||||
|
||||
template<typename U>
|
||||
gcc_pure
|
||||
bool Contains(U &&u) const {
|
||||
bool Contains(U &&u) const noexcept {
|
||||
for (const auto &i : *this)
|
||||
if (u == i)
|
||||
return true;
|
||||
|
||||
@@ -31,14 +31,14 @@
|
||||
#include "CharUtil.hxx"
|
||||
|
||||
void
|
||||
StringView::StripLeft()
|
||||
StringView::StripLeft() noexcept
|
||||
{
|
||||
while (!IsEmpty() && IsWhitespaceOrNull(front()))
|
||||
pop_front();
|
||||
}
|
||||
|
||||
void
|
||||
StringView::StripRight()
|
||||
StringView::StripRight() noexcept
|
||||
{
|
||||
while (!IsEmpty() && IsWhitespaceOrNull(back()))
|
||||
pop_back();
|
||||
|
||||
@@ -64,67 +64,67 @@ struct StringView : ConstBuffer<char> {
|
||||
return StringView("", size_t(0));
|
||||
}
|
||||
|
||||
void SetEmpty() {
|
||||
void SetEmpty() noexcept {
|
||||
data = "";
|
||||
size = 0;
|
||||
}
|
||||
|
||||
gcc_pure
|
||||
pointer_type Find(char ch) const {
|
||||
pointer_type Find(char ch) const noexcept {
|
||||
return (pointer_type)memchr(data, ch, size);
|
||||
}
|
||||
|
||||
StringView &operator=(std::nullptr_t) {
|
||||
StringView &operator=(std::nullptr_t) noexcept {
|
||||
data = nullptr;
|
||||
size = 0;
|
||||
return *this;
|
||||
}
|
||||
|
||||
StringView &operator=(pointer_type _data) {
|
||||
StringView &operator=(pointer_type _data) noexcept {
|
||||
data = _data;
|
||||
size = _data != nullptr ? strlen(_data) : 0;
|
||||
return *this;
|
||||
}
|
||||
|
||||
gcc_pure
|
||||
bool StartsWith(StringView needle) const {
|
||||
bool StartsWith(StringView needle) const noexcept {
|
||||
return size >= needle.size &&
|
||||
memcmp(data, needle.data, needle.size) == 0;
|
||||
}
|
||||
|
||||
gcc_pure
|
||||
bool Equals(StringView other) const {
|
||||
bool Equals(StringView other) const noexcept {
|
||||
return size == other.size &&
|
||||
memcmp(data, other.data, size) == 0;
|
||||
}
|
||||
|
||||
template<size_t n>
|
||||
bool EqualsLiteral(const char (&other)[n]) const {
|
||||
bool EqualsLiteral(const char (&other)[n]) const noexcept {
|
||||
return Equals(Literal(other));
|
||||
}
|
||||
|
||||
gcc_pure
|
||||
bool EqualsIgnoreCase(StringView other) const {
|
||||
bool EqualsIgnoreCase(StringView other) const noexcept {
|
||||
return size == other.size &&
|
||||
strncasecmp(data, other.data, size) == 0;
|
||||
}
|
||||
|
||||
template<size_t n>
|
||||
bool EqualsLiteralIgnoreCase(const char (&other)[n]) const {
|
||||
bool EqualsLiteralIgnoreCase(const char (&other)[n]) const noexcept {
|
||||
return EqualsIgnoreCase(Literal(other));
|
||||
}
|
||||
|
||||
/**
|
||||
* Skip all whitespace at the beginning.
|
||||
*/
|
||||
void StripLeft();
|
||||
void StripLeft() noexcept;
|
||||
|
||||
/**
|
||||
* Skip all whitespace at the end.
|
||||
*/
|
||||
void StripRight();
|
||||
void StripRight() noexcept;
|
||||
|
||||
void Strip() {
|
||||
void Strip() noexcept {
|
||||
StripLeft();
|
||||
StripRight();
|
||||
}
|
||||
|
||||
@@ -45,7 +45,7 @@ FakeDecoder::Ready(const AudioFormat audio_format,
|
||||
}
|
||||
|
||||
DecoderCommand
|
||||
FakeDecoder::GetCommand()
|
||||
FakeDecoder::GetCommand() noexcept
|
||||
{
|
||||
return DecoderCommand::NONE;
|
||||
}
|
||||
@@ -56,13 +56,13 @@ FakeDecoder::CommandFinished()
|
||||
}
|
||||
|
||||
SongTime
|
||||
FakeDecoder::GetSeekTime()
|
||||
FakeDecoder::GetSeekTime() noexcept
|
||||
{
|
||||
return SongTime();
|
||||
}
|
||||
|
||||
uint64_t
|
||||
FakeDecoder::GetSeekFrame()
|
||||
FakeDecoder::GetSeekFrame() noexcept
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -34,10 +34,10 @@ struct FakeDecoder final : DecoderClient {
|
||||
/* virtual methods from DecoderClient */
|
||||
void Ready(AudioFormat audio_format,
|
||||
bool seekable, SignedSongTime duration) override;
|
||||
DecoderCommand GetCommand() override;
|
||||
DecoderCommand GetCommand() noexcept override;
|
||||
void CommandFinished() override;
|
||||
SongTime GetSeekTime() override;
|
||||
uint64_t GetSeekFrame() override;
|
||||
SongTime GetSeekTime() noexcept override;
|
||||
uint64_t GetSeekFrame() noexcept override;
|
||||
void SeekError() override;
|
||||
InputStreamPtr OpenUri(const char *uri) override;
|
||||
size_t Read(InputStream &is, void *buffer, size_t length) override;
|
||||
|
||||
@@ -49,9 +49,9 @@ CPPUNIT_TEST_SUITE_REGISTRATION(ByteReverseTest);
|
||||
void
|
||||
ByteReverseTest::TestByteReverse2()
|
||||
{
|
||||
static const char src[] alignas(uint16_t) = "123456";
|
||||
alignas(uint16_t) static const char src[] = "123456";
|
||||
static const char result[] = "214365";
|
||||
static uint8_t dest[ARRAY_SIZE(src)] alignas(uint16_t);
|
||||
alignas(uint16_t)static uint8_t dest[ARRAY_SIZE(src)];
|
||||
|
||||
reverse_bytes(dest, (const uint8_t *)src,
|
||||
(const uint8_t *)(src + ARRAY_SIZE(src) - 1), 2);
|
||||
@@ -73,9 +73,9 @@ ByteReverseTest::TestByteReverse3()
|
||||
void
|
||||
ByteReverseTest::TestByteReverse4()
|
||||
{
|
||||
static const char src[] alignas(uint32_t) = "12345678";
|
||||
alignas(uint32_t) static const char src[] = "12345678";
|
||||
static const char result[] = "43218765";
|
||||
static uint8_t dest[ARRAY_SIZE(src)] alignas(uint32_t);
|
||||
alignas(uint32_t) static uint8_t dest[ARRAY_SIZE(src)];
|
||||
|
||||
reverse_bytes(dest, (const uint8_t *)src,
|
||||
(const uint8_t *)(src + ARRAY_SIZE(src) - 1), 4);
|
||||
|
||||
Reference in New Issue
Block a user