c++ - 我怎样才能明智地分配静态 RtMidi 回调对象?

标签 c++ function static callback midi

我正在使用 C++ RtMidi 库从两个相同的设备(Novation 启动板)读取 MIDI 输入。
两个启动板都“活”在自己的对象中,打开自己的 MIDI 端口,并且(应该)设置自己的回调方法。但是,如果我按下启动板上的按钮,两个设备都会将 MIDI 数据放入同一个回调函数(最后分配的回调函数)。
我希望回调函数是特定于对象而不是特定于类的。经过大量研究和修改后,我怀疑问题与以下事实有关:回调函数被声明为静态(如 RtMidi 文档所建议的那样),因此被声明为类范围而不是对象范围。

如何修复代码,以便将启动板生成的 MIDI 事件发送到它们“自己的”回调函数?

这是(精简的)代码:

启动板.cpp

class launchpad {
public:
    launchpad(int paramPortId, std::string paramPosition);
private:
    static void listenerCallback(double deltatime, std::vector< unsigned char > *message, void *userData);
    static std::string position;
};

std::string launchpad::position;

void launchpad::listenerCallback(double deltatime, std::vector< unsigned char > *message, void *userData) {
    unsigned int nBytes = message->size();
    for (unsigned int i = 0; i < nBytes; i++)
        std::cout << position << "Byte " << i << " = " << (int) message->at(i) << ", ";
    if (nBytes > 0)
        std::cout << "stamp = " << deltatime << std::endl;
}

launchpad::launchpad(int paramPortId, std::string paramPosition) {

    RtMidiIn *input = new RtMidiIn();
    launchpad::position = paramPosition;
    std::cout << "Launchpad found at port # " << paramPortId << " assigned position: " << position << std::endl;

    input->setCallback(&listenerCallback);
    input->openPort(paramPortId);
}

main.cpp

int main(int argc, char *argv[]) {

   RtMidiIn *infoDevice;
   launchpad *leftLaunchpad = 0;
   launchpad *rightLaunchpad = 0;
   int launchpadIndex = 0;
   infoDevice = new RtMidiIn();
   unsigned int nPorts = infoDevice->getPortCount();
   string portName;

   for (unsigned int i = 0; i < nPorts; i++) {
       portName = infoDevice->getPortName(i);
       if (portName == "Launchpad") {
           if (launchpadIndex == 0) {
               leftLaunchpad = new launchpad(i, "left");
               launchpadIndex++;
           } else if (launchpadIndex == 1) {
               rightLaunchpad = new launchpad(i, "right");
               launchpadIndex++;
           }
       }
}

    char input;
    std::cin.get(input);
    return 0;

非常感谢任何帮助。谢谢

最佳答案

listenerCallback 可以是任何不是来自类的静态 C 函数

然后使用 输入->setCallback(&listenerCallback,(void *)this); userdata 会告诉你正在调用什么

关于c++ - 我怎样才能明智地分配静态 RtMidi 回调对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16508595/

相关文章:

c++ - 为什么在将r值引用分配给它时将其视为l值引用?

c++ - 将子类实例替换为父类(super class)引用 C++

java - 我可以在 Java 中覆盖和重载静态方法吗?

java - 通过上下文传递类名并使用它在不同的类中存储静态值

c++ - 在模板类中实现和调用静态方法

c++ - 如何将一个qt3库完全移植到qt4?

c++ - 在派生类中初始化具有依赖类型名称的基子对象

javascript - 从代码中的其他地方调用 JQuery 事件作为函数...?

jquery - 使用 JQuery 手动调用事件函数

python - 如何避免使用 import 并仍然从函数中获得相同的输出?