Skip to content

Commit

Permalink
Adding the GenericDefaultNameCapability and its implementation
Browse files Browse the repository at this point in the history
Fixing a conceptual bug in the DefaultNameCapability - it needs to run on a given name (also stored in the database), not on the internal name of the patch. Needs a parameter, it needs.
  • Loading branch information
christofmuc committed Jan 1, 2021
1 parent 3fa8c10 commit 1a5ee0f
Show file tree
Hide file tree
Showing 11 changed files with 100 additions and 31 deletions.
2 changes: 1 addition & 1 deletion MidiKraft-base
2 changes: 1 addition & 1 deletion MidiKraft-database
2 changes: 2 additions & 0 deletions adaptions/GenericAdaptation.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ namespace knobkraft {
*kDeviceDetectWaitMilliseconds = "deviceDetectWaitMilliseconds",
*kNameFromDump = "nameFromDump",
*kRenamePatch = "renamePatch",
*kIsDefaultName = "isDefaultName",
*kIsEditBufferDump = "isEditBufferDump",
*kCreateEditBufferRequest = "createEditBufferRequest",
*kConvertToEditBuffer = "convertToEditBuffer",
Expand All @@ -67,6 +68,7 @@ namespace knobkraft {
kNeedsChannelSpecificDetection,
kDeviceDetectWaitMilliseconds,
kNameFromDump,
kIsDefaultName,
kRenamePatch,
kIsEditBufferDump,
kCreateEditBufferRequest,
Expand Down
2 changes: 1 addition & 1 deletion adaptions/GenericAdaptation.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ namespace knobkraft {
void checkForPythonOutputAndLog();

extern const char *kIsEditBufferDump, *kCreateEditBufferRequest, *kConvertToEditBuffer,
*kNameFromDump, *kRenamePatch,
*kNameFromDump, *kRenamePatch, *kIsDefaultName,
*kIsSingleProgramDump, *kCreateProgramDumpRequest, *kConvertToProgramDump, *kNumberFromDump,
*kCreateBankDumpRequest, *kIsPartOfBankDump, *kIsBankDumpFinished, *kExtractPatchesFromBank;

Expand Down
93 changes: 73 additions & 20 deletions adaptions/GenericPatch.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -49,37 +49,57 @@ namespace knobkraft {

void GenericStoredPatchNameCapability::setName(std::string const &name)
{
// set name is an optional method - if it is not implemented, the name in the patch is never changed, the name displayed in the Librarian is
if (!me_->pythonModuleHasFunction(kRenamePatch)) return;

// Very well, then try to change the name in the patch data
try {
ScopedLock lock(GenericAdaptation::multiThreadGuard);
std::vector<int> v(me_->data().data(), me_->data().data() + me_->data().size());
py::object result = me_->callMethod(kRenamePatch, v, name);
auto intVector = result.cast<std::vector<int>>();
std::vector<uint8> byteData = GenericAdaptation::intVectorToByteVector(intVector);
me_->setData(byteData);
}
catch (py::error_already_set &ex) {
std::string errorMessage = (boost::format("Error calling %s: %s") % kRenamePatch % ex.what()).str();
SimpleLogger::instance()->postMessage(errorMessage);
}
catch (...) {
SimpleLogger::instance()->postMessage((boost::format("Uncaught exception in %s of Patch of GenericAdaptation") % kRenamePatch).str());
if (!me_.expired()) {
// set name is an optional method - if it is not implemented, the name in the patch is never changed, the name displayed in the Librarian is
if (!me_.lock()->pythonModuleHasFunction(kRenamePatch)) return;

// Very well, then try to change the name in the patch data
try {
ScopedLock lock(GenericAdaptation::multiThreadGuard);
std::vector<int> v(me_.lock()->data().data(), me_.lock()->data().data() + me_.lock()->data().size());
py::object result = me_.lock()->callMethod(kRenamePatch, v, name);
auto intVector = result.cast<std::vector<int>>();
std::vector<uint8> byteData = GenericAdaptation::intVectorToByteVector(intVector);
me_.lock()->setData(byteData);
}
catch (py::error_already_set &ex) {
std::string errorMessage = (boost::format("Error calling %s: %s") % kRenamePatch % ex.what()).str();
SimpleLogger::instance()->postMessage(errorMessage);
}
catch (...) {
SimpleLogger::instance()->postMessage((boost::format("Uncaught exception in %s of Patch of GenericAdaptation") % kRenamePatch).str());
}
}
}

bool GenericStoredPatchNameCapability::isDefaultName() const
bool GenericDefaultNameCapability::isDefaultName(std::string const &patchName) const
{
// Not implemented yet
if (!me_.expired()) {
auto patch = me_.lock();
try {
py::object result = patch->callMethod(kIsDefaultName, patchName);
return py::cast<bool>(result);
}
catch (py::error_already_set &ex) {
std::string errorMessage = (boost::format("Error calling %s: %s") % kIsDefaultName % ex.what()).str();
SimpleLogger::instance()->postMessage(errorMessage);
}
catch (...) {
SimpleLogger::instance()->postMessage((boost::format("Uncaught exception in %s of Patch of GenericAdaptation") % kIsDefaultName).str());
}
}
return false;
}

bool GenericPatch::hasCapability(std::shared_ptr<midikraft::StoredPatchNameCapability> &outCapability) const
{
midikraft::StoredPatchNameCapability *impl;
if (hasCapability(&impl)) {
if (!genericStoredPatchNameCapabilityImpl_) {
// Lazy init allowed despite const-ness of method. Smell.
GenericPatch *non_const = const_cast<GenericPatch *>(this);
non_const->genericStoredPatchNameCapabilityImpl_ = std::make_shared<GenericStoredPatchNameCapability>(non_const->shared_from_this());
}
outCapability = genericStoredPatchNameCapabilityImpl_;
return true;
}
Expand All @@ -89,11 +109,44 @@ namespace knobkraft {
bool GenericPatch::hasCapability(midikraft::StoredPatchNameCapability **outCapability) const
{
if (pythonModuleHasFunction(kRenamePatch)) {
if (!genericStoredPatchNameCapabilityImpl_) {
// Lazy init allowed despite const-ness of method. Smell.
GenericPatch *non_const = const_cast<GenericPatch *>(this);
non_const->genericStoredPatchNameCapabilityImpl_ = std::make_shared<GenericStoredPatchNameCapability>(non_const->shared_from_this());
}
*outCapability = genericStoredPatchNameCapabilityImpl_.get();
return true;
}
return false;
}

bool GenericPatch::hasCapability(std::shared_ptr<midikraft::DefaultNameCapability> &outCapability) const
{
midikraft::DefaultNameCapability *impl;
if (hasCapability(&impl)) {
if (!genericDefaultNameCapabilityImp_) {
// Lazy init allowed despite const-ness of method. Smell.
GenericPatch *non_const = const_cast<GenericPatch *>(this);
non_const->genericDefaultNameCapabilityImp_ = std::make_shared<GenericDefaultNameCapability>(non_const->shared_from_this());
}
outCapability = genericDefaultNameCapabilityImp_;
return true;
}
return false;
}

bool GenericPatch::hasCapability(midikraft::DefaultNameCapability **outCapability) const
{
if (pythonModuleHasFunction(kIsDefaultName)) {
if (!genericDefaultNameCapabilityImp_) {
// Lazy init allowed despite const-ness of method. Smell.
GenericPatch *non_const = const_cast<GenericPatch *>(this);
non_const->genericDefaultNameCapabilityImp_ = std::make_shared<GenericDefaultNameCapability>(non_const->shared_from_this());
}
*outCapability = genericDefaultNameCapabilityImp_.get();
return true;
}
return false;
}
}

20 changes: 17 additions & 3 deletions adaptions/GenericPatch.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,16 +23,27 @@ namespace knobkraft {

class GenericStoredPatchNameCapability : public midikraft::StoredPatchNameCapability {
public:
GenericStoredPatchNameCapability(GenericPatch *me) : me_(me) {}
GenericStoredPatchNameCapability(std::shared_ptr<GenericPatch> me) : me_(me) {}

void setName(std::string const &name) override;
virtual bool isDefaultName() const override;

private:
GenericPatch *me_;
std::weak_ptr<GenericPatch> me_;
};

class GenericDefaultNameCapability : public midikraft::DefaultNameCapability {
public:
GenericDefaultNameCapability(std::shared_ptr<GenericPatch> me) : me_(me) {}

virtual bool isDefaultName(std::string const &patchName) const override;

private:
std::weak_ptr<GenericPatch> me_;
};

class GenericPatch : public midikraft::DataFile, public midikraft::RuntimeCapability<midikraft::StoredPatchNameCapability>
, public midikraft::RuntimeCapability<midikraft::DefaultNameCapability>
, public std::enable_shared_from_this<GenericPatch>
{
public:
enum DataType {
Expand Down Expand Up @@ -74,9 +85,12 @@ namespace knobkraft {
// Runtime Capabilities
bool hasCapability(std::shared_ptr<midikraft::StoredPatchNameCapability> &outCapability) const override;
bool hasCapability(midikraft::StoredPatchNameCapability **outCapability) const override;
bool hasCapability(std::shared_ptr<midikraft::DefaultNameCapability> &outCapability) const override;
bool hasCapability(midikraft::DefaultNameCapability **outCapability) const override;

private:
std::shared_ptr<GenericStoredPatchNameCapability> genericStoredPatchNameCapabilityImpl_;
std::shared_ptr<GenericDefaultNameCapability> genericDefaultNameCapabilityImp_;

pybind11::module &adaptation_;
std::string name_;
Expand Down
2 changes: 1 addition & 1 deletion synths/MidiKraft-access-virus
2 changes: 1 addition & 1 deletion synths/MidiKraft-oberheim-matrix1000
2 changes: 1 addition & 1 deletion synths/MidiKraft-sequential-ob6
2 changes: 1 addition & 1 deletion synths/MidiKraft-sequential-rev2
2 changes: 1 addition & 1 deletion synths/MidiKraft-yamaha-refacedx

0 comments on commit 1a5ee0f

Please sign in to comment.