File size: 2,769 Bytes
5ac6c6e
22d14fd
5ac6c6e
 
 
22d14fd
 
 
5ac6c6e
22d14fd
f3db0f3
22d14fd
5ac6c6e
 
 
22d14fd
5ac6c6e
 
 
22d14fd
 
 
 
5ac6c6e
22d14fd
 
5ac6c6e
 
22d14fd
5ac6c6e
22d14fd
5ac6c6e
 
 
 
22d14fd
5ac6c6e
22d14fd
379e9dd
22d14fd
c151d02
379e9dd
22d14fd
5ac6c6e
22d14fd
 
5ac6c6e
22d14fd
 
 
5ac6c6e
22d14fd
 
 
5ac6c6e
22d14fd
 
 
5ac6c6e
 
22d14fd
 
 
 
 
 
 
 
 
 
 
 
5ac6c6e
 
22d14fd
 
 
 
 
 
 
 
 
 
 
 
 
 
379e9dd
 
22d14fd
 
 
 
 
5ac6c6e
 
 
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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#include <juce_audio_processors/juce_audio_processors.h>
#include <juce_audio_utils/juce_audio_utils.h>
#include <juce_gui_basics/juce_gui_basics.h>
#include <juce_events/juce_events.h>

#include "SharedAudioBuffer.h"
#include "IPCProtocol.h"
#include "Constants.h"
#include "HelperPluginHost.h"
#include "HelperIPC.h"

class HelperApplication : public juce::JUCEApplication
{
public:
    const juce::String getApplicationName() override { return "PluginBridgeHelper"; }
    const juce::String getApplicationVersion() override { return PluginBridgeConstants::kVersion; }

    void initialise(const juce::String& commandLine) override
    {
        auto args = juce::StringArray::fromTokens(commandLine, " ", "\"");

        int parentPid = 0;
        for (int i = 0; i < args.size() - 1; ++i)
        {
            if (args[i] == "--pid")
                parentPid = args[i + 1].getIntValue();
        }

        if (parentPid == 0)
        {
            DBG("HelperApplication: --pid argument required");
            quit();
            return;
        }

        DBG("HelperApplication: Starting for parent PID " + juce::String(parentPid));

        auto portName = juce::String(IPC::getLayerPortName(parentPid));

        pluginHost = std::make_unique<HelperPluginHost>();
        pluginHost->setLayerPortName(portName);

        ipcServer = std::make_unique<HelperIPC>(parentPid, *pluginHost);

        auto shmName = IPC::getShmName(parentPid);
        if (!sharedAudio.open(shmName))
        {
            DBG("HelperApplication: Failed to open shared memory: " + shmName);
            quit();
            return;
        }

        if (!inputSem.open(IPC::getInputSemName(parentPid)) ||
            !outputSem.open(IPC::getOutputSemName(parentPid)))
        {
            DBG("HelperApplication: Failed to open semaphores");
            quit();
            return;
        }

        if (!ipcServer->connect())
        {
            DBG("HelperApplication: Failed to connect to parent IPC socket");
            quit();
            return;
        }

        pluginHost->setSharedAudio(&sharedAudio, &inputSem, &outputSem);
        pluginHost->startProcessing();
        ipcServer->sendReady();

        DBG("HelperApplication: Ready and running");
    }

    void shutdown() override
    {
        if (pluginHost)
            pluginHost->stopProcessing();

        ipcServer.reset();
        pluginHost.reset();
        sharedAudio.destroy();
    }

    void systemRequestedQuit() override
    {
        quit();
    }

private:
    std::unique_ptr<HelperPluginHost> pluginHost;
    std::unique_ptr<HelperIPC> ipcServer;
    SharedAudioBuffer sharedAudio;
    SharedSemaphore inputSem;
    SharedSemaphore outputSem;
};

START_JUCE_APPLICATION(HelperApplication)