60
61
QMutexLocker locker(&m_mutex);
62
63
qDebug() << "MidiDevice: Deleting MidiMapping...";
63
m_mappingMutex.lock();
64
m_mappingPtrMutex.lock();
64
65
delete m_pMidiMapping;
65
m_mappingMutex.unlock();
66
m_mappingPtrMutex.unlock();
68
69
void MidiDevice::startup()
70
m_mappingMutex.lock();
71
QMutexLocker locker(&m_mappingPtrMutex);
71
72
#ifdef __MIDISCRIPT__
73
setReceiveInhibit(true);
72
74
m_pMidiMapping->startupScriptEngine();
75
setReceiveInhibit(false);
74
m_mappingMutex.unlock();
77
79
void MidiDevice::shutdown()
79
m_mappingMutex.lock();
81
QMutexLocker locker(&m_mappingPtrMutex);
82
//Stop us from processing any MIDI messages that are
83
//received while we're trying to shut down the scripting engine.
84
//This prevents a deadlock that can happen because we've locked
85
//the MIDI mapping pointer mutex (in the line above). If a
86
//MIDI message is received while this is locked, the script
87
//engine can end up waiting for the MIDI message to be
88
//mapped and we end up with a deadlock.
89
//Similarly, if a MIDI message is sent from the scripting
90
//engine while we've held this lock, we'll end up with
91
//a similar deadlock. (Note that shutdownScriptEngin()
92
//waits for the scripting engine thread to terminate,
93
//which will never happen if it's stuck waiting for
94
//m_mappingPtrMutex to unlock.
95
setReceiveInhibit(true);
80
97
#ifdef __MIDISCRIPT__
81
98
m_pMidiMapping->shutdownScriptEngine();
83
m_mappingMutex.unlock();
100
setReceiveInhibit(false);
101
setSendInhibit(false);
86
104
void MidiDevice::setMidiMapping(MidiMapping* mapping)
89
m_mappingMutex.lock();
107
m_mappingPtrMutex.lock();
90
108
m_pMidiMapping = mapping;
92
110
if (m_pCorrespondingOutputDevice)
94
112
m_pCorrespondingOutputDevice->setMidiMapping(m_pMidiMapping);
96
m_mappingMutex.unlock();
114
m_mappingPtrMutex.unlock();
141
159
m_bMidiLearn = true;
142
160
m_mutex.unlock();
144
m_mappingMutex.lock();
162
m_mappingPtrMutex.lock();
145
163
connect(this, SIGNAL(midiEvent(MidiMessage)), m_pMidiMapping, SLOT(finishMidiLearn(MidiMessage)));
146
m_mappingMutex.unlock();
164
m_mappingPtrMutex.unlock();
149
167
void MidiDevice::disableMidiLearn() {
151
169
m_bMidiLearn = false;
152
170
m_mutex.unlock();
154
m_mappingMutex.lock();
172
m_mappingPtrMutex.lock();
155
173
disconnect(this, SIGNAL(midiEvent(MidiMessage)), m_pMidiMapping, SLOT(finishMidiLearn(MidiMessage)));
156
m_mappingMutex.unlock();
174
m_mappingPtrMutex.unlock();
159
177
void MidiDevice::receive(MidiStatusByte status, char channel, char control, char value)
183
201
return; // Don't process midi messages further when MIDI learning
186
QMutexLocker mappingLocker(&m_mappingMutex);
204
QMutexLocker mappingLocker(&m_mappingPtrMutex);
188
206
// Only check for a mapping if the status byte is one we know how to handle
189
207
if (status == MIDI_STATUS_NOTE_ON
259
277
QMutexLocker locker(&m_mutex);
260
278
m_bReceiveInhibit = inhibit;
281
void MidiDevice::setSendInhibit(bool inhibit)
283
//See comments for m_bSendInhibit.
284
QMutexLocker locker(&m_mutex);
285
m_bSendInhibit = inhibit;