int sporth_ref(sporth_stack *stack, void *ud) { plumber_data *pd = ud; char *str; switch(pd->mode) { case PLUMBER_CREATE: plumber_add_ugen(pd, SPORTH_REF, NULL); if(sporth_check_args(stack, "s") != SPORTH_OK) { stack->error++; fprintf(stderr, "ref: Invalid arguments."); return PLUMBER_NOTOK; } sporth_stack_pop_string(stack); break; case PLUMBER_INIT: str = sporth_stack_pop_string(stack); plumber_ftmap_delete(pd, 0); /* get reference of the *next* pipe in the plumbing */ plumber_ftmap_add_userdata(pd, str, pd->next->ud); plumber_ftmap_delete(pd, 1); break; case PLUMBER_COMPUTE: break; case PLUMBER_DESTROY: break; } return PLUMBER_OK; }
int sporth_palias(sporth_stack *stack, void *ud) { plumber_data *pd = ud; char *name; int id; SPFLOAT *foo; switch(pd->mode) { case PLUMBER_CREATE: plumber_add_ugen(pd, SPORTH_PALIAS, NULL); if(sporth_check_args(stack, "sf") != SPORTH_OK) { fprintf(stderr,"palias: Not enough arguments\n"); stack->error++; return PLUMBER_NOTOK; } id = floor(sporth_stack_pop_float(stack)); name = sporth_stack_pop_string(stack); foo = &pd->p[id]; plumber_ftmap_delete(pd, 0); plumber_set_var(pd, name, foo); plumber_ftmap_delete(pd, 1); break; case PLUMBER_INIT: sporth_stack_pop_float(stack); sporth_stack_pop_string(stack); break; case PLUMBER_COMPUTE: sporth_stack_pop_float(stack); break; default: break; } return PLUMBER_OK; }
int sporth_talias(sporth_stack *stack, void *ud) { plumber_data *pd = ud; char *ftname; char *varname; uint32_t index; SPFLOAT *var; sp_ftbl *ft; switch(pd->mode){ case PLUMBER_CREATE: plumber_add_ugen(pd, SPORTH_TALIAS, NULL); if(sporth_check_args(stack, "sfs") != SPORTH_OK) { plumber_print(pd,"Init: incorrect arguments for talias\n"); return PLUMBER_NOTOK; } ftname = sporth_stack_pop_string(stack); index = sporth_stack_pop_float(stack); varname = sporth_stack_pop_string(stack); if(plumber_ftmap_search(pd, ftname, &ft) == PLUMBER_NOTOK) { plumber_print(pd, "talias: could not find table '%s'\n", ftname); stack->error++; return PLUMBER_NOTOK; } var = &ft->tbl[index]; plumber_ftmap_delete(pd, 0); plumber_ftmap_add_userdata(pd, varname, var); plumber_ftmap_delete(pd, 1); break; case PLUMBER_INIT: ftname = sporth_stack_pop_string(stack); index = sporth_stack_pop_float(stack); varname = sporth_stack_pop_string(stack); break; case PLUMBER_COMPUTE: sporth_stack_pop_float(stack); break; case PLUMBER_DESTROY: break; } return PLUMBER_OK; }
int main() { UserData ud; /* allocate and initialize */ sp_create(&ud.sp); plumber_register(&ud.pd); plumber_init(&ud.pd); /* create an ftable with a size 1, which will be expanded with gen_vals */ sp_ftbl_create(ud.sp, &ud.seq, 1); /* Gen_vals will create a table from a string of numbers */ sp_gen_vals(ud.sp, ud.seq, "60 63 67 72"); /* Sporth code to be parsed, using a ftable generated in c called 'seq' */ char *str = "0.1 dmetro " "0 'seq' tseq " "0.01 port mtof " "0.5 1 1 1 fm"; /* Tell plumber that that we will take care of removing the following ftables */ /* This is needed for persistant ftables that don't get cleaned for * recompilation */ plumber_ftmap_delete(&ud.pd, 0); /* add ftable to plumber and call it "seq" */ plumber_ftmap_add(&ud.pd, "seq", ud.seq); /* Turn automatic deletion back "on" */ plumber_ftmap_delete(&ud.pd, 1); /* make plumber know about the soundpipe instance */ ud.pd.sp = ud.sp; /* parse string and allocate plumbing */ plumber_parse_string(&ud.pd, str); /* initialize the plumbing */ plumber_compute(&ud.pd, PLUMBER_INIT); /* run */ sp_process(ud.sp, &ud, process); /* Cleanup */ /* Plumber will handle freeing the memory of the ftable we added */ /* no need to call sp_ftbl_destroy */ plumber_clean(&ud.pd); sp_ftbl_destroy(&ud.seq); sp_destroy(&ud.sp); return 0; }
int plumber_init(plumber_data *plumb) { plumb->mode = PLUMBER_CREATE; plumb->current_pipe = 0; plumb->ftmap = plumb->ft1; plumb->pipes= &plumb->main; plumb->tmp = &plumb->main; plumbing_init(plumb->pipes); plumb->nchan = 1; sporth_stack_init(&plumb->sporth.stack); plumber_ftmap_delete(plumb, 1); plumber_ftmap_init(plumb); plumb->seed = (int) time(NULL); plumb->fp = NULL; int pos; for(pos = 0; pos < 16; pos++) plumb->p[pos] = 0; for(pos = 0; pos < 16; pos++) plumb->f[pos] = sporth_f_default; return PLUMBER_OK; }