2014-06-05 2 views
1

Я использую libpd для встраивания механизма Pure Data в свой проект, и я пытаюсь получать сигнальные сообщения из патча.Как получить именованный сигнал с патча Pure Data с помощью 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 toCPP] версию сообщения, но не [s ~ toCPP]. Однако, в отличие от этого, я могу получить результат от [osc ~ 440], если подключить его к объекту [dac ~] и прочитать данные через outbuf, но это не оптимально для моих целей, и я бы как бы избежать этого (основной причиной является то, что мне может потребоваться вывести более 8 или более наборов акустических данных, и в патче он становится несколько громоздким, чтобы создать и использовать dac-объект с этим множеством каналов).

Мои вопросы таким образом:

Можно ли получить сигнал на основе сообщений из пластыря Pd с использованием libpd?

Как получить сигнальное сообщение от патча Pd с использованием libpd на стороне C++?

ответ

3

только способ передачи сигналов между хостом и libpd является использование [adc~] и [dac~].

Однако вам не нужно создавать [dac~] с «громоздким» количеством входов.

вместо этого использовать[dac~ 27]для вывода сигнала на 27-м канале.

btw, нет «сигнальных сообщений»; сообщение является асинхронным событием, тогда как сигнал является синхронным потоком данных.