Compare commits

...

30 Commits

Author SHA1 Message Date
Max Kellermann
e4c8ebe056 release v0.23.10 2022-10-14 23:51:41 +02:00
Max Kellermann
76b25a1377 output/alsa: add nullptr check for snd_pcm_name() return value
It is not explicitly documented whether snd_pcm_name() is allowed to
return NULL:
https://www.alsa-project.org/alsa-doc/alsa-lib/group___p_c_m.html#ga5031edc0422df8db1f70af056a12dd77

But apparently this is legal:
0222f45d11/src/pcm/pcm.c (L2761-L2762)

That's ... surprising!

Closes https://github.com/MusicPlayerDaemon/MPD/issues/1645
2022-10-14 23:14:30 +02:00
Max Kellermann
ccc3ee663b java/File: remove assertions to work around -Wtautological-pointer-compare 2022-10-14 23:00:35 +02:00
Max Kellermann
0626661764 android/Context: fix typo in assert() variable name
Closes https://github.com/MusicPlayerDaemon/MPD/issues/1644
2022-10-14 22:59:39 +02:00
Max Kellermann
31db04a3ca meson.build: suppress bogus clang 14 warning on libfmt headers 2022-10-14 22:54:34 +02:00
Max Kellermann
0c7163b9db subprojects: update expat 2022-10-14 22:46:30 +02:00
Max Kellermann
7d78cad8af doc/user.rst: update Android NDK requirement to 25b 2022-10-14 22:41:33 +02:00
Max Kellermann
912530ed20 test/meson.build: remove obsolete CURL workaround
This appears to have been fixed in some recent CURL version.
2022-10-14 22:41:33 +02:00
Max Kellermann
d3f37199b9 python/build/libs.py: update libnfs to 5.0.2 2022-10-14 22:41:33 +02:00
Max Kellermann
a4748d84b0 python/build/libs.py: update CURL to 7.85.0 2022-10-14 22:41:33 +02:00
Max Kellermann
8f847ec381 python/build/libs.py: update FFmpeg to 5.1.2 2022-10-14 22:41:33 +02:00
Max Kellermann
3a70f09dd3 python/build/libs.py: update libopenmpt to 0.6.6 2022-10-14 22:41:33 +02:00
Max Kellermann
568f63100b python/build/libs.py: update zlib to 1.2.13 2022-10-14 21:54:04 +02:00
Max Kellermann
3e25916b37 time/Parser: remove unused library 2022-09-30 18:17:03 +02:00
Max Kellermann
5f9438dae6 storage/curl: include cleanup 2022-09-30 18:16:46 +02:00
BurroCargado
99e65c58ce storage/curl: make timestamp parsing more robust
According to the latest WebDAV specification (RFC4918),
timestamp string in the getlastmodified property is formatted
as rfc1123-date, such as "Sun, 06 Nov 1994 08:49:37 GMT".
However, to process responses from servers in the older style
format specified in RFC2518, timestamps in the HTTP-date format
had better be accepted.

As described in the libcurl api documentation, curl_getdate() can handle
timestamp strings in HTTP-date formats, including rfc1123-date.

https://www.rfc-editor.org/rfc/rfc4918#section-15.7
https://www.rfc-editor.org/rfc/rfc2518.html#section-13.7
https://curl.se/libcurl/c/curl_getdate.html
2022-09-29 18:19:30 +02:00
BurroCargado
df71b07e9d storage/curl: fix can't get timestamp of remote file 2022-09-29 18:19:03 +02:00
Max Kellermann
2694195215 storage/curl: add noexcept and [[gnu::pure]] 2022-09-29 18:18:18 +02:00
Max Kellermann
66450d1f3c subprojects: update expat, fmt, sqlite3, vorbis 2022-09-28 11:34:33 +02:00
Max Kellermann
76efea3aa7 decoder/ffmpeg: add libfmt formatter for AVSampleFormat
Fixes compiler warning because formatting unscoped enums is deprecated
since libfmt 9.
2022-09-28 11:34:33 +02:00
jcorporation
7ab0dfc8ce Sets the curl proxy ssl verify options to the values of the host configuration options
This fixes 
2022-09-27 20:26:50 +02:00
Max Kellermann
15ff7c4cad Merge branch 'fix-oggflac-serial' of https://github.com/anthonyde/MPD into v0.23.x 2022-09-20 14:44:13 +02:00
Anthony DeRossi
9ab9b97f20 encoder/flac: only set a serial number for oggflac
This fixes a bug introduced in 87fa6bca where the FLAC encoder fails to
initialize unless libFLAC is built with Ogg support. When libFLAC is
built without Ogg support, FLAC__stream_encoder_set_ogg_serial_number
unconditionally returns false.
2022-09-16 17:58:41 -07:00
Max Kellermann
88d92aceab python/build/libs.py: update libFLAC to 1.4.0 2022-09-16 18:21:47 +02:00
Max Kellermann
a2ce4352c8 python/build/libs.py: update Boost to 1.80.0 2022-09-16 17:54:07 +02:00
Max Kellermann
84f43ccde8 LogInit: default to stderr on Windows
Don't require "log_file" setting, for "--no-config" operation.

Closes https://github.com/MusicPlayerDaemon/MPD/issues/1600
2022-09-06 21:04:53 +02:00
Max Kellermann
38704c9cf3 LogInit: improve systemd/journald comment 2022-09-06 21:03:56 +02:00
Max Kellermann
910d0ec92b test/net/meson.build: add missing dependency 2022-09-06 20:44:24 +02:00
Max Kellermann
3b05c89765 archive/iso9660: fix off-by-one assertion failure
Calling data[fill] could trigger an assertion failure if
fill==data.size(), even if we call it only to take the address.

Instead of doing that, this commit changes the code to pointer
arithmetic.

Closes https://github.com/MusicPlayerDaemon/MPD/issues/1556
2022-09-06 20:28:33 +02:00
Max Kellermann
e77b3fa46f increment version number to 0.23.10 2022-09-06 20:23:50 +02:00
26 changed files with 159 additions and 182 deletions

12
NEWS

@@ -1,3 +1,15 @@
ver 0.23.10 (2022/10/14)
* storage
- curl: fix file time stamps
* decoder
- ffmpeg: fix libfmt 9 compiler warning
* encoder
- flac: fix failure when libFLAC is built without Ogg support
* output
- alsa: fix crash bug
* Windows
- log to stdout by default, don't require "log_file" setting
ver 0.23.9 (2022/08/18)
* input
- cdio_paranoia: add options "mode" and "skip"

@@ -2,8 +2,8 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="org.musicpd"
android:installLocation="auto"
android:versionCode="68"
android:versionName="0.23.9">
android:versionCode="69"
android:versionName="0.23.10">
<uses-sdk android:minSdkVersion="21" android:targetSdkVersion="30"/>

@@ -38,7 +38,7 @@ author = 'Max Kellermann'
# built documents.
#
# The short X.Y version.
version = '0.23.9'
version = '0.23.10'
# The full version, including alpha/beta/rc tags.
#release = version + '~git'

@@ -199,7 +199,7 @@ Compiling for Android
You need:
* Android SDK
* `Android NDK r23 <https://developer.android.com/ndk/downloads>`_
* `Android NDK r25b <https://developer.android.com/ndk/downloads>`_
* `Meson 0.56.0 <http://mesonbuild.com/>`__ and `Ninja
<https://ninja-build.org/>`__
* cmake

@@ -1,7 +1,7 @@
project(
'mpd',
['c', 'cpp'],
version: '0.23.9',
version: '0.23.10',
meson_version: '>= 0.56.0',
default_options: [
'c_std=c11',
@@ -251,6 +251,14 @@ endif
fmt_dep = dependency('fmt', fallback: ['fmt', 'fmt_dep'])
if compiler.get_id() == 'clang' and compiler.version().version_compare('<15')
fmt_dep = declare_dependency(
dependencies: fmt_dep,
# suppress bogus clang 14 warning (the version in Android NDK r25b)
compile_args: ['-Wno-unused-local-typedef'],
)
endif
log = static_library(
'log',
'src/Log.cxx',

@@ -43,20 +43,22 @@ opus = AutotoolsProject(
)
flac = AutotoolsProject(
'http://downloads.xiph.org/releases/flac/flac-1.3.4.tar.xz',
'8ff0607e75a322dd7cd6ec48f4f225471404ae2730d0ea945127b1355155e737',
'http://downloads.xiph.org/releases/flac/flac-1.4.0.tar.xz',
'af41c0733c93c237c3e52f64dd87e3b0d9af38259f1c7d11e8cbf583c48c2506',
'lib/libFLAC.a',
[
'--disable-shared', '--enable-static',
'--disable-stack-smash-protection',
'--disable-xmms-plugin', '--disable-cpplibs',
'--disable-doxygen-docs',
'--disable-programs',
],
subdirs=['include', 'src/libFLAC'],
)
zlib = ZlibProject(
'http://zlib.net/zlib-1.2.12.tar.xz',
'7db46b8d7726232a621befaab4a1c870f00a90805511c0e0090441dac57def18',
'http://zlib.net/zlib-1.2.13.tar.xz',
'd14c38e313afc35a9a8760dadf26042f51ea0f5d154b0630a31da0540107fb98',
'lib/libz.a',
)
@@ -112,16 +114,20 @@ libmodplug = AutotoolsProject(
)
libopenmpt = AutotoolsProject(
'https://lib.openmpt.org/files/libopenmpt/src/libopenmpt-0.5.12+release.autotools.tar.gz',
'892aea7a599b5d21842bebf463b5aafdad5711be7008dd84401920c6234820af',
'https://lib.openmpt.org/files/libopenmpt/src/libopenmpt-0.6.6+release.autotools.tar.gz',
'6ddb9e26a430620944891796fefb1bbb38bd9148f6cfc558810c0d3f269876c7',
'lib/libopenmpt.a',
[
'--disable-shared', '--enable-static',
'--disable-openmpt123',
'--disable-examples',
'--disable-tests',
'--disable-doxygen-doc',
'--without-mpg123', '--without-ogg', '--without-vorbis', '--without-vorbisfile',
'--without-portaudio', '--without-portaudiocpp', '--without-sndfile',
'--without-flac',
],
base='libopenmpt-0.5.12+release.autotools',
base='libopenmpt-0.6.6+release.autotools',
)
wildmidi = CmakeProject(
@@ -151,8 +157,8 @@ gme = CmakeProject(
)
ffmpeg = FfmpegProject(
'http://ffmpeg.org/releases/ffmpeg-5.1.tar.xz',
'55eb6aab5ee235550fa54a33eaf8bf1b4ec66c01453182b12f6a993d75698b03',
'http://ffmpeg.org/releases/ffmpeg-5.1.2.tar.xz',
'619e706d662c8420859832ddc259cd4d4096a48a2ce1eefd052db9e440eef3dc',
'lib/libavcodec.a',
[
'--disable-shared', '--enable-static',
@@ -387,8 +393,8 @@ openssl = OpenSSLProject(
)
curl = CmakeProject(
'https://curl.se/download/curl-7.84.0.tar.xz',
'2d118b43f547bfe5bae806d8d47b4e596ea5b25a6c1f080aef49fbcd817c5db8',
'https://curl.se/download/curl-7.85.0.tar.xz',
'88b54a6d4b9a48cb4d873c7056dcba997ddd5b7be5a2d537a4acb55c20b04be6',
'lib/libcurl.a',
[
'-DBUILD_CURL_EXE=OFF',
@@ -422,8 +428,8 @@ curl = CmakeProject(
)
libnfs = AutotoolsProject(
'https://github.com/sahlberg/libnfs/archive/libnfs-5.0.1.tar.gz',
'7ef445410b42f36b9bad426608b53ccb9ccca4101e545c383f564c11db672ca8',
'https://github.com/sahlberg/libnfs/archive/libnfs-5.0.2.tar.gz',
'637e56643b19da9fba98f06847788c4dad308b723156a64748041035dcdf9bd3',
'lib/libnfs.a',
[
'--disable-shared', '--enable-static',
@@ -434,7 +440,7 @@ libnfs = AutotoolsProject(
'--disable-utils', '--disable-examples',
],
base='libnfs-libnfs-5.0.1',
base='libnfs-libnfs-5.0.2',
autoreconf=True,
)
@@ -445,7 +451,7 @@ jack = JackProject(
)
boost = BoostProject(
'https://boostorg.jfrog.io/artifactory/main/release/1.79.0/source/boost_1_79_0.tar.bz2',
'475d589d51a7f8b3ba2ba4eda022b170e562ca3b760ee922c146b6c65856ef39',
'https://boostorg.jfrog.io/artifactory/main/release/1.80.0/source/boost_1_80_0.tar.bz2',
'1e19565d82e43bc59209a168f5ac899d3ba471d55c7610c677d4ccf2c9c500c0',
'include/boost/version.hpp',
)

@@ -158,12 +158,15 @@ log_init(const ConfigData &config, bool verbose, bool use_stdout)
getenv("NOTIFY_SOCKET") != nullptr) {
/* if MPD was started as a systemd
service, default to journal (which
is connected to fd=2) */
is connected to stdout&stderr) */
out_fd = STDOUT_FILENO;
return;
}
#endif
#ifndef HAVE_SYSLOG
#ifdef _WIN32
/* default to stdout on Windows */
out_fd = STDOUT_FILENO;
#elif !defined(HAVE_SYSLOG)
throw std::runtime_error("config parameter 'log_file' not found");
#endif
#ifdef HAVE_SYSLOG

@@ -46,7 +46,7 @@ Context::Initialise(JNIEnv *env) noexcept
AllocatedPath
Context::GetExternalFilesDir(JNIEnv *env, const char *type) noexcept
{
assert(_type != nullptr);
assert(type != nullptr);
jobject file = env->CallObjectMethod(Get(), getExternalFilesDir_method,
Java::String::Optional(env, type).Get());

@@ -166,7 +166,7 @@ class Iso9660InputStream final : public InputStream {
assert(fill <= data.size());
assert(position <= fill);
return {&data[position], &data[fill]};
return {data.data() + position, data.data() + fill};
}
void Consume(size_t nbytes) noexcept {

@@ -31,6 +31,7 @@
#include "lib/ffmpeg/Format.hxx"
#include "lib/ffmpeg/Codec.hxx"
#include "lib/ffmpeg/SampleFormat.hxx"
#include "lib/ffmpeg/LibFmt.hxx"
#include "../DecoderAPI.hxx"
#include "FfmpegMetaData.hxx"
#include "FfmpegIo.hxx"

@@ -38,6 +38,7 @@ class FlacEncoder final : public Encoder {
FLAC__StreamEncoder *const fse;
const unsigned compression;
const bool oggflac;
PcmBuffer expand_buffer;
@@ -122,7 +123,7 @@ flac_encoder_init(const ConfigBlock &block)
}
static void
flac_encoder_setup(FLAC__StreamEncoder *fse, unsigned compression,
flac_encoder_setup(FLAC__StreamEncoder *fse, unsigned compression, bool oggflac,
const AudioFormat &audio_format)
{
unsigned bits_per_sample;
@@ -157,7 +158,7 @@ flac_encoder_setup(FLAC__StreamEncoder *fse, unsigned compression,
throw FormatRuntimeError("error setting flac sample rate to %d",
audio_format.sample_rate);
if (!FLAC__stream_encoder_set_ogg_serial_number(fse,
if (oggflac && !FLAC__stream_encoder_set_ogg_serial_number(fse,
GenerateSerial()))
throw FormatRuntimeError("error setting ogg serial number");
}
@@ -166,11 +167,12 @@ FlacEncoder::FlacEncoder(AudioFormat _audio_format, FLAC__StreamEncoder *_fse, u
:Encoder(_oggchaining),
audio_format(_audio_format), fse(_fse),
compression(_compression),
oggflac(_oggflac),
output_buffer(8192)
{
/* this immediately outputs data through callback */
auto init_status = _oggflac ?
auto init_status = oggflac ?
FLAC__stream_encoder_init_ogg_stream(fse,
nullptr, WriteCallback,
nullptr, nullptr, nullptr,
@@ -209,7 +211,7 @@ PreparedFlacEncoder::Open(AudioFormat &audio_format)
throw std::runtime_error("FLAC__stream_encoder_new() failed");
try {
flac_encoder_setup(fse, compression, audio_format);
flac_encoder_setup(fse, compression, oggflac, audio_format);
} catch (...) {
FLAC__stream_encoder_delete(fse);
throw;
@@ -222,7 +224,7 @@ void
FlacEncoder::SendTag(const Tag &tag)
{
/* re-initialize encoder since flac_encoder_finish resets everything */
flac_encoder_setup(fse, compression, audio_format);
flac_encoder_setup(fse, compression, oggflac, audio_format);
FLAC__StreamMetadata *metadata = FLAC__metadata_object_new(FLAC__METADATA_TYPE_VORBIS_COMMENT);
FLAC__StreamMetadata_VorbisComment_Entry entry;

@@ -439,6 +439,8 @@ CurlInputStream::InitEasy()
request->SetVerifyPeer(verify_peer);
request->SetVerifyHost(verify_host);
request->SetOption(CURLOPT_HTTPHEADER, request_headers.Get());
request->SetProxyVerifyPeer(verify_peer);
request->SetProxyVerifyHost(verify_host);
}
void

@@ -49,9 +49,6 @@ Java::File::Initialise(JNIEnv *env) noexcept
AllocatedPath
Java::File::ToAbsolutePath(JNIEnv *env, jobject _file) noexcept
{
assert(env != nullptr);
assert(_file != nullptr);
LocalObject file(env, _file);
const jstring path = GetAbsolutePath(env, file);

@@ -123,6 +123,14 @@ public:
easy.SetVerifyPeer(value);
}
void SetProxyVerifyHost(bool value) {
easy.SetOption(CURLOPT_PROXY_SSL_VERIFYHOST, value ? 2L : 0L);
}
void SetProxyVerifyPeer(bool value) {
easy.SetOption(CURLOPT_PROXY_SSL_VERIFYPEER, value);
}
void SetNoBody(bool value=true) {
easy.SetNoBody(value);
}

39
src/lib/ffmpeg/LibFmt.hxx Normal file

@@ -0,0 +1,39 @@
/*
* Copyright 2003-2022 The Music Player Daemon Project
* http://www.musicpd.org
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#pragma once
extern "C" {
#include <libavutil/samplefmt.h>
}
#include <fmt/format.h>
template<>
struct fmt::formatter<AVSampleFormat> : formatter<string_view>
{
template<typename FormatContext>
auto format(const AVSampleFormat format, FormatContext &ctx) {
const char *name = av_get_sample_fmt_name(format);
if (name == nullptr)
name = "?";
return formatter<string_view>::format(name, ctx);
}
};

@@ -812,8 +812,12 @@ AlsaOutput::Open(AudioFormat &audio_format)
fmt::format("Failed to open ALSA device \"{}\"",
GetDevice()).c_str());
const char *pcm_name = snd_pcm_name(pcm);
if (pcm_name == nullptr)
pcm_name = "?";
FmtDebug(alsa_output_domain, "opened {} type={}",
snd_pcm_name(pcm),
pcm_name,
snd_pcm_type_name(snd_pcm_type(pcm)));
#ifdef ENABLE_DSD

@@ -34,7 +34,6 @@
#include "event/InjectEvent.hxx"
#include "thread/Mutex.hxx"
#include "thread/Cond.hxx"
#include "time/Parser.hxx"
#include "util/ASCII.hxx"
#include "util/RuntimeError.hxx"
#include "util/StringCompare.hxx"
@@ -171,8 +170,9 @@ struct DavResponse {
}
};
[[gnu::pure]]
static unsigned
ParseStatus(const char *s)
ParseStatus(const char *s) noexcept
{
/* skip the "HTTP/1.1" prefix */
const char *space = std::strchr(s, ' ');
@@ -182,37 +182,37 @@ ParseStatus(const char *s)
return strtoul(space + 1, nullptr, 10);
}
[[gnu::pure]]
static unsigned
ParseStatus(const char *s, size_t length)
ParseStatus(const char *s, size_t length) noexcept
{
return ParseStatus(std::string(s, length).c_str());
}
[[gnu::pure]]
static std::chrono::system_clock::time_point
ParseTimeStamp(const char *s)
ParseTimeStamp(const char *s) noexcept
{
try {
// TODO: make this more robust
return ParseTimePoint(s, "%a, %d %b %Y %T");
} catch (...) {
return std::chrono::system_clock::time_point::min();
}
return std::chrono::system_clock::from_time_t(curl_getdate(s, nullptr));
}
[[gnu::pure]]
static std::chrono::system_clock::time_point
ParseTimeStamp(const char *s, size_t length)
ParseTimeStamp(const char *s, size_t length) noexcept
{
return ParseTimeStamp(std::string(s, length).c_str());
}
[[gnu::pure]]
static uint64_t
ParseU64(const char *s)
ParseU64(const char *s) noexcept
{
return strtoull(s, nullptr, 10);
}
[[gnu::pure]]
static uint64_t
ParseU64(const char *s, size_t length)
ParseU64(const char *s, size_t length) noexcept
{
return ParseU64(std::string(s, length).c_str());
}
@@ -278,6 +278,7 @@ public:
"<a:resourcetype/>"
"<a:getcontenttype/>"
"<a:getcontentlength/>"
"<a:getlastmodified/>"
"</a:prop>"
"</a:propfind>");
}

@@ -1,57 +0,0 @@
/*
* Copyright 2014-2019 Max Kellermann <max.kellermann@gmail.com>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* - Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the
* distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
* OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "Parser.hxx"
#include "Convert.hxx"
#include <cassert>
#include <stdexcept>
#include <time.h>
std::chrono::system_clock::time_point
ParseTimePoint(const char *s, const char *format)
{
assert(s != nullptr);
assert(format != nullptr);
#ifdef _WIN32
/* TODO: emulate strptime()? */
(void)s;
(void)format;
throw std::runtime_error("Time parsing not implemented on Windows");
#else
struct tm tm{};
const char *end = strptime(s, format, &tm);
if (end == nullptr || *end != 0)
throw std::runtime_error("Failed to parse time stamp");
return TimeGm(tm);
#endif /* !_WIN32 */
}

@@ -1,43 +0,0 @@
/*
* Copyright 2014-2019 Max Kellermann <max.kellermann@gmail.com>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* - Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the
* distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
* OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef TIME_PARSER_HXX
#define TIME_PARSER_HXX
#include <chrono>
/**
* Parse a time stamp.
*
* Throws std::runtime_error on error.
*/
std::chrono::system_clock::time_point
ParseTimePoint(const char *s, const char *format);
#endif

@@ -1,6 +1,5 @@
time = static_library(
'time',
'Parser.cxx',
'Convert.cxx',
'ISO8601.cxx',
'Math.cxx',

@@ -1,12 +1,12 @@
[wrap-file]
directory = expat-2.4.8
source_url = https://github.com/libexpat/libexpat/releases/download/R_2_4_8/expat-2.4.8.tar.xz
source_filename = expat-2.4.8.tar.bz2
source_hash = f79b8f904b749e3e0d20afeadecf8249c55b2e32d4ebb089ae378df479dcaf25
patch_filename = expat_2.4.8-1_patch.zip
patch_url = https://wrapdb.mesonbuild.com/v2/expat_2.4.8-1/get_patch
patch_hash = 9aec253a2c6d1c0feb852c5c6920298d14701eeec7acc6832bb402438b52112a
directory = expat-2.4.9
source_url = https://github.com/libexpat/libexpat/releases/download/R_2_4_9/expat-2.4.9.tar.xz
source_filename = expat-2.4.9.tar.bz2
source_hash = 6e8c0728fe5c7cd3f93a6acce43046c5e4736c7b4b68e032e9350daa0efc0354
patch_filename = expat_2.4.9-1_patch.zip
patch_url = https://wrapdb.mesonbuild.com/v2/expat_2.4.9-1/get_patch
patch_hash = 51b42d935008552f9d6c4d3e7511b84690a2a0c9d90165d1d192fc892f0a4787
wrapdb_version = 2.4.9-1
[provide]
expat = expat_dep

@@ -1,12 +1,12 @@
[wrap-file]
directory = fmt-8.1.1
source_url = https://github.com/fmtlib/fmt/archive/8.1.1.tar.gz
source_filename = fmt-8.1.1.tar.gz
source_hash = 3d794d3cf67633b34b2771eb9f073bde87e846e0d395d254df7b211ef1ec7346
patch_filename = fmt_8.1.1-2_patch.zip
patch_url = https://wrapdb.mesonbuild.com/v2/fmt_8.1.1-2/get_patch
patch_hash = cd001046281330a8862591780a9ea71a1fa594edd0d015deb24e44680c9ea33b
wrapdb_version = 8.1.1-2
directory = fmt-9.0.0
source_url = https://github.com/fmtlib/fmt/archive/9.0.0.tar.gz
source_filename = fmt-9.0.0.tar.gz
source_hash = 9a1e0e9e843a356d65c7604e2c8bf9402b50fe294c355de0095ebd42fb9bd2c5
patch_filename = fmt_9.0.0-1_patch.zip
patch_url = https://wrapdb.mesonbuild.com/v2/fmt_9.0.0-1/get_patch
patch_hash = 5f12924065e0fe7ccae40593d256a082955c273cb2880b3e3de05df9d8d10697
wrapdb_version = 9.0.0-1
[provide]
fmt = fmt_dep

@@ -1,12 +1,12 @@
[wrap-file]
directory = sqlite-amalgamation-3380000
source_url = https://sqlite.org/2022/sqlite-amalgamation-3380000.zip
source_filename = sqlite-amalgamation-3380000.zip
source_hash = e055f6054e97747a135c89e36520c0a423249e8a91c5fc445163f4a6adb20df6
patch_filename = sqlite3_3.38.0-1_patch.zip
patch_url = https://wrapdb.mesonbuild.com/v2/sqlite3_3.38.0-1/get_patch
patch_hash = 49e30bf010ff63ab772d5417885e6905379025ceac80382e292c6dbd3a9da744
directory = sqlite-amalgamation-3390300
source_url = https://sqlite.org/2022/sqlite-amalgamation-3390300.zip
source_filename = sqlite-amalgamation-3390300.zip
source_hash = a89db3030d229d860ae56a8bac50ac9761434047ae886e47e7c8f9f428fa98ad
patch_filename = sqlite3_3.39.3-1_patch.zip
patch_url = https://wrapdb.mesonbuild.com/v2/sqlite3_3.39.3-1/get_patch
patch_hash = f5c41ff7b3da1108ed221b9a820b41188550cafb8a6c3d247bb40bd598775050
wrapdb_version = 3.39.3-1
[provide]
sqlite3 = sqlite3_dep

@@ -3,13 +3,12 @@ directory = libvorbis-1.3.7
source_url = https://downloads.xiph.org/releases/vorbis/libvorbis-1.3.7.tar.xz
source_filename = libvorbis-1.3.7.tar.xz
source_hash = b33cc4934322bcbf6efcbacf49e3ca01aadbea4114ec9589d1b1e9d20f72954b
patch_filename = vorbis_1.3.7-3_patch.zip
patch_url = https://wrapdb.mesonbuild.com/v2/vorbis_1.3.7-3/get_patch
patch_hash = 6cb90a61ede8c64d3e8e379b96dcc800c9dd69e925122b3d73d8f59a563c3afa
wrapdb_version = 1.3.7-3
patch_filename = vorbis_1.3.7-4_patch.zip
patch_url = https://wrapdb.mesonbuild.com/v2/vorbis_1.3.7-4/get_patch
patch_hash = 979e22b24b16c927040700dfd8319cd6ba29bf52a14dbc66b1cb4ea60504f14a
wrapdb_version = 1.3.7-4
[provide]
vorbis = vorbis_dep
vorbisfile = vorbisfile_dep
vorbisenc = vorbisenc_dep

@@ -320,11 +320,6 @@ if curl_dep.found()
include_directories: inc,
dependencies: [
curl_dep,
# Explicitly linking with zlib here works around a linker
# failure on Windows, because our Windows CURL build is
# statically linked and thus declares no dependency on zlib
zlib_dep,
],
)

@@ -19,6 +19,7 @@ test(
include_directories: inc,
dependencies: [
net_dep,
util_dep,
gtest_dep,
],
),