# HG changeset patch # User Giulio Moro # Date 1465356681 -3600 # Node ID 749aa016fa168f8f0cdff06d0fd8b1fec1aa95df # Parent 09397ded89661e44a680e07ad908ce01c221a15f pinMode can now be controlled from Pd diff -r 09397ded8966 -r 749aa016fa16 examples/basic_libpd/render.cpp --- a/examples/basic_libpd/render.cpp Wed Jun 08 02:00:17 2016 +0100 +++ b/examples/basic_libpd/render.cpp Wed Jun 08 04:31:21 2016 +0100 @@ -51,11 +51,64 @@ static uint32_t clearDataOut; static uint32_t setDataOut; +static uint16_t digitalModeClear; +static uint16_t digitalModeSet; +static uint16_t digitalRates; + + void sendDigitalMessage(bool state, unsigned int delay, void* receiverName){ libpd_float((char*)receiverName, (float)state); // rt_printf("%s: %d\n", (char*)receiverName, state); } +#define LIBPD_DIGITAL_OFFSET 11 // digitals are preceded by 2 audio and 8 analogs (even if using a different number of analogs) + +void Bela_messageHook(const char *source, const char *symbol, int argc, t_atom *argv){ + if(strcmp(source, "bela_setDigital") == 0){ + // symbol is the direction, argv[0] is the channel, argv[1] (optional) + // is signal(\"sig\" or \"~\") or message(\"mess\", default) rate + bool error = false; + bool signal = false; // defaults to message rate + bool direction; + if(strcmp(symbol, "in") == 0){ + direction = INPUT; + } else if(strcmp(symbol, "out") == 0){ + direction = OUTPUT; + } else { + error = true; + } + if(argc == 0){ + error = true; + } else if (libpd_is_float(&argv[0]) == false){ + error = true; + } + if(error == true){ + rt_printf("bela_setDigital requires at least [direction channel(\n"); + return; + } + int channel = libpd_get_float(&argv[0]) - LIBPD_DIGITAL_OFFSET; + if(argc >= 2){ + t_atom* a = &argv[1]; + if(libpd_is_symbol(a)){ + char *s = libpd_get_symbol(a); + if(strcmp(s, "~") == 0 || strncmp(s, "sig", 3) == 0){ + signal = true; + } + } + } + digitalRates = changeBit(digitalRates, channel, signal); + if(direction == 1){ + digitalModeClear = setBit(digitalModeClear, channel); + digitalModeSet = clearBit(digitalModeSet, channel); + } else { + digitalModeSet = setBit(digitalModeSet, channel); + digitalModeClear = clearBit(digitalModeClear, channel); + } +// rt_printf("Channel: %d, input?: %d, ~?: %d\n", channel, direction==INPUT, signal); +// rt_printf("modeSet 0x%x modeClear 0x%x\n", digitalModeSet, digitalModeClear); + } +} + void Bela_floatHook(const char *source, float value){ // rt_printf("received: %s %f\n", source, value); // let's make this as optimized as possible for built-in digital Out parsing @@ -131,6 +184,7 @@ // set hooks before calling libpd_init libpd_set_printhook(Bela_printHook); libpd_set_floathook(Bela_floatHook); + libpd_set_messagehook(Bela_messageHook); libpd_set_noteonhook(pdnoteon); //TODO: add hooks for other midi events and generate MIDI output appropriately libpd_init(); @@ -167,6 +221,7 @@ libpd_bind("bela_digitalOut24"); libpd_bind("bela_digitalOut25"); libpd_bind("bela_digitalOut26"); + libpd_bind("bela_setDigital"); libpdReadFilesTask = Bela_createAuxiliaryTask(libpdReadFilesLoop, 60, "libpdReadFiles"); Bela_scheduleAuxiliaryTask(libpdReadFilesTask); @@ -339,12 +394,14 @@ } // digital out at message-rate - if(clearDataOut || setDataOut){ + if(clearDataOut || setDataOut || digitalModeSet || digitalModeClear){ + uint32_t orWord = ((setDataOut << 16) | digitalModeSet); + uint32_t andTildeWord = ((clearDataOut << 16) | digitalModeClear); + uint32_t outWord; for (unsigned int frame = audioFrameBase; frame < audioFrameBase + gLibpdBlockSize; ++frame) { - // TODO: only process the channels marked as such - uint32_t outWord = context->digital[frame]; - outWord = outWord | (setDataOut << 16); - outWord = outWord &~ (clearDataOut << 16); + outWord = context->digital[frame]; + outWord = outWord | orWord; + outWord = outWord &~ andTildeWord; context->digital[frame] = outWord; } }