release v0.22.9
-----BEGIN PGP SIGNATURE----- iQJEBAABCgAuFiEEA5IzWngIOJSkMBxDI26KWMbbRRIFAmDTg80QHG1heEBtdXNp Y3BkLm9yZwAKCRAjbopYxttFErvaD/93cfFvY/E9NZbI7XmuEfrfX0dUEo2dd8bi O1tbEU+8uquNLV5cyb5iEpu6RCbAQxjj8clqVuMgfl0Qe3NQ+Z+nyOg0YVEB4Z16 cQBDFGawth7HuaqBIdMgnoapUxyGW3KMFw6si5OsV5AMkT5ybdsWg3sOXIXG+cLa 7KoIwVlgum+DsAPCSKis9fiuZJCnsg9SVcsJnpoaa7ZVOASPp1Wd7F9Kv6wj03/R fEQ3z/s/4ILsWmZFHnclFq5LSpNvom5fAiedO15WVsJCxoZHEAg0ZpnNn/whU1HA fciGImrjHLCTKVS5xpWNXUMaov2k7LEbLka2AqYwdeuxf7kAeoZC42H/cwK6tH/F xuNWg4l9DZQUoGFxN4hfxJi3fsVpx0+3FR+cJQWOuUtwcmh4e7qJKX1gxAjHvEQY GPS+jx7ndpcVDJyupvhFVGT0VDEOP7yMTjdY6uc5dXa4Ulx59duvgTdEyYgS4feM BqNOYkD2FXnN7nv56f23q5SkRHF5D5nnoc8robIWkng9PXoq1Faq42MwLFxyCdH1 duRHk06FaFYpPv7gYagarFYIwOKCteL8aOwLymYbJop0O8ripYVQ7hHcEeWNvV+f Q1ggllNBD/igvom6tRNl+S7TeQijr44M3/pDvDI3oXJPCfh1ZFGjwKqKqS76JfEu v4V1N0rseA== =p1U2 -----END PGP SIGNATURE----- Merge tag 'v0.22.9' release v0.22.9
This commit is contained in:
commit
e4e4576a39
7
NEWS
7
NEWS
|
@ -16,11 +16,16 @@ ver 0.23 (not yet released)
|
|||
- new tags "ComposerSort", "Ensemble", "Movement", "MovementNumber", and "Location"
|
||||
* new build-time dependency: libfmt
|
||||
|
||||
ver 0.22.9 (not yet released)
|
||||
ver 0.22.9 (2021/06/23)
|
||||
* database
|
||||
- simple: load all .mpdignore files of all parent directories
|
||||
* tags
|
||||
- fix "readcomments" and "readpicture" on remote files with ID3 tags
|
||||
* decoder
|
||||
- ffmpeg: support the tags "sort_album", "album-sort", "artist-sort"
|
||||
- ffmpeg: fix build failure with FFmpeg 3.4
|
||||
* Android
|
||||
- fix auto-start on boot in Android 8 or later
|
||||
* Windows
|
||||
- fix build failure with SQLite
|
||||
|
||||
|
|
|
@ -14,7 +14,7 @@ For basic installation instructions
|
|||
|
||||
- [Manual](http://www.musicpd.org/doc/user/)
|
||||
- [Forum](http://forum.musicpd.org/)
|
||||
- [IRC](irc://chat.freenode.net/#mpd)
|
||||
- [IRC](ircs://irc.libera.chat:6697/#mpd)
|
||||
- [Bug tracker](https://github.com/MusicPlayerDaemon/MPD/issues/)
|
||||
|
||||
# Developers
|
||||
|
|
|
@ -414,6 +414,15 @@ public class Main extends Service implements Runnable {
|
|||
* start Main service without any callback
|
||||
*/
|
||||
public static void start(Context context, boolean wakelock) {
|
||||
context.startService(new Intent(context, Main.class).putExtra("wakelock", wakelock));
|
||||
Intent intent = new Intent(context, Main.class)
|
||||
.putExtra("wakelock", wakelock);
|
||||
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
|
||||
/* in Android 8+, we need to use this method
|
||||
or else we'll get "IllegalStateException:
|
||||
app is in background" */
|
||||
context.startForegroundService(intent);
|
||||
else
|
||||
context.startService(intent);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -760,7 +760,7 @@ A resampler using `libsamplerate <http://www.mega-nerd.com/SRC/>`_ a.k.a. Secret
|
|||
* - Name
|
||||
- Description
|
||||
* - **type**
|
||||
- The interpolator type. See below for a list of known types.
|
||||
- The interpolator type. Defaults to :samp:`2`. See below for a list of known types.
|
||||
|
||||
The following converter types are provided by libsamplerate:
|
||||
|
||||
|
|
|
@ -689,6 +689,8 @@ The State File
|
|||
- Specify the state file location. The parent directory must be writable by the :program:`MPD` user (+wx).
|
||||
* - **state_file_interval SECONDS**
|
||||
- Auto-save the state file this number of seconds after each state change. Defaults to 120 (2 minutes).
|
||||
* - **restore_paused yes|no**
|
||||
- If set to :samp:`yes`, then :program:`MPD` is put into pause mode instead of starting playback after startup. Default is :samp:`no`.
|
||||
|
||||
The Sticker Database
|
||||
^^^^^^^^^^^^^^^^^^^^
|
||||
|
@ -1121,7 +1123,7 @@ Support
|
|||
Getting Help
|
||||
^^^^^^^^^^^^
|
||||
|
||||
The :program:`MPD` project runs a `forum <https://forum.musicpd.org/>`_ and an IRC channel (#mpd on Freenode) for requesting help. Visit the MPD help page for details on how to get help.
|
||||
The :program:`MPD` project runs a `forum <https://forum.musicpd.org/>`_ and an IRC channel (#mpd on Libera.Chat) for requesting help. Visit the MPD help page for details on how to get help.
|
||||
|
||||
Common Problems
|
||||
^^^^^^^^^^^^^^^
|
||||
|
|
|
@ -20,7 +20,7 @@ class Project:
|
|||
self.base = base
|
||||
|
||||
if name is None or version is None:
|
||||
m = re.match(r'^([-\w]+)-(\d[\d.]*[a-z]?[\d.]*(?:-alpha\d+)?)$', self.base)
|
||||
m = re.match(r'^([-\w]+)-(\d[\d.]*[a-z]?[\d.]*(?:-alpha\d+)?)(\+.*)?$', self.base)
|
||||
if name is None: name = m.group(1)
|
||||
if version is None: version = m.group(2)
|
||||
|
||||
|
|
19
src/Main.cxx
19
src/Main.cxx
|
@ -489,6 +489,15 @@ MainConfigured(const struct options &options, const ConfigData &raw_config)
|
|||
LogError(std::current_exception(),
|
||||
"Zeroconf initialization failed");
|
||||
}
|
||||
|
||||
AtScopeExit(&zeroconf, &instance) {
|
||||
if (zeroconf) {
|
||||
auto &event_loop = instance.io_thread.GetEventLoop();
|
||||
BlockingCall(event_loop, [&](){
|
||||
zeroconf.reset();
|
||||
});
|
||||
}
|
||||
};
|
||||
#endif
|
||||
|
||||
#ifdef ENABLE_DATABASE
|
||||
|
@ -550,16 +559,6 @@ MainConfigured(const struct options &options, const ConfigData &raw_config)
|
|||
instance.state_file->Write();
|
||||
|
||||
instance.BeginShutdownUpdate();
|
||||
|
||||
#ifdef HAVE_ZEROCONF
|
||||
if (zeroconf) {
|
||||
auto &event_loop = instance.io_thread.GetEventLoop();
|
||||
BlockingCall(event_loop, [&](){
|
||||
zeroconf.reset();
|
||||
});
|
||||
}
|
||||
#endif
|
||||
|
||||
instance.BeginShutdownPartitions();
|
||||
}
|
||||
|
||||
|
|
|
@ -25,6 +25,7 @@
|
|||
#include "client/Client.hxx"
|
||||
#include "protocol/Ack.hxx"
|
||||
#include "fs/AllocatedPath.hxx"
|
||||
#include "input/InputStream.hxx"
|
||||
#include "util/Compiler.h"
|
||||
#include "util/UriExtract.hxx"
|
||||
#include "LocateUri.hxx"
|
||||
|
@ -32,8 +33,13 @@
|
|||
static void
|
||||
TagScanStream(const char *uri, TagHandler &handler)
|
||||
{
|
||||
if (!tag_stream_scan(uri, handler))
|
||||
Mutex mutex;
|
||||
|
||||
auto is = InputStream::OpenReady(uri, mutex);
|
||||
if (!tag_stream_scan(*is, handler))
|
||||
throw ProtocolError(ACK_ERROR_NO_EXIST, "Failed to load file");
|
||||
|
||||
ScanGenericTags(*is, handler);
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
|
@ -430,6 +430,7 @@ SendGroup(mpd_connection *connection, TagType group)
|
|||
return mpd_search_add_group_tag(connection, tag);
|
||||
#else
|
||||
(void)connection;
|
||||
(void)group;
|
||||
|
||||
throw std::runtime_error("Grouping requires libmpdclient 2.12");
|
||||
#endif
|
||||
|
|
|
@ -470,6 +470,7 @@ IsSeekable(const AVFormatContext &format_context) noexcept
|
|||
#if LIBAVFORMAT_VERSION_INT >= AV_VERSION_INT(58, 6, 100)
|
||||
return (format_context.ctx_flags & AVFMTCTX_UNSEEKABLE) != 0;
|
||||
#else
|
||||
(void)format_context;
|
||||
return false;
|
||||
#endif
|
||||
}
|
||||
|
@ -658,6 +659,8 @@ ffmpeg_scan_stream(InputStream &is, TagHandler &handler)
|
|||
return FfmpegScanStream(*f, handler);
|
||||
}
|
||||
|
||||
#if LIBAVFORMAT_VERSION_INT >= AV_VERSION_INT(58, 9, 100)
|
||||
|
||||
static void
|
||||
ffmpeg_uri_decode(DecoderClient &client, const char *uri)
|
||||
{
|
||||
|
@ -689,6 +692,8 @@ ffmpeg_protocols() noexcept
|
|||
return protocols;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/**
|
||||
* A list of extensions found for the formats supported by ffmpeg.
|
||||
* This list is current as of 02-23-09; To find out if there are more
|
||||
|
@ -812,6 +817,8 @@ static const char *const ffmpeg_mime_types[] = {
|
|||
constexpr DecoderPlugin ffmpeg_decoder_plugin =
|
||||
DecoderPlugin("ffmpeg", ffmpeg_decode, ffmpeg_scan_stream)
|
||||
.WithInit(ffmpeg_init, ffmpeg_finish)
|
||||
#if LIBAVFORMAT_VERSION_INT >= AV_VERSION_INT(58, 9, 100)
|
||||
.WithProtocols(ffmpeg_protocols, ffmpeg_uri_decode)
|
||||
#endif
|
||||
.WithSuffixes(ffmpeg_suffixes)
|
||||
.WithMimeTypes(ffmpeg_mime_types);
|
||||
|
|
|
@ -32,6 +32,7 @@ LastInputStream::~LastInputStream() noexcept = default;
|
|||
void
|
||||
LastInputStream::Close() noexcept
|
||||
{
|
||||
uri.clear();
|
||||
is.reset();
|
||||
close_timer.Cancel();
|
||||
}
|
||||
|
|
|
@ -64,8 +64,7 @@ public:
|
|||
return is.get();
|
||||
}
|
||||
|
||||
is.reset();
|
||||
close_timer.Cancel();
|
||||
Close();
|
||||
|
||||
is = open(new_uri, mutex);
|
||||
uri = std::forward<U>(new_uri);
|
||||
|
|
Loading…
Reference in New Issue