summaryrefslogtreecommitdiff
path: root/muse_qt4_evolution/muse/midiplugin.h
blob: 87e91953a73d32be17c82d0606efdd950d8026f5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
//=============================================================================
//  MusE
//  Linux Music Editor
//  $Id:$
//
//  Copyright (C) 2002-2006 by Werner Schweer and others
//
//  This program is free software; you can redistribute it and/or modify
//  it under the terms of the GNU General Public License version 2.
//
//  This program is distributed in the hope that it will be useful,
//  but WITHOUT ANY WARRANTY; without even the implied warranty of
//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
//  GNU General Public License for more details.
//
//  You should have received a copy of the GNU General Public License
//  along with this program; if not, write to the Free Software
//  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
//=============================================================================

#ifndef __MIDIPLUGIN_H__
#define __MIDIPLUGIN_H__

#include "globals.h"
#include "midiplugins/libmidiplugin/mempi.h"

namespace AL {
      class Xml;
      };
using AL::Xml;

class MidiPluginIF;
class MidiPluginGui;
class MidiPluginI;
class MidiTrackBase;
class Ctrl;
class MidiEventList;
class MidiTrackBase;

typedef const MEMPI* (*MEMPI_Function)();

//---------------------------------------------------------
//   MidiPlugin
//---------------------------------------------------------

class MidiPlugin {
      MEMPI_Function mempi;
      const MEMPI* plugin;

   protected:
      int _instances;
      QFileInfo fi;

   public:
      MidiPlugin(const QFileInfo* f, const MEMPI_Function, const MEMPI* d);
      virtual ~MidiPlugin() {}

      int instances() const               { return _instances; }
      virtual void incInstances(int val)  { _instances += val; }

      QString lib() const                 { return fi.baseName();    }
      QString path() const                { return fi.absolutePath();     }
      QString name() const                { return QString(plugin->name); }
      QString description() const         { return QString(plugin->description); }
      QString version() const             { return QString(plugin->version); }
      MempiType type() const              { return plugin->type;   }
      MidiPluginI* instantiate(MidiTrackBase*);
      bool instantiate(MidiPluginI*);
      };

//---------------------------------------------------------
//   MidiPluginList
//---------------------------------------------------------

typedef QList<MidiPlugin*>::iterator iMidiPlugin;

class MidiPluginList : public QList<MidiPlugin*> {
   public:
      MidiPlugin* find(const QString&, const QString&);
      MidiPluginList() {}
      };

//---------------------------------------------------------
//   MidiPluginI
//    plugin instance
//---------------------------------------------------------

class MidiPluginI {
      MidiPlugin* _plugin;
      Mempi* mempi;

      MidiTrackBase* _track;
      bool _on;

   public:
      MidiPluginI(MidiPlugin*, MidiTrackBase*, Mempi*);
      MidiPluginI(MidiTrackBase*);
      ~MidiPluginI();

      void setMempi(Mempi* m)    { mempi = m; }

      MidiPlugin* plugin() const { return _plugin; }
      bool on() const            { return _on; }
      void setOn(bool val)       { _on = val; }
      void apply(unsigned, unsigned, MidiEventList*, MidiEventList*);

      QString name() const              { return QString(mempi->name()); }
      QString lib() const               { return _plugin->lib(); }
      MidiTrackBase* track() const      { return _track; }
      void getGeometry(int*x, int*y, int* w, int* h) const { mempi->getGeometry(x, y, w, h); }
      void setGeometry(int x, int y, int w, int h)   { mempi->setGeometry(x, y, w, h); }
      void writeConfiguration(Xml& xml);
      bool readConfiguration(QDomNode);

      void showGui();
      void showGui(bool);
      bool hasGui() const { return mempi->hasGui(); }
      bool guiVisible() const;
      void getInitData(int* len, const unsigned char** p) { mempi->getInitData(len, p); }
      void setInitData(int len, const unsigned char* p)   { mempi->setInitData(len, p); }
      };

//---------------------------------------------------------
//   Pipeline
//    chain of connected efx inserts
//---------------------------------------------------------

class MidiPipeline : public QList<MidiPluginI*> {
   public:
      MidiPipeline();
      bool isOn(int idx) const;
      void setOn(int, bool);
      QString name(int idx) const;
      void showGui(int, bool);
      bool guiVisible(int) const;
      bool hasGui(int) const;
      void apply(unsigned, unsigned, MidiEventList*, MidiEventList*);
      void move(int idx, bool up);
      };

typedef MidiPipeline::iterator iMidiPluginI;
typedef MidiPipeline::const_iterator ciMidiPluginI;

//---------------------------------------------------------
//   MidiPluginDialog
//---------------------------------------------------------

class MidiPluginDialog : public QDialog {
      QTreeWidget* pList;

      Q_OBJECT

   public:
      MidiPluginDialog(QWidget* parent=0);
      static MidiPlugin* getPlugin(QWidget* parent);
      MidiPlugin* value();

  public slots:
      void fillPlugs();
      };

static const int MidiPipelineDepth = 4;

extern void initMidiPlugins();
extern MidiPluginList midiPlugins;

#endif