# HG changeset patch # User Chris Cannam # Date 1444742800 -3600 # Node ID e994747fb9dd1c253c6b80cedabedadb4e54be35 # Parent db946591a39117218320a9fe2201647c61c5fa5f Adjust model update during recording or writing a new wave file. Formerly we were using the model's completion percentage to indicate write proportion and completion -- that's not a good idea because some layers will reasonably avoid rendering at all until a model reaches 100% completion (it's supposed to report only progress on the initial model generation, and the model shouldn't change during completion updates). diff -r db946591a391 -r e994747fb9dd data/model/FFTModel.cpp --- a/data/model/FFTModel.cpp Mon Oct 12 15:06:15 2015 +0100 +++ b/data/model/FFTModel.cpp Tue Oct 13 14:26:40 2015 +0100 @@ -51,6 +51,10 @@ << ") must be at least FFT size (" << m_fftSize << ")" << endl; throw invalid_argument("FFTModel window size must be at least FFT size"); } + + connect(model, SIGNAL(modelChanged()), this, SIGNAL(modelChanged())); + connect(model, SIGNAL(modelChangedWithin(sv_frame_t, sv_frame_t)), + this, SIGNAL(modelChangedWithin(sv_frame_t, sv_frame_t))); } FFTModel::~FFTModel() diff -r db946591a391 -r e994747fb9dd data/model/Model.h --- a/data/model/Model.h Mon Oct 12 15:06:15 2015 +0100 +++ b/data/model/Model.h Tue Oct 13 14:26:40 2015 +0100 @@ -121,7 +121,8 @@ * through it an estimated percentage value showing how far * through the background operation it thinks it is (for progress * reporting). If it has no way to calculate progress, it may - * return the special value COMPLETION_UNKNOWN. + * return the special value COMPLETION_UNKNOWN. See also + * getCompletion(). */ virtual bool isReady(int *completion = 0) const { bool ok = isOK(); diff -r db946591a391 -r e994747fb9dd data/model/WritableWaveFileModel.cpp --- a/data/model/WritableWaveFileModel.cpp Mon Oct 12 15:06:15 2015 +0100 +++ b/data/model/WritableWaveFileModel.cpp Tue Oct 13 14:26:40 2015 +0100 @@ -32,6 +32,8 @@ using namespace std; +const int WritableWaveFileModel::PROPORTION_UNKNOWN = -1; + //#define DEBUG_WRITABLE_WAVE_FILE_MODEL 1 WritableWaveFileModel::WritableWaveFileModel(sv_samplerate_t sampleRate, @@ -44,7 +46,7 @@ m_channels(channels), m_frameCount(0), m_startFrame(0), - m_completion(0) + m_proportion(PROPORTION_UNKNOWN) { if (path.isEmpty()) { try { @@ -153,17 +155,30 @@ bool WritableWaveFileModel::isReady(int *completion) const { - if (completion) *completion = m_completion; - return (m_completion == 100); + int c = getCompletion(); + if (completion) *completion = c; + if (!isOK()) return false; + return (c == 100); } void -WritableWaveFileModel::setCompletion(int completion) +WritableWaveFileModel::setWriteProportion(int proportion) { - m_completion = completion; - if (completion == 100) { - if (m_reader) m_reader->updateDone(); - } + m_proportion = proportion; +} + +int +WritableWaveFileModel::getWriteProportion() const +{ + return m_proportion; +} + +void +WritableWaveFileModel::writeComplete() +{ + if (m_reader) m_reader->updateDone(); + m_proportion = 100; + emit modelChanged(); } sv_frame_t diff -r db946591a391 -r e994747fb9dd data/model/WritableWaveFileModel.h --- a/data/model/WritableWaveFileModel.h Mon Oct 12 15:06:15 2015 +0100 +++ b/data/model/WritableWaveFileModel.h Tue Oct 13 14:26:40 2015 +0100 @@ -33,17 +33,51 @@ /** * Call addSamples to append a block of samples to the end of the - * file. Caller should also call setCompletion to update the - * progress of this file, if it has a known end point, and should - * call setCompletion(100) when the file has been written. + * file. Caller should also call setWriteProportion() to update + * the progress of this file, if it has a known end point, and + * should call writeComplete() when the file has been written. */ virtual bool addSamples(float **samples, sv_frame_t count); + + /** + * Set the proportion of the file which has been written so far, + * as a percentage. This may be used to indicate progress. + * + * Note that this differs from the "completion" percentage + * reported through isReady()/getCompletion(). That percentage is + * updated when "internal processing has advanced... but the model + * has not changed externally", i.e. it reports progress in + * calculating the initial state of a model. In contrast, an + * update to setWriteProportion corresponds to a change in the + * externally visible state of the model (i.e. it contains more + * data than before). + */ + void setWriteProportion(int proportion); + + /** + * Indicate that writing is complete. You should call this even if + * you have never called setWriteProportion(). + */ + void writeComplete(); + + static const int PROPORTION_UNKNOWN; + + /** + * Get the proportion of the file which has been written so far, + * as a percentage. Return PROPORTION_UNKNOWN if unknown. + */ + int getWriteProportion() const; bool isOK() const; bool isReady(int *) const; - - virtual void setCompletion(int completion); // percentage - virtual int getCompletion() const { return m_completion; } + + /** + * Return the generation completion percentage of this model. This + * is always 100, because the model is always in a complete state + * -- it just contains varying amounts of data depending on how + * much has been written. + */ + virtual int getCompletion() const { return 100; } const ZoomConstraint *getZoomConstraint() const { static PowerOfSqrtTwoZoomConstraint zc; @@ -101,7 +135,7 @@ int m_channels; sv_frame_t m_frameCount; sv_frame_t m_startFrame; - int m_completion; + int m_proportion; }; #endif diff -r db946591a391 -r e994747fb9dd transform/RealTimeEffectModelTransformer.cpp --- a/transform/RealTimeEffectModelTransformer.cpp Mon Oct 12 15:06:15 2015 +0100 +++ b/transform/RealTimeEffectModelTransformer.cpp Tue Oct 13 14:26:40 2015 +0100 @@ -282,8 +282,10 @@ } if (blockFrame == contextStart || completion > prevCompletion) { + // This setCompletion is probably misusing the completion + // terminology, just as it was for WritableWaveFileModel if (stvm) stvm->setCompletion(completion); - if (wwfm) wwfm->setCompletion(completion); + if (wwfm) wwfm->setWriteProportion(completion); prevCompletion = completion; } @@ -293,6 +295,6 @@ if (m_abandoned) return; if (stvm) stvm->setCompletion(100); - if (wwfm) wwfm->setCompletion(100); + if (wwfm) wwfm->writeComplete(); }