如何使用libpd从Pure Data补丁接收命名信号?

时间:2014-06-05 18:12:35

标签: c++ puredata libpd

我正在使用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;
}

人们会期望这个代码在符号到CPP的每个滴答周期从补丁接收浮点(或浮点数列表),但是,情况并非如此。此测试代码将接收消息的[s toCPP]版本,但不会接收[s~toCPP]。顺便说一句,我可以但是,如果我将它连接到[dac~]对象并通过outbuf读入数据,则接收来自[osc~440]的输出,但这不是我的最佳选择。使用和我想避免它(主要原因是我可能需要输出超过8组或更多组的声学数据,并且在补丁中创建和使用具有那么多的dac~对象时有点笨拙信道)。

我的问题是:

是否可以使用libpd从Pd补丁接收基于信号的消息?

如何在C ++端使用libpd从Pd补丁接收基于信号的消息?

1 个答案:

答案 0 :(得分:3)

唯一在主机和libpd之间传递信号的方式是使用[adc~][dac~]

但是,您无需创建具有“笨重”入口数的[dac~]

而是使用 [dac~ 27] 在第27个频道输出信号。

顺便说一下,没有“基于信号的消息”;消息是异步事件,而信号是同步数据流。