From e903d0096807565834c77e6d85c670493e34202f Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Wed, 17 Apr 2013 00:44:02 +0200 Subject: [PATCH] output/ffado: remove broken plugin This plugin has been in MPD for three years, and it has never worked. Enough! --- INSTALL | 3 - Makefile.am | 7 - NEWS | 1 + configure.ac | 17 -- doc/user.xml | 37 ---- src/OutputList.cxx | 4 - src/output/ffado_output_plugin.c | 359 ------------------------------- src/output/ffado_output_plugin.h | 25 --- valgrind.suppressions | 11 - 9 files changed, 1 insertion(+), 463 deletions(-) delete mode 100644 src/output/ffado_output_plugin.c delete mode 100644 src/output/ffado_output_plugin.h diff --git a/INSTALL b/INSTALL index 9db6c67f0..185798a76 100644 --- a/INSTALL +++ b/INSTALL @@ -56,9 +56,6 @@ You also need an encoder: either libvorbisenc (ogg), or liblame (mp3). OpenAL - http://kcat.strangesoft.net/openal.html Open Audio Library -libffado - http://www.ffado.org/ -For FireWire audio devices. - Optional Input Dependencies --------------------------- diff --git a/Makefile.am b/Makefile.am index 463c0bec8..744ca4e44 100644 --- a/Makefile.am +++ b/Makefile.am @@ -750,7 +750,6 @@ endif liboutput_plugins_a_CPPFLAGS = $(AM_CPPFLAGS) \ $(AO_CFLAGS) \ $(ALSA_CFLAGS) \ - $(FFADO_CFLAGS) \ $(JACK_CFLAGS) \ $(OPENAL_CFLAGS) \ $(OPENSSL_CFLAGS) \ @@ -763,7 +762,6 @@ OUTPUT_LIBS = \ $(AO_LIBS) \ $(ALSA_LIBS) \ $(ROAR_LIBS) \ - $(FFADO_LIBS) \ $(JACK_LIBS) \ $(OPENAL_LIBS) \ $(PULSE_LIBS) \ @@ -817,11 +815,6 @@ liboutput_plugins_a_SOURCES += \ libmixer_plugins_a_SOURCES += src/mixer/RoarMixerPlugin.cxx endif -if ENABLE_FFADO_OUTPUT -liboutput_plugins_a_SOURCES += \ - src/output/ffado_output_plugin.c src/output/ffado_output_plugin.h -endif - if HAVE_AO liboutput_plugins_a_SOURCES += \ src/output/ao_output_plugin.c src/output/ao_output_plugin.h diff --git a/NEWS b/NEWS index 7460b722c..5a6d2b921 100644 --- a/NEWS +++ b/NEWS @@ -12,6 +12,7 @@ ver 0.18 (2012/??/??) * output: - new option "tags" may be used to disable sending tags to output - alsa: workaround for noise after manual song change + - ffado: remove broken plugin - mvp: remove obsolete plugin * improved decoder/output error reporting * eliminate timer wakeup on idle MPD diff --git a/configure.ac b/configure.ac index f0cf470e0..253f25764 100644 --- a/configure.ac +++ b/configure.ac @@ -205,10 +205,6 @@ AC_ARG_ENABLE(documentation, [build documentation (default: disable)]),, [enable_documentation=no]) -AC_ARG_ENABLE(ffado, - AS_HELP_STRING([--enable-ffado], [enable libffado (FireWire) support]),, - [enable_ffado=no]) - AC_ARG_ENABLE(ffmpeg, AS_HELP_STRING([--enable-ffmpeg], [enable FFMPEG support]),, @@ -1287,17 +1283,6 @@ fi AM_CONDITIONAL(HAVE_ROAR, test x$enable_roar = xyes) -dnl ----------------------------------- FFADO --------------------------------- - -MPD_AUTO_PKG(ffado, FFADO, [libffado], - [libffado output plugin], [libffado not found]) - -if test x$enable_ffado = xyes; then - AC_DEFINE(ENABLE_FFADO_OUTPUT, 1, [Define to enable the libffado output plugin]) -fi - -AM_CONDITIONAL(ENABLE_FFADO_OUTPUT, test x$enable_ffado = xyes) - dnl ----------------------------------- FIFO ---------------------------------- if test x$enable_fifo = xyes; then AC_CHECK_FUNC([mkfifo], @@ -1488,7 +1473,6 @@ if test x$enable_alsa = xno && test x$enable_roar = xno && test x$enable_ao = xno && - test x$enable_ffado = xno && test x$enable_fifo = xno && test x$enable_httpd_output = xno && test x$enable_jack = xno && @@ -1642,7 +1626,6 @@ results(id3,[ID3]) printf '\nPlayback support:\n\t' results(alsa,ALSA) -results(ffado,FFADO) results(fifo,FIFO) results(recorder_output,[File Recorder]) results(httpd_output,[HTTP Daemon]) diff --git a/doc/user.xml b/doc/user.xml index 6c722ceb1..051b9e891 100644 --- a/doc/user.xml +++ b/doc/user.xml @@ -1371,43 +1371,6 @@ systemctl start mpd.socket -
- <varname>ffado</varname> - - - The ffado plugin connects to FireWire - audio devices via libffado. - - - - Warning: this plugin was not tested successfully. I just - couldn't keep libffado2 from crashing. Use at your own - risk. - - - - - - - Setting - Description - - - - - - device - NAME - - - Sets the device which should be used, e.g. "hw:0". - - - - - -
-
<varname>jack</varname> diff --git a/src/OutputList.cxx b/src/OutputList.cxx index f79590817..4191da07c 100644 --- a/src/OutputList.cxx +++ b/src/OutputList.cxx @@ -22,7 +22,6 @@ #include "output_api.h" #include "output/AlsaOutputPlugin.hxx" #include "output/ao_output_plugin.h" -#include "output/ffado_output_plugin.h" #include "output/FifoOutputPlugin.hxx" #include "output/HttpdOutputPlugin.hxx" #include "output/JackOutputPlugin.hxx" @@ -84,9 +83,6 @@ const struct audio_output_plugin *const audio_output_plugins[] = { #endif #ifdef ENABLE_WINMM_OUTPUT &winmm_output_plugin, -#endif -#ifdef ENABLE_FFADO_OUTPUT - &ffado_output_plugin, #endif NULL }; diff --git a/src/output/ffado_output_plugin.c b/src/output/ffado_output_plugin.c deleted file mode 100644 index ba239a4ad..000000000 --- a/src/output/ffado_output_plugin.c +++ /dev/null @@ -1,359 +0,0 @@ -/* - * Copyright (C) 2003-2011 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. - */ - -/* - * Warning: this plugin was not tested successfully. I just couldn't - * keep libffado2 from crashing. Use at your own risk. - * - * For details, see my Debian bug reports: - * - * http://bugs.debian.org/601657 - * http://bugs.debian.org/601659 - * http://bugs.debian.org/601663 - * - */ - -#include "config.h" -#include "ffado_output_plugin.h" -#include "output_api.h" -#include "timer.h" - -#include -#include - -#include - -#undef G_LOG_DOMAIN -#define G_LOG_DOMAIN "ffado" - -enum { - MAX_STREAMS = 8, -}; - -struct mpd_ffado_stream { - /** libffado's stream number */ - int number; - - float *buffer; -}; - -struct mpd_ffado_device { - struct audio_output base; - - char *device_name; - int verbose; - unsigned period_size, nb_buffers; - - ffado_device_t *dev; - - /** - * The current sample position inside the stream buffers. New - * samples get appended at this position on all streams at the - * same time. When the buffers are full - * (buffer_position==period_size), - * ffado_streaming_transfer_playback_buffers() gets called to - * hand them over to libffado. - */ - unsigned buffer_position; - - /** - * The number of streams which are really used by MPD. - */ - int num_streams; - struct mpd_ffado_stream streams[MAX_STREAMS]; -}; - -static inline GQuark -ffado_output_quark(void) -{ - return g_quark_from_static_string("ffado_output"); -} - -static struct audio_output * -ffado_init(const struct config_param *param, - GError **error_r) -{ - g_debug("using libffado version %s, API=%d", - ffado_get_version(), ffado_get_api_version()); - - struct mpd_ffado_device *fd = g_new(struct mpd_ffado_device, 1); - if (!ao_base_init(&fd->base, &ffado_output_plugin, param, error_r)) { - g_free(fd); - return NULL; - } - - fd->device_name = config_dup_block_string(param, "device", NULL); - fd->verbose = config_get_block_unsigned(param, "verbose", 0); - - fd->period_size = config_get_block_unsigned(param, "period_size", - 1024); - if (fd->period_size == 0 || fd->period_size > 1024 * 1024) { - ao_base_finish(&fd->base); - g_set_error(error_r, ffado_output_quark(), 0, - "invalid period_size setting"); - return false; - } - - fd->nb_buffers = config_get_block_unsigned(param, "nb_buffers", 3); - if (fd->nb_buffers == 0 || fd->nb_buffers > 1024) { - ao_base_finish(&fd->base); - g_set_error(error_r, ffado_output_quark(), 0, - "invalid nb_buffers setting"); - return false; - } - - return &fd->base; -} - -static void -ffado_finish(struct audio_output *ao) -{ - struct mpd_ffado_device *fd = (struct mpd_ffado_device *)ao; - - g_free(fd->device_name); - ao_base_finish(&fd->base); - g_free(fd); -} - -static bool -ffado_configure_stream(ffado_device_t *dev, struct mpd_ffado_stream *stream, - GError **error_r) -{ - char *buffer = (char *)stream->buffer; - if (ffado_streaming_set_playback_stream_buffer(dev, stream->number, - buffer) != 0) { - g_set_error(error_r, ffado_output_quark(), 0, - "failed to configure stream buffer"); - return false; - } - - if (ffado_streaming_playback_stream_onoff(dev, stream->number, - 1) != 0) { - g_set_error(error_r, ffado_output_quark(), 0, - "failed to disable stream"); - return false; - } - - return true; -} - -static bool -ffado_configure(struct mpd_ffado_device *fd, struct audio_format *audio_format, - GError **error_r) -{ - assert(fd != NULL); - assert(fd->dev != NULL); - assert(audio_format->channels <= MAX_STREAMS); - - if (ffado_streaming_set_audio_datatype(fd->dev, - ffado_audio_datatype_float) != 0) { - g_set_error(error_r, ffado_output_quark(), 0, - "ffado_streaming_set_audio_datatype() failed"); - return false; - } - - int num_streams = ffado_streaming_get_nb_playback_streams(fd->dev); - if (num_streams < 0) { - g_set_error(error_r, ffado_output_quark(), 0, - "ffado_streaming_get_nb_playback_streams() failed"); - return false; - } - - g_debug("there are %d playback streams", num_streams); - - fd->num_streams = 0; - for (int i = 0; i < num_streams; ++i) { - char name[256]; - ffado_streaming_get_playback_stream_name(fd->dev, i, name, - sizeof(name) - 1); - - ffado_streaming_stream_type type = - ffado_streaming_get_playback_stream_type(fd->dev, i); - if (type != ffado_stream_type_audio) { - g_debug("stream %d name='%s': not an audio stream", - i, name); - continue; - } - - if (fd->num_streams >= audio_format->channels) { - g_debug("stream %d name='%s': ignoring", - i, name); - continue; - } - - g_debug("stream %d name='%s'", i, name); - - struct mpd_ffado_stream *stream = - &fd->streams[fd->num_streams++]; - - stream->number = i; - - /* allocated buffer is zeroed = silence */ - stream->buffer = g_new0(float, fd->period_size); - - if (!ffado_configure_stream(fd->dev, stream, error_r)) - return false; - } - - if (!audio_valid_channel_count(fd->num_streams)) { - g_set_error(error_r, ffado_output_quark(), 0, - "invalid channel count from libffado: %u", - audio_format->channels); - return false; - } - - g_debug("configured %d audio streams", fd->num_streams); - - if (ffado_streaming_prepare(fd->dev) != 0) { - g_set_error(error_r, ffado_output_quark(), 0, - "ffado_streaming_prepare() failed"); - return false; - } - - if (ffado_streaming_start(fd->dev) != 0) { - g_set_error(error_r, ffado_output_quark(), 0, - "ffado_streaming_start() failed"); - return false; - } - - audio_format->channels = fd->num_streams; - return true; -} - -static bool -ffado_open(struct audio_output *ao, struct audio_format *audio_format, - GError **error_r) -{ - struct mpd_ffado_device *fd = (struct mpd_ffado_device *)ao; - - /* will be converted to floating point, choose best input - format */ - audio_format->format = SAMPLE_FORMAT_S24_P32; - - ffado_device_info_t device_info; - memset(&device_info, 0, sizeof(device_info)); - if (fd->device_name != NULL) { - device_info.nb_device_spec_strings = 1; - device_info.device_spec_strings = &fd->device_name; - } - - ffado_options_t options; - memset(&options, 0, sizeof(options)); - options.sample_rate = audio_format->sample_rate; - options.period_size = fd->period_size; - options.nb_buffers = fd->nb_buffers; - options.verbose = fd->verbose; - - fd->dev = ffado_streaming_init(device_info, options); - if (fd->dev == NULL) { - g_set_error(error_r, ffado_output_quark(), 0, - "ffado_streaming_init() failed"); - return false; - } - - if (!ffado_configure(fd, audio_format, error_r)) { - ffado_streaming_finish(fd->dev); - - for (int i = 0; i < fd->num_streams; ++i) { - struct mpd_ffado_stream *stream = &fd->streams[i]; - g_free(stream->buffer); - } - - return false; - } - - fd->buffer_position = 0; - - return true; -} - -static void -ffado_close(struct audio_output *ao) -{ - struct mpd_ffado_device *fd = (struct mpd_ffado_device *)ao; - - ffado_streaming_stop(fd->dev); - ffado_streaming_finish(fd->dev); - - for (int i = 0; i < fd->num_streams; ++i) { - struct mpd_ffado_stream *stream = &fd->streams[i]; - g_free(stream->buffer); - } -} - -static size_t -ffado_play(struct audio_output *ao, const void *chunk, size_t size, - GError **error_r) -{ - struct mpd_ffado_device *fd = (struct mpd_ffado_device *)ao; - - /* wait for prefious buffer to finish (if it was full) */ - - if (fd->buffer_position >= fd->period_size) { - switch (ffado_streaming_wait(fd->dev)) { - case ffado_wait_ok: - case ffado_wait_xrun: - break; - - default: - g_set_error(error_r, ffado_output_quark(), 0, - "ffado_streaming_wait() failed"); - return 0; - } - - fd->buffer_position = 0; - } - - /* copy samples to stream buffers, non-interleaved */ - - const int32_t *p = chunk; - unsigned num_frames = size / sizeof(*p) / fd->num_streams; - if (num_frames > fd->period_size - fd->buffer_position) - num_frames = fd->period_size - fd->buffer_position; - - for (unsigned i = num_frames; i > 0; --i) { - for (int stream = 0; stream < fd->num_streams; ++stream) - fd->streams[stream].buffer[fd->buffer_position] = - *p++ / (float)(1 << 23); - ++fd->buffer_position; - } - - /* if buffer full, transfer to device */ - - if (fd->buffer_position >= fd->period_size && - /* libffado documentation says this function returns -1 on - error, but that is a lie - it returns a boolean value, - and "false" means error */ - !ffado_streaming_transfer_playback_buffers(fd->dev)) { - g_set_error(error_r, ffado_output_quark(), 0, - "ffado_streaming_transfer_playback_buffers() failed"); - return 0; - } - - return num_frames * sizeof(*p) * fd->num_streams; -} - -const struct audio_output_plugin ffado_output_plugin = { - .name = "ffado", - .init = ffado_init, - .finish = ffado_finish, - .open = ffado_open, - .close = ffado_close, - .play = ffado_play, -}; diff --git a/src/output/ffado_output_plugin.h b/src/output/ffado_output_plugin.h deleted file mode 100644 index 4dde01859..000000000 --- a/src/output/ffado_output_plugin.h +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright (C) 2003-2011 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_FFADO_OUTPUT_PLUGIN_H -#define MPD_FFADO_OUTPUT_PLUGIN_H - -extern const struct audio_output_plugin ffado_output_plugin; - -#endif diff --git a/valgrind.suppressions b/valgrind.suppressions index 56bb8e62f..240626ff6 100644 --- a/valgrind.suppressions +++ b/valgrind.suppressions @@ -549,14 +549,3 @@ fun:call_init fun:_dl_init } - -{ - - Memcheck:Leak - fun:*alloc - fun:_dl_allocate_tls - ... - obj:*/libffado.so* - fun:call_init - fun:_dl_init -}