Mercurial > hg > sonic-annotator
changeset 127:f0df07da6f46
Update version, add --minversion flag
author | Chris Cannam |
---|---|
date | Thu, 09 Oct 2014 12:56:55 +0100 (2014-10-09) |
parents | e6379b2e1c5c |
children | c24270fc6635 |
files | CHANGELOG runner/main.cpp tests/include.sh tests/test-helpfulflags/test-helpfulflags.sh version.h |
diffstat | 5 files changed, 146 insertions(+), 60 deletions(-) [+] |
line wrap: on
line diff
--- a/CHANGELOG Thu Oct 09 12:27:17 2014 +0100 +++ b/CHANGELOG Thu Oct 09 12:56:55 2014 +0100 @@ -1,3 +1,12 @@ + +Changes in Sonic Annotator 1.1 since the previous release 1.0: + +Front-end changes: + + - Add support for the start time and duration properties of a + transform, applying a plugin to only a range of the input audio + - Add --normalise to request each audio file be normalised to 1.0 max + - Add --multiplex Changes in Sonic Annotator 1.0 since the previous release 0.7:
--- a/runner/main.cpp Thu Oct 09 12:27:17 2014 +0100 +++ b/runner/main.cpp Thu Oct 09 12:56:55 2014 +0100 @@ -137,6 +137,50 @@ return ws; } +static bool +isVersionNewerThan(QString a, QString b) // from VersionTester in svapp +{ + QRegExp re("[._-]"); + QStringList alist = a.split(re, QString::SkipEmptyParts); + QStringList blist = b.split(re, QString::SkipEmptyParts); + int ae = alist.size(); + int be = blist.size(); + int e = std::max(ae, be); + for (int i = 0; i < e; ++i) { + int an = 0, bn = 0; + if (i < ae) { + an = alist[i].toInt(); + if (an == 0 && alist[i] != "0") { + an = -1; // non-numeric field -> "-pre1" etc + } + } + if (i < be) { + bn = blist[i].toInt(); + if (bn == 0 && blist[i] != "0") { + bn = -1; + } + } + if (an < bn) return false; + if (an > bn) return true; + } + return false; +} + +static int +checkMinVersion(QString myname, QString v) +{ + if (v == RUNNER_VERSION) { + return 0; + } else if (isVersionNewerThan(RUNNER_VERSION, v)) { + return 0; + } else { + cerr << myname << ": version " + << RUNNER_VERSION << " is less than requested min version " + << v << ", failing" << endl; + return 1; + } +} + void printUsage(QString myname) { cerr << endl; @@ -150,15 +194,15 @@ cerr << "This program is supplied with NO WARRANTY, to the extent permitted by law." << endl; cerr << endl; cerr << "Usage: " << endl; - cerr << " " << myname.toStdString() + cerr << " " << myname << " [-mrnf] -t transform.ttl [..] -w <writer> [..] <audio> [..]" << endl; - cerr << " " << myname.toStdString() + cerr << " " << myname << " [-mrnf] -T translist.txt [..] -w <writer> [..] <audio> [..]" << endl; - cerr << " " << myname.toStdString() + cerr << " " << myname << " [-mrnf] -d <plugin> [..] -w <writer> [..] <audio> [...]" << endl; - cerr << " " << myname.toStdString() + cerr << " " << myname << " -s <transform>" << endl; - cerr << " " << myname.toStdString() + cerr << " " << myname << " [-lhv]" << endl; cerr << endl; cerr << "Where <audio> is an audio file or URL to use as input: either a local file" << endl; @@ -185,7 +229,7 @@ cerr << "\n "; c -= 78; } - cerr << ext.toStdString(); + cerr << ext; if (i + 1 == extlist.size()) cerr << "."; else cerr << ", "; } @@ -266,6 +310,11 @@ cerr << " and write it to standard output." << endl; cerr << endl; cerr << " -v, --version Show the version number and exit." << endl; + cerr << endl; + cerr << " --minversion <V> Exit with successful return code if the version of" << endl; + cerr << " " << myname << " is at least <V>, failure otherwise." << endl; + cerr << " For scripts that depend on certain option support." << endl; + cerr << endl; cerr << " -h, --help Show help." << endl; cerr << endl; @@ -295,7 +344,7 @@ for (int k = 0; k < spaceage; ++k) cerr << " "; QString s(j->description.c_str()); s = wrap(s, 56, 22); - cerr << s.toStdString() << endl; + cerr << s << endl; } } @@ -312,7 +361,7 @@ iter != transforms.end(); ++iter) { const TransformDescription &transform = *iter; if (transform.type == TransformDescription::Analysis) { - cout << transform.identifier.toStdString() << endl; + cout << transform.identifier << endl; } } } @@ -327,7 +376,7 @@ << "@prefix : <#> ." << endl << endl; QString rdf = RDFTransformFactory::writeTransformToRDF (transform, ":transform"); - cout << rdf.toStdString(); + cout << rdf; } void @@ -336,8 +385,8 @@ QDir dir(dirname); QString printable = dir.dirName().left(20); - cerr << "\rScanning \"" << printable.toStdString() << "\"..." - << QString(" ").left(20 - printable.length()).toStdString() + cerr << "\rScanning \"" << printable << "\"..." + << QString(" ").left(20 - printable.length()) << " [" << found << " audio file(s)]"; QString extensions = AudioFileReaderFactory::getKnownExtensions(); @@ -411,6 +460,7 @@ bool list = false; bool summaryOnly = false; QString skeletonFor = ""; + QString minVersion = ""; QString myname = args[0]; myname = QFileInfo(myname).baseName(); QStringList otherArgs; @@ -435,14 +485,14 @@ if (arg == "-w" || arg == "--writer") { if (last || args[i+1].startsWith("-")) { - cerr << myname.toStdString() << ": argument expected for \"" - << arg.toStdString() << "\" option" << endl; - cerr << helpStr.toStdString() << endl; + cerr << myname << ": argument expected for \"" + << arg << "\" option" << endl; + cerr << helpStr << endl; exit(2); } else { string tag = args[++i].toStdString(); if (requestedWriterTags.find(tag) != requestedWriterTags.end()) { - cerr << myname.toStdString() << ": NOTE: duplicate specification of writer type \"" << tag << "\" ignored" << endl; + cerr << myname << ": NOTE: duplicate specification of writer type \"" << tag << "\" ignored" << endl; } else { requestedWriterTags.insert(tag); } @@ -450,15 +500,15 @@ } } else if (arg == "-t" || arg == "--transform") { if (last || args[i+1].startsWith("-")) { - cerr << myname.toStdString() << ": argument expected for \"" - << arg.toStdString() << "\" option" << endl; - cerr << helpStr.toStdString() << endl; + cerr << myname << ": argument expected for \"" + << arg << "\" option" << endl; + cerr << helpStr << endl; exit(2); } else { string transform = args[++i].toStdString(); if (requestedTransformFiles.find(transform) != requestedTransformFiles.end()) { - cerr << myname.toStdString() << ": NOTE: duplicate specification of transform file \"" << transform << "\" ignored" << endl; + cerr << myname << ": NOTE: duplicate specification of transform file \"" << transform << "\" ignored" << endl; } else { requestedTransformFiles.insert(transform); } @@ -466,15 +516,15 @@ } } else if (arg == "-T" || arg == "--transforms") { if (last || args[i+1].startsWith("-")) { - cerr << myname.toStdString() << ": argument expected for \"" - << arg.toStdString() << "\" option" << endl; - cerr << helpStr.toStdString() << endl; + cerr << myname << ": argument expected for \"" + << arg << "\" option" << endl; + cerr << helpStr << endl; exit(2); } else { string transform = args[++i].toStdString(); if (requestedTransformListFiles.find(transform) != requestedTransformListFiles.end()) { - cerr << myname.toStdString() << ": NOTE: duplicate specification of transform list file \"" << transform << "\" ignored" << endl; + cerr << myname << ": NOTE: duplicate specification of transform list file \"" << transform << "\" ignored" << endl; } else { requestedTransformListFiles.insert(transform); } @@ -482,15 +532,15 @@ } } else if (arg == "-d" || arg == "--default") { if (last || args[i+1].startsWith("-")) { - cerr << myname.toStdString() << ": argument expected for \"" - << arg.toStdString() << "\" option" << endl; - cerr << helpStr.toStdString() << endl; + cerr << myname << ": argument expected for \"" + << arg << "\" option" << endl; + cerr << helpStr << endl; exit(2); } else { string deft = args[++i].toStdString(); if (requestedDefaultTransforms.find(deft) != requestedDefaultTransforms.end()) { - cerr << myname.toStdString() << ": NOTE: duplicate specification of default transform \"" << deft << "\" ignored" << endl; + cerr << myname << ": NOTE: duplicate specification of default transform \"" << deft << "\" ignored" << endl; } else { requestedDefaultTransforms.insert(deft); } @@ -498,9 +548,9 @@ } } else if (arg == "-S" || arg == "--summary") { if (last || args[i+1].startsWith("-")) { - cerr << myname.toStdString() << ": argument expected for \"" - << arg.toStdString() << "\" option" << endl; - cerr << helpStr.toStdString() << endl; + cerr << myname << ": argument expected for \"" + << arg << "\" option" << endl; + cerr << helpStr << endl; exit(2); } else { string summary = args[++i].toStdString(); @@ -512,9 +562,9 @@ continue; } else if (arg == "--segments") { if (last) { - cerr << myname.toStdString() << ": argument expected for \"" - << arg.toStdString() << "\" option" << endl; - cerr << helpStr.toStdString() << endl; + cerr << myname << ": argument expected for \"" + << arg << "\" option" << endl; + cerr << helpStr << endl; exit(2); } else { string segmentSpec = args[++i].toStdString(); @@ -524,8 +574,8 @@ boundaries.insert(Vamp::RealTime::fromSeconds (segmentStrs[j].toDouble(&good))); if (!good) { - cerr << myname.toStdString() << ": segment boundaries must be numeric" << endl; - cerr << helpStr.toStdString() << endl; + cerr << myname << ": segment boundaries must be numeric" << endl; + cerr << helpStr << endl; exit(2); } } @@ -545,12 +595,21 @@ } else if (arg == "-l" || arg == "--list") { list = true; continue; + } else if (arg == "--minversion") { + if (last || args[i+1].startsWith("-")) { + cerr << myname << ": usage: " + << myname << " " << arg << " <version>" << endl; + cerr << helpStr << endl; + exit(2); + } + minVersion = args[++i]; + continue; } else if (arg == "-s" || arg == "--skeleton") { if (last || args[i+1].startsWith("-")) { - cerr << myname.toStdString() << ": usage: " - << myname.toStdString() << " " << arg.toStdString() + cerr << myname << ": usage: " + << myname << " " << arg << " <transform>" << endl; - cerr << helpStr.toStdString() << endl; + cerr << helpStr << endl; exit(2); } else { skeletonFor = args[++i]; @@ -563,7 +622,7 @@ if (list) { if (!requestedWriterTags.empty() || skeletonFor != "") { - cerr << helpStr.toStdString() << endl; + cerr << helpStr << endl; exit(2); } listTransforms(); @@ -571,35 +630,42 @@ } if (skeletonFor != "") { if (!requestedWriterTags.empty()) { - cerr << helpStr.toStdString() << endl; + cerr << helpStr << endl; exit(2); } printSkeleton(skeletonFor); exit(0); } + if (minVersion != "") { + if (!requestedWriterTags.empty()) { + cerr << helpStr << endl; + exit(2); + } + exit(checkMinVersion(myname, minVersion)); + } if (requestedTransformFiles.empty() && requestedTransformListFiles.empty() && requestedDefaultTransforms.empty()) { - cerr << myname.toStdString() + cerr << myname << ": no transform(s) specified" << endl; - cerr << helpStr.toStdString() << endl; + cerr << helpStr << endl; exit(2); } if (requestedWriterTags.empty()) { - cerr << myname.toStdString() + cerr << myname << ": no writer(s) specified" << endl; - cerr << helpStr.toStdString() << endl; + cerr << helpStr << endl; exit(2); } if (!boundaries.empty()) { if (requestedSummaryTypes.empty()) { - cerr << myname.toStdString() + cerr << myname << ": summary segment boundaries provided, but no summary type specified" << endl; - cerr << helpStr.toStdString() << endl; + cerr << helpStr << endl; exit(2); } } @@ -630,7 +696,7 @@ if (!requestedSummaryTypes.empty()) { if (!manager.setSummaryTypes(requestedSummaryTypes, boundaries)) { - cerr << myname.toStdString() + cerr << myname << ": failed to set requested summary types" << endl; exit(1); } @@ -646,9 +712,9 @@ FeatureWriter *writer = FeatureWriterFactory::createWriter(*i); if (!writer) { - cerr << myname.toStdString() << ": unknown feature writer \"" + cerr << myname << ": unknown feature writer \"" << *i << "\"" << endl; - cerr << helpStr.toStdString() << endl; + cerr << helpStr << endl; exit(2); } @@ -675,11 +741,11 @@ writerArgs[argbase] = otherArgs[j].toStdString(); otherArgs.removeAt(j); } else { - cerr << myname.toStdString() << ": " + cerr << myname << ": " << "argument required for \"" - << literal.toStdString() << "\" option" + << literal << "\" option" << endl; - cerr << helpStr.toStdString() << endl; + cerr << helpStr << endl; exit(2); } } else { @@ -695,16 +761,16 @@ for (int i = 0; i < otherArgs.size(); ++i) { if (otherArgs[i].startsWith("-")) { - cerr << myname.toStdString() << ": unknown option \"" - << otherArgs[i].toStdString() << "\"" << endl; - cerr << helpStr.toStdString() << endl; + cerr << myname << ": unknown option \"" + << otherArgs[i] << "\"" << endl; + cerr << helpStr << endl; exit(2); } } if (otherArgs.empty()) { - cerr << myname.toStdString() << ": no input(s) specified" << endl; - cerr << helpStr.toStdString() << endl; + cerr << myname << ": no input(s) specified" << endl; + cerr << helpStr << endl; exit(2); } @@ -717,7 +783,7 @@ requestedTransformFiles.insert(files[j].toStdString()); } } else { - cerr << myname.toStdString() << ": failed to read template list file \"" << *i << "\"" << endl; + cerr << myname << ": failed to read template list file \"" << *i << "\"" << endl; exit(2); } } @@ -792,7 +858,7 @@ } if (!haveFeatureExtractor) { - cerr << myname.toStdString() << ": no feature extractors added" << endl; + cerr << myname << ": no feature extractors added" << endl; good = false; } }
--- a/tests/include.sh Thu Oct 09 12:27:17 2014 +0100 +++ b/tests/include.sh Thu Oct 09 12:56:55 2014 +0100 @@ -4,6 +4,8 @@ testdir=$mypath/.. r=$testdir/../sonic-annotator +version=1.1 + audiopath=$testdir/audio percplug=vamp:vamp-example-plugins:percussiononsets
--- a/tests/test-helpfulflags/test-helpfulflags.sh Thu Oct 09 12:27:17 2014 +0100 +++ b/tests/test-helpfulflags/test-helpfulflags.sh Thu Oct 09 12:56:55 2014 +0100 @@ -32,4 +32,13 @@ $r --skeleton $percplug | rapper -i turtle - test >/dev/null 2>&1 || \ fail "Invalid XML skeleton produced with --skeleton $percplug" +$r --minversion $version || \ + fail "Returned failure code when run with --minversion $version" + +$r --minversion ${version}.1 2>/dev/null && \ + fail "Returned success code when run with --minversion $version" + +$r --minversion 63.9 2>/dev/null && \ + fail "Returned success code when run with --minversion 63.9" + exit 0