/[svn]/linuxsampler/trunk/src/engines/common/InstrumentScriptVM.h
ViewVC logotype

Diff of /linuxsampler/trunk/src/engines/common/InstrumentScriptVM.h

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 2878 by schoenebeck, Sun Apr 10 18:22:23 2016 UTC revision 2879 by schoenebeck, Tue Apr 19 14:07:53 2016 UTC
# Line 17  Line 17 
17  #include "../../common/Pool.h"  #include "../../common/Pool.h"
18  #include "InstrumentScriptVMFunctions.h"  #include "InstrumentScriptVMFunctions.h"
19    
20    /**
21     * Amount of bits on the left hand side of all pool_element_id_t numbers (i.e.
22     * event_id_t, note_id_t) being reserved for script VM implementation internal
23     * purposes.
24     *
25     * Right now there is only one bit reserved, which allows the VM (and its
26     * built-in functions) to distinguish user supplied @c Event IDs (event_id_t)
27     * from @c Note IDs (note_id_t).
28     */
29    #define INSTR_SCRIPT_EVENT_ID_RESERVED_BITS 1
30    
31    /**
32     * Used to mark IDs (in script scope) to actually be a note ID.
33     */
34    #define INSTR_SCRIPT_NOTE_ID_FLAG   (1 << (sizeof(pool_element_id_t) * 8 - 1))
35    
36  #define INSTR_SCRIPT_EVENT_GROUPS 28  #define INSTR_SCRIPT_EVENT_GROUPS 28
37    
38  namespace LinuxSampler {  namespace LinuxSampler {
# Line 24  namespace LinuxSampler { Line 40  namespace LinuxSampler {
40      class AbstractEngineChannel;      class AbstractEngineChannel;
41      class InstrumentScript;      class InstrumentScript;
42    
43        /** @brief Convert IDs between script scope and engine internal scope.
44         *
45         * This class is used to translate unique IDs of events between script
46         * scope and sampler engine internal scope, that is:
47         * @code
48         * int (script scope) -> event_id_t (engine internal scope)
49         * int (script scope) -> note_id_t (engine internal scope)
50         * @endcode
51         * and vice versa:
52         * @code
53         * event_id_t (engine internal scope) -> int (script scope)
54         * note_id_t (engine internal scope)  -> int (script scope)
55         * @endcode
56         * This is required because engine internally notes and regular events are
57         * using their own, separate ID generating pool, and their ID number set
58         * may thu soverlap.
59         *
60         * @see INSTR_SCRIPT_EVENT_ID_RESERVED_BITS
61         */
62        class ScriptID {
63        public:
64            enum type_t {
65                EVENT, ///< ID is actually an event ID
66                NOTE, ///< ID is actually a note ID
67            };
68    
69            /**
70             * Construct a ScriptID object with an ID from script scope.
71             */
72            ScriptID(uint id) : m_id(id) {}
73    
74            /**
75             * Returns a ScriptID object constructed with an event ID from engine
76             * internal scope.
77             */
78            inline static ScriptID fromEventID(event_id_t id) {
79                return ScriptID(id);
80            }
81    
82            /**
83             * Returns a ScriptID object constructed with a note ID from engine
84             * internal scope.
85             */
86            inline static ScriptID fromNoteID(note_id_t id) {
87                return ScriptID(INSTR_SCRIPT_NOTE_ID_FLAG | id);
88            }
89    
90            /**
91             * Whether the ID reflected by this ScriptID object is actually a note
92             * ID or rather an event ID.
93             */
94            inline type_t type() const {
95                return (m_id & INSTR_SCRIPT_NOTE_ID_FLAG) ? NOTE : EVENT;
96            }
97    
98            inline bool isNoteID() const {
99                return type() == NOTE;
100            }
101    
102            inline bool isEventID() const {
103                return type() == EVENT;
104            }
105    
106            /**
107             * Returns event ID (for engine internal scope) of the ID reflected by
108             * this ScriptID object, it returns 0 (being an invalid ID) if the ID
109             * reflected by this ScriptID object is not an event ID.
110             */
111            inline event_id_t eventID() const {
112                switch (type()) {
113                    case EVENT: return m_id;
114                    default:    return 0; // not an event id, return invalid ID
115                }
116            }
117    
118            /**
119             * Returns note ID (for engine internal scope) of the ID reflected by
120             * this ScriptID object, it returns 0 (being an invalid ID) if the ID
121             * reflected by this ScriptID object is not a note ID.
122             */
123            inline note_id_t noteID() const {
124                switch (type()) {
125                    case NOTE: return ~INSTR_SCRIPT_NOTE_ID_FLAG & m_id;
126                    default:   return 0; // not a note id, return invalid ID
127                }
128            }
129    
130            /**
131             * Integer cast operator, which returns an ID number of this ScripID
132             * object intended for script scope.
133             */
134            inline operator uint() const {
135                return m_id;
136            }
137    
138        private:
139            uint m_id;
140        };
141    
142      /** @brief List of Event IDs.      /** @brief List of Event IDs.
143       *       *
144       * Used for built-in script functions:       * Used for built-in script functions:

Legend:
Removed from v.2878  
changed lines
  Added in v.2879

  ViewVC Help
Powered by ViewVC