diff --git a/test/ReadFrames.cxx b/test/ReadFrames.cxx new file mode 100644 index 000000000..2037134ff --- /dev/null +++ b/test/ReadFrames.cxx @@ -0,0 +1,52 @@ +/* + * 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 "ReadFrames.hxx" +#include "system/Error.hxx" +#include "io/FileDescriptor.hxx" + +static size_t +ReadOrThrow(FileDescriptor fd, void *buffer, size_t size) +{ + auto nbytes = fd.Read(buffer, size); + if (nbytes < 0) + throw MakeErrno("Read failed"); + + return nbytes; +} + +std::size_t +ReadFrames(FileDescriptor fd, void *_buffer, std::size_t size, + std::size_t frame_size) +{ + auto buffer = (std::byte *)_buffer; + + size = (size / frame_size) * frame_size; + + size_t nbytes = ReadOrThrow(fd, buffer, size); + + const size_t modulo = nbytes % frame_size; + if (modulo > 0) { + size_t rest = frame_size - modulo; + fd.FullRead(buffer + nbytes, rest); + nbytes += rest; + } + + return nbytes; +} diff --git a/test/ReadFrames.hxx b/test/ReadFrames.hxx new file mode 100644 index 000000000..ea851add1 --- /dev/null +++ b/test/ReadFrames.hxx @@ -0,0 +1,26 @@ +/* + * 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 + +class FileDescriptor; + +std::size_t +ReadFrames(FileDescriptor fd, void *buffer, std::size_t size, + std::size_t frame_size); diff --git a/test/meson.build b/test/meson.build index 75c3ff46f..3b9671410 100644 --- a/test/meson.build +++ b/test/meson.build @@ -520,6 +520,7 @@ test( executable( 'run_filter', 'run_filter.cxx', + 'ReadFrames.cxx', include_directories: inc, dependencies: [ filter_glue_dep, diff --git a/test/run_filter.cxx b/test/run_filter.cxx index 25c9a1786..04d35dfba 100644 --- a/test/run_filter.cxx +++ b/test/run_filter.cxx @@ -18,6 +18,7 @@ */ #include "ConfigGlue.hxx" +#include "ReadFrames.hxx" #include "fs/Path.hxx" #include "fs/NarrowPath.hxx" #include "filter/LoadOne.hxx" @@ -60,35 +61,6 @@ LoadFilter(const ConfigData &config, const char *name) return filter_configured_new(*param); } -static size_t -ReadOrThrow(FileDescriptor fd, void *buffer, size_t size) -{ - auto nbytes = fd.Read(buffer, size); - if (nbytes < 0) - throw MakeErrno("Read failed"); - - return nbytes; -} - -static size_t -ReadFrames(FileDescriptor fd, void *_buffer, size_t size, size_t frame_size) -{ - auto buffer = (uint8_t *)_buffer; - - size = (size / frame_size) * frame_size; - - size_t nbytes = ReadOrThrow(fd, buffer, size); - - const size_t modulo = nbytes % frame_size; - if (modulo > 0) { - size_t rest = frame_size - modulo; - fd.FullRead(buffer + nbytes, rest); - nbytes += rest; - } - - return nbytes; -} - int main(int argc, char **argv) try { if (argc < 3 || argc > 4) {