~rryan/mixxx/features_key

« back to all changes in this revision

Viewing changes to mixxx/src/midi/midimapping.h

  • Committer: Varun Jewalikar
  • Date: 2012-05-25 22:27:23 UTC
  • mfrom: (2684.18.232 trunk)
  • Revision ID: mr.unwell2006@gmail.com-20120525222723-0j4kc3av9cg59faf
MergingĀ fromĀ lp:mixxx

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/***************************************************************************
2
 
                             midimapping.h
3
 
                           MIDI Mapping Class
4
 
                           -------------------
5
 
    begin                : Sat Jan 17 2009
6
 
    copyright            : (C) 2009 Sean M. Pappalardo
7
 
                           (C) 2009 Albert Santoni
8
 
    email                : pegasus@c64.org
9
 
 
10
 
***************************************************************************/
11
 
 
12
 
/***************************************************************************
13
 
*                                                                         *
14
 
*   This program is free software; you can redistribute it and/or modify  *
15
 
*   it under the terms of the GNU General Public License as published by  *
16
 
*   the Free Software Foundation; either version 2 of the License, or     *
17
 
*   (at your option) any later version.                                   *
18
 
*                                                                         *
19
 
***************************************************************************/
20
 
 
21
 
#ifndef MIDIMAPPING_H
22
 
#define MIDIMAPPING_H
23
 
 
24
 
#include "mididevice.h"
25
 
#include "midimessage.h"
26
 
#include "mixxxcontrol.h"
27
 
#include "midiinputmapping.h"
28
 
#include "midioutputmapping.h"
29
 
#include <QTableWidget>
30
 
 
31
 
#ifdef __MIDISCRIPT__
32
 
#include "midiscriptengine.h"
33
 
#endif
34
 
 
35
 
//Forward declarations
36
 
class MidiInputMappingTableModel;
37
 
class MidiOutputMappingTableModel;
38
 
 
39
 
#define BINDINGS_PATH QDir::homePath().append("/").append(SETTINGS_PATH).append("midi/")
40
 
// local midi mapping presets
41
 
#define LPRESETS_PATH QDir::homePath().append("/").append(SETTINGS_PATH).append("presets/")
42
 
#define MIDI_MAPPING_EXTENSION ".midi.xml"
43
 
 
44
 
class MidiMapping : public QObject
45
 
{
46
 
    Q_OBJECT
47
 
 
48
 
    public:
49
 
    /** Constructor also loads & applies the default XML MIDI mapping file */
50
 
    MidiMapping(MidiDevice* outputMidiDevice=NULL);
51
 
    ~MidiMapping();
52
 
    void setOutputMidiDevice(MidiDevice* outputMidiDevice);
53
 
    
54
 
    void setName(QString name);
55
 
 
56
 
    void loadPreset(bool forceLoad=false);
57
 
    void loadPreset(QString path, bool forceLoad=false);
58
 
    void loadPreset(QDomElement root, bool forceLoad=false);
59
 
 
60
 
    void savePreset();
61
 
    void savePreset(QString path);
62
 
    void applyPreset();
63
 
    
64
 
    
65
 
    MidiInputMappingTableModel* getMidiInputMappingTableModel();
66
 
    MidiOutputMappingTableModel* getMidiOutputMappingTableModel();
67
 
    //MixxxControl* getInputMixxxControl(MidiMessage command);
68
 
 
69
 
    static double ComputeValue(MidiOption midioption, double _prevmidivalue, double _newmidivalue);
70
 
 
71
 
    // MIDI Input Mapping Modifiers
72
 
    int numInputMidiMessages();
73
 
    bool isInputIndexValid(int index);
74
 
    bool isMidiMessageMapped(MidiMessage command);
75
 
    MidiMessage getInputMidiMessage(int index);
76
 
    MixxxControl getInputMixxxControl(int index);
77
 
    MixxxControl getInputMixxxControl(MidiMessage command);
78
 
    void setInputMidiMapping(MidiMessage command, MixxxControl control);
79
 
    void clearInputMidiMapping(int index);
80
 
    void clearInputMidiMapping(MidiMessage command);
81
 
    void clearInputMidiMapping(int index, int count);
82
 
 
83
 
    // MIDI Output Mapping Modifiers
84
 
    int numOutputMixxxControls();
85
 
    bool isOutputIndexValid(int index);
86
 
    bool isMixxxControlMapped(MixxxControl control);
87
 
    MixxxControl getOutputMixxxControl(int index);
88
 
    MidiMessage getOutputMidiMessage(int index);
89
 
    MidiMessage getOutputMidiMessage(MixxxControl control);
90
 
    void setOutputMidiMapping(MixxxControl control, MidiMessage command);
91
 
    void clearOutputMidiMapping(int index);
92
 
    void clearOutputMidiMapping(MixxxControl control);
93
 
    void clearOutputMidiMapping(int index, int count);
94
 
#ifdef __MIDISCRIPT__
95
 
    void initializeScripts();
96
 
    void startupScriptEngine();
97
 
    void shutdownScriptEngine();
98
 
    void restartScriptEngine();
99
 
    MidiScriptEngine *getMidiScriptEngine() { return m_pScriptEngine; };
100
 
#endif
101
 
 
102
 
public slots:
103
 
    void finishMidiLearn(MidiMessage message);
104
 
    void beginMidiLearn(MixxxControl control);
105
 
    void cancelMidiLearn();
106
 
    void slotScriptEngineReady();
107
 
    /** Restarts the script engine and re-applies the mapping
108
 
        to effectively reset the controller */
109
 
    void reset();
110
 
    
111
 
signals:
112
 
    void inputMappingChanged();
113
 
    void inputMappingChanged(int startIndex, int endIndex);
114
 
    void outputMappingChanged();
115
 
    void outputMappingChanged(int startIndex, int endIndex);
116
 
    void midiLearningStarted();
117
 
    void midiLearningFinished(MidiMessage);
118
 
    void midiLearningFinished();
119
 
    void callMidiScriptFunction(QString);
120
 
    void callMidiScriptFunction(QString, QString);
121
 
    void loadMidiScriptFiles(QList<QString>);
122
 
    void initMidiScripts(QList<QString>);
123
 
    void shutdownMidiScriptEngine(QList<QString>);
124
 
 
125
 
private:
126
 
    int internalNumInputMidiMessages();
127
 
    bool internalIsInputIndexValid(int index);
128
 
    void internalSetInputMidiMapping(MidiMessage command, 
129
 
                                     MixxxControl control,
130
 
                                     bool shouldEmit);
131
 
    int internalNumOutputMidiMessages();
132
 
    int internalNumOutputMixxxControls();
133
 
    bool internalIsOutputIndexValid(int index);
134
 
    void internalSetOutputMidiMapping(MixxxControl control,
135
 
                                      MidiMessage command,
136
 
                                      bool shouldEmit);
137
 
    void clearPreset();
138
 
    QDomDocument buildDomElement();
139
 
    void addControl(QDomElement& control, QString device);
140
 
    void addOutput(QDomElement& output, QString device);
141
 
    void addMidiScriptInfo(QDomElement &scriptFile, QString device); //Sucks
142
 
 
143
 
    bool addInputControl(MidiStatusByte midiStatus, int midiNo, int midiChannel,
144
 
                         QString controlObjectGroup, QString controlObjectKey,
145
 
                         QString controlObjectDescription, MidiOption midiOption);
146
 
    bool addInputControl(MidiMessage message, MixxxControl control);
147
 
    void removeInputMapping(MidiStatusByte midiStatus, int midiNo, int midiChannel);
148
 
 
149
 
#ifdef __MIDISCRIPT__
150
 
    /** Adds a script file name and function prefix to the list to be loaded */
151
 
    void addScriptFile(QString filename, QString functionprefix);
152
 
    /** Actually loads script code from the files in the list */
153
 
    void loadScriptCode();
154
 
 
155
 
    QList<QString> m_scriptFileNames;
156
 
    QList<QString> m_scriptFunctionPrefixes;
157
 
    MidiScriptEngine *m_pScriptEngine;
158
 
 
159
 
    QMutex m_scriptEngineInitializedMutex;
160
 
    QWaitCondition m_scriptEngineInitializedCondition;
161
 
#endif
162
 
    QMutex m_mappingLock;
163
 
    QDomElement m_Bindings;
164
 
    MidiInputMapping m_inputMapping;
165
 
    MidiOutputMapping m_outputMapping;
166
 
    MidiInputMappingTableModel* m_pMidiInputMappingTableModel;
167
 
    MidiOutputMappingTableModel* m_pMidiOutputMappingTableModel;
168
 
    MixxxControl m_controlToLearn;
169
 
    QString m_deviceName; /** Name of the device to look for in the <controller> XML nodes... */
170
 
    MidiDevice* m_pOutputMidiDevice; /** We need a pointer back to an _output_ MIDI device so our
171
 
                                         LED handlers know where to fire MIDI messages. Note that
172
 
                                         this can be NULL if there is no output MIDI device! */
173
 
};
174
 
 
175
 
#endif