typedef m_bool (*f_drvini)(VM*, struct BBQ_*);
typedef void (*f_drvrun)(VM*, struct BBQ_*);
typedef void (*f_drvdel)(VM*, struct BBQ_*);
-
+#define DRVRUN(a) void a(VM *vm, struct BBQ_* di)
+#define DRVDEL(a) void a(VM *vm, struct BBQ_* di)
typedef struct DriverData_ {
+ void* data;
f_drvini ini;
f_drvrun run;
f_drvdel del;
- void* data;
} DriverData;
ANN void dummy_driver(DriverData*);
struct BBQ_ * di = (struct BBQ_*)xcalloc(1, sizeof(struct BBQ_));
di->func = dummy_driver;
di->run = vm_run;
- di->driver = (DriverData*)xcalloc(1, sizeof(DriverData));
+ di->driver = (DriverData*)mp_alloc(DriverData);
return di;
}
VMBENCH_END
}
-ANN /* static */ void free_driverinfo(struct BBQ_* di, VM* vm) {
- mp_free(SoundInfo, di->si);
- if(di->driver->del)
- di->driver->del(vm, di);
- xfree(di->driver);
- xfree(di);
+ANN /* static */ void free_driverinfo(struct BBQ_* bbq, VM* vm) {
+ mp_free(SoundInfo, bbq->si);
+ if(bbq->driver->del)
+ bbq->driver->del(vm, bbq);
+ mp_free(DriverData, bbq->driver);
+ xfree(bbq);
}
ANN void gwion_end(const Gwion gwion) {
- plug_end(gwion);
arg_release(gwion->arg);
xfree(gwion->arg);
free_env(gwion->env);
free_emitter(gwion->emit);
free_vm(gwion->vm);
+ plug_end(gwion);
xfree(gwion->plug);
free_symbols();
}
Except(sh, "MsgRemove");
}
}
-
+#include "sound.h"
ANN void free_vm(VM* vm) {
vector_release(&vm->shreduler->shreds);
vector_release(&vm->ugen);
+struct BBQ_* bbq = vm->bbq;
if(vm->bbq) {
+ mp_free(SoundInfo, bbq->si);
+ if(bbq->driver->del)
+ bbq->driver->del(vm, bbq);
+ mp_free(DriverData, bbq->driver);
if(vm->bbq->in)
xfree(vm->bbq->in);
if(vm->bbq->out)
xfree(vm->bbq->out);
- free_driverinfo(vm->bbq, vm);
+ xfree(bbq);
+// free_driverinfo(vm->bbq, vm);
}
xfree(vm->shreduler);
free(vm);