# HG changeset patch # User Chris Cannam # Date 1413385515 -3600 # Node ID 859d8ec60e06c9684e613d25b120babffd9c3468 # Parent 3e30dbb68ca2a2c83104387c0baff9f3537bad1e Add setNofM logic which the JSON writer can use to write a list when sending multiple files' worth to a single target diff -r 3e30dbb68ca2 -r 859d8ec60e06 .hgsubstate --- a/.hgsubstate Wed Oct 15 15:20:16 2014 +0100 +++ b/.hgsubstate Wed Oct 15 16:05:15 2014 +0100 @@ -1,3 +1,3 @@ d16f0fd6db6104d87882bc43788a3bb1b0f8c528 dataquay 879bdc878826bebec67130326f99397c430419b1 sv-dependency-builds -7d003fe48225c0fc4f811de075b4d7f0b9bc599b svcore +6b2a8b34e9d3d9a573af2ae303f33362e4c17784 svcore diff -r 3e30dbb68ca2 -r 859d8ec60e06 runner/JAMSFeatureWriter.cpp --- a/runner/JAMSFeatureWriter.cpp Wed Oct 15 15:20:16 2014 +0100 +++ b/runner/JAMSFeatureWriter.cpp Wed Oct 15 16:05:15 2014 +0100 @@ -33,7 +33,9 @@ SupportStdOut, "json"), m_network(false), - m_networkRetrieved(false) + m_networkRetrieved(false), + m_n(1), + m_m(1) { } @@ -142,7 +144,13 @@ if (f.values.size() > 0) { d += QString(", \"value\": [ "); for (int j = 0; j < int(f.values.size()); ++j) { - d += QString("%1 ").arg(f.values[i]); + if (isnan(f.values[j])) { + d += "\"NaN\" "; + } else if (isinf(f.values[j])) { + d += "\"Inf\" "; + } else { + d += QString("%1 ").arg(f.values[j]); + } } d += "]"; } @@ -154,6 +162,18 @@ } void +JAMSFeatureWriter::setNofM(int n, int m) +{ + if (m_singleFileName != "" || m_stdout) { + m_n = n; + m_m = m; + } else { + m_n = 1; + m_m = 1; + } +} + +void JAMSFeatureWriter::finish() { for (FileStreamMap::const_iterator stri = m_streams.begin(); @@ -162,10 +182,6 @@ QTextStream *sptr = stri->second; QTextStream &stream = *sptr; - if (m_streamTracks[sptr].size() > 1) { - stream << "[\n"; - } - bool firstInStream = true; for (TrackIds::const_iterator tri = m_streamTracks[sptr].begin(); @@ -173,7 +189,13 @@ TrackId trackId = *tri; - if (!firstInStream) { + if (firstInStream) { + if (m_streamTracks[sptr].size() > 1 || (m_m > 1 && m_n == 1)) { + stream << "[\n"; + } + } + + if (!firstInStream || (m_m > 1 && m_n > 1)) { stream << ",\n"; } @@ -253,10 +275,12 @@ firstInStream = false; } - if (m_streamTracks[sptr].size() > 1) { - stream << "\n]"; + if (!firstInStream) { + if (m_streamTracks[sptr].size() > 1 || (m_m > 1 && m_n == m_m)) { + stream << "\n]"; + } + stream << "\n"; } - stream << "\n"; } m_streamTracks.clear(); diff -r 3e30dbb68ca2 -r 859d8ec60e06 runner/JAMSFeatureWriter.h --- a/runner/JAMSFeatureWriter.h Wed Oct 15 15:20:16 2014 +0100 +++ b/runner/JAMSFeatureWriter.h Wed Oct 15 16:05:15 2014 +0100 @@ -36,6 +36,8 @@ virtual void setTrackMetadata(QString trackid, TrackMetadata metadata); + virtual void setNofM(int, int); + virtual void write(QString trackid, const Transform &transform, const Vamp::Plugin::OutputDescriptor &output, @@ -95,6 +97,8 @@ bool m_network; bool m_networkRetrieved; + int m_n; + int m_m; }; #endif diff -r 3e30dbb68ca2 -r 859d8ec60e06 runner/main.cpp --- a/runner/main.cpp Wed Oct 15 15:20:16 2014 +0100 +++ b/runner/main.cpp Wed Oct 15 16:05:15 2014 +0100 @@ -939,17 +939,25 @@ } if (multiplex) { try { + for (int i = 0; i < (int)writers.size(); ++i) { + writers[i]->setNofM(1, 1); + } manager.extractFeaturesMultiplexed(goodSources); } catch (const std::exception &e) { cerr << "ERROR: Feature extraction failed: " << e.what() << endl; } } else { + int n = 0; for (QStringList::const_iterator i = goodSources.begin(); i != goodSources.end(); ++i) { std::cerr << "Extracting features for: \"" << i->toStdString() << "\"" << std::endl; + ++n; try { + for (int j = 0; j < (int)writers.size(); ++j) { + writers[j]->setNofM(n, goodSources.size()); + } manager.extractFeatures(*i); } catch (const std::exception &e) { cerr << "ERROR: Feature extraction failed for \"" diff -r 3e30dbb68ca2 -r 859d8ec60e06 tests/test-json-destinations/test-json-destinations.sh --- a/tests/test-json-destinations/test-json-destinations.sh Wed Oct 15 15:20:16 2014 +0100 +++ b/tests/test-json-destinations/test-json-destinations.sh Wed Oct 15 16:05:15 2014 +0100 @@ -23,11 +23,22 @@ transformdir=$mypath/transforms +failshow() { + echo "Test failed: $1" + if [ -n "$2" ]; then + echo "Output follows:" + echo "--" + cat $2 + echo "--" + fi + exit 1 +} + check_json() { test -f $1 || \ fail "Fails to write output to expected location $1 for $2" - cat $1 | json_verify || \ - fail "Writes invalid JSON to location $1 for $2" + cat $1 | json_verify -q || \ + failshow "Writes invalid JSON to location $1 for $2" $1 rm -f $1 }