/[svn]/linuxsampler/trunk/src/plugins/InstrumentEditor.h
ViewVC logotype

Annotation of /linuxsampler/trunk/src/plugins/InstrumentEditor.h

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1876 - (hide annotations) (download) (as text)
Fri Mar 27 12:16:12 2009 UTC (15 years, 1 month ago) by schoenebeck
File MIME type: text/x-c++hdr
File size: 14302 byte(s)
* added optional 3rd party user data parameter for following
  liblinuxsampler C++ API methods: InstrumentEditor::Main(),
  InstrumentEditor::Launch(), InstrumentManager::LaunchInstrumentEditor()
* minor cosmetics regarding configure script summary
* debian packaging: include DSSI and LV2 plugin binaries of the sampler
  into the liblinuxsampler package
* RPM packaging: include DSSI and LV2 plugin binaries of the sampler
  into the liblinuxsampler package
* bumped version to 0.5.1.12cvs

1 schoenebeck 1374 /***************************************************************************
2     * *
3 schoenebeck 1876 * Copyright (C) 2007 - 2009 Christian Schoenebeck *
4 schoenebeck 1374 * *
5     * This program is free software; you can redistribute it and/or modify *
6     * it under the terms of the GNU General Public License as published by *
7     * the Free Software Foundation; either version 2 of the License, or *
8     * (at your option) any later version. *
9     * *
10     * This program is distributed in the hope that it will be useful, *
11     * but WITHOUT ANY WARRANTY; without even the implied warranty of *
12     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
13     * GNU General Public License for more details. *
14     * *
15     * You should have received a copy of the GNU General Public License *
16     * along with this program; if not, write to the Free Software *
17     * Foundation, Inc., 59 Temple Place, Suite 330, Boston, *
18     * MA 02111-1307 USA *
19     ***************************************************************************/
20    
21     #ifndef LS_INSTRUMENT_EDITOR_H
22     #define LS_INSTRUMENT_EDITOR_H
23    
24     #include "../common/global.h"
25     #include "../common/Thread.h"
26 schoenebeck 1659 #include "../drivers/midi/VirtualMidiDevice.h"
27 schoenebeck 1374
28     #include <set>
29    
30     namespace LinuxSampler {
31    
32     // just symbol prototyping
33     class InstrumentEditorListener;
34    
35     /** @brief Instrument Editor Interface (external plugin)
36     *
37     * LinuxSampler allows to spawn arbitrary instrument editor applications
38     * within the sampler's own process. That way instrument editors are
39     * able to modify already loaded instruments live or on-the-fly, that is
40     * without having to load it again neither on sampler nor on editor side,
41     * which is essential for editing large instruments.
42     *
43     * Instrument editors have to implement this abstract base class, embedded
44     * into a DLL and placed into the respective sampler's library path. The
45     * sampler will load these external DLLs as plugins on startup. Whenever
46     * there's a request for editing an instrument, the sampler will try to
47     * launch a matching registered editor, by calling the respective
48     * plugin's @c Main() method.
49     */
50 schoenebeck 1659 class InstrumentEditor : public VirtualMidiDevice, protected Thread {
51 schoenebeck 1374 public:
52    
53     /////////////////////////////////////////////////////////////////
54     // abstract methods
55     // (these have to be implemented by the descendant)
56    
57     /**
58     * Entry point for the instrument editor's thread. As the
59     * instrument data structure is passed as typeless (void*)
60     * pointer, this is not type safe! The implementing instrument
61     * editor has to interpret the @a sTypeName and @a sTypeVersion
62     * arguments to determine if it's able to cast the instrument
63     * pointer to a known type and actually be able to work with it.
64     *
65     * @param pInstrument - pointer to the respective instrument object
66     * @param sTypeName - format of the instrument data structure
67     * (i.e. @c "libgig" )
68     * @param sTypeVersion - version of the instrument data structure
69     * (i.e. @c "3.0.1" ).
70 schoenebeck 1876 * @param pUserData - (optional) arbitrary 3rd party data that might
71     * been passed by Launch()
72 schoenebeck 1374 */
73 schoenebeck 1876 virtual int Main(void* pInstrument, String sTypeName, String sTypeVersion, void* pUserData = NULL) = 0;
74 schoenebeck 1374
75     /**
76     * The instrument editor has to return @c true in case it supports
77     * the given instrument data structure type and version, it has to
78     * return @c false otherwise. This method will be called by the
79     * sampler to determine which editor is capable to work with a
80     * certain instrument.
81     *
82     * @param sTypeName - i.e. @c "libgig"
83 schoenebeck 1425 * @param sTypeVersion - i.e. @c "3.0.1"
84 schoenebeck 1374 */
85     virtual bool IsTypeSupported(String sTypeName, String sTypeVersion) = 0;
86    
87     /**
88     * The instrument editor's name (i.e. @c "gigedit" ).
89     */
90     virtual String Name() = 0;
91    
92     /**
93     * The instrument editor's version (i.e. @c "0.0.1" ).
94     */
95     virtual String Version() = 0;
96    
97     /**
98     * Arbitrary textual description of the instrument editor
99     * (i.e. "Gigasampler and DLS format editor, GTK based").
100     */
101     virtual String Description() = 0;
102    
103    
104    
105     /////////////////////////////////////////////////////////////////
106     // normal methods
107     // (usually not to be overriden by descendant)
108    
109     /** @brief Dispatch pending sample removal event.
110     *
111     * @e SHOULD be called by the instrument editor @e before deleting
112     * samples, so the sampler can react by stopping usage of these
113     * samples to avoid a crash.
114     *
115     * After calling this method, the instrument editor @e MUST call
116     * @c NotifySamplesRemoved() after it actually deleted the samples, so
117     * the sampler can react by i.e. resuming playback of sampler engines.
118     *
119     * @param Samples - list of samples that will be deleted by the
120     * instrument editor
121     */
122     void NotifySamplesToBeRemoved(std::set<void*> Samples);
123    
124     /** @brief Dispatch completed sample removal event.
125     *
126     * Inform the sampler that the by @c NotifySamplesToBeRemoved()
127     * previously announced samples have been deleted.
128     */
129     void NotifySamplesRemoved();
130    
131     /** @brief Dispatch pending data structure modification event.
132     *
133     * @e SHOULD be called by the instrument editor @e before modifying
134     * data structures (except samples, which have their own dispatch
135     * methods) which could otherwise lead to undesired synchronisation
136     * issues and a crash. The respective data structure is passed as a
137     * typeless pointer @a pStruct , so the instrument editor additionally
138     * has to pass the name of the data structure (i.e. @c "gig::Region" ),
139     * so the sampler can cast the pointer to an appropriate type. The
140     * sampler will react by stopping usage of the respective data
141     * structure.
142     *
143     * After calling this method, the instrument editor @e MUST call
144     * @c NotifyDataStructureChanged() , so the sampler can react by
145     * resuming usage of the respective data structure for playback.
146     *
147     * @param pStruct - data structure going to be modified
148     * @param sStructType - name of the data structure (i.e. its C++
149     * struct or class name)
150     */
151     void NotifyDataStructureToBeChanged(void* pStruct, String sStructType);
152    
153     /** @brief Dispatch completed data structure modification event.
154     *
155     * Inform the sampler that the by @c NotifyDataStructureToBeChanged()
156     * previously announced data structure has been completely modified.
157     *
158     * @param pStruct - data structure that has been modified
159     * @param sStructType - name of the data structure (i.e. its C++
160     * struct or class name)
161     */
162     void NotifyDataStructureChanged(void* pStruct, String sStructType);
163    
164     /** @brief Dispatch sample reference changed event.
165     *
166     * @e SHOULD be called by the instrument editor @e after a certain data
167     * structure changed its reference / pointer to a sample, so the
168     * sampler can react by:
169     *
170     * - Caching the newly referenced sample if necessary.
171     * - Un-caching the old referenced sample if necessary.
172     *
173     * @e Note: the instrument editor additionally @e MUST embed this call
174     * into the respective @c NotifyDataStructureToBeChanged() and
175     * @c NotifyDataStructureChanged() calls for announcing the data
176     * structure whose sample reference is actually to be changed, so the
177     * sampler can react by suspending usage. For example:
178     * @code
179     * NotifyDataStructureToBeChanged(pDimReg, "gig::DimensionRegion");
180     * gig::Sample* pOldSample = pDimReg->pSample;
181     * pDimReg->pSample = pNewSample;
182     * NotifySampleReferenceChanged(pOldSample, pNewSample);
183     * NotifyDataStructureChanged(pDimReg, "gig::DimensionRegion");
184     * @endcode
185     * So calling this method alone is not safe!
186     *
187     * @param pOldSample - previous sample reference
188     * @param pNewSample - current sample reference
189     */
190     void NotifySampleReferenceChanged(void* pOldSample, void* pNewSample);
191    
192     /**
193     * Launch the instrument editor for the given instrument. The
194     * editor will be spawned in its own thread and this method will
195     * return as soon as the editor's thread actually started.
196 schoenebeck 1876 *
197     * @param pUserData - (optional) arbitrary 3rd party data that might
198     * e.g. been passed by
199     * InstrumentManager::LaunchInstrumentEditor()
200 schoenebeck 1374 */
201 schoenebeck 1876 void Launch(void* pInstrument, String sTypeName, String sTypeVersion, void* pUserData = NULL);
202 schoenebeck 1374
203     /**
204     * Registers object that wants to be notified on events.
205     */
206     void AddListener(InstrumentEditorListener* pListener);
207    
208     /**
209     * Unregisters object that doesn't want to be notified anymore.
210     */
211     void RemoveListener(InstrumentEditorListener* pListener);
212    
213     /**
214     * Constructor
215     */
216     InstrumentEditor();
217    
218 schoenebeck 1653 /**
219     * Destructor
220     */
221     virtual ~InstrumentEditor();
222    
223 schoenebeck 1374 protected:
224     std::set<InstrumentEditorListener*> listeners;
225    
226     // derived abstract method from base class 'Thread'
227     virtual int Main();
228     private:
229     void* pInstrument;
230     String sTypeName;
231     String sTypeVersion;
232 schoenebeck 1876 void* pUserData;
233 schoenebeck 1374 };
234    
235     /** @brief Instrument Editor Notifications
236     *
237     * This abstract interface class has to be implemented by classes that
238     * want to be notified on certain events of an instrument editor. This is
239     * typically used on sampler side, but might also be used by an instrument
240     * editor to get informed about modifications another instrument editor
241     * makes.
242     */
243     class InstrumentEditorListener {
244     public:
245     /** @brief Called after the instrument editor stopped running.
246     *
247     * Automatically called after the instrument editor application stopped
248     * running. This method has to be implemented by the descendant.
249     *
250     * @param pSender - instrument editor that died
251     */
252     virtual void OnInstrumentEditorQuit(InstrumentEditor* pSender) = 0;
253    
254     /** @brief Called before samples are to be deleted.
255     *
256     * See the dispatcher method
257     * @c InstrumentEditor::NotifySamplesToBeRemoved() for details.
258     * This method has to be implemented by the descendant.
259     *
260     * @param Samples - list of samples that will be deleted by the
261     * instrument editor
262     * @param pSender - instrument editor that is going to do this
263     * modification
264     */
265     virtual void OnSamplesToBeRemoved(std::set<void*> Samples, InstrumentEditor* pSender) = 0;
266    
267     /** @brief Called after samples have been deleted.
268     *
269     * See the dispatcher method
270     * @c InstrumentEditor::NotifySamplesRemoved() for details.
271     * This method has to be implemented by the descendant.
272     *
273     * @param pSender - instrument editor that did this modification
274     */
275     virtual void OnSamplesRemoved(InstrumentEditor* pSender) = 0;
276    
277     /** @brief Called before data structure is to be modified.
278     *
279     * See the dispatcher method
280     * @c InstrumentEditor::NotifyDataStructureToBeChanged() for details.
281     * This method has to be implemented by the descendant.
282     *
283     * @param pStruct - data structure going to be modified
284     * @param sStructType - name of the data structure (i.e. its C++
285     * struct or class name)
286     * @param pSender - instrument editor that is going to do this
287     * modification
288     */
289     virtual void OnDataStructureToBeChanged(void* pStruct, String sStructType, InstrumentEditor* pSender) = 0;
290    
291     /** @brief Called after data structure has been modified.
292     *
293     * See the dispatcher method
294     * @c InstrumentEditor::NotifyDataStructureChanged() for details.
295     * This method has to be implemented by the descendant.
296     *
297     * @param pStruct - data structure that has been modified
298     * @param sStructType - name of the data structure (i.e. its C++
299     * struct or class name)
300     * @param pSender - instrument editor that did this modification
301     */
302     virtual void OnDataStructureChanged(void* pStruct, String sStructType, InstrumentEditor* pSender) = 0;
303    
304     /** @brief Called after some data structure changed its reference to a sample.
305     *
306     * @c InstrumentEditor::NotifySampleReferenceChanged() for details.
307     * This method has to be implemented by the descendant.
308     *
309     * @param pOldSample - previous sample reference
310     * @param pNewSample - current sample reference
311     * @param pSender - instrument editor that did this modification
312     */
313     virtual void OnSampleReferenceChanged(void* pOldSample, void* pNewSample, InstrumentEditor* pSender) = 0;
314     };
315    
316     } // namespace LinuxSampler
317    
318     #endif // LS_INSTRUMENT_EDITOR_H

  ViewVC Help
Powered by ViewVC