void assert_failed(const char* msg, const char* location, int line){ char* p = buffer; p = stpncpy(p, msg, 32); p = stpcpy(p, (const char*)" in "); p = stpncpy(p, location, 32); p = stpcpy(p, (const char*)" line "); p = stpcpy(p, itoa(line, 10)); getProgramVector()->message = buffer; if(getProgramVector()->programStatus != NULL) getProgramVector()->programStatus(AUDIO_ERROR_STATUS); }
int WEB_setup(long fs, int bs) { for(int i=0; i<NOF_PARAMETERS; ++i) { parameters[i] = 0; parameterNames[i] = NULL; } blocksize = bs; // set up programvector with sample rate, blocksize, callbacks et c ProgramVector* pv = getProgramVector(); pv->checksum = sizeof(ProgramVector); pv->hardware_version = OWL_PEDAL_HARDWARE; pv->audio_input = NULL; pv->audio_output = NULL; pv->audio_bitdepth = 32; pv->audio_blocksize = bs; pv->audio_samplingrate = fs; pv->parameters = parameters; pv->parameters_size = NOF_PARAMETERS; pv->buttons = buttons; pv->registerPatch = registerPatch; pv->registerPatchParameter = registerPatchParameter; pv->cycles_per_block = 0; pv->heap_bytes_used = 0; pv->programReady = programReady; pv->programStatus = programStatus; pv->serviceCall = serviceCall; pv->message = NULL; setup(); struct mallinfo minfo = mallinfo(); // getProgramVector()->heap_bytes_used = minfo.uordblks; pv->heap_bytes_used = minfo.arena; return 0; }
void debugMessage(const char* msg, float a){ char* p = buffer; p = stpncpy(p, msg, 48); p = stpcpy(p, (const char*)" "); p = stpcpy(p, ftoa(a, 10)); getProgramVector()->message = buffer; }
void debugMessage(const char* msg, int a, int b){ char* p = buffer; p = stpncpy(p, msg, 32); p = stpcpy(p, (const char*)" "); p = stpcpy(p, itoa(a, 10)); p = stpcpy(p, (const char*)" "); p = stpcpy(p, itoa(b, 10)); getProgramVector()->message = buffer; }
void WEB_processBlock(float** inputs, float** outputs) { unsigned long now = systicks(); ProgramVector* pv = getProgramVector(); MemBuffer buffer(inputs, 2, blocksize); PatchProcessor* processor = getInitialisingPatchProcessor(); pv->buttons = buttons; processor->setParameterValues(pv->parameters); processor->patch->processAudio(buffer); memcpy(outputs[0], inputs[0], blocksize*sizeof(float)); memcpy(outputs[1], inputs[1], blocksize*sizeof(float)); pv->cycles_per_block = systicks()-now; buttons = pv->buttons; }
char* WEB_getStatus() { static char buffer[64]; char* p = buffer; ProgramVector* pv = getProgramVector(); if(pv == NULL) return (char*)"Missing program vector"; uint8_t err = pv->error; switch(err & 0xf0) { case NO_ERROR: { // p = stpcpy(p, (const char*)"No error"); p = stpcpy(p, (const char*)"CPU "); float percent = (pv->cycles_per_block/pv->audio_blocksize) / (float)3500; p = stpcpy(p, itoa(ceilf(percent*100), 10)); p = stpcpy(p, (const char*)"% Heap "); int mem = pv->heap_bytes_used; p = stpcpy(p, itoa(mem, 10)); break; } case MEM_ERROR: p = stpcpy(p, (const char*)"Memory Error 0x"); p = stpcpy(p, itoa(err, 16)); break; case BUS_ERROR: p = stpcpy(p, (const char*)"Bus Error 0x"); p = stpcpy(p, itoa(err, 16)); break; case USAGE_ERROR: p = stpcpy(p, (const char*)"Usage Error 0x"); p = stpcpy(p, itoa(err, 16)); break; case NMI_ERROR: p = stpcpy(p, (const char*)"Non-maskable Interrupt 0x"); p = stpcpy(p, itoa(err, 16)); break; case HARDFAULT_ERROR: p = stpcpy(p, (const char*)"HardFault Error 0x"); p = stpcpy(p, itoa(err, 16)); break; case PROGRAM_ERROR: p = stpcpy(p, (const char*)"Missing or Invalid Program 0x"); p = stpcpy(p, itoa(err, 16)); break; default: p = stpcpy(p, (const char*)"Unknown Error 0x"); p = stpcpy(p, itoa(err, 16)); break; } return buffer; }
void processBlock(){ buffer.split(getProgramVector()->audio_input, getProgramVector()->audio_blocksize); patches.process(buffer); buffer.comb(getProgramVector()->audio_output); }
void PatchController::init(){ parameterValues = getProgramVector()->parameters; // setActiveSlot(GREEN); initialisePatch(GREEN, getGreenPatchId()); initialisePatch(RED, getRedPatchId()); }
int Patch::getSamplesSinceButtonPressed(PatchButtonId bid){ int index = bid+PARAMETER_F; return index <= getProgramVector()->parameters_size ? getProgramVector()->parameters[index] : 0; }
bool Patch::isButtonPressed(PatchButtonId bid){ return getProgramVector()->buttons & (1<<bid); }
void Patch::setButton(PatchButtonId bid, bool pressed){ if(pressed) getProgramVector()->buttons |= 1<<bid; else getProgramVector()->buttons &= ~(1<<bid); }
uint32_t ProgramManager::getHeapMemoryUsed(){ return getProgramVector()->heap_bytes_used; }
void Patch::registerParameter(PatchParameterId pid, const char* name, const char* description){ if(getProgramVector()->registerPatchParameter != NULL) getProgramVector()->registerPatchParameter(pid, name); }
char* WEB_getMessage() { char* msg = getProgramVector()->message; // getProgramVector()->message = NULL; return msg; }
int main(void) { #ifdef STARTUP_CODE memcpy(_sidata, _sdata, _sdata-_edata); // Copy the data segment initializers memset(_sbss, 0, _ebss-_sbss); // zero fill the BSS segment __libc_init_array(); // Call static constructors #endif /* STARTUP_CODE */ #ifdef DEBUG_DWT volatile unsigned int *DWT_CYCCNT = (volatile unsigned int *)0xE0001004; //address of the register volatile unsigned int *DWT_CONTROL = (volatile unsigned int *)0xE0001000; //address of the register volatile unsigned int *SCB_DEMCR = (volatile unsigned int *)0xE000EDFC; //address of the register *SCB_DEMCR = *SCB_DEMCR | 0x01000000; *DWT_CONTROL = *DWT_CONTROL | 1 ; // enable the counter #endif /* DEBUG_DWT */ if(getProgramVector()->checksum != sizeof(ProgramVector)) { getProgramVector()->error = CHECKSUM_ERROR_STATUS; getProgramVector()->message = (char*)"ProgramVector checksum error"; getProgramVector()->programStatus(AUDIO_ERROR_STATUS); return -1; } if(getProgramVector()->audio_blocksize <= 0 || getProgramVector()->audio_blocksize > AUDIO_MAX_BLOCK_SIZE) { getProgramVector()->error = CONFIGURATION_ERROR_STATUS; getProgramVector()->message = (char*)"Invalid blocksize"; getProgramVector()->programStatus(AUDIO_ERROR_STATUS); return -1; } setup(); #ifdef DEBUG_MEM struct mallinfo minfo = mallinfo(); // getProgramVector()->heap_bytes_used = minfo.uordblks; getProgramVector()->heap_bytes_used = minfo.arena; #endif /* DEBUG_MEM */ for(;;) { getProgramVector()->programReady(); #ifdef DEBUG_DWT *DWT_CYCCNT = 0; // reset the counter #endif /* DEBUG_DWT */ processBlock(); #ifdef DEBUG_DWT getProgramVector()->cycles_per_block = *DWT_CYCCNT; #endif /* DEBUG_DWT */ } }
void debugMessage(const char* msg){ strlcpy(buffer, msg, 64); getProgramVector()->message = buffer; }
double Patch::getSampleRate(){ return getProgramVector()->audio_samplingrate; }
int Patch::getBlockSize(){ return getProgramVector()->audio_blocksize; }
uint32_t ProgramManager::getCyclesPerBlock(){ return getProgramVector()->cycles_per_block; }