summaryrefslogtreecommitdiffstats
path: root/src/controllers/midi/midioutputhandler.cpp
blob: 6c3a045f6527701845d07fa113168c14f79fd94e (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
/**
 * @file midioutputhandler.cpp
 * @author Sean Pappalardo spappalardo@mixxx.org
 * @date Tue 11 Feb 2012
 * @brief MIDI output mapping handler
 *
 */

#include <QtDebug>

#include "controllers/midi/midioutputhandler.h"
#include "controllers/midi/midicontroller.h"
#include "controllers/controllerdebug.h"
#include "control/controlobject.h"

MidiOutputHandler::MidiOutputHandler(MidiController* controller,
                                     const MidiOutputMapping& mapping)
        : m_pController(controller),
          m_mapping(mapping),
          m_cos(mapping.controlKey, this),
          m_lastVal(-1) { // -1 = virgin
    m_cos.connectValueChanged(this, &MidiOutputHandler::controlChanged);
}

MidiOutputHandler::~MidiOutputHandler() {
    ConfigKey cKey = m_cos.getKey();
    controllerDebug(QString("Destroying static MIDI output handler on %1 for %2,%3")
                .arg(m_pController->getName(), cKey.group, cKey.item));
}

bool MidiOutputHandler::validate() {
    return m_cos.valid();
}

void MidiOutputHandler::update() {
    controlChanged(m_cos.get());
}

void MidiOutputHandler::controlChanged(double value) {
    // Don't update with out of date messages.
    value = m_cos.get();

    unsigned char byte3 = m_mapping.output.off;
    if (value >= m_mapping.output.min && value <= m_mapping.output.max) {
        byte3 = m_mapping.output.on;
    }

    if (static_cast<int>(byte3) == m_lastVal) {
        // Don't send redundant messages.
        return;
    }

    if (!m_pController->isOpen()) {
        qWarning() << "MIDI device" << m_pController->getName() << "not open for output!";
    } else if (byte3 != 0xFF) {
        controllerDebug("sending MIDI bytes:" << m_mapping.output.status
                     << "," << m_mapping.output.control << ","
                     << byte3);
        m_pController->sendShortMsg(m_mapping.output.status,
                                    m_mapping.output.control, byte3);
        m_lastVal = static_cast<int>(byte3);
    }
}