我如何分配静态RtMidi回调对象明智
How can i assign static RtMidi callbacks object wise?
我正在使用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会告诉你什么是
相关文章:
- 架构决策:返回std::future还是提供回调
- 正在为Xtensa simcall函数编写回调函数
- 如何在C++中使用非静态成员函数作为回调函数
- FLTK:按下哪个按钮 - 将数字传递给按钮的回调 (lambda)
- 在简单示例中,Python3 + ctypes 回调会导致内存泄漏
- 用于在回调中调用解析器的设计模式
- 如何使用C++对象的成员函数作为 C 样式回调?
- Java从C++回调到C++回调
- 如何将成员函数作为回调参数传递给需要"typedef-ed"自由函数指针的函数?
- 从不同的 cpp 调用回调函数会导致bad_function_call
- pcap_handler回调仅在使用 NPCAP v0.9991 时包含空数据包
- 不带轮询的 SDL2 事件回调
- C++存储带有可变参数的回调
- 如何使用 Node-addon-API 实现 node-nan 回调
- 处理影响跨不同线程共享对象的定时回调的最佳方法是什么?
- 访问类C++ C 样式回调
- 处理类内的回调时,必须调用对非静态成员函数的引用
- 如果 C 函数仍然可以间接执行(通过回调函数),那么将它声明为静态函数是否是一种不好的做法?
- 在C++中实现回调
- 我如何分配静态RtMidi回调对象明智