Snapshots

This commit is contained in:
Robin Davies
2024-10-03 07:27:13 -04:00
parent 0b7078b592
commit 7821872016
69 changed files with 6070 additions and 1169 deletions
+114 -112
View File
@@ -27,140 +27,142 @@
#include <functional>
#include "DbDezipper.hpp"
namespace pipedal {
class RealtimeVuBuffers;
class RealtimePatchPropertyRequest;
class RealtimeRingBufferWriter;
struct Lv2PedalboardError {
int64_t intanceId;
std::string message;
};
class Lv2PedalboardErrorList: public std::vector<Lv2PedalboardError> // (forward declaration issues with a using statement)
namespace pipedal
{
};
class IPatchWriterCallback;
class RealtimeVuBuffers;
class RealtimePatchPropertyRequest;
class RealtimeRingBufferWriter;
class Lv2Pedalboard {
IHost *pHost = nullptr;
DbDezipper inputVolume;
DbDezipper outputVolume;
BufferPool bufferPool;
std::vector<float*> pedalboardInputBuffers;
std::vector<float*> pedalboardOutputBuffers;
std::vector<std::shared_ptr<IEffect> > effects;
std::vector<IEffect* > realtimeEffects; // std::shared_ptr is not thread-safe!!
using Action = std::function<void()>;
using ProcessAction = std::function<void(uint32_t frames)>;
std::vector<Action> activateActions;
std::vector<ProcessAction> processActions;
std::vector<Action> deactivateActions;
float *CreateNewAudioBuffer();
RealtimeRingBufferWriter *ringBufferWriter;
enum class MappingType {
Linear,
Circular,
Momentary,
Latched,
};
class MidiMapping {
public:
std::shared_ptr<Lv2PluginInfo> pluginInfo; // lifecycle
const Lv2PortInfo *pPortInfo = nullptr; // owned by port.
int instanceId = -1;
int effectIndex = -1;
int controlIndex = -1;
int key; // key to the note or control. internal use only.
bool hasLastValue = false;
float lastValue = -1;
MappingType mappingType;
MidiBinding midiBinding;
struct Lv2PedalboardError
{
int64_t intanceId;
std::string message;
};
std::vector<MidiMapping> midiMappings;
class Lv2PedalboardErrorList : public std::vector<Lv2PedalboardError> // (forward declaration issues with a using statement)
{
};
class Lv2Pedalboard
{
IHost *pHost = nullptr;
std::vector<float*> PrepareItems(
std::vector<PedalboardItem> & items,
std::vector<float*> inputBuffers,
Lv2PedalboardErrorList &errorList
);
DbDezipper inputVolume;
DbDezipper outputVolume;
void PrepareMidiMap(const Pedalboard&pedalboard);
void PrepareMidiMap(const PedalboardItem&pedalboardItem);
BufferPool bufferPool;
std::vector<float *> pedalboardInputBuffers;
std::vector<float *> pedalboardOutputBuffers;
std::vector<float*> AllocateAudioBuffers(int nChannels);
int CalculateChainInputs(const std::vector<float *> &inputBuffers, const std::vector<PedalboardItem> &items);
void AppendParameterRequest(uint8_t*atomBuffer, LV2_URID uridParameter);
public:
Lv2Pedalboard() { }
~Lv2Pedalboard() { }
std::vector<std::shared_ptr<IEffect>> effects;
std::vector<IEffect *> realtimeEffects;
void Prepare(IHost *pHost,Pedalboard&pedalboard, Lv2PedalboardErrorList &errorList);
using Action = std::function<void()>;
using ProcessAction = std::function<void(uint32_t frames)>;
std::vector<IEffect* > GetEffects() { return realtimeEffects; }
std::vector<Action> activateActions;
int GetIndexOfInstanceId(uint64_t instanceId) {
for (int i = 0; i < this->realtimeEffects.size(); ++i)
std::vector<ProcessAction> processActions;
std::vector<Action> deactivateActions;
float *CreateNewAudioBuffer();
RealtimeRingBufferWriter *ringBufferWriter;
enum class MappingType
{
if (this->realtimeEffects[i]->GetInstanceId() == instanceId) return i;
}
return -1;
}
IEffect*GetEffect(uint64_t instanceId) {
for (int i = 0; i < realtimeEffects.size(); ++i) {
if (realtimeEffects[i]->GetInstanceId() == instanceId)
Linear,
Circular,
Momentary,
Latched,
};
class MidiMapping
{
public:
std::shared_ptr<Lv2PluginInfo> pluginInfo; // lifecycle
const Lv2PortInfo *pPortInfo = nullptr; // owned by port.
int instanceId = -1;
int effectIndex = -1;
int controlIndex = -1;
int key; // key to the note or control. internal use only.
bool hasLastValue = false;
float lastValue = -1;
MappingType mappingType;
MidiBinding midiBinding;
};
std::vector<MidiMapping> midiMappings;
std::vector<float *> PrepareItems(
std::vector<PedalboardItem> &items,
std::vector<float *> inputBuffers,
Lv2PedalboardErrorList &errorList);
void PrepareMidiMap(const Pedalboard &pedalboard);
void PrepareMidiMap(const PedalboardItem &pedalboardItem);
std::vector<float *> AllocateAudioBuffers(int nChannels);
int CalculateChainInputs(const std::vector<float *> &inputBuffers, const std::vector<PedalboardItem> &items);
void AppendParameterRequest(uint8_t *atomBuffer, LV2_URID uridParameter);
public:
Lv2Pedalboard() {}
~Lv2Pedalboard() {}
void Prepare(IHost *pHost, Pedalboard &pedalboard, Lv2PedalboardErrorList &errorList);
std::vector<IEffect *> &GetEffects() { return realtimeEffects; }
int GetIndexOfInstanceId(uint64_t instanceId)
{
for (int i = 0; i < this->realtimeEffects.size(); ++i)
{
return realtimeEffects[i];
if (this->realtimeEffects[i]->GetInstanceId() == instanceId)
return i;
}
return -1;
}
return nullptr;
}
void Activate();
void Deactivate();
bool Run(float**inputBuffers, float**outputBuffers,uint32_t samples, RealtimeRingBufferWriter*realtimeWriter);
IEffect *GetEffect(uint64_t instanceId)
{
for (int i = 0; i < realtimeEffects.size(); ++i)
{
if (realtimeEffects[i]->GetInstanceId() == instanceId)
{
return realtimeEffects[i];
}
}
return nullptr;
}
void Activate();
void Deactivate();
bool Run(float **inputBuffers, float **outputBuffers, uint32_t samples, RealtimeRingBufferWriter *realtimeWriter);
void ResetAtomBuffers();
void ResetAtomBuffers();
void ProcessParameterRequests(RealtimePatchPropertyRequest *pParameterRequests);
void GatherPatchProperties(RealtimePatchPropertyRequest *pParameterRequests);
void GatherPathPatchProperties(IPatchWriterCallback *cbPatchWriter);
void ProcessParameterRequests(RealtimePatchPropertyRequest *pParameterRequests);
void GatherPatchProperties(RealtimePatchPropertyRequest *pParameterRequests);
std::vector<float *> &GetInputBuffers() { return this->pedalboardInputBuffers; }
std::vector<float *> &GetoutputBuffers() { return this->pedalboardOutputBuffers; }
int GetControlIndex(uint64_t instanceId, const std::string &symbol);
void SetControlValue(int effectIndex, int portIndex, float value);
void SetInputVolume(float value) { this->inputVolume.SetTarget(value); }
void SetOutputVolume(float value) { this->outputVolume.SetTarget(value); }
void SetBypass(int effectIndex, bool enabled);
std::vector<float*> &GetInputBuffers() { return this->pedalboardInputBuffers;}
std::vector<float*> &GetoutputBuffers() { return this->pedalboardOutputBuffers;}
void ComputeVus(RealtimeVuBuffers *vuConfiguration, uint32_t samples, float **inputBuffers, float **outputBuffers);
float GetControlOutputValue(int effectIndex, int portIndex);
int GetControlIndex(uint64_t instanceId,const std::string&symbol);
void SetControlValue(int effectIndex, int portIndex, float value);
void SetInputVolume(float value) { this->inputVolume.SetTarget(value);}
void SetOutputVolume(float value) { this->outputVolume.SetTarget(value);}
void SetBypass(int effectIndex,bool enabled);
void ComputeVus(RealtimeVuBuffers *vuConfiguration, uint32_t samples, float**inputBuffers, float**outputBuffers);
float GetControlOutputValue(int effectIndex, int portIndex);
typedef void (MidiCallbackFn) (void* data,uint64_t intanceId, int controlIndex, float value);
void OnMidiMessage(size_t size, uint8_t*data,
void *callbackHandle,
MidiCallbackFn*pfnCallback);
};
typedef void(MidiCallbackFn)(void *data, uint64_t intanceId, int controlIndex, float value);
void OnMidiMessage(size_t size, uint8_t *data,
void *callbackHandle,
MidiCallbackFn *pfnCallback);
};
} // namespace