Пример #1
0
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);
}
Пример #2
0
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;
}
Пример #3
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;
}
Пример #4
0
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;
}
Пример #5
0
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;
}
Пример #6
0
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;
}
Пример #7
0
void processBlock(){
  buffer.split(getProgramVector()->audio_input, getProgramVector()->audio_blocksize);
  patches.process(buffer);
  buffer.comb(getProgramVector()->audio_output);
}
Пример #8
0
void PatchController::init(){
  parameterValues = getProgramVector()->parameters;
  // setActiveSlot(GREEN);
  initialisePatch(GREEN, getGreenPatchId());
  initialisePatch(RED, getRedPatchId());
}
Пример #9
0
int Patch::getSamplesSinceButtonPressed(PatchButtonId bid){
  int index = bid+PARAMETER_F;
  return index <= getProgramVector()->parameters_size ? 
    getProgramVector()->parameters[index] : 0;
}
Пример #10
0
bool Patch::isButtonPressed(PatchButtonId bid){
  return getProgramVector()->buttons & (1<<bid);
}
Пример #11
0
void Patch::setButton(PatchButtonId bid, bool pressed){
  if(pressed)
    getProgramVector()->buttons |= 1<<bid;
  else
    getProgramVector()->buttons &= ~(1<<bid);
}
Пример #12
0
uint32_t ProgramManager::getHeapMemoryUsed(){
  return getProgramVector()->heap_bytes_used;
}
Пример #13
0
void Patch::registerParameter(PatchParameterId pid, const char* name, const char* description){
  if(getProgramVector()->registerPatchParameter != NULL)
    getProgramVector()->registerPatchParameter(pid, name);
}
Пример #14
0
char* WEB_getMessage() {
    char* msg = getProgramVector()->message;
    // getProgramVector()->message = NULL;
    return msg;
}
Пример #15
0
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 */
    }
}
Пример #16
0
void debugMessage(const char* msg){
  strlcpy(buffer, msg, 64);
  getProgramVector()->message = buffer;
}
Пример #17
0
double Patch::getSampleRate(){
  return getProgramVector()->audio_samplingrate;
}
Пример #18
0
int Patch::getBlockSize(){
  return getProgramVector()->audio_blocksize;
}
Пример #19
0
uint32_t ProgramManager::getCyclesPerBlock(){
  return getProgramVector()->cycles_per_block;
}