summaryrefslogtreecommitdiffstats
path: root/src/effects/lv2/lv2effectprocessor.h
blob: 36dc5c5fb999cc04ba646e576865c529843d3ef5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#pragma once

#include "effects/effectprocessor.h"
#include "effects/effectmanifest.h"
#include "engine/effects/engineeffectparameter.h"
#include <lilv-0/lilv/lilv.h>
#include "effects/defs.h"
#include "engine/engine.h"

class LV2EffectGroupState : public EffectState {
  public:
    LV2EffectGroupState(const mixxx::EngineParameters& bufferParameters, const LilvPlugin* pPlugin)
            : EffectState(bufferParameters) {
        m_pInstance = lilv_plugin_instantiate(pPlugin, bufferParameters.sampleRate(), nullptr);
    }
    ~LV2EffectGroupState() {
        lilv_instance_deactivate(m_pInstance);
        lilv_instance_free(m_pInstance);
    }

    LilvInstance* lilvIinstance() {
        return m_pInstance;
    }
  private:
    LilvInstance* m_pInstance;
};

class LV2EffectProcessor : public EffectProcessor {
  public:
    LV2EffectProcessor(EngineEffect* pEngineEffect,
            EffectManifestPointer pManifest,
            const LilvPlugin* plugin,
            const QList<int>& audioPortIndices,
            const QList<int>& controlPortIndices);
    ~LV2EffectProcessor();

    void initialize(
            const QSet<ChannelHandleAndGroup>& activeInputChannels,
            EffectsManager* pEffectsManager,
            const mixxx::EngineParameters& bufferParameters) override;
    EffectState* createState(const mixxx::EngineParameters& bufferParameters) final;
    bool loadStatesForInputChannel(const ChannelHandle* inputChannel,
          const EffectStatesMap* pStatesMap) override;
    // Called from main thread for garbage collection after the last audio thread
    // callback executes process() with EffectEnableState::Disabling
    void deleteStatesForInputChannel(const ChannelHandle* inputChannel) override;

    void process(const ChannelHandle& inputHandle,
            const ChannelHandle& outputHandle,
            const CSAMPLE* pInput, CSAMPLE* pOutput,
            const mixxx::EngineParameters& bufferParameters,
            const EffectEnableState enableState,
            const GroupFeatureState& groupFeatures) override;
  private:
    LV2EffectGroupState* createGroupState(const mixxx::EngineParameters& bufferParameters);

    QList<EngineEffectParameter*> m_parameters;
    float* m_inputL;
    float* m_inputR;
    float* m_outputL;
    float* m_outputR;
    float* m_params;
    const LilvPlugin* m_pPlugin;
    const QList<int> m_audioPortIndices;
    const QList<int> m_controlPortIndices;

    EffectsManager* m_pEffectsManager;
    ChannelHandleMap<ChannelHandleMap<LV2EffectGroupState*>> m_channelStateMatrix;
};