annotate transform/FileFeatureWriter.h @ 1008:d9e0e59a1581

When using an aggregate model to pass data to a transform, zero-pad the shorter input to the duration of the longer rather than truncating the longer. (This is better behaviour for e.g. MATCH, and in any case the code was previously truncating incorrectly and ending up with garbage data at the end.)
author Chris Cannam
date Fri, 14 Nov 2014 13:51:33 +0000
parents 694301cc71cc
children d74ebd2d2c49
rev   line source
Chris@498 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
Chris@498 2
Chris@498 3 /*
Chris@498 4 Sonic Visualiser
Chris@498 5 An audio file viewer and annotation editor.
Chris@498 6
Chris@498 7 Sonic Annotator
Chris@498 8 A utility for batch feature extraction from audio files.
Chris@498 9
Chris@498 10 Mark Levy, Chris Sutton and Chris Cannam, Queen Mary, University of London.
Chris@498 11 Copyright 2007-2008 QMUL.
Chris@498 12
Chris@498 13 This program is free software; you can redistribute it and/or
Chris@498 14 modify it under the terms of the GNU General Public License as
Chris@498 15 published by the Free Software Foundation; either version 2 of the
Chris@498 16 License, or (at your option) any later version. See the file
Chris@498 17 COPYING included with this distribution for more information.
Chris@498 18 */
Chris@498 19
Chris@498 20 #ifndef _FILE_FEATURE_WRITER_H_
Chris@498 21 #define _FILE_FEATURE_WRITER_H_
Chris@498 22
Chris@498 23 #include <string>
Chris@498 24 #include <map>
Chris@498 25 #include <set>
Chris@498 26
Chris@498 27 #include "FeatureWriter.h"
Chris@498 28
Chris@498 29 using std::string;
Chris@498 30 using std::map;
Chris@498 31 using std::set;
Chris@498 32 using std::pair;
Chris@498 33
Chris@498 34 class QTextStream;
Chris@498 35 class QFile;
Chris@498 36
Chris@498 37 class FileFeatureWriter : public FeatureWriter
Chris@498 38 {
Chris@498 39 public:
Chris@498 40 virtual ~FileFeatureWriter();
Chris@498 41
Chris@498 42 virtual ParameterList getSupportedParameters() const;
Chris@498 43 virtual void setParameters(map<string, string> &params);
Chris@498 44
Chris@625 45 virtual void testOutputFile(QString trackId, TransformId transformId);
Chris@515 46 virtual void flush();
Chris@531 47 virtual void finish();
Chris@515 48
Chris@498 49 protected:
Chris@498 50 enum FileWriteSupport {
Chris@498 51 SupportOneFilePerTrackTransform = 1,
Chris@498 52 SupportOneFilePerTrack = 2,
Chris@997 53 SupportOneFileTotal = 4,
Chris@997 54 SupportStdOut = 8
Chris@498 55 };
Chris@498 56
Chris@498 57 FileFeatureWriter(int support, QString extension);
Chris@498 58 QTextStream *getOutputStream(QString, TransformId);
Chris@498 59
Chris@498 60 typedef pair<QString, TransformId> TrackTransformPair;
Chris@999 61 typedef map<TrackTransformPair, QString> FileNameMap;
Chris@498 62 typedef map<TrackTransformPair, QFile *> FileMap;
Chris@498 63 typedef map<QFile *, QTextStream *> FileStreamMap;
Chris@498 64 FileMap m_files;
Chris@999 65 FileNameMap m_filenames;
Chris@498 66 FileStreamMap m_streams;
Chris@512 67 QTextStream *m_prevstream;
Chris@498 68
Chris@999 69 TrackTransformPair getFilenameKey(QString, TransformId);
Chris@999 70
Chris@999 71 // Come up with a suitable output filename for the given track ID -
Chris@999 72 // transform ID combo. Fail if it already exists, etc.
Chris@999 73 QString createOutputFilename(QString, TransformId);
Chris@999 74
Chris@999 75 // Look up and return the output filename for the given track ID -
Chris@999 76 // transform ID combo.
Chris@498 77 QString getOutputFilename(QString, TransformId);
Chris@999 78
Chris@999 79 // Look up and return the output file handle for the given track
Chris@999 80 // ID - transform ID combo. Return 0 if it could not be opened.
Chris@498 81 QFile *getOutputFile(QString, TransformId);
Chris@591 82
Chris@591 83 // subclass can implement this to be called before file is opened for append
Chris@930 84 virtual void reviewFileForAppending(QString) { }
Chris@498 85
Chris@498 86 int m_support;
Chris@498 87 QString m_extension;
Chris@498 88 QString m_baseDir;
Chris@498 89 bool m_manyFiles;
Chris@498 90 QString m_singleFileName;
Chris@498 91 bool m_stdout;
Chris@498 92 bool m_append;
Chris@498 93 bool m_force;
Chris@498 94 };
Chris@498 95
Chris@498 96 #endif