diff --git a/NEWS b/NEWS index a6db643c8..9c5c8a7ef 100644 --- a/NEWS +++ b/NEWS @@ -39,6 +39,7 @@ ver 0.21 (not yet released) - shout: support the Shine encoder plugin - sndio: remove support for the broken RoarAudio sndio emulation - osx: initial support for DSD over PCM + - roar: removed - httpd_output: support for unix sockets * mixer - sndio: new mixer plugin diff --git a/doc/plugins.rst b/doc/plugins.rst index 77cd6c70b..3e6d6dd08 100644 --- a/doc/plugins.rst +++ b/doc/plugins.rst @@ -936,21 +936,6 @@ The pulse plugin connects to a `PulseAudio `_ server. - -.. list-table:: - :widths: 20 80 - :header-rows: 1 - - * - Setting - - Description - * - **server HOSTNAME** - - The host name of the RoarAudio server. If not specified, then :program:`MPD` will connect to the default locations. - * - **role ROLE** - - The "role" that :program:`MPD` registers itself as in the RoarAudio server. The default is "music". - recorder ~~~~~~~~ The recorder plugin writes the audio played by :program:`MPD` to a file. This may be useful for recording radio streams. diff --git a/doc/user.rst b/doc/user.rst index a69512892..6d59ab60f 100644 --- a/doc/user.rst +++ b/doc/user.rst @@ -72,7 +72,7 @@ For example, the following installs a fairly complete list of build dependencies libzzip-dev \ libcurl4-gnutls-dev libyajl-dev libexpat-dev \ libasound2-dev libao-dev libjack-jackd2-dev libopenal-dev \ - libpulse-dev libroar-dev libshout3-dev \ + libpulse-dev libshout3-dev \ libsndio-dev \ libmpdclient-dev \ libnfs-dev libsmbclient-dev \ diff --git a/meson.build b/meson.build index 534453f5d..8d85d1c31 100644 --- a/meson.build +++ b/meson.build @@ -309,7 +309,6 @@ subdir('src/lib/wrap') subdir('src/lib/nfs') subdir('src/lib/oss') subdir('src/lib/pulse') -subdir('src/lib/roar') subdir('src/lib/sndio') subdir('src/lib/sqlite') subdir('src/lib/systemd') diff --git a/meson_options.txt b/meson_options.txt index 48622b5f1..c2d388a46 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -163,7 +163,6 @@ option('oss', type: 'feature', description: 'Open Sound System support') option('pipe', type: 'boolean', value: true, description: 'Pipe output plugin') option('pulse', type: 'feature', description: 'PulseAudio support') option('recorder', type: 'boolean', value: true, description: 'Recorder output plugin') -option('roar', type: 'feature', description: 'Roar output plugin') option('shout', type: 'feature', description: 'Shoutcast streaming support using libshout') option('sndio', type: 'feature', description: 'sndio output plugin') option('solaris_output', type: 'feature', description: 'Solaris /dev/audio support') diff --git a/src/lib/roar/meson.build b/src/lib/roar/meson.build deleted file mode 100644 index 9269a4efd..000000000 --- a/src/lib/roar/meson.build +++ /dev/null @@ -1,2 +0,0 @@ -libroar_dep = dependency('libroar', version: '>= 0.4.0', required: get_option('roar')) -conf.set('ENABLE_ROAR', libroar_dep.found()) diff --git a/src/mixer/MixerList.hxx b/src/mixer/MixerList.hxx index ae4a4e81e..7fa3daf2b 100644 --- a/src/mixer/MixerList.hxx +++ b/src/mixer/MixerList.hxx @@ -33,7 +33,6 @@ extern const MixerPlugin alsa_mixer_plugin; extern const MixerPlugin haiku_mixer_plugin; extern const MixerPlugin oss_mixer_plugin; extern const MixerPlugin osx_mixer_plugin; -extern const MixerPlugin roar_mixer_plugin; extern const MixerPlugin pulse_mixer_plugin; extern const MixerPlugin winmm_mixer_plugin; extern const MixerPlugin sndio_mixer_plugin; diff --git a/src/mixer/plugins/RoarMixerPlugin.cxx b/src/mixer/plugins/RoarMixerPlugin.cxx deleted file mode 100644 index 77dd2cc44..000000000 --- a/src/mixer/plugins/RoarMixerPlugin.cxx +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright 2003-2017 The Music Player Daemon Project - * Copyright (C) 2010-2011 Philipp 'ph3-der-loewe' Schafft - * Copyright (C) 2010-2011 Hans-Kristian 'maister' Arntzen - * - * 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. - */ - - -#include "config.h" -#include "mixer/MixerInternal.hxx" -#include "output/plugins/RoarOutputPlugin.hxx" -#include "util/Compiler.h" - -class RoarMixer final : public Mixer { - /** the base mixer class */ - RoarOutput &self; - -public: - RoarMixer(RoarOutput &_output, MixerListener &_listener) - :Mixer(roar_mixer_plugin, _listener), - self(_output) {} - - /* virtual methods from class Mixer */ - void Open() override { - } - - void Close() noexcept override { - } - - int GetVolume() override; - void SetVolume(unsigned volume) override; -}; - -static Mixer * -roar_mixer_init(gcc_unused EventLoop &event_loop, AudioOutput &ao, - MixerListener &listener, - gcc_unused const ConfigBlock &block) -{ - return new RoarMixer((RoarOutput &)ao, listener); -} - -int -RoarMixer::GetVolume() -{ - return roar_output_get_volume(self); -} - -void -RoarMixer::SetVolume(unsigned volume) -{ - roar_output_set_volume(self, volume); -} - -const MixerPlugin roar_mixer_plugin = { - roar_mixer_init, - false, -}; diff --git a/src/mixer/plugins/meson.build b/src/mixer/plugins/meson.build index d145b48a7..eda7c8e2a 100644 --- a/src/mixer/plugins/meson.build +++ b/src/mixer/plugins/meson.build @@ -26,10 +26,6 @@ if pulse_dep.found() mixer_plugins_sources += 'PulseMixerPlugin.cxx' endif -if libroar_dep.found() - mixer_plugins_sources += 'RoarMixerPlugin.cxx' -endif - if libsndio_dep.found() mixer_plugins_sources += 'SndioMixerPlugin.cxx' endif @@ -45,7 +41,6 @@ mixer_plugins = static_library( dependencies: [ alsa_dep, pulse_dep, - libroar_dep, libsndio_dep, ] ) diff --git a/src/output/Registry.cxx b/src/output/Registry.cxx index 0a70d610c..522ede903 100644 --- a/src/output/Registry.cxx +++ b/src/output/Registry.cxx @@ -34,7 +34,6 @@ #include "plugins/PipeOutputPlugin.hxx" #include "plugins/PulseOutputPlugin.hxx" #include "plugins/RecorderOutputPlugin.hxx" -#include "plugins/RoarOutputPlugin.hxx" #include "plugins/ShoutOutputPlugin.hxx" #include "plugins/sles/SlesOutputPlugin.hxx" #include "plugins/SolarisOutputPlugin.hxx" @@ -65,9 +64,6 @@ const AudioOutputPlugin *const audio_output_plugins[] = { #ifdef ENABLE_ALSA &alsa_output_plugin, #endif -#ifdef ENABLE_ROAR - &roar_output_plugin, -#endif #ifdef ENABLE_AO &ao_output_plugin, #endif diff --git a/src/output/plugins/RoarOutputPlugin.cxx b/src/output/plugins/RoarOutputPlugin.cxx deleted file mode 100644 index adc44afce..000000000 --- a/src/output/plugins/RoarOutputPlugin.cxx +++ /dev/null @@ -1,347 +0,0 @@ -/* - * Copyright 2003-2017 The Music Player Daemon Project - * Copyright (C) 2010-2011 Philipp 'ph3-der-loewe' Schafft - * Copyright (C) 2010-2011 Hans-Kristian 'maister' Arntzen - * - * 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. - */ - -#include "config.h" -#include "RoarOutputPlugin.hxx" -#include "../OutputAPI.hxx" -#include "mixer/MixerList.hxx" -#include "thread/Mutex.hxx" -#include "util/Domain.hxx" -#include "Log.hxx" - -#include -#include - -/* libroar/services.h declares roar_service_stream::new - work around - this C++ problem */ -#define new _new -#include -#undef new - -#include - -class RoarOutput final : AudioOutput { - const std::string host, name; - - roar_vs_t * vss; - int err = ROAR_ERROR_NONE; - const int role; - struct roar_connection con; - struct roar_audio_info info; - mutable Mutex mutex; - bool alive; - -public: - RoarOutput(const ConfigBlock &block); - - static AudioOutput *Create(EventLoop &, const ConfigBlock &block) { - return new RoarOutput(block); - } - - int GetVolume() const; - void SetVolume(unsigned volume); - -private: - void Open(AudioFormat &audio_format) override; - void Close() noexcept override; - - void SendTag(const Tag &tag) override; - size_t Play(const void *chunk, size_t size) override; - void Cancel() noexcept override; -}; - -static constexpr Domain roar_output_domain("roar_output"); - -gcc_pure -static int -GetConfiguredRole(const ConfigBlock &block) noexcept -{ - const char *role = block.GetBlockValue("role"); - return role != nullptr - ? roar_str2role(role) - : ROAR_ROLE_MUSIC; -} - -RoarOutput::RoarOutput(const ConfigBlock &block) - :AudioOutput(0), - host(block.GetBlockValue("server", "")), - name(block.GetBlockValue("name", "MPD")), - role(GetConfiguredRole(block)) -{ -} - -inline int -RoarOutput::GetVolume() const -{ - const std::lock_guard protect(mutex); - - if (vss == nullptr || !alive) - return -1; - - float l, r; - int error; - if (roar_vs_volume_get(vss, &l, &r, &error) < 0) - throw std::runtime_error(roar_vs_strerr(error)); - - return (l + r) * 50; -} - -int -roar_output_get_volume(RoarOutput &roar) -{ - return roar.GetVolume(); -} - -inline void -RoarOutput::SetVolume(unsigned volume) -{ - assert(volume <= 100); - - const std::lock_guard protect(mutex); - if (vss == nullptr || !alive) - throw std::runtime_error("closed"); - - int error; - float level = volume / 100.0; - - if (roar_vs_volume_mono(vss, level, &error) < 0) - throw std::runtime_error(roar_vs_strerr(error)); -} - -void -roar_output_set_volume(RoarOutput &roar, unsigned volume) -{ - roar.SetVolume(volume); -} - -static void -roar_use_audio_format(struct roar_audio_info *info, - AudioFormat &audio_format) -{ - info->rate = audio_format.sample_rate; - info->channels = audio_format.channels; - info->codec = ROAR_CODEC_PCM_S; - - switch (audio_format.format) { - case SampleFormat::UNDEFINED: - case SampleFormat::FLOAT: - case SampleFormat::DSD: - info->bits = 16; - audio_format.format = SampleFormat::S16; - break; - - case SampleFormat::S8: - info->bits = 8; - break; - - case SampleFormat::S16: - info->bits = 16; - break; - - case SampleFormat::S24_P32: - info->bits = 32; - audio_format.format = SampleFormat::S32; - break; - - case SampleFormat::S32: - info->bits = 32; - break; - } -} - -void -RoarOutput::Open(AudioFormat &audio_format) -{ - const std::lock_guard protect(mutex); - - if (roar_simple_connect(&con, - host.empty() ? nullptr : host.c_str(), - name.c_str()) < 0) - throw std::runtime_error("Failed to connect to Roar server"); - - vss = roar_vs_new_from_con(&con, &err); - - if (vss == nullptr || err != ROAR_ERROR_NONE) - throw std::runtime_error("Failed to connect to server"); - - roar_use_audio_format(&info, audio_format); - - if (roar_vs_stream(vss, &info, ROAR_DIR_PLAY, &err) < 0) - throw std::runtime_error("Failed to start stream"); - - roar_vs_role(vss, role, &err); - alive = true; -} - -void -RoarOutput::Close() noexcept -{ - const std::lock_guard protect(mutex); - - alive = false; - - if (vss != nullptr) - roar_vs_close(vss, ROAR_VS_TRUE, &err); - vss = nullptr; - roar_disconnect(&con); -} - -void -RoarOutput::Cancel() noexcept -{ - const std::lock_guard protect(mutex); - - if (vss == nullptr) - return; - - roar_vs_t *_vss = vss; - vss = nullptr; - roar_vs_close(_vss, ROAR_VS_TRUE, &err); - alive = false; - - _vss = roar_vs_new_from_con(&con, &err); - if (_vss == nullptr) - return; - - if (roar_vs_stream(_vss, &info, ROAR_DIR_PLAY, &err) < 0) { - roar_vs_close(_vss, ROAR_VS_TRUE, &err); - LogError(roar_output_domain, "Failed to start stream"); - return; - } - - roar_vs_role(_vss, role, &err); - vss = _vss; - alive = true; -} - -size_t -RoarOutput::Play(const void *chunk, size_t size) -{ - if (vss == nullptr) - throw std::runtime_error("Connection is invalid"); - - ssize_t nbytes = roar_vs_write(vss, chunk, size, &err); - if (nbytes <= 0) - throw std::runtime_error("Failed to play data"); - - return nbytes; -} - -static const char* -roar_tag_convert(TagType type, bool *is_uuid) -{ - *is_uuid = false; - switch (type) - { - case TAG_ARTIST: - case TAG_ALBUM_ARTIST: - return "AUTHOR"; - case TAG_ALBUM: - return "ALBUM"; - case TAG_TITLE: - return "TITLE"; - case TAG_TRACK: - return "TRACK"; - case TAG_NAME: - return "NAME"; - case TAG_GENRE: - return "GENRE"; - case TAG_DATE: - return "DATE"; - case TAG_PERFORMER: - return "PERFORMER"; - case TAG_COMMENT: - return "COMMENT"; - case TAG_DISC: - return "DISCID"; - case TAG_COMPOSER: -#ifdef ROAR_META_TYPE_COMPOSER - return "COMPOSER"; -#else - return "AUTHOR"; -#endif - case TAG_MUSICBRAINZ_ARTISTID: - case TAG_MUSICBRAINZ_ALBUMID: - case TAG_MUSICBRAINZ_ALBUMARTISTID: - case TAG_MUSICBRAINZ_TRACKID: - case TAG_MUSICBRAINZ_RELEASETRACKID: - case TAG_MUSICBRAINZ_WORKID: - *is_uuid = true; - return "HASH"; - - default: - return nullptr; - } -} - -void -RoarOutput::SendTag(const Tag &tag) -{ - if (vss == nullptr) - return; - - const std::lock_guard protect(mutex); - - size_t cnt = 0; - struct roar_keyval vals[32]; - char uuid_buf[32][64]; - - char timebuf[16]; - if (!tag.duration.IsNegative()) { - const unsigned seconds = tag.duration.ToS(); - snprintf(timebuf, sizeof(timebuf), "%02d:%02d:%02d", - seconds / 3600, (seconds % 3600) / 60, seconds % 60); - - vals[cnt].key = const_cast("LENGTH"); - vals[cnt].value = timebuf; - ++cnt; - } - - for (const auto &item : tag) { - if (cnt >= 32) - break; - - bool is_uuid = false; - const char *key = roar_tag_convert(item.type, - &is_uuid); - if (key != nullptr) { - vals[cnt].key = const_cast(key); - - if (is_uuid) { - snprintf(uuid_buf[cnt], sizeof(uuid_buf[0]), "{UUID}%s", - item.value); - vals[cnt].value = uuid_buf[cnt]; - } else { - vals[cnt].value = const_cast(item.value); - } - - cnt++; - } - } - - roar_vs_meta(vss, vals, cnt, &(err)); -} - -const struct AudioOutputPlugin roar_output_plugin = { - "roar", - nullptr, - &RoarOutput::Create, - &roar_mixer_plugin, -}; diff --git a/src/output/plugins/RoarOutputPlugin.hxx b/src/output/plugins/RoarOutputPlugin.hxx deleted file mode 100644 index da08bc6bf..000000000 --- a/src/output/plugins/RoarOutputPlugin.hxx +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright 2003-2017 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. - */ - -#ifndef MPD_ROAR_OUTPUT_PLUGIN_H -#define MPD_ROAR_OUTPUT_PLUGIN_H - -class RoarOutput; - -extern const struct AudioOutputPlugin roar_output_plugin; - -int -roar_output_get_volume(RoarOutput &roar); - -void -roar_output_set_volume(RoarOutput &roar, unsigned volume); - -#endif diff --git a/src/output/plugins/meson.build b/src/output/plugins/meson.build index 1e67c7c9a..7b5ea8bb8 100644 --- a/src/output/plugins/meson.build +++ b/src/output/plugins/meson.build @@ -99,10 +99,6 @@ if get_option('recorder') need_encoder = true endif -if libroar_dep.found() - output_plugins_sources += 'RoarOutputPlugin.cxx' -endif - libshout_dep = dependency('shout', required: get_option('shout')) conf.set('HAVE_SHOUT', libshout_dep.found()) if libshout_dep.found() @@ -150,7 +146,6 @@ output_plugins = static_library( libao_dep, libjack_dep, pulse_dep, - libroar_dep, libshout_dep, libsndio_dep, openal_dep,