From 33aedc887acc4c52e140ba93df55f1825a2ebb10 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Sun, 28 Jul 2013 12:50:37 +0200 Subject: decoder/wildmidi: convert to C++ --- Makefile.am | 4 +- src/DecoderList.cxx | 2 +- src/decoder/WildmidiDecoderPlugin.cxx | 155 ++++++++++++++++++++++++++++++++++ src/decoder/WildmidiDecoderPlugin.hxx | 25 ++++++ src/decoder/wildmidi_decoder_plugin.c | 150 -------------------------------- 5 files changed, 184 insertions(+), 152 deletions(-) create mode 100644 src/decoder/WildmidiDecoderPlugin.cxx create mode 100644 src/decoder/WildmidiDecoderPlugin.hxx delete mode 100644 src/decoder/wildmidi_decoder_plugin.c diff --git a/Makefile.am b/Makefile.am index fc2da2cef..a5b782037 100644 --- a/Makefile.am +++ b/Makefile.am @@ -594,7 +594,9 @@ libdecoder_plugins_a_SOURCES += src/decoder/fluidsynth_decoder_plugin.c endif if ENABLE_WILDMIDI -libdecoder_plugins_a_SOURCES += src/decoder/wildmidi_decoder_plugin.c +libdecoder_plugins_a_SOURCES += \ + src/decoder/WildmidiDecoderPlugin.cxx \ + src/decoder/WildmidiDecoderPlugin.hxx endif if HAVE_FFMPEG diff --git a/src/DecoderList.cxx b/src/DecoderList.cxx index e607b685d..f6b029f7a 100644 --- a/src/DecoderList.cxx +++ b/src/DecoderList.cxx @@ -37,6 +37,7 @@ #include "decoder/MadDecoderPlugin.hxx" #include "decoder/SndfileDecoderPlugin.hxx" #include "decoder/Mpg123DecoderPlugin.hxx" +#include "decoder/WildmidiDecoderPlugin.hxx" #include @@ -46,7 +47,6 @@ extern const struct decoder_plugin mpcdec_decoder_plugin; extern const struct decoder_plugin modplug_decoder_plugin; extern const struct decoder_plugin mikmod_decoder_plugin; extern const struct decoder_plugin sidplay_decoder_plugin; -extern const struct decoder_plugin wildmidi_decoder_plugin; extern const struct decoder_plugin fluidsynth_decoder_plugin; const struct decoder_plugin *const decoder_plugins[] = { diff --git a/src/decoder/WildmidiDecoderPlugin.cxx b/src/decoder/WildmidiDecoderPlugin.cxx new file mode 100644 index 000000000..28602e38a --- /dev/null +++ b/src/decoder/WildmidiDecoderPlugin.cxx @@ -0,0 +1,155 @@ +/* + * Copyright (C) 2003-2013 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. + */ + +#include "config.h" +#include "WildmidiDecoderPlugin.hxx" +#include "decoder_api.h" +#include "tag_handler.h" +#include "glib_compat.h" + +#include + +extern "C" { +#include +} + +#undef G_LOG_DOMAIN +#define G_LOG_DOMAIN "wildmidi" + +static constexpr unsigned WILDMIDI_SAMPLE_RATE = 48000; + +static bool +wildmidi_init(const struct config_param *param) +{ + const char *config_file; + int ret; + + config_file = config_get_block_string(param, "config_file", + "/etc/timidity/timidity.cfg"); + if (!g_file_test(config_file, G_FILE_TEST_IS_REGULAR)) { + g_debug("configuration file does not exist: %s", config_file); + return false; + } + + ret = WildMidi_Init(config_file, WILDMIDI_SAMPLE_RATE, 0); + return ret == 0; +} + +static void +wildmidi_finish(void) +{ + WildMidi_Shutdown(); +} + +static void +wildmidi_file_decode(struct decoder *decoder, const char *path_fs) +{ + static const struct audio_format audio_format = { + WILDMIDI_SAMPLE_RATE, + SAMPLE_FORMAT_S16, + 2, + }; + midi *wm; + const struct _WM_Info *info; + enum decoder_command cmd; + + wm = WildMidi_Open(path_fs); + if (wm == nullptr) + return; + + info = WildMidi_GetInfo(wm); + if (info == nullptr) { + WildMidi_Close(wm); + return; + } + + decoder_initialized(decoder, &audio_format, true, + info->approx_total_samples / WILDMIDI_SAMPLE_RATE); + + do { + char buffer[4096]; + int len; + + info = WildMidi_GetInfo(wm); + if (info == nullptr) + break; + + len = WildMidi_GetOutput(wm, buffer, sizeof(buffer)); + if (len <= 0) + break; + + cmd = decoder_data(decoder, nullptr, buffer, len, 0); + + if (cmd == DECODE_COMMAND_SEEK) { + unsigned long seek_where = WILDMIDI_SAMPLE_RATE * + decoder_seek_where(decoder); + +#ifdef HAVE_WILDMIDI_SAMPLED_SEEK + WildMidi_SampledSeek(wm, &seek_where); +#else + WildMidi_FastSeek(wm, &seek_where); +#endif + decoder_command_finished(decoder); + cmd = DECODE_COMMAND_NONE; + } + + } while (cmd == DECODE_COMMAND_NONE); + + WildMidi_Close(wm); +} + +static bool +wildmidi_scan_file(const char *path_fs, + const struct tag_handler *handler, void *handler_ctx) +{ + midi *wm = WildMidi_Open(path_fs); + if (wm == nullptr) + return false; + + const struct _WM_Info *info = WildMidi_GetInfo(wm); + if (info == nullptr) { + WildMidi_Close(wm); + return false; + } + + int duration = info->approx_total_samples / WILDMIDI_SAMPLE_RATE; + tag_handler_invoke_duration(handler, handler_ctx, duration); + + WildMidi_Close(wm); + + return true; +} + +static const char *const wildmidi_suffixes[] = { + "mid", + nullptr +}; + +const struct decoder_plugin wildmidi_decoder_plugin = { + "wildmidi", + wildmidi_init, + wildmidi_finish, + nullptr, + wildmidi_file_decode, + wildmidi_scan_file, + nullptr, + nullptr, + wildmidi_suffixes, + nullptr, +}; diff --git a/src/decoder/WildmidiDecoderPlugin.hxx b/src/decoder/WildmidiDecoderPlugin.hxx new file mode 100644 index 000000000..956b72299 --- /dev/null +++ b/src/decoder/WildmidiDecoderPlugin.hxx @@ -0,0 +1,25 @@ +/* + * Copyright (C) 2003-2013 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_DECODER_WILDMIDI_HXX +#define MPD_DECODER_WILDMIDI_HXX + +extern const struct decoder_plugin wildmidi_decoder_plugin; + +#endif diff --git a/src/decoder/wildmidi_decoder_plugin.c b/src/decoder/wildmidi_decoder_plugin.c deleted file mode 100644 index 2cdb30a9c..000000000 --- a/src/decoder/wildmidi_decoder_plugin.c +++ /dev/null @@ -1,150 +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. - */ - -#include "config.h" -#include "decoder_api.h" -#include "tag_handler.h" -#include "glib_compat.h" - -#include - -#include - -#undef G_LOG_DOMAIN -#define G_LOG_DOMAIN "wildmidi" - -enum { - WILDMIDI_SAMPLE_RATE = 48000, -}; - -static bool -wildmidi_init(const struct config_param *param) -{ - const char *config_file; - int ret; - - config_file = config_get_block_string(param, "config_file", - "/etc/timidity/timidity.cfg"); - if (!g_file_test(config_file, G_FILE_TEST_IS_REGULAR)) { - g_debug("configuration file does not exist: %s", config_file); - return false; - } - - ret = WildMidi_Init(config_file, WILDMIDI_SAMPLE_RATE, 0); - return ret == 0; -} - -static void -wildmidi_finish(void) -{ - WildMidi_Shutdown(); -} - -static void -wildmidi_file_decode(struct decoder *decoder, const char *path_fs) -{ - static const struct audio_format audio_format = { - .sample_rate = WILDMIDI_SAMPLE_RATE, - .format = SAMPLE_FORMAT_S16, - .channels = 2, - }; - midi *wm; - const struct _WM_Info *info; - enum decoder_command cmd; - - wm = WildMidi_Open(path_fs); - if (wm == NULL) - return; - - info = WildMidi_GetInfo(wm); - if (info == NULL) { - WildMidi_Close(wm); - return; - } - - decoder_initialized(decoder, &audio_format, true, - info->approx_total_samples / WILDMIDI_SAMPLE_RATE); - - do { - char buffer[4096]; - int len; - - info = WildMidi_GetInfo(wm); - if (info == NULL) - break; - - len = WildMidi_GetOutput(wm, buffer, sizeof(buffer)); - if (len <= 0) - break; - - cmd = decoder_data(decoder, NULL, buffer, len, 0); - - if (cmd == DECODE_COMMAND_SEEK) { - unsigned long seek_where = WILDMIDI_SAMPLE_RATE * - decoder_seek_where(decoder); - -#ifdef HAVE_WILDMIDI_SAMPLED_SEEK - WildMidi_SampledSeek(wm, &seek_where); -#else - WildMidi_FastSeek(wm, &seek_where); -#endif - decoder_command_finished(decoder); - cmd = DECODE_COMMAND_NONE; - } - - } while (cmd == DECODE_COMMAND_NONE); - - WildMidi_Close(wm); -} - -static bool -wildmidi_scan_file(const char *path_fs, - const struct tag_handler *handler, void *handler_ctx) -{ - midi *wm = WildMidi_Open(path_fs); - if (wm == NULL) - return false; - - const struct _WM_Info *info = WildMidi_GetInfo(wm); - if (info == NULL) { - WildMidi_Close(wm); - return false; - } - - int duration = info->approx_total_samples / WILDMIDI_SAMPLE_RATE; - tag_handler_invoke_duration(handler, handler_ctx, duration); - - WildMidi_Close(wm); - - return true; -} - -static const char *const wildmidi_suffixes[] = { - "mid", - NULL -}; - -const struct decoder_plugin wildmidi_decoder_plugin = { - .name = "wildmidi", - .init = wildmidi_init, - .finish = wildmidi_finish, - .file_decode = wildmidi_file_decode, - .scan_file = wildmidi_scan_file, - .suffixes = wildmidi_suffixes, -}; -- cgit v1.2.3