1 /*
2  * Copyright (c) 2014-2020 Christian Schoenebeck
3  *
4  * http://www.linuxsampler.org
5  *
6  * This file is part of LinuxSampler and released under the same terms.
7  * See README file for details.
8  */
9 
10 #ifndef LS_ABSTRACTINSTRUMENTMANAGER_H
11 #define LS_ABSTRACTINSTRUMENTMANAGER_H
12 
13 #include "../InstrumentManager.h"
14 #include "../../common/ResourceManager.h"
15 #include "../../common/global_private.h"
16 #include "InstrumentScriptVM.h"
17 
18 namespace LinuxSampler {
19 
20     typedef ResourceConsumer<VMParserContext> InstrumentScriptConsumer;
21 
22     /// Identifies uniquely a compiled script.
23     struct ScriptKey {
24         String code; ///< Script's source code.
25         std::map<String,String> patchVars; ///< Patch variables being overridden by instrument.
26         bool wildcardPatchVars; ///< Seldom use: Allows lookup for consumers of a specific script by ignoring all (overridden) patch variables.
27 
28         inline bool operator<(const ScriptKey& o) const {
29             if (wildcardPatchVars)
30                 return code < o.code;
31             else
32                 return code < o.code || (code == o.code && patchVars < o.patchVars);
33         }
34 
35         inline bool operator>(const ScriptKey& o) const {
36             if (wildcardPatchVars)
37                 return code > o.code;
38             else
39                 return code > o.code || (code == o.code && patchVars > o.patchVars);
40         }
41 
42         inline bool operator==(const ScriptKey& o) const {
43             if (wildcardPatchVars)
44                 return code == o.code;
45             else
46                 return code == o.code && patchVars == o.patchVars;
47         }
48 
49         inline bool operator!=(const ScriptKey& o) const {
50             return !(operator==(o));
51         }
52     };
53 
54     class AbstractInstrumentManager : public InstrumentManager {
55     public:
AbstractInstrumentManager()56         AbstractInstrumentManager() { }
~AbstractInstrumentManager()57         virtual ~AbstractInstrumentManager() { }
58 
59         /**
60          * Resource manager for loading and sharing the parsed (executable) VM
61          * presentation of real-time instrument scripts. The key used here, and
62          * associated with each script resource, is not as one might expect the
63          * script name or something equivalent, instead the key used is
64          * actually the entire script's source code text (and additionally
65          * potentially patched variables). The value (the actual resource) is of
66          * type @c VMParserContext, which is the parsed (executable) VM
67          * representation of the respective script.
68          */
69         class ScriptResourceManager : public ResourceManager<ScriptKey, VMParserContext> {
70         public:
ScriptResourceManager()71             ScriptResourceManager() {}
~ScriptResourceManager()72             virtual ~ScriptResourceManager() {}
73         protected:
74             // implementation of derived abstract methods from 'ResourceManager'
75             virtual VMParserContext* Create(ScriptKey key, InstrumentScriptConsumer* pConsumer, void*& pArg);
76             virtual void Destroy(VMParserContext* pResource, void* pArg);
OnBorrow(VMParserContext * pResource,InstrumentScriptConsumer * pConsumer,void * & pArg)77             virtual void OnBorrow(VMParserContext* pResource, InstrumentScriptConsumer* pConsumer, void*& pArg) {} // ignore
78         } scripts;
79     };
80 
81 } // namespace LinuxSampler
82 
83 #endif // LS_ABSTRACTINSTRUMENTMANAGER_H
84