LMMS
Loading...
Searching...
No Matches
lmms::Lv2Proc Class Reference

#include <Lv2Proc.h>

Inheritance diagram for lmms::Lv2Proc:
lmms::LinkedModelGroup lmms::Model

Classes

struct  StereoPortRef

Public Member Functions

 Lv2Proc (const LilvPlugin *plugin, Model *parent)
 ~Lv2Proc () override
void reload ()
void onSampleRateChanged ()
StereoPortRefinPorts ()
const StereoPortRefinPorts () const
StereoPortRefoutPorts ()
const StereoPortRefoutPorts () const
template<class Functor>
void foreach_port (const Functor &ftor)
template<class Functor>
void foreach_port (const Functor &ftor) const
void dumpPorts ()
 Debug function to print ports to stdout.
void copyModelsFromCore ()
void copyModelsToCore ()
 Bring values from all ports to the LMMS core.
void copyBuffersFromCore (const SampleFrame *buf, unsigned firstChan, unsigned num, f_cnt_t frames)
void copyBuffersToCore (SampleFrame *buf, unsigned firstChan, unsigned num, f_cnt_t frames) const
void run (f_cnt_t frames)
 Run the Lv2 plugin instance for.
void handleMidiInputEvent (const class MidiEvent &event, const TimePos &time, f_cnt_t offset)
class AutomatableModelmodelAtPort (const QString &uri)
std::size_t controlCount () const
bool hasNoteInput () const
Public Member Functions inherited from lmms::LinkedModelGroup
 LinkedModelGroup (Model *parent)
void linkControls (LinkedModelGroup *other)
template<class Functor>
void foreach_model (const Functor &ftor)
template<class Functor>
void foreach_model (const Functor &ftor) const
std::size_t modelNum () const
bool containsModel (const QString &name) const
void removeControl (AutomatableModel *)
void saveValues (class QDomDocument &doc, class QDomElement &that)
void loadValues (const class QDomElement &that)
AutomatableModelgetModel (const std::string &s)
void addModel (class AutomatableModel *model, const QString &name)
 Register a further model.
bool eraseModel (const QString &name)
 Unregister a model, return true if a model was erased.
void clearModels ()
 Remove all models.
Public Member Functions inherited from lmms::Model
 Model (Model *parent, QString displayName=QString(), bool defaultConstructed=false)
 ~Model () override=default
bool isDefaultConstructed () const
ModelparentModel () const
virtual QString displayName () const
virtual void setDisplayName (const QString &displayName)
virtual QString fullDisplayName () const

Static Public Member Functions

static Plugin::Type check (const LilvPlugin *plugin, std::vector< PluginIssue > &issues)

Protected Member Functions

void initPlugin ()
 Create ports and instance, connect ports, activate plugin.
void shutdownPlugin ()
 Deactivate instance.

Private Member Functions

void initMOptions ()
 initialize m_options
void initPluginSpecificFeatures ()
void loadFileInternal (const QString &file)
 load a file in the plugin, but don't do anything in LMMS
void createPorts ()
 allocate m_ports, fill all with metadata, and assign meaning of ports
void createPort (std::size_t portNum)
 fill m_ports[portNum] with metadata
void connectPort (std::size_t num)
 connect m_ports[portNum] with Lv2
void dumpPort (std::size_t num)

Static Private Member Functions

static int32_t defaultEvbufSize ()
static bool portIsSideChain (const LilvPlugin *plugin, const LilvPort *port)
static bool portIsOptional (const LilvPlugin *plugin, const LilvPort *port)
static AutoLilvNode uri (const char *uriStr)

Private Attributes

const LilvPluginm_plugin
LilvInstancem_instance = nullptr
Lv2Features m_features
Lv2Options m_options
std::optional< Lv2Workerm_worker
Semaphore m_workLock
std::vector< std::unique_ptr< Lv2Ports::PortBase > > m_ports
StereoPortRef m_inPorts
StereoPortRef m_outPorts
Lv2Ports::AtomSeqm_midiIn = nullptr
Lv2Ports::AtomSeqm_midiOut = nullptr
std::atomic_flag m_ringLock = ATOMIC_FLAG_INIT
 spinlock for the MIDI ringbuffer (for MIDI events going to the plugin)
ringbuffer_t< struct MidiInputEventm_midiInputBuf
 MIDI ringbuffer (for MIDI events going to the plugin).
ringbuffer_reader_t< struct MidiInputEventm_midiInputReader
 MIDI ringbuffer reader.
std::map< std::string, AutomatableModel * > m_connectedModels

Static Private Attributes

constexpr static const std::size_t m_maxMidiInputEvents = 1024

Friends

class Lv2ProcSuspender

Additional Inherited Members

Signals inherited from lmms::LinkedModelGroup
void modelAdded (lmms::AutomatableModel *added)
void modelRemoved (lmms::AutomatableModel *removed)
Signals inherited from lmms::Model
void dataChanged ()
void dataUnchanged ()
void propertiesChanged ()

Detailed Description

Class representing one Lv2 processor, i.e. one Lv2 handle. For Mono effects, 1 Lv2ControlBase references 2 Lv2Proc.

Constructor & Destructor Documentation

◆ Lv2Proc()

lmms::Lv2Proc::Lv2Proc ( const LilvPlugin * plugin,
Model * parent )

◆ ~Lv2Proc()

lmms::Lv2Proc::~Lv2Proc ( )
override

Member Function Documentation

◆ check()

Plugin::Type lmms::Lv2Proc::check ( const LilvPlugin * plugin,
std::vector< PluginIssue > & issues )
static

◆ connectPort()

void lmms::Lv2Proc::connectPort ( std::size_t num)
private

connect m_ports[portNum] with Lv2

◆ controlCount()

std::size_t lmms::Lv2Proc::controlCount ( ) const
inline

◆ copyBuffersFromCore()

void lmms::Lv2Proc::copyBuffersFromCore ( const SampleFrame * buf,
unsigned firstChan,
unsigned num,
f_cnt_t frames )

Copy buffer passed by the core into our ports

Parameters
bufbuffer of sample frames, each sample frame is something like a float[<number-of-procs> * <channels per proc>] array.
firstChanThe offset for buf where we have to read our first channel. This marks the first sample in each sample frame where we read from. If we are the 2nd of 2 mono procs, this can be greater than 0.
numNumber of channels we must read from
buf(starting at offset)

◆ copyBuffersToCore()

void lmms::Lv2Proc::copyBuffersToCore ( SampleFrame * buf,
unsigned firstChan,
unsigned num,
f_cnt_t frames ) const

Copy our ports into buffers passed by the core

Parameters
bufbuffer of sample frames, each sample frame is something like a float[<number-of-procs> * <channels per proc>] array.
firstChanThe offset for buf where we have to write our first channel. This marks the first sample in each sample frame where we write to. If we are the 2nd of 2 mono procs, this can be greater than 0.
numNumber of channels we must write to
buf(starting at offset)

◆ copyModelsFromCore()

void lmms::Lv2Proc::copyModelsFromCore ( )

Copy values from the LMMS core (connected models, MIDI events, ...) into the respective ports

◆ copyModelsToCore()

void lmms::Lv2Proc::copyModelsToCore ( )

Bring values from all ports to the LMMS core.

◆ createPort()

void lmms::Lv2Proc::createPort ( std::size_t portNum)
private

fill m_ports[portNum] with metadata

◆ createPorts()

void lmms::Lv2Proc::createPorts ( )
private

allocate m_ports, fill all with metadata, and assign meaning of ports

◆ defaultEvbufSize()

int32_t lmms::Lv2Proc::defaultEvbufSize ( )
inlinestaticprivate

◆ dumpPort()

void lmms::Lv2Proc::dumpPort ( std::size_t num)
private

◆ dumpPorts()

void lmms::Lv2Proc::dumpPorts ( )

Debug function to print ports to stdout.

◆ foreach_port() [1/2]

template<class Functor>
void lmms::Lv2Proc::foreach_port ( const Functor & ftor)
inline

◆ foreach_port() [2/2]

template<class Functor>
void lmms::Lv2Proc::foreach_port ( const Functor & ftor) const
inline

◆ handleMidiInputEvent()

void lmms::Lv2Proc::handleMidiInputEvent ( const class MidiEvent & event,
const TimePos & time,
f_cnt_t offset )

◆ hasNoteInput()

bool lmms::Lv2Proc::hasNoteInput ( ) const

◆ initMOptions()

void lmms::Lv2Proc::initMOptions ( )
private

initialize m_options

◆ initPlugin()

void lmms::Lv2Proc::initPlugin ( )
protected

Create ports and instance, connect ports, activate plugin.

◆ initPluginSpecificFeatures()

void lmms::Lv2Proc::initPluginSpecificFeatures ( )
private

◆ inPorts() [1/2]

StereoPortRef & lmms::Lv2Proc::inPorts ( )
inline

◆ inPorts() [2/2]

const StereoPortRef & lmms::Lv2Proc::inPorts ( ) const
inline

◆ loadFileInternal()

void lmms::Lv2Proc::loadFileInternal ( const QString & file)
private

load a file in the plugin, but don't do anything in LMMS

◆ modelAtPort()

AutomatableModel * lmms::Lv2Proc::modelAtPort ( const QString & uri)

◆ onSampleRateChanged()

void lmms::Lv2Proc::onSampleRateChanged ( )

◆ outPorts() [1/2]

StereoPortRef & lmms::Lv2Proc::outPorts ( )
inline

◆ outPorts() [2/2]

const StereoPortRef & lmms::Lv2Proc::outPorts ( ) const
inline

◆ portIsOptional()

bool lmms::Lv2Proc::portIsOptional ( const LilvPlugin * plugin,
const LilvPort * port )
staticprivate

◆ portIsSideChain()

bool lmms::Lv2Proc::portIsSideChain ( const LilvPlugin * plugin,
const LilvPort * port )
staticprivate

◆ reload()

void lmms::Lv2Proc::reload ( )

◆ run()

void lmms::Lv2Proc::run ( f_cnt_t frames)

Run the Lv2 plugin instance for.

Parameters
framesframes

◆ shutdownPlugin()

void lmms::Lv2Proc::shutdownPlugin ( )
protected

Deactivate instance.

◆ uri()

AutoLilvNode lmms::Lv2Proc::uri ( const char * uriStr)
staticprivate

◆ Lv2ProcSuspender

friend class Lv2ProcSuspender
friend

Member Data Documentation

◆ m_connectedModels

std::map<std::string, AutomatableModel *> lmms::Lv2Proc::m_connectedModels
private

models for the controls, sorted by port symbols

Note
These are not owned, but rather link to the models in ControlPorts in m_ports

◆ m_features

Lv2Features lmms::Lv2Proc::m_features
private

◆ m_inPorts

StereoPortRef lmms::Lv2Proc::m_inPorts
private

◆ m_instance

LilvInstance* lmms::Lv2Proc::m_instance = nullptr
private

◆ m_maxMidiInputEvents

const std::size_t lmms::Lv2Proc::m_maxMidiInputEvents = 1024
staticconstexprprivate

◆ m_midiIn

Lv2Ports::AtomSeq* lmms::Lv2Proc::m_midiIn = nullptr
private

◆ m_midiInputBuf

ringbuffer_t<struct MidiInputEvent> lmms::Lv2Proc::m_midiInputBuf
private

MIDI ringbuffer (for MIDI events going to the plugin).

◆ m_midiInputReader

ringbuffer_reader_t<struct MidiInputEvent> lmms::Lv2Proc::m_midiInputReader
private

MIDI ringbuffer reader.

◆ m_midiOut

Lv2Ports::AtomSeq * lmms::Lv2Proc::m_midiOut = nullptr
private

◆ m_options

Lv2Options lmms::Lv2Proc::m_options
private

◆ m_outPorts

StereoPortRef lmms::Lv2Proc::m_outPorts
private

◆ m_plugin

const LilvPlugin* lmms::Lv2Proc::m_plugin
private

◆ m_ports

std::vector<std::unique_ptr<Lv2Ports::PortBase> > lmms::Lv2Proc::m_ports
private

◆ m_ringLock

std::atomic_flag lmms::Lv2Proc::m_ringLock = ATOMIC_FLAG_INIT
private

spinlock for the MIDI ringbuffer (for MIDI events going to the plugin)

◆ m_worker

std::optional<Lv2Worker> lmms::Lv2Proc::m_worker
private

◆ m_workLock

Semaphore lmms::Lv2Proc::m_workLock
private

The documentation for this class was generated from the following files: