From bbc7e836f054aea09a1cde23d553a01892ea18c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Goran=20Meki=C4=87?= Date: Sat, 25 Feb 2017 00:58:18 +0100 Subject: Disk streaming cli option --- .gitignore | 3 +- AUTHORS | 3 ++ drumgizmo/drumgizmoc.cc | 20 ++++++++-- src/Makefile.am | 3 ++ src/bytesizeparser.cc | 99 +++++++++++++++++++++++++++++++++++++++++++++++++ src/bytesizeparser.h | 33 +++++++++++++++++ tools/add_file | 10 +++-- 7 files changed, 164 insertions(+), 7 deletions(-) create mode 100644 src/bytesizeparser.cc create mode 100644 src/bytesizeparser.h diff --git a/.gitignore b/.gitignore index c2ab71f..9486c44 100644 --- a/.gitignore +++ b/.gitignore @@ -26,6 +26,7 @@ INSTALL *.o *.a *.la +*.core test_* *.exe Makefile.am.test @@ -73,4 +74,4 @@ plugin/vst/public.sdk/ plugingui/tests/*test *~ \#*\# -.\#* \ No newline at end of file +.\#* diff --git a/AUTHORS b/AUTHORS index 056ec04..f30f477 100644 --- a/AUTHORS +++ b/AUTHORS @@ -13,5 +13,8 @@ Developer: Developer, Graphics, GUI design and logo: Lars Muldjord [muldjord] (muldjordlars@gmail.com) +Developer: + Goran Mekić [meka] (meka@tilda.center) + Patches: John Hammen (sample multichannel support) diff --git a/drumgizmo/drumgizmoc.cc b/drumgizmo/drumgizmoc.cc index 1ba9516..6ea6b5d 100644 --- a/drumgizmo/drumgizmoc.cc +++ b/drumgizmo/drumgizmoc.cc @@ -39,6 +39,7 @@ #include "drumgizmo.h" #include "drumgizmoc.h" #include "enginefactory.h" +#include "bytesizeparser.h" #include "event.h" @@ -65,6 +66,7 @@ static const char usage_str[] = "output engine.\n" " -O, --outputparms parmlist Set output engine parameters.\n" " -e, --endpos Number of samples to process, -1: infinite.\n" + " -m, --diskstreamsize Size of buffer for disk streaming, eg. 5{k,M,G}.\n" #ifndef DISABLE_HUGIN " -D, --debug ddd Enable debug messages on 'ddd'; see hugin " "documentation for details\n" @@ -92,10 +94,12 @@ static const char usage_str[] = " dummy:\n" "\n"; + int main(int argc, char* argv[]) { int c; - + Settings settings; + settings.disk_cache_enable = false; std::string hugin_filter; unsigned int hugin_flags = 0; #ifndef DISABLE_HUGIN @@ -121,6 +125,7 @@ int main(int argc, char* argv[]) {"outputengine", required_argument, 0, 'o'}, {"outputparms", required_argument, 0, 'O'}, {"endpos", required_argument, 0, 'e'}, + {"diskstreamsize", required_argument, 0, 'm'}, #ifndef DISABLE_HUGIN {"debug", required_argument, 0, 'D'}, #endif /*DISABLE_HUGIN*/ @@ -128,7 +133,7 @@ int main(int argc, char* argv[]) {"help", no_argument, 0, 'h'}, {0, 0, 0, 0}}; - c = getopt_long(argc, argv, "hvpo:O:i:I:e:a" + c = getopt_long(argc, argv, "hvpo:O:i:I:e:am:" #ifndef DISABLE_HUGIN "D:" #endif /*DISABLE_HUGIN*/ @@ -203,6 +208,16 @@ int main(int argc, char* argv[]) printf("%s", copyright_str); return 0; + case 'm': + settings.disk_cache_upper_limit = byteSizeParser(optarg); + if(!settings.disk_cache_upper_limit) + { + printf("%s", version_str); + printf(usage_str, argv[0]); + return 1; + } + settings.disk_cache_enable = true; + default: break; } @@ -343,7 +358,6 @@ int main(int argc, char* argv[]) printf("Using kitfile: %s\n", kitfile.c_str()); - Settings settings; DrumGizmo gizmo(settings, *oe.get(), *ie.get()); gizmo.setFrameSize(oe->getBufferSize()); diff --git a/src/Makefile.am b/src/Makefile.am index 2277eeb..06e189f 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -17,6 +17,7 @@ nodist_libdg_la_SOURCES = \ audiocacheidmanager.cc \ audioinputenginemidi.cc \ audiofile.cc \ + bytesizeparser.cc \ channel.cc \ channelmixer.cc \ chresampler.cc \ @@ -57,6 +58,7 @@ EXTRA_DIST = \ audioinputenginemidi.h \ audiooutputengine.h \ beatmapper.h \ + bytesizeparser.h \ channel.h \ channelmixer.h \ chresampler.h \ @@ -102,6 +104,7 @@ EXTRA_DIST = \ audioinputenginemidi.cc \ audiooutputengine.cc \ beatmapper.cc \ + bytesizeparser.cc \ channel.cc \ channelmixer.cc \ chresampler.cc \ diff --git a/src/bytesizeparser.cc b/src/bytesizeparser.cc new file mode 100644 index 0000000..0bab316 --- /dev/null +++ b/src/bytesizeparser.cc @@ -0,0 +1,99 @@ +/* -*- Mode: c++ -*- */ +/*************************************************************************** + * bytesize_parser.cc + * + * Sat Mar 4 18:00:12 CET 2017 + * Copyright 2017 Goran Mekić + * meka@tilda.center + ****************************************************************************/ + +/* + * This file is part of DrumGizmo. + * + * DrumGizmo is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * DrumGizmo 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 Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with DrumGizmo; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + */ +#include "bytesizeparser.h" +#include +#include + + +static std::size_t suffixToSize(const char& suffix) +{ + int size = 1; + switch(suffix) + { + case 'k': + size <<= 10; + break; + case 'M': + size <<= 20; + break; + case 'G': + size <<= 30; + break; + default: + size = 0; + break; + } + return size; +} + + +std::size_t byteSizeParser(const std::string& argument) +{ + std::string::size_type suffix_index; + std::size_t stream_size; + std::string suffix; + bool error = false; + + try + { + stream_size = std::stoi(argument, &suffix_index); + } + catch(std::invalid_argument) + { + std::cerr << "Invalid option for diskstreamsize" << std::endl; + error = true; + } + catch(std::out_of_range) + { + std::cerr << "Number too big. Try using bigger suffix for diskstreamsize" << std::endl; + error = true; + } + if(!error) + { + suffix = argument.substr(suffix_index); + if (suffix.length() > 1) + { + error = true; + } + } + if(!error) + { + std::size_t suffix_size = suffixToSize(suffix[0]); + if (suffix_size) + { + stream_size *= suffix_size; + } + } + if(error) + { + std::cerr << "Stream size should be in [suffix] format "; + std::cerr << "where [suffix] is k, M, or G." << std::endl; + std::cerr << "Example: 10M which is 10 * 1024 * 1024 bytes" << std::endl; + return 0; + } + return stream_size; +} diff --git a/src/bytesizeparser.h b/src/bytesizeparser.h new file mode 100644 index 0000000..3007454 --- /dev/null +++ b/src/bytesizeparser.h @@ -0,0 +1,33 @@ +/* -*- Mode: c++ -*- */ +/*************************************************************************** + * bytesize_parser.h + * + * Sat Mar 4 18:00:12 CET 2017 + * Copyright 2017 Goran Mekić + * meka@tilda.center + ****************************************************************************/ + +/* + * This file is part of DrumGizmo. + * + * DrumGizmo is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * DrumGizmo 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 Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with DrumGizmo; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + */ +#pragma once +#include + + +//! Returns size in bytes +//! \param argument The size in n{k,M,G} format +std::size_t byteSizeParser(const std::string& argument); diff --git a/tools/add_file b/tools/add_file index d1b190f..a704029 100755 --- a/tools/add_file +++ b/tools/add_file @@ -16,14 +16,18 @@ function allfile() { fi if [ "$USER" == "chaot" ] then - NAME="André Nusser"; EMAIL="andre.nusser@googlemail.com" + NAME="André Nusser"; EMAIL="andre.nusser@googlemail.com" fi if [ "$DGUSER" == "glocke" ] then - NAME="Christian Glöckner"; EMAIL="cgloeckner@freenet.de" + NAME="Christian Glöckner"; EMAIL="cgloeckner@freenet.de" + fi + if [ "$USER" == "meka" ] + then + NAME="Goran Mekić"; EMAIL="meka@tilda.center" fi - echo "/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */" > $1; + echo "/* -*- Mode: c++ -*- */" > $1; echo "/***************************************************************************" >> $1; echo " * $1" >> $1; echo " *" >> $1 ; -- cgit v1.2.3