Commit 01fd6e5e authored by Max Kellermann's avatar Max Kellermann

Merge branch 'v0.21.x'

parents beed004b 8bf3f9b8
...@@ -13,6 +13,10 @@ ver 0.22 (not yet released) ...@@ -13,6 +13,10 @@ ver 0.22 (not yet released)
- hdcd: new plugin based on FFmpeg's "af_hdcd" for HDCD playback - hdcd: new plugin based on FFmpeg's "af_hdcd" for HDCD playback
ver 0.21.11 (not yet released) ver 0.21.11 (not yet released)
* input
- tidal: deprecated because Tidal has changed the protocol
* decoder
- wildmidi: log error if library initialization fails
* output * output
- alsa, osx: fix distortions with DSD_U32 and DoP on 32 bit CPUs - alsa, osx: fix distortions with DSD_U32 and DoP on 32 bit CPUs
* protocol * protocol
......
...@@ -269,6 +269,11 @@ tidal ...@@ -269,6 +269,11 @@ tidal
Play songs from the commercial streaming service `Tidal <http://tidal.com/>`_. It plays URLs in the form tidal://track/ID, e.g.: Play songs from the commercial streaming service `Tidal <http://tidal.com/>`_. It plays URLs in the form tidal://track/ID, e.g.:
.. warning::
This plugin is currently defunct because Tidal has changed the
protocol and decided not to share documentation.
.. code-block:: none .. code-block:: none
mpc add tidal://track/59727857 mpc add tidal://track/59727857
......
...@@ -20,6 +20,8 @@ ...@@ -20,6 +20,8 @@
#include "config.h" #include "config.h"
#include "DecoderList.hxx" #include "DecoderList.hxx"
#include "DecoderPlugin.hxx" #include "DecoderPlugin.hxx"
#include "PluginUnavailable.hxx"
#include "Log.hxx"
#include "config/Data.hxx" #include "config/Data.hxx"
#include "config/Block.hxx" #include "config/Block.hxx"
#include "plugins/AudiofileDecoderPlugin.hxx" #include "plugins/AudiofileDecoderPlugin.hxx"
...@@ -45,6 +47,7 @@ ...@@ -45,6 +47,7 @@
#include "plugins/FluidsynthDecoderPlugin.hxx" #include "plugins/FluidsynthDecoderPlugin.hxx"
#include "plugins/SidplayDecoderPlugin.hxx" #include "plugins/SidplayDecoderPlugin.hxx"
#include "util/Macros.hxx" #include "util/Macros.hxx"
#include "util/RuntimeError.hxx"
#include <string.h> #include <string.h>
...@@ -147,8 +150,17 @@ decoder_plugin_init_all(const ConfigData &config) ...@@ -147,8 +150,17 @@ decoder_plugin_init_all(const ConfigData &config)
if (param != nullptr) if (param != nullptr)
param->SetUsed(); param->SetUsed();
if (plugin.Init(*param)) try {
decoder_plugins_enabled[i] = true; if (plugin.Init(*param))
decoder_plugins_enabled[i] = true;
} catch (const PluginUnavailable &e) {
FormatError(e,
"Decoder plugin '%s' is unavailable",
plugin.name);
} catch (...) {
std::throw_with_nested(FormatRuntimeError("Failed to initialize decoder plugin '%s'",
plugin.name));
}
} }
} }
......
...@@ -20,18 +20,18 @@ ...@@ -20,18 +20,18 @@
#include "WildmidiDecoderPlugin.hxx" #include "WildmidiDecoderPlugin.hxx"
#include "../DecoderAPI.hxx" #include "../DecoderAPI.hxx"
#include "tag/Handler.hxx" #include "tag/Handler.hxx"
#include "util/Domain.hxx" #include "util/ScopeExit.hxx"
#include "util/StringFormat.hxx"
#include "fs/AllocatedPath.hxx" #include "fs/AllocatedPath.hxx"
#include "fs/FileSystem.hxx" #include "fs/FileSystem.hxx"
#include "fs/Path.hxx" #include "fs/Path.hxx"
#include "Log.hxx" #include "Log.hxx"
#include "PluginUnavailable.hxx"
extern "C" { extern "C" {
#include <wildmidi_lib.h> #include <wildmidi_lib.h>
} }
static constexpr Domain wildmidi_domain("wildmidi");
static constexpr AudioFormat wildmidi_audio_format{48000, SampleFormat::S16, 2}; static constexpr AudioFormat wildmidi_audio_format{48000, SampleFormat::S16, 2};
static bool static bool
...@@ -43,14 +43,27 @@ wildmidi_init(const ConfigBlock &block) ...@@ -43,14 +43,27 @@ wildmidi_init(const ConfigBlock &block)
if (!FileExists(path)) { if (!FileExists(path)) {
const auto utf8 = path.ToUTF8(); const auto utf8 = path.ToUTF8();
FormatDebug(wildmidi_domain, throw PluginUnavailable(StringFormat<1024>("configuration file does not exist: %s",
"configuration file does not exist: %s", utf8.c_str()));
utf8.c_str());
return false;
} }
return WildMidi_Init(path.c_str(), wildmidi_audio_format.sample_rate, #ifdef LIBWILDMIDI_VERSION
0) == 0; /* WildMidi_ClearError() requires libwildmidi 0.4 */
WildMidi_ClearError();
AtScopeExit() { WildMidi_ClearError(); };
#endif
if (WildMidi_Init(path.c_str(), wildmidi_audio_format.sample_rate,
0) != 0) {
#ifdef LIBWILDMIDI_VERSION
/* WildMidi_GetError() requires libwildmidi 0.4 */
throw PluginUnavailable(WildMidi_GetError());
#else
throw PluginUnavailable("WildMidi_Init() failed");
#endif
}
return true;
} }
static void static void
......
...@@ -180,6 +180,8 @@ InitTidalInput(EventLoop &event_loop, const ConfigBlock &block) ...@@ -180,6 +180,8 @@ InitTidalInput(EventLoop &event_loop, const ConfigBlock &block)
if (password == nullptr) if (password == nullptr)
throw PluginUnconfigured("No Tidal password configured"); throw PluginUnconfigured("No Tidal password configured");
FormatWarning(tidal_domain, "The Tidal input plugin is deprecated because Tidal has changed the protocol and doesn't share documentation");
tidal_audioquality = block.GetBlockValue("audioquality", "HIGH"); tidal_audioquality = block.GetBlockValue("audioquality", "HIGH");
tidal_session = new TidalSessionManager(event_loop, base_url, token, tidal_session = new TidalSessionManager(event_loop, base_url, token,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment