- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 C++ RtMidi 库从两个相同的设备(Novation 启动板)读取 MIDI 输入。
两个启动板都“活”在自己的对象中,打开自己的 MIDI 端口,并且(应该)设置自己的回调方法。但是,如果我按下启动板上的按钮,两个设备都会将 MIDI 数据放入同一个回调函数(最后分配的回调函数)。
我希望回调函数是特定于对象而不是特定于类的。经过大量研究和修改后,我怀疑问题与以下事实有关:回调函数被声明为静态(如 RtMidi 文档所建议的那样),因此被声明为类范围而不是对象范围。
如何修复代码,以便将启动板生成的 MIDI 事件发送到它们“自己的”回调函数?
这是(精简的)代码:
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);
}
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/
我有一个包含 1+N 个线程和 N 个 FIFO 队列的程序,例如:FIFO_queue_t* fifo_queque[N]。一个线程负责填充这 N 个 FIFO 队列。并且其他每个线程都与 1 个
我正在使用 Wise Installer Editor 编写 .msi,并且我想将所有文件复制到注册表项中指定的目录中。 我如何在 Wise 中指定这一点? 提前致谢, 埃内斯托 最佳答案 您可以尝试
我们有一个场景,其中我们尝试获取附加的磁盘虚拟机以及分配给这些磁盘的相应总空间。是否有任何命令或脚本可以获取详细信息? 我已使用命令 Get-AzureDisk 获取输出,但它没有显示列表中的所有虚拟
我有一个包含多个派生类的类,每个派生类都有自己的构造函数。 class A { public: static A *create_new_A(int child_ID);
我有一个小问题:) 我计划建立一个相当不寻常的 web 项目,大约有 1000 个页面,其中不会有经典的导航(仅适用于关于页面和联系人),并且所有页面都不会链接到一个又一个。 它的索引 > 打开随机页
我们的应用程序中有一些数据。有时它会被保存,所以我们为它做了一个实体和一个 NSManagedObject 子类。但是,通常情况下,对象将被实例化并且永远不会保存。我正在考虑使用另一个具有 NSInM
假设我有一个表如下: Class | Subject | Student | Marks ---------------------------------------- 1
刚刚在我正在编写的一些代码中偶然发现了这种情况,并且很好奇“正确”的方法是什么。举例来说,我有一大堆对象,我需要按某个属性对其进行分组,但组的顺序很重要。 例如。对象: var obj = {
如何在 Android 应用 Activity 中启用 Mutli 窗口选项? 我尝试在两个单独的 Activity 中使用 AndroidManifest Activity 属性 android:r
我发现 ear 插件覆盖了 war 插件并阻止调用 war 任务。我通过直接调用它来绕过它。 这是远程明智的还是我应该放弃并转向 eclipse 和 gradle 中的多项目设置? ear {
我们的安装程序是用 Inno Setup 编写的,我们实际上对它非常满意。然而,一些客户不断要求他们可以更轻松地通过 Active Directory 分发 MSI 安装程序。通过扩展 Inno Se
我正在尝试使用 Visual Studio 2017 (v15.4.5) 将现有的 WCF Web API(针对 .NET Framework 4.6.1)移植到 ASP.Net Core 2,但在找
我是一名优秀的程序员,十分优秀!