1 /*
2 ZynAddSubFX - a software synthesizer
3
4 ZynAddSubFX-UI.cpp - DPF + ZynAddSubFX External UI
5 Copyright (C) 2015-2016 Filipe Coelho
6 Author: Filipe Coelho
7
8 This program is free software; you can redistribute it and/or
9 modify it under the terms of the GNU General Public License
10 as published by the Free Software Foundation; either version 2
11 of the License, or (at your option) any later version.
12 */
13
14 // DPF includes
15 #include "DistrhoUI.hpp"
16
17 /* ------------------------------------------------------------------------------------------------------------
18 * ZynAddSubFX UI class */
19
20 class ZynAddSubFXUI : public UI
21 {
22 public:
ZynAddSubFXUI(const intptr_t wid,const char * const bpath)23 ZynAddSubFXUI(const intptr_t wid, const char* const bpath)
24 : UI(390, 525),
25 oscPort(0),
26 winId(wid)
27 {
28 setTitle("ZynAddSubFX");
29
30 #if DISTRHO_OS_MAC
31 extUiPath = bpath;
32 extUiPath += "/zynaddsubfx-ext-gui";
33 #else
34 extUiPath = "zynaddsubfx-ext-gui";
35
36 // unused
37 return; (void)bpath;
38 #endif
39 }
40
~ZynAddSubFXUI()41 ~ZynAddSubFXUI() override
42 {
43 }
44
45 protected:
46 /* --------------------------------------------------------------------------------------------------------
47 * DSP/Plugin Callbacks */
48
49 /**
50 A parameter has changed on the plugin side.
51 This is called by the host to inform the UI about parameter changes.
52 */
parameterChanged(uint32_t index,float value)53 void parameterChanged(uint32_t index, float value) override
54 {
55 switch (index)
56 {
57 case kParamOscPort: {
58 const int port = int(value+0.5f);
59
60 if (oscPort != port)
61 {
62 oscPort = port;
63 respawnAtURL(port);
64 }
65 } break;
66 }
67 }
68
69 /**
70 A program has been loaded on the plugin side.
71 This is called by the host to inform the UI about program changes.
72 */
programLoaded(uint32_t index)73 void programLoaded(uint32_t index) override
74 {
75 (void)index; // ZynAddSubFX::loadProgram already informs the UI
76 }
77
78 /**
79 A state has changed on the plugin side.
80 This is called by the host to inform the UI about state changes.
81 */
stateChanged(const char * key,const char * value)82 void stateChanged(const char* key, const char* value) override
83 {
84 (void)key; (void)value;
85 }
86
87 private:
88 int oscPort;
89 String extUiPath;
90 const intptr_t winId;
91
respawnAtURL(const int url)92 void respawnAtURL(const int url)
93 {
94 char urlAsString[32];
95 sprintf(urlAsString, "osc.udp://localhost:%i/", url);
96
97 char winIdAsString[32];
98 sprintf(winIdAsString, "%llu", (long long unsigned)(winId ? winId : 1));
99
100 printf("Now respawning at '%s', using winId '%s'\n", urlAsString, winIdAsString);
101
102 const char* args[] = {
103 extUiPath.buffer(),
104 "--embed",
105 winIdAsString,
106 "--title",
107 getTitle(),
108 urlAsString,
109 nullptr
110 };
111
112 startExternalProcess(args);
113 }
114
115 DISTRHO_DECLARE_NON_COPY_CLASS(ZynAddSubFXUI)
116 };
117
118 /* ------------------------------------------------------------------------------------------------------------
119 * Create UI, entry point */
120
121 START_NAMESPACE_DISTRHO
122
createUI()123 UI* createUI()
124 {
125 #if DISTRHO_PLUGIN_HAS_EMBED_UI
126 const uintptr_t winId = UI::getNextWindowId();
127 #else
128 const uintptr_t winId = 0;
129 #endif
130 const char* const bundlePath = UI::getNextBundlePath();
131
132 return new ZynAddSubFXUI(winId, bundlePath);
133 }
134
135 END_NAMESPACE_DISTRHO
136