1 /*
2  * DISTRHO Plugin Framework (DPF)
3  * Copyright (C) 2012-2020 Filipe Coelho <falktx@falktx.com>
4  *
5  * Permission to use, copy, modify, and/or distribute this software for any purpose with
6  * or without fee is hereby granted, provided that the above copyright notice and this
7  * permission notice appear in all copies.
8  *
9  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD
10  * TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN
11  * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
12  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
13  * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
14  * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15  */
16 
17 #ifndef DISTRHO_UI_PRIVATE_DATA_HPP_INCLUDED
18 #define DISTRHO_UI_PRIVATE_DATA_HPP_INCLUDED
19 
20 #include "../DistrhoUI.hpp"
21 
22 START_NAMESPACE_DISTRHO
23 
24 // -----------------------------------------------------------------------
25 // Static data, see DistrhoUI.cpp
26 
27 extern double d_lastUiSampleRate;
28 extern void*  d_lastUiDspPtr;
29 
30 // -----------------------------------------------------------------------
31 // UI callbacks
32 
33 typedef void (*editParamFunc)   (void* ptr, uint32_t rindex, bool started);
34 typedef void (*setParamFunc)    (void* ptr, uint32_t rindex, float value);
35 typedef void (*setStateFunc)    (void* ptr, const char* key, const char* value);
36 typedef void (*sendNoteFunc)    (void* ptr, uint8_t channel, uint8_t note, uint8_t velo);
37 typedef void (*setSizeFunc)     (void* ptr, uint width, uint height);
38 typedef bool (*fileRequestFunc) (void* ptr, const char* key);
39 
40 // -----------------------------------------------------------------------
41 // UI private data
42 
43 struct UI::PrivateData {
44     // DSP
45     double   sampleRate;
46     uint32_t parameterOffset;
47 #if DISTRHO_PLUGIN_WANT_DIRECT_ACCESS
48     void*    dspPtr;
49 #endif
50 
51     // UI
52     bool automaticallyScale;
53     bool resizeInProgress;
54     uint minWidth;
55     uint minHeight;
56     uint bgColor;
57     uint fgColor;
58 
59     // Callbacks
60     void*           callbacksPtr;
61     editParamFunc   editParamCallbackFunc;
62     setParamFunc    setParamCallbackFunc;
63     setStateFunc    setStateCallbackFunc;
64     sendNoteFunc    sendNoteCallbackFunc;
65     setSizeFunc     setSizeCallbackFunc;
66     fileRequestFunc fileRequestCallbackFunc;
67 
PrivateDataUI::PrivateData68     PrivateData() noexcept
69         : sampleRate(d_lastUiSampleRate),
70           parameterOffset(0),
71 #if DISTRHO_PLUGIN_WANT_DIRECT_ACCESS
72           dspPtr(d_lastUiDspPtr),
73 #endif
74           automaticallyScale(false),
75           resizeInProgress(false),
76           minWidth(0),
77           minHeight(0),
78           bgColor(0),
79           fgColor(0),
80           callbacksPtr(nullptr),
81           editParamCallbackFunc(nullptr),
82           setParamCallbackFunc(nullptr),
83           setStateCallbackFunc(nullptr),
84           sendNoteCallbackFunc(nullptr),
85           setSizeCallbackFunc(nullptr),
86           fileRequestCallbackFunc(nullptr)
87     {
88         DISTRHO_SAFE_ASSERT(d_isNotZero(sampleRate));
89 
90 #if defined(DISTRHO_PLUGIN_TARGET_DSSI) || defined(DISTRHO_PLUGIN_TARGET_LV2)
91         parameterOffset += DISTRHO_PLUGIN_NUM_INPUTS + DISTRHO_PLUGIN_NUM_OUTPUTS;
92 # if DISTRHO_PLUGIN_WANT_LATENCY
93         parameterOffset += 1;
94 # endif
95 #endif
96 
97 #ifdef DISTRHO_PLUGIN_TARGET_LV2
98 # if (DISTRHO_PLUGIN_WANT_MIDI_INPUT || DISTRHO_PLUGIN_WANT_TIMEPOS || DISTRHO_PLUGIN_WANT_STATE)
99         parameterOffset += 1;
100 #  if DISTRHO_PLUGIN_WANT_STATE
101         parameterOffset += 1;
102 #  endif
103 # endif
104 #endif
105     }
106 
editParamCallbackUI::PrivateData107     void editParamCallback(const uint32_t rindex, const bool started)
108     {
109         if (editParamCallbackFunc != nullptr)
110             editParamCallbackFunc(callbacksPtr, rindex, started);
111     }
112 
setParamCallbackUI::PrivateData113     void setParamCallback(const uint32_t rindex, const float value)
114     {
115         if (setParamCallbackFunc != nullptr)
116             setParamCallbackFunc(callbacksPtr, rindex, value);
117     }
118 
setStateCallbackUI::PrivateData119     void setStateCallback(const char* const key, const char* const value)
120     {
121         if (setStateCallbackFunc != nullptr)
122             setStateCallbackFunc(callbacksPtr, key, value);
123     }
124 
sendNoteCallbackUI::PrivateData125     void sendNoteCallback(const uint8_t channel, const uint8_t note, const uint8_t velocity)
126     {
127         if (sendNoteCallbackFunc != nullptr)
128             sendNoteCallbackFunc(callbacksPtr, channel, note, velocity);
129     }
130 
setSizeCallbackUI::PrivateData131     void setSizeCallback(const uint width, const uint height)
132     {
133         if (setSizeCallbackFunc != nullptr)
134             setSizeCallbackFunc(callbacksPtr, width, height);
135     }
136 
fileRequestCallbackUI::PrivateData137     bool fileRequestCallback(const char* key)
138     {
139         if (fileRequestCallbackFunc != nullptr)
140             return fileRequestCallbackFunc(callbacksPtr, key);
141 
142         // TODO use old style DPF dialog here
143 
144         return false;
145     }
146 };
147 
148 // -----------------------------------------------------------------------
149 
150 END_NAMESPACE_DISTRHO
151 
152 #endif // DISTRHO_UI_PRIVATE_DATA_HPP_INCLUDED
153