From 6b6d9e64bda0ab19a3f6f13957f6625ba35c1d08 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Sun, 28 Jul 2013 13:10:05 +0200 Subject: decoder/pcm: convert to C++ --- Makefile.am | 4 +- src/DecoderList.cxx | 2 +- src/decoder/PcmDecoderPlugin.cxx | 118 +++++++++++++++++++++++++++++++++++++++ src/decoder/PcmDecoderPlugin.hxx | 33 +++++++++++ src/decoder/pcm_decoder_plugin.c | 108 ----------------------------------- src/decoder/pcm_decoder_plugin.h | 33 ----------- 6 files changed, 154 insertions(+), 144 deletions(-) create mode 100644 src/decoder/PcmDecoderPlugin.cxx create mode 100644 src/decoder/PcmDecoderPlugin.hxx delete mode 100644 src/decoder/pcm_decoder_plugin.c delete mode 100644 src/decoder/pcm_decoder_plugin.h diff --git a/Makefile.am b/Makefile.am index 919da1be8..376ebe88c 100644 --- a/Makefile.am +++ b/Makefile.am @@ -68,7 +68,6 @@ mpd_headers = \ src/gerror.h \ src/glib_compat.h \ src/gcc.h \ - src/decoder/pcm_decoder_plugin.h \ src/input_stream.h \ src/TextInputStream.hxx \ src/ls.h \ @@ -447,7 +446,8 @@ endif # decoder plugins libdecoder_plugins_a_SOURCES = \ - src/decoder/pcm_decoder_plugin.c \ + src/decoder/PcmDecoderPlugin.cxx \ + src/decoder/PcmDecoderPlugin.hxx \ src/decoder/DsdiffDecoderPlugin.cxx \ src/decoder/DsdiffDecoderPlugin.hxx \ src/decoder/DsfDecoderPlugin.cxx \ diff --git a/src/DecoderList.cxx b/src/DecoderList.cxx index 3964a12f0..241997817 100644 --- a/src/DecoderList.cxx +++ b/src/DecoderList.cxx @@ -23,7 +23,7 @@ #include "conf.h" #include "mpd_error.h" #include "decoder/AudiofileDecoderPlugin.hxx" -#include "decoder/pcm_decoder_plugin.h" +#include "decoder/PcmDecoderPlugin.hxx" #include "decoder/DsdiffDecoderPlugin.hxx" #include "decoder/DsfDecoderPlugin.hxx" #include "decoder/FlacDecoderPlugin.h" diff --git a/src/decoder/PcmDecoderPlugin.cxx b/src/decoder/PcmDecoderPlugin.cxx new file mode 100644 index 000000000..a1c965bbb --- /dev/null +++ b/src/decoder/PcmDecoderPlugin.cxx @@ -0,0 +1,118 @@ +/* + * 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 "decoder/PcmDecoderPlugin.hxx" +#include "decoder_api.h" + +extern "C" { +#include "util/byte_reverse.h" +} + +#include +#include +#include /* for SEEK_SET */ + +#undef G_LOG_DOMAIN +#define G_LOG_DOMAIN "pcm" + +static void +pcm_stream_decode(struct decoder *decoder, struct input_stream *is) +{ + static constexpr struct audio_format audio_format = { + 44100, + SAMPLE_FORMAT_S16, + 2, + }; + + const char *const mime = input_stream_get_mime_type(is); + const bool reverse_endian = mime != nullptr && + strcmp(mime, "audio/x-mpd-cdda-pcm-reverse") == 0; + + GError *error = nullptr; + enum decoder_command cmd; + + double time_to_size = audio_format_time_to_size(&audio_format); + + float total_time = -1; + const goffset size = input_stream_get_size(is); + if (size >= 0) + total_time = size / time_to_size; + + decoder_initialized(decoder, &audio_format, + input_stream_is_seekable(is), total_time); + + do { + char buffer[4096]; + + size_t nbytes = decoder_read(decoder, is, + buffer, sizeof(buffer)); + + if (nbytes == 0 && input_stream_lock_eof(is)) + break; + + if (reverse_endian) + /* make sure we deliver samples in host byte order */ + reverse_bytes_16((uint16_t *)buffer, + (uint16_t *)buffer, + (uint16_t *)(buffer + nbytes)); + + cmd = nbytes > 0 + ? decoder_data(decoder, is, + buffer, nbytes, 0) + : decoder_get_command(decoder); + if (cmd == DECODE_COMMAND_SEEK) { + goffset offset = (goffset)(time_to_size * + decoder_seek_where(decoder)); + if (input_stream_lock_seek(is, offset, SEEK_SET, + &error)) { + decoder_command_finished(decoder); + } else { + g_warning("seeking failed: %s", error->message); + g_error_free(error); + decoder_seek_error(decoder); + } + + cmd = DECODE_COMMAND_NONE; + } + } while (cmd == DECODE_COMMAND_NONE); +} + +static const char *const pcm_mime_types[] = { + /* for streams obtained by the cdio_paranoia input plugin */ + "audio/x-mpd-cdda-pcm", + + /* same as above, but with reverse byte order */ + "audio/x-mpd-cdda-pcm-reverse", + + nullptr +}; + +const struct decoder_plugin pcm_decoder_plugin = { + "pcm", + nullptr, + nullptr, + pcm_stream_decode, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + pcm_mime_types, +}; diff --git a/src/decoder/PcmDecoderPlugin.hxx b/src/decoder/PcmDecoderPlugin.hxx new file mode 100644 index 000000000..2883e866e --- /dev/null +++ b/src/decoder/PcmDecoderPlugin.hxx @@ -0,0 +1,33 @@ +/* + * 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. + */ + +/** \file + * + * Not really a decoder; this plugin forwards its input data "as-is". + * + * It was written only to support the "cdio_paranoia" input plugin, + * which does not need a decoder. + */ + +#ifndef MPD_DECODER_PCM_HXX +#define MPD_DECODER_PCM_HXX + +extern const struct decoder_plugin pcm_decoder_plugin; + +#endif diff --git a/src/decoder/pcm_decoder_plugin.c b/src/decoder/pcm_decoder_plugin.c deleted file mode 100644 index d529cef5c..000000000 --- a/src/decoder/pcm_decoder_plugin.c +++ /dev/null @@ -1,108 +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/pcm_decoder_plugin.h" -#include "decoder_api.h" -#include "util/byte_reverse.h" - -#include -#include -#include /* for SEEK_SET */ - -#undef G_LOG_DOMAIN -#define G_LOG_DOMAIN "pcm" - -static void -pcm_stream_decode(struct decoder *decoder, struct input_stream *is) -{ - static const struct audio_format audio_format = { - .sample_rate = 44100, - .format = SAMPLE_FORMAT_S16, - .channels = 2, - }; - - const char *const mime = input_stream_get_mime_type(is); - const bool reverse_endian = mime != NULL && - strcmp(mime, "audio/x-mpd-cdda-pcm-reverse") == 0; - - GError *error = NULL; - enum decoder_command cmd; - - double time_to_size = audio_format_time_to_size(&audio_format); - - float total_time = -1; - const goffset size = input_stream_get_size(is); - if (size >= 0) - total_time = size / time_to_size; - - decoder_initialized(decoder, &audio_format, - input_stream_is_seekable(is), total_time); - - do { - char buffer[4096]; - - size_t nbytes = decoder_read(decoder, is, - buffer, sizeof(buffer)); - - if (nbytes == 0 && input_stream_lock_eof(is)) - break; - - if (reverse_endian) - /* make sure we deliver samples in host byte order */ - reverse_bytes_16((uint16_t *)buffer, - (uint16_t *)buffer, - (uint16_t *)(buffer + nbytes)); - - cmd = nbytes > 0 - ? decoder_data(decoder, is, - buffer, nbytes, 0) - : decoder_get_command(decoder); - if (cmd == DECODE_COMMAND_SEEK) { - goffset offset = (goffset)(time_to_size * - decoder_seek_where(decoder)); - if (input_stream_lock_seek(is, offset, SEEK_SET, - &error)) { - decoder_command_finished(decoder); - } else { - g_warning("seeking failed: %s", error->message); - g_error_free(error); - decoder_seek_error(decoder); - } - - cmd = DECODE_COMMAND_NONE; - } - } while (cmd == DECODE_COMMAND_NONE); -} - -static const char *const pcm_mime_types[] = { - /* for streams obtained by the cdio_paranoia input plugin */ - "audio/x-mpd-cdda-pcm", - - /* same as above, but with reverse byte order */ - "audio/x-mpd-cdda-pcm-reverse", - - NULL -}; - -const struct decoder_plugin pcm_decoder_plugin = { - .name = "pcm", - .stream_decode = pcm_stream_decode, - .mime_types = pcm_mime_types, -}; diff --git a/src/decoder/pcm_decoder_plugin.h b/src/decoder/pcm_decoder_plugin.h deleted file mode 100644 index 11df80155..000000000 --- a/src/decoder/pcm_decoder_plugin.h +++ /dev/null @@ -1,33 +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. - */ - -/** \file - * - * Not really a decoder; this plugin forwards its input data "as-is". - * - * It was written only to support the "cdio_paranoia" input plugin, - * which does not need a decoder. - */ - -#ifndef MPD_DECODER_PCM_H -#define MPD_DECODER_PCM_H - -extern const struct decoder_plugin pcm_decoder_plugin; - -#endif -- cgit v1.2.3