diff options
author | GrimReaperFloof <GrimReaperFloof@users.noreply.github.com> | 2021-05-11 20:05:26 +0200 |
---|---|---|
committer | Max Kellermann <max@musicpd.org> | 2021-05-19 09:53:39 +0200 |
commit | a134f692bf67f5851542d732c4a547f41d6d1da2 (patch) | |
tree | c4cf5ec9fb6b11c9bc03207c68a6e79733f53a74 /src | |
parent | d747576793bccb4d80df951ca92981efc8cfff31 (diff) |
Code deduplication: move mod_loadfile() into ModCommon.cxx
Diffstat (limited to 'src')
-rw-r--r-- | src/decoder/plugins/ModCommon.cxx | 85 | ||||
-rw-r--r-- | src/decoder/plugins/ModCommon.hxx | 30 | ||||
-rw-r--r-- | src/decoder/plugins/ModplugDecoderPlugin.cxx | 65 | ||||
-rw-r--r-- | src/decoder/plugins/meson.build | 5 |
4 files changed, 121 insertions, 64 deletions
diff --git a/src/decoder/plugins/ModCommon.cxx b/src/decoder/plugins/ModCommon.cxx new file mode 100644 index 000000000..2cd66fb5a --- /dev/null +++ b/src/decoder/plugins/ModCommon.cxx @@ -0,0 +1,85 @@ +/* + * Copyright 2003-2021 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 "ModCommon.hxx" +#include "Log.hxx" + +static constexpr size_t MOD_PREALLOC_BLOCK = 256 * 1024; +static constexpr offset_type MOD_FILE_LIMIT = 100 * 1024 * 1024; + +WritableBuffer<uint8_t> +mod_loadfile(const Domain *domain, DecoderClient *client, InputStream &is) +{ + //known/unknown size, preallocate array, lets read in chunks + + const bool is_stream = !is.KnownSize(); + + WritableBuffer<uint8_t> buffer; + if (is_stream) + buffer.size = MOD_PREALLOC_BLOCK; + else { + const auto size = is.GetSize(); + + if (size == 0) { + LogWarning(*domain, "file is empty"); + return nullptr; + } + + if (size > MOD_FILE_LIMIT) { + LogWarning(*domain, "file too large"); + return nullptr; + } + + buffer.size = size; + } + + buffer.data = new uint8_t[buffer.size]; + + uint8_t *const end = buffer.end(); + uint8_t *p = buffer.begin(); + + while (true) { + size_t ret = decoder_read(client, is, p, end - p); + if (ret == 0) { + if (is.LockIsEOF()) + /* end of file */ + break; + + /* I/O error - skip this song */ + delete[] buffer.data; + buffer.data = nullptr; + return buffer; + } + + p += ret; + if (p == end) { + if (!is_stream) + break; + + LogWarning(*domain, "stream too large"); + delete[] buffer.data; + buffer.data = nullptr; + return buffer; + } + } + + buffer.size = p - buffer.data; + return buffer; +} + diff --git a/src/decoder/plugins/ModCommon.hxx b/src/decoder/plugins/ModCommon.hxx new file mode 100644 index 000000000..43315d61d --- /dev/null +++ b/src/decoder/plugins/ModCommon.hxx @@ -0,0 +1,30 @@ +/* + * Copyright 2003-2021 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_MOD_COMMON_HXX +#define MPD_MOD_COMMON_HXX + +#include "../DecoderAPI.hxx" +#include "input/InputStream.hxx" +#include "util/WritableBuffer.hxx" +#include "util/Domain.hxx" + +WritableBuffer<uint8_t> mod_loadfile(const Domain *domain, DecoderClient *client, InputStream &is); + +#endif diff --git a/src/decoder/plugins/ModplugDecoderPlugin.cxx b/src/decoder/plugins/ModplugDecoderPlugin.cxx index fd1217e8f..1a45a1ce8 100644 --- a/src/decoder/plugins/ModplugDecoderPlugin.cxx +++ b/src/decoder/plugins/ModplugDecoderPlugin.cxx @@ -18,6 +18,7 @@ */ #include "ModplugDecoderPlugin.hxx" +#include "ModCommon.hxx" #include "../DecoderAPI.hxx" #include "input/InputStream.hxx" #include "tag/Handler.hxx" @@ -40,8 +41,6 @@ static constexpr Domain modplug_domain("modplug"); static constexpr size_t MODPLUG_FRAME_SIZE = 4096; -static constexpr size_t MODPLUG_PREALLOC_BLOCK = 256 * 1024; -static constexpr offset_type MODPLUG_FILE_LIMIT = 100 * 1024 * 1024; static int modplug_loop_count; static unsigned char modplug_resampling_mode; @@ -71,70 +70,10 @@ modplug_decoder_init(const ConfigBlock &block) return true; } -static WritableBuffer<uint8_t> -mod_loadfile(DecoderClient *client, InputStream &is) -{ - //known/unknown size, preallocate array, lets read in chunks - - const bool is_stream = !is.KnownSize(); - - WritableBuffer<uint8_t> buffer; - if (is_stream) - buffer.size = MODPLUG_PREALLOC_BLOCK; - else { - const auto size = is.GetSize(); - - if (size == 0) { - LogWarning(modplug_domain, "file is empty"); - return nullptr; - } - - if (size > MODPLUG_FILE_LIMIT) { - LogWarning(modplug_domain, "file too large"); - return nullptr; - } - - buffer.size = size; - } - - buffer.data = new uint8_t[buffer.size]; - - uint8_t *const end = buffer.end(); - uint8_t *p = buffer.begin(); - - while (true) { - size_t ret = decoder_read(client, is, p, end - p); - if (ret == 0) { - if (is.LockIsEOF()) - /* end of file */ - break; - - /* I/O error - skip this song */ - delete[] buffer.data; - buffer.data = nullptr; - return buffer; - } - - p += ret; - if (p == end) { - if (!is_stream) - break; - - LogWarning(modplug_domain, "stream too large"); - delete[] buffer.data; - buffer.data = nullptr; - return buffer; - } - } - - buffer.size = p - buffer.data; - return buffer; -} - static ModPlugFile * LoadModPlugFile(DecoderClient *client, InputStream &is) { - const auto buffer = mod_loadfile(client, is); + const auto buffer = mod_loadfile(&modplug_domain, client, is); if (buffer.IsNull()) { LogWarning(modplug_domain, "could not load stream"); return nullptr; diff --git a/src/decoder/plugins/meson.build b/src/decoder/plugins/meson.build index 0b37363fe..3a5233074 100644 --- a/src/decoder/plugins/meson.build +++ b/src/decoder/plugins/meson.build @@ -102,7 +102,10 @@ endif libmodplug_dep = dependency('libmodplug', required: get_option('modplug')) decoder_features.set('ENABLE_MODPLUG', libmodplug_dep.found()) if libmodplug_dep.found() - decoder_plugins_sources += 'ModplugDecoderPlugin.cxx' + decoder_plugins_sources += [ + 'ModplugDecoderPlugin.cxx', + 'ModCommon.cxx' + ] endif libmpcdec_dep = c_compiler.find_library('mpcdec', required: get_option('mpcdec')) |