我正在使用 libpd 将 Pure Data 引擎嵌入到我的项目中,并且我正在尝试接收来自补丁的信号消息。
如果我在补丁中放置一个非信号消息(即)控件:
|
|
|
[s toCPP]
我收到消息没有问题。但是,如果我尝试使用 ~ 来执行相同的消息,表示信号消息,我的处理程序永远不会收到它,示例补丁如下:
[osc~ 440]
|
|
|
[s~ toCPP]
无论我使用轮询还是回调,此补丁都不会收到任何“toCPP”消息。这是我的 [精简] 示例代码:
#include <PdBase.hpp>
#include <iostream>
using namespace pd;
class PdRec : public pd::PdReceiver
{
public:
void receiveFloat(const std::string & dest, float num)
{
std::cout << "received float: " << dest << ": " << num << std::endl;
}
void receiveSymbol(const std::string & dest, const std::string & symbol)
{
std::cout << "Received symbol: " << dest << ": " << symbol << std::endl;
}
void receiveMessage(const std::string & dest, const std::string & msg, const pd::List& list)
{
std::cout << "Received message: " << dest << ": " << msg << std::endl;
}
void receiveList(const std::string & dest, const pd::List & list)
{
std::cout << "Received list: " << dest << std::endl;
}
}
int main(int argc, char** argv)
{
float inbuf[64], outbuf[64];
pd::PdBase pdEngine;
if(!pdEngine.init(1, 1, 44100))
{
std::cout << "Failed to initialize pd!" << std::endl;
exit(1);
}
std::cout << "Init success!" << std::endl;
pd::Patch patch = pdEngine.openPatch("a440test.pd", "./");
std::cout << patch << std::endl;
PdRec rec;
pdEngine.subscribe("toCPP");
pdEngine.setReceiver(&rec);
pdEngine.computeAudio(true);
for(int i = 0; i < 30 * 44100 / 64; i++)
{
pdEngine.processFloat(1, inbuf, outbuf);
}
return 0;
}
有人会期望此代码在符号 toCPP 的每个滴答周期从补丁中接收一个浮点数(或浮点数列表),但事实并非如此。此测试代码将收到消息的 [s toCPP] 版本,而不是 [s~ toCPP]。顺便说一句,如果我将 [osc~ 440] 连接到 [dac~] 对象并通过 outbuf 读取数据,我可以接收来自 [osc~ 440] 的输出,但这对我的用途来说不是最佳的,我想避免它(主要原因是我可能需要输出 8 组或更多组声学数据,并且在补丁中创建和使用具有这么多通道的 dac~ 对象变得有些笨拙)。
我的问题是:
是否可以使用 libpd 从 Pd 补丁接收基于信号的消息?
如何在 C++ 端使用 libpd 从 Pd 补丁接收基于信号的消息?