2014-06-05 19 views
1

我正在使用libpd將純數據引擎嵌入到我的項目中,並試圖從該補丁程序接收信號消息。如何使用libpd從純數據修補程序接收命名信號?

如果我放置一個非信號消息(即)控制在補丁:

| 
| 
| 
[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到CPP]版本,但不會收到[s〜toCPP]。另外,如果我將它連接到一個[dac_]對象並通過outbuf讀入數據,我會接收[osc〜440]的輸出,但是這對於我的用途並不是最佳的,我可以可以就像避免它一樣(主要原因是我可能需要輸出8組或更多組聲音數據,並且在創建和使用具有許多通道的dac_對象的補丁程序中有點不便)。

我的問題是這樣的:

是否有可能使用libpd鈀補丁接收基於信號的消息?

如何在C++端使用libpd從Pd補丁接收基於信號的消息?

回答

3

通信的主機和libpd之間的信號的方式是通過使用[adc~][dac~]。但是,您不需要創建一個[dac~],其中帶有「笨拙」的入口數目。

改爲使用[dac~ 27]在第27通道上輸出信號。

順便說一句,沒有「基於信號的消息」;消息是異步事件,而信號是同步數據流。

相關問題