Merge branch 'v0.21.x'
This commit is contained in:
4
NEWS
4
NEWS
@@ -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
|
|||||||
|
|
||||||
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 @@
|
|||||||
#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 @@
|
|||||||
#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)
|
|||||||
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 @@
|
|||||||
#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)
|
|||||||
|
|
||||||
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)
|
|||||||
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,
|
||||||
|
Reference in New Issue
Block a user