我如何分配静态RtMidi回调对象明智

How can i assign static RtMidi callbacks object wise?

本文关键字:回调 RtMidi 对象 静态 何分配 分配      更新时间:2023-10-16

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

如何修复代码,以便由launchpad生成的MIDI事件被发送到它们的"自己的"回调函数?

下面是(压缩)代码:

launchpad.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 *));userdata会告诉你什么是