From df83c0381e126f17d59039ab8b61789bfe27a79f Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Mon, 2 Oct 2017 20:40:44 +0200 Subject: Prepare support for compression levels (archive + flac) --- libs/pbd/file_archive.cc | 29 +++++++++++++++++++++++++---- libs/pbd/pbd/file_archive.h | 13 +++++++++++-- 2 files changed, 36 insertions(+), 6 deletions(-) (limited to 'libs/pbd') diff --git a/libs/pbd/file_archive.cc b/libs/pbd/file_archive.cc index 95cdbf61cf..ccc19c0541 100644 --- a/libs/pbd/file_archive.cc +++ b/libs/pbd/file_archive.cc @@ -16,6 +16,11 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ +#ifndef NDEBUG +#include +#include +#endif + #include #include #include @@ -337,7 +342,7 @@ FileArchive::do_extract (struct archive* a) int -FileArchive::create (const std::string& srcdir) +FileArchive::create (const std::string& srcdir, CompressionLevel compression_level) { if (_req.is_remote ()) { return -1; @@ -357,11 +362,11 @@ FileArchive::create (const std::string& srcdir) filemap[*f] = f->substr (p_len); } - return create (filemap); + return create (filemap, compression_level); } int -FileArchive::create (const std::map& filemap) +FileArchive::create (const std::map& filemap, CompressionLevel compression_level) { struct archive *a; struct archive_entry *entry; @@ -385,10 +390,21 @@ FileArchive::create (const std::map& filemap) a = archive_write_new (); archive_write_set_format_pax_restricted (a); - archive_write_add_filter_lzma (a); + + if (compression_level != CompressNone) { + archive_write_add_filter_lzma (a); + char buf[48]; + sprintf (buf, "lzma:compression-level=%u,lzma:threads=0", (uint32_t) compression_level); + archive_write_set_options (a, buf); + } + archive_write_open_filename (a, _req.url); entry = archive_entry_new (); +#ifndef NDEBUG + const int64_t archive_start_time = g_get_monotonic_time(); +#endif + for (std::map::const_iterator f = filemap.begin (); f != filemap.end (); ++f) { char buf[8192]; const char* filepath = f->first.c_str (); @@ -433,5 +449,10 @@ FileArchive::create (const std::map& filemap) archive_write_close (a); archive_write_free (a); +#ifndef NDEBUG + const int64_t elapsed_time_us = g_get_monotonic_time() - archive_start_time; + std::cerr << "archived in " << std::fixed << std::setprecision (2) << elapsed_time_us / 1000000. << " sec\n"; +#endif + return 0; } diff --git a/libs/pbd/pbd/file_archive.h b/libs/pbd/pbd/file_archive.h index 3708f3bbf4..3ef1d93ee0 100644 --- a/libs/pbd/pbd/file_archive.h +++ b/libs/pbd/pbd/file_archive.h @@ -38,8 +38,17 @@ class LIBPBD_API FileArchive int inflate (const std::string& destdir); std::vector contents (); - int create (const std::string& srcdir); - int create (const std::map & filemap); + /* these are mapped to libarchive's lzmaz + * compression level 0..9 + */ + enum CompressionLevel { + CompressNone = -1, + CompressFast = 0, + CompressGood = 6 + }; + + int create (const std::string& srcdir, CompressionLevel compression_level = CompressGood); + int create (const std::map & filemap, CompressionLevel compression_level = CompressGood); PBD::Signal2 progress; // TODO -- cgit v1.2.3