struct Vector_ rem;
struct Vector_ lib;
struct Vector_ mod;
- Vector ref;
m_bool loop;
- unsigned quit : 1;
} Arg;
-ANN void arg_init(Arg* arg);
ANN void arg_release(Arg* arg);
+ANN uint parse_args(Arg*, DriverInfo*);
#endif
#define __GWION
typedef struct Gwion_* Gwion;
#include "plug.h"
+#include "driver.h"
struct Gwion_ {
-// Vector args
-// PlugInfo
-// => Vector v[GWION_NVEC];
PlugInfo plug;
+ Driver* driver;
+// scanner
// sym
// mem
// rnd
VM* vm;
};
ANN void gwion_init(const Gwion, const Vector);
-ANN void gwion_release(const Gwion gwion);
+ANN m_bool gwion_audio(const Gwion gwion, DriverInfo* di);
+ANN void gwion_run(const Gwion gwion, DriverInfo* di);
+ANN m_bool gwion_engine(const Gwion gwion);
+ANN void gwion_release(const Gwion gwion, DriverInfo* di);
#endif
-#include <stdlib.h>
-#include <stdio.h>
#include <getopt.h>
#include <string.h>
#include "gwion_util.h"
-#include "gwion_ast.h"
-#include "map_private.h"
-#include "arg.h"
#include "oo.h"
#include "vm.h"
#include "driver.h"
+#include "arg.h"
-ANN void arg_init(Arg* arg) {
+ANN static void arg_init(Arg* arg) {
vector_init(&arg->add);
vector_init(&arg->rem);
vector_init(&arg->lib);
vector_init(&arg->mod);
vector_add(&arg->lib, (vtype)GWPLUG_DIR);
- arg->ref = &arg->add;
}
ANN void arg_release(Arg* arg) {
;
ANN static void arg_add(Arg* arg) {
+ Vector ref = &arg->add;
while(optind < arg->argc) {
m_str str = arg->argv[optind++];
if(!strcmp(str, "-")) {
- arg->ref = &arg->rem;
+ ref = &arg->rem;
str = arg->argv[optind++];
} else if(!strcmp(str, "+")) {
- arg->ref = &arg->add;
+ ref = &arg->add;
str = arg->argv[optind++];
}
- vector_add(arg->ref, (vtype)str);
+ vector_add(ref, (vtype)str);
}
}
}
}
-ANN void parse_args(Arg* arg, DriverInfo* di) {
+ANN uint parse_args(Arg* arg, DriverInfo* di) {
+ uint quit = 0;
int i, index;
+ arg_init(arg);
while((i = getopt_long(arg->argc, arg->argv, "?vqh:p:i:o:n:b:e:s:d:l:g:-:rc:f:m:P:C ",
long_option, &index)) != -1) {
switch(i) {
exit(1);
break;
case 'q':
- arg->quit = 1;
+ quit = 1;
break;
case 'l':
arg->loop = strtol(optarg, NULL, 10) > 0 ? 1 : -1;
}
}
arg_add(arg);
+ return quit;
}
#include "env.h"
#include "instr.h"
#include "emit.h"
+#include "engine.h"
#include "gwion.h"
#include "arg.h"
+
+#ifdef VMBENCH
+#include <time.h>
+#include <bsd/sys/time.h>
+#define VMBENCH_INI struct timespec ini, end, ret; \
+ clock_gettime(CLOCK_THREAD_CPUTIME_ID, &ini);
+#define VMBENCH_END clock_gettime(CLOCK_THREAD_CPUTIME_ID, &end); \
+ timespecsub(&end, &ini, &ret); \
+ printf("timespec %lu.%09lu\n", ret.tv_sec, ret.tv_nsec);
+#else
+#define VMBENCH_INI
+#define VMBENCH_END
+#endif
+
ANN void gwion_init(const Gwion gwion, const Vector args) {
gwion->vm = new_vm();
gwion->emit = new_emitter();
gwion->emit->env = gwion->env;
gwion->vm->gwion = gwion;
gwion->env->gwion = gwion;
+ gwion->driver = (Driver*)xcalloc(1, sizeof(Driver));
plug_ini(gwion->plug, args);
}
-ANN void gwion_release(const Gwion gwion) {
+ANN m_bool gwion_audio(const Gwion gwion, DriverInfo* di) {
+ di->func(gwion->driver);
+ VM* vm = gwion->vm;
+ return gwion->driver->ini(vm, di) > 0 &&
+ (vm->bbq = new_bbq(di));
+}
+
+ANN m_bool gwion_engine(const Gwion gwion) {
+ return type_engine_init(gwion->vm, &gwion->plug[GWPLUG_IMPORT]) > 0;
+}
+
+ANN void gwion_run(const Gwion gwion, DriverInfo* di) {
+ VM* vm = gwion->vm;
+ vm->is_running = 1;
+ VMBENCH_INI
+ gwion->driver->run(vm, di);
+ VMBENCH_END
+}
+
+ANN void gwion_release(const Gwion gwion, DriverInfo* di) {
+ if(gwion->driver->del)
+ gwion->driver->del(gwion->vm, di);
+ xfree(gwion->driver);
plug_end(gwion);
free_env(gwion->env);
free_emitter(gwion->emit);
-#include <stdlib.h>
-#include <stdio.h>
#include <signal.h>
#include "gwion_util.h"
#include "gwion_ast.h"
#include "env.h"
#include "compile.h"
#include "driver.h"
-#include "arg.h"
-#include "engine.h"
-
-#ifdef VMBENCH
-#include <time.h>
-#include <bsd/sys/time.h>
-#define VMBENCH_INI \
- struct timespec ini, end, ret; \
- clock_gettime(CLOCK_THREAD_CPUTIME_ID, &ini);
-#define VMBENCH_END \
- clock_gettime(CLOCK_THREAD_CPUTIME_ID, &end); \
- timespecsub(&end, &ini, &ret); \
- printf("timespec %lu.%09lu\n", ret.tv_sec, ret.tv_nsec);
-#else
-#define VMBENCH_INI
-#define VMBENCH_END
-#endif
-
#include "gwion.h"
+#include "arg.h"
-extern void parse_args(Arg*, DriverInfo*);
-static VM* some_static_vm;
+static struct Gwion_ gwion;
static void sig(int unused __attribute__((unused))) {
- some_static_vm->is_running = 0;
+ gwion.vm->is_running = 0;
}
int main(int argc, char** argv) {
- Driver d = { };
Arg arg = { .argc = argc, .argv=argv, .loop=-1 };
DriverInfo di = { 2, 2, 2,
48000, 256, 3, "default:CARD=CODEC", 0, 0, D_FUNC, vm_run, 0, 0};
-
- arg_init(&arg);
-
-//#define STD_BUFSZ 10000
-//char buf[STD_BUFSZ];
-//setvbuf(stdout, buf, _IOFBF, STD_BUFSZ);
-//char buf2[STD_BUFSZ];
-//setvbuf(stderr, buf2, _IOFBF, STD_BUFSZ);
-
- parse_args(&arg, &di);
- if(arg.quit) {
+//#define BUFSZ 10000
+//char outbuf[BUFSZ], errbuf[BUFSZ];
+//setvbuf(stdout, outbuf, _IOFBF, BUFSZ);
+//setvbuf(stderr, errbuf, _IOFBF, BUFSZ);
+ if(parse_args(&arg, &di)) {
arg_release(&arg);
return 0;
}
+ gwion_init(&gwion, &arg.lib);
signal(SIGINT, sig);
signal(SIGTERM, sig);
- struct Gwion_ gwion;
- gwion_init(&gwion, &arg.lib);
- some_static_vm = gwion.vm;
- di.func(&d);
- shreduler_set_loop(gwion.vm->shreduler, arg.loop);
- if(d.ini(gwion.vm, &di) > 0 && (gwion.vm->bbq = new_bbq(&di)) &&
- type_engine_init(gwion.vm, &gwion.plug[GWPLUG_IMPORT]) > 0) {
+ if(gwion_audio(&gwion, &di) && gwion_engine(&gwion)) {
module_ini(&gwion, &arg.mod);
for(m_uint i = 0; i < vector_size(&arg.add); i++)
compile_filename(&gwion, (m_str)vector_at(&arg.add, i));
- gwion.vm->is_running = 1;
- VMBENCH_INI
- d.run(gwion.vm, &di);
- VMBENCH_END
+ shreduler_set_loop(gwion.vm->shreduler, arg.loop);
+ gwion_run(&gwion, &di);
}
arg_release(&arg);
- if(d.del)
- d.del(gwion.vm, &di);
- gwion_release(&gwion);
+ gwion_release(&gwion, &di);
return 0;
}