# HG changeset patch # User Chris Cannam # Date 1562259861 -3600 # Node ID 77543124651bbbf92fd3b97cdd8597ce74a9fa3b # Parent d0ef65d8dd89a4b8449f24fe7edb60ebe2baffbe Overhaul PlayParameters bits diff -r d0ef65d8dd89 -r 77543124651b base/PlayParameterRepository.cpp --- a/base/PlayParameterRepository.cpp Thu Jul 04 14:30:48 2019 +0100 +++ b/base/PlayParameterRepository.cpp Thu Jul 04 18:04:21 2019 +0100 @@ -17,8 +17,6 @@ #include "PlayParameters.h" #include "Playable.h" -#include "ById.h" - #include PlayParameterRepository * @@ -35,24 +33,14 @@ } void -PlayParameterRepository::addPlayable(int playableId) +PlayParameterRepository::addPlayable(int playableId, const Playable *playable) { -// cerr << "PlayParameterRepository:addPlayable playable = " << playable << endl; - if (!getPlayParameters(playableId)) { - - auto playable = AnyById::getAs(playableId); - if (!playable) { - SVCERR << "ERROR: id passed to PlayParameterRepository::addPlayable is not that of a Playable" << endl; - return; - } // Give all playables the same type of play parameters for the // moment -// cerr << "PlayParameterRepository:addPlayable: Adding play parameters for " << playable << endl; - - PlayParameters *params = new PlayParameters; + auto params = std::make_shared(); m_playParameters[playableId] = params; params->setPlayClipId @@ -61,14 +49,11 @@ params->setPlayAudible (playable->getDefaultPlayAudible()); - connect(params, SIGNAL(playParametersChanged()), + connect(params.get(), SIGNAL(playParametersChanged()), this, SLOT(playParametersChanged())); - connect(params, SIGNAL(playClipIdChanged(QString)), + connect(params.get(), SIGNAL(playClipIdChanged(QString)), this, SLOT(playClipIdChanged(QString))); - -// cerr << "Connected play parameters " << params << " for playable " -// << playable << " to this " << this << endl; } } @@ -76,10 +61,8 @@ PlayParameterRepository::removePlayable(int playableId) { if (m_playParameters.find(playableId) == m_playParameters.end()) { - SVCERR << "WARNING: PlayParameterRepository::removePlayable: unknown playable " << playableId << endl; return; } - delete m_playParameters[playableId]; m_playParameters.erase(playableId); } @@ -91,13 +74,13 @@ return; } if (!getPlayParameters(to)) { - cerr << "WARNING: PlayParameterRepository::copyParameters: target playable unknown, adding it now" << endl; - addPlayable(to); + cerr << "ERROR: PlayParameterRepository::copyParameters: target playable unknown" << endl; + return; } - getPlayParameters(to)->copyFrom(getPlayParameters(from)); + getPlayParameters(to)->copyFrom(getPlayParameters(from).get()); } -PlayParameters * +std::shared_ptr PlayParameterRepository::getPlayParameters(int playableId) { if (m_playParameters.find(playableId) == m_playParameters.end()) { @@ -110,17 +93,21 @@ PlayParameterRepository::playParametersChanged() { PlayParameters *params = dynamic_cast(sender()); - emit playParametersChanged(params); + for (auto i: m_playParameters) { + if (i.second.get() == params) { + emit playParametersChanged(i.first); + return; + } + } } void PlayParameterRepository::playClipIdChanged(QString id) { PlayParameters *params = dynamic_cast(sender()); - for (PlayableParameterMap::iterator i = m_playParameters.begin(); - i != m_playParameters.end(); ++i) { - if (i->second == params) { - emit playClipIdChanged(i->first, id); + for (auto i: m_playParameters) { + if (i.second.get() == params) { + emit playClipIdChanged(i.first, id); return; } } @@ -129,18 +116,14 @@ void PlayParameterRepository::clear() { -// cerr << "PlayParameterRepository: PlayParameterRepository::clear" << endl; - while (!m_playParameters.empty()) { - delete m_playParameters.begin()->second; - m_playParameters.erase(m_playParameters.begin()); - } + m_playParameters.clear(); } -PlayParameterRepository::EditCommand::EditCommand(PlayParameters *params) : +PlayParameterRepository::EditCommand::EditCommand(std::shared_ptr params) : m_params(params) { - m_from.copyFrom(m_params); - m_to.copyFrom(m_params); + m_from.copyFrom(m_params.get()); + m_to.copyFrom(m_params.get()); } void diff -r d0ef65d8dd89 -r 77543124651b base/PlayParameterRepository.h --- a/base/PlayParameterRepository.h Thu Jul 04 14:30:48 2019 +0100 +++ b/base/PlayParameterRepository.h Thu Jul 04 18:04:21 2019 +0100 @@ -22,6 +22,7 @@ class Playable; #include +#include #include #include @@ -36,43 +37,33 @@ virtual ~PlayParameterRepository(); /** - * Register a playable. - * - * The id must be of an object that is registered with the ById - * store and that can be dynamic_cast to Playable. + * Register a playable. The id can be anything you like, so long + * as it is unique among playables. */ - void addPlayable(int playableId); + void addPlayable(int id, const Playable *); /** - * Unregister a playable. - * - * The id must be of an object that is registered with the ById - * store and that can be dynamic_cast to Playable. + * Unregister a playable. This must happen before a playable is + * deleted. */ - void removePlayable(int playableId); + void removePlayable(int id); /** * Copy the play parameters from one playable to another. - * - * The ids must be of objects that are registered with the ById - * store and that can be dynamic_cast to Playable. */ void copyParameters(int fromId, int toId); /** * Retrieve the play parameters for a playable. - * - * The id must be of an object that is registered with the ById - * store and that can be dynamic_cast to Playable. */ - PlayParameters *getPlayParameters(int playableId); + std::shared_ptr getPlayParameters(int id); void clear(); class EditCommand : public Command { public: - EditCommand(PlayParameters *params); + EditCommand(std::shared_ptr params); void setPlayMuted(bool); void setPlayAudible(bool); void setPlayPan(float); @@ -83,13 +74,13 @@ QString getName() const override; protected: - PlayParameters *m_params; + std::shared_ptr m_params; PlayParameters m_from; PlayParameters m_to; }; signals: - void playParametersChanged(PlayParameters *); + void playParametersChanged(int playableId); void playClipIdChanged(int playableId, QString); protected slots: @@ -97,7 +88,7 @@ void playClipIdChanged(QString); protected: - typedef std::map PlayableParameterMap; + typedef std::map> PlayableParameterMap; PlayableParameterMap m_playParameters; static PlayParameterRepository *m_instance; diff -r d0ef65d8dd89 -r 77543124651b base/PropertyContainer.h --- a/base/PropertyContainer.h Thu Jul 04 14:30:48 2019 +0100 +++ b/base/PropertyContainer.h Thu Jul 04 18:04:21 2019 +0100 @@ -21,6 +21,7 @@ #include #include #include +#include class PlayParameters; class RangeMapper; @@ -111,7 +112,13 @@ virtual QString getPropertyContainerName() const = 0; virtual QString getPropertyContainerIconName() const = 0; - virtual PlayParameters *getPlayParameters() { return 0; } + /** + * Return the play parameters for this layer, if any. The return + * value is a shared_ptr that, if not null, can be passed to + * e.g. PlayParameterRepository::EditCommand to change the + * parameters. + */ + virtual std::shared_ptr getPlayParameters() { return {}; } signals: void propertyChanged(PropertyContainer::PropertyName); diff -r d0ef65d8dd89 -r 77543124651b data/model/DenseTimeValueModel.cpp --- a/data/model/DenseTimeValueModel.cpp Thu Jul 04 14:30:48 2019 +0100 +++ b/data/model/DenseTimeValueModel.cpp Thu Jul 04 18:04:21 2019 +0100 @@ -14,19 +14,8 @@ */ #include "DenseTimeValueModel.h" -#include "base/PlayParameterRepository.h" #include - -DenseTimeValueModel::DenseTimeValueModel() -{ - PlayParameterRepository::getInstance()->addPlayable(getId().untyped); -} - -DenseTimeValueModel::~DenseTimeValueModel() -{ - PlayParameterRepository::getInstance()->removePlayable(getId().untyped); -} QString DenseTimeValueModel::toDelimitedDataString(QString delimiter, diff -r d0ef65d8dd89 -r 77543124651b data/model/DenseTimeValueModel.h --- a/data/model/DenseTimeValueModel.h Thu Jul 04 14:30:48 2019 +0100 +++ b/data/model/DenseTimeValueModel.h Thu Jul 04 18:04:21 2019 +0100 @@ -32,9 +32,9 @@ Q_OBJECT public: - DenseTimeValueModel(); + DenseTimeValueModel() { } - virtual ~DenseTimeValueModel(); + virtual ~DenseTimeValueModel() { } /** * Return the minimum possible value found in this model type. diff -r d0ef65d8dd89 -r 77543124651b data/model/NoteModel.h --- a/data/model/NoteModel.h Thu Jul 04 14:30:48 2019 +0100 +++ b/data/model/NoteModel.h Thu Jul 04 18:04:21 2019 +0100 @@ -66,7 +66,8 @@ m_valueMinimum = 33.f; m_valueMaximum = 88.f; } - PlayParameterRepository::getInstance()->addPlayable(getId().untyped); + PlayParameterRepository::getInstance()->addPlayable + (getId().untyped, this); } NoteModel(sv_samplerate_t sampleRate, int resolution, @@ -87,11 +88,13 @@ DeferredNotifier::NOTIFY_ALWAYS : DeferredNotifier::NOTIFY_DEFERRED), m_completion(100) { - PlayParameterRepository::getInstance()->addPlayable(getId().untyped); + PlayParameterRepository::getInstance()->addPlayable + (getId().untyped, this); } virtual ~NoteModel() { - PlayParameterRepository::getInstance()->removePlayable(getId().untyped); + PlayParameterRepository::getInstance()->removePlayable + (getId().untyped); } QString getTypeName() const override { return tr("Note"); } diff -r d0ef65d8dd89 -r 77543124651b data/model/ReadOnlyWaveFileModel.cpp --- a/data/model/ReadOnlyWaveFileModel.cpp Thu Jul 04 14:30:48 2019 +0100 +++ b/data/model/ReadOnlyWaveFileModel.cpp Thu Jul 04 18:04:21 2019 +0100 @@ -21,12 +21,12 @@ #include "system/System.h" #include "base/Preferences.h" +#include "base/PlayParameterRepository.h" #include #include #include -//#include #include #include @@ -85,6 +85,9 @@ if (m_reader) setObjectName(m_reader->getTitle()); if (objectName() == "") setObjectName(QFileInfo(m_path).fileName()); if (isOK()) fillCache(); + + PlayParameterRepository::getInstance()->addPlayable + (getId().untyped, this); } ReadOnlyWaveFileModel::ReadOnlyWaveFileModel(FileSource source, AudioFileReader *reader) : @@ -106,10 +109,16 @@ if (m_reader) setObjectName(m_reader->getTitle()); if (objectName() == "") setObjectName(QFileInfo(m_path).fileName()); fillCache(); + + PlayParameterRepository::getInstance()->addPlayable + (getId().untyped, this); } ReadOnlyWaveFileModel::~ReadOnlyWaveFileModel() { + PlayParameterRepository::getInstance()->removePlayable + (getId().untyped); + m_exiting = true; if (m_fillThread) m_fillThread->wait(); if (m_myReader) delete m_reader; diff -r d0ef65d8dd89 -r 77543124651b data/model/SparseOneDimensionalModel.h --- a/data/model/SparseOneDimensionalModel.h Thu Jul 04 14:30:48 2019 +0100 +++ b/data/model/SparseOneDimensionalModel.h Thu Jul 04 18:04:21 2019 +0100 @@ -53,11 +53,13 @@ DeferredNotifier::NOTIFY_ALWAYS : DeferredNotifier::NOTIFY_DEFERRED), m_completion(100) { - PlayParameterRepository::getInstance()->addPlayable(getId().untyped); + PlayParameterRepository::getInstance()->addPlayable + (getId().untyped, this); } virtual ~SparseOneDimensionalModel() { - PlayParameterRepository::getInstance()->removePlayable(getId().untyped); + PlayParameterRepository::getInstance()->removePlayable + (getId().untyped); } QString getTypeName() const override { return tr("Sparse 1-D"); } diff -r d0ef65d8dd89 -r 77543124651b data/model/SparseTimeValueModel.h --- a/data/model/SparseTimeValueModel.h Thu Jul 04 14:30:48 2019 +0100 +++ b/data/model/SparseTimeValueModel.h Thu Jul 04 18:04:21 2019 +0100 @@ -54,7 +54,8 @@ m_completion(100) { // Model is playable, but may not sound (if units not Hz or // range unsuitable) - PlayParameterRepository::getInstance()->addPlayable(getId().untyped); + PlayParameterRepository::getInstance()->addPlayable + (getId().untyped, this); } SparseTimeValueModel(sv_samplerate_t sampleRate, int resolution, @@ -73,11 +74,13 @@ m_completion(100) { // Model is playable, but may not sound (if units not Hz or // range unsuitable) - PlayParameterRepository::getInstance()->addPlayable(getId().untyped); + PlayParameterRepository::getInstance()->addPlayable + (getId().untyped, this); } virtual ~SparseTimeValueModel() { - PlayParameterRepository::getInstance()->removePlayable(getId().untyped); + PlayParameterRepository::getInstance()->removePlayable + (getId().untyped); } QString getTypeName() const override { return tr("Sparse Time-Value"); } diff -r d0ef65d8dd89 -r 77543124651b data/model/WritableWaveFileModel.cpp --- a/data/model/WritableWaveFileModel.cpp Thu Jul 04 14:30:48 2019 +0100 +++ b/data/model/WritableWaveFileModel.cpp Thu Jul 04 18:04:21 2019 +0100 @@ -19,6 +19,7 @@ #include "base/TempDirectory.h" #include "base/Exceptions.h" +#include "base/PlayParameterRepository.h" #include "fileio/WavFileWriter.h" #include "fileio/WavFileReader.h" @@ -160,10 +161,16 @@ connect(m_model, SIGNAL(modelChanged()), this, SIGNAL(modelChanged())); connect(m_model, SIGNAL(modelChangedWithin(sv_frame_t, sv_frame_t)), this, SIGNAL(modelChangedWithin(sv_frame_t, sv_frame_t))); + + PlayParameterRepository::getInstance()->addPlayable + (getId().untyped, this); } WritableWaveFileModel::~WritableWaveFileModel() { + PlayParameterRepository::getInstance()->removePlayable + (getId().untyped); + delete m_model; delete m_targetWriter; delete m_temporaryWriter;