annotate data/model/AlignmentModel.h @ 1881:b504df98c3be

Ensure completion on output model is started at zero, so if it's checked before the input model has become ready and the transform has begun, it is not accidentally reported as complete (affected re-aligning models in Sonic Lineup when replacing the session)
author Chris Cannam
date Fri, 26 Jun 2020 11:45:39 +0100
parents 3072aa267248
children
rev   line source
Chris@297 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
Chris@297 2
Chris@297 3 /*
Chris@297 4 Sonic Visualiser
Chris@297 5 An audio file viewer and annotation editor.
Chris@297 6 Centre for Digital Music, Queen Mary, University of London.
Chris@297 7 This file copyright 2007 QMUL.
Chris@297 8
Chris@297 9 This program is free software; you can redistribute it and/or
Chris@297 10 modify it under the terms of the GNU General Public License as
Chris@297 11 published by the Free Software Foundation; either version 2 of the
Chris@297 12 License, or (at your option) any later version. See the file
Chris@297 13 COPYING included with this distribution for more information.
Chris@297 14 */
Chris@297 15
Chris@1581 16 #ifndef SV_ALIGNMENT_MODEL_H
Chris@1581 17 #define SV_ALIGNMENT_MODEL_H
Chris@297 18
Chris@297 19 #include "Model.h"
Chris@1738 20 #include "Path.h"
Chris@338 21 #include "base/RealTime.h"
Chris@338 22
Chris@338 23 #include <QString>
Chris@338 24 #include <QStringList>
Chris@297 25
Chris@297 26 class SparseTimeValueModel;
Chris@297 27
Chris@297 28 class AlignmentModel : public Model
Chris@297 29 {
Chris@297 30 Q_OBJECT
Chris@297 31
Chris@297 32 public:
Chris@1735 33 AlignmentModel(ModelId reference /* any model */,
Chris@1735 34 ModelId aligned /* any model */,
Chris@1735 35 ModelId path /* a SparseTimeValueModel */);
Chris@297 36 ~AlignmentModel();
Chris@297 37
Chris@1580 38 bool isOK() const override;
Chris@1705 39
Chris@1705 40 void setError(QString error) { m_error = error; }
Chris@1705 41 QString getError() const { return m_error; }
Chris@1705 42
Chris@1580 43 sv_frame_t getStartFrame() const override;
Chris@1725 44 sv_frame_t getTrueEndFrame() const override;
Chris@1580 45 sv_samplerate_t getSampleRate() const override;
Chris@1580 46 bool isReady(int *completion = 0) const override;
Chris@1671 47 int getCompletion() const override {
Chris@1671 48 int c = 0;
Chris@1671 49 (void)isReady(&c);
Chris@1671 50 return c;
Chris@1671 51 }
Chris@1580 52 const ZoomConstraint *getZoomConstraint() const override;
Chris@297 53
Chris@1580 54 QString getTypeName() const override { return tr("Alignment"); }
Chris@345 55
Chris@1735 56 ModelId getReferenceModel() const;
Chris@1735 57 ModelId getAlignedModel() const;
Chris@297 58
Chris@1862 59 void setCompletion(int completion);
Chris@1862 60
Chris@1038 61 sv_frame_t toReference(sv_frame_t frame) const;
Chris@1038 62 sv_frame_t fromReference(sv_frame_t frame) const;
Chris@297 63
Chris@1735 64 void setPathFrom(ModelId pathSource); // a SparseTimeValueModel
Chris@1738 65 void setPath(const Path &path);
Chris@407 66
Chris@1774 67 /**
Chris@1774 68 * Set the calculated pitch relative to a reference. This is
Chris@1774 69 * purely metadata.
Chris@1774 70 */
Chris@1774 71 void setRelativePitch(int cents) { m_relativePitch = cents; }
Chris@1774 72
Chris@1774 73 /**
Chris@1774 74 * Get the value set with setRelativePitch.
Chris@1774 75 */
Chris@1774 76 int getRelativePitch() const { return m_relativePitch; }
Chris@1774 77
Chris@1580 78 void toXml(QTextStream &stream,
Chris@1752 79 QString indent = "",
Chris@1752 80 QString extraAttributes = "") const override;
Chris@407 81
Chris@1833 82 QVector<QString>
Chris@1833 83 getStringExportHeaders(DataExportOptions) const override {
Chris@1833 84 return {};
Chris@1815 85 }
Chris@1833 86
Chris@1833 87 QVector<QVector<QString>>
Chris@1833 88 toStringExportRows(DataExportOptions, sv_frame_t, sv_frame_t) const override {
Chris@1833 89 return {};
Chris@1679 90 }
Chris@1679 91
Chris@297 92 signals:
Chris@1752 93 void completionChanged(ModelId);
Chris@297 94
Chris@297 95 protected slots:
Chris@1752 96 void pathSourceChangedWithin(ModelId, sv_frame_t startFrame, sv_frame_t endFrame);
Chris@1752 97 void pathSourceCompletionChanged(ModelId);
Chris@297 98
Chris@297 99 protected:
Chris@1735 100 ModelId m_reference;
Chris@1735 101 ModelId m_aligned;
Chris@297 102
Chris@1761 103 ModelId m_pathSource; // a SparseTimeValueModel, which we need a
Chris@1761 104 // handle on only while it's still being generated
Chris@1735 105
Chris@1738 106 mutable std::unique_ptr<Path> m_path;
Chris@1738 107 mutable std::unique_ptr<Path> m_reversePath;
Chris@323 108 bool m_pathBegun;
Chris@297 109 bool m_pathComplete;
Chris@1705 110 QString m_error;
Chris@1774 111 int m_relativePitch;
Chris@1862 112 int m_explicitlySetCompletion;
Chris@297 113
Chris@338 114 void constructPath() const;
Chris@297 115 void constructReversePath() const;
Chris@297 116
Chris@1738 117 sv_frame_t performAlignment(const Path &path, sv_frame_t frame) const;
Chris@297 118 };
Chris@297 119
Chris@297 120 #endif