Я использую 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++?