]> Nishi Git Mirror - gwion.git/commitdiff
:art: Improve main and args
authorfennecdjay <astor.jeremie@wanadoo.fr>
Fri, 22 Feb 2019 15:17:47 +0000 (16:17 +0100)
committerfennecdjay <astor.jeremie@wanadoo.fr>
Fri, 22 Feb 2019 15:17:47 +0000 (16:17 +0100)
include/arg.h
include/gwion.h
src/arg.c
src/gwion.c
src/main.c

index 2e4d19dfe955ca4bf1453481e5c80decdd7d58fb..46f488c377601ae05685c34f925f4b211d7087c3 100644 (file)
@@ -7,11 +7,9 @@ typedef struct {
   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
index 7d8c785566b66c6cdb2210572f2cf99f6261b7eb..06c6eaff06ec7c43dab7bbf78fb0d62c306e8a23 100644 (file)
@@ -2,11 +2,11 @@
 #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
@@ -16,5 +16,8 @@ struct Gwion_ {
   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
index 9564d8eb964fff36173a9341e13a54ce478a62b6..6d51f2f0023573da7f2a844fbd92e06bea29630d 100644 (file)
--- a/src/arg.c
+++ b/src/arg.c
@@ -1,22 +1,17 @@
-#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) {
@@ -82,16 +77,17 @@ static const char usage[] =
 ;
 
 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);
   }
 }
 
@@ -137,8 +133,10 @@ ANN static void arg_drvr(DriverInfo* di, const int i) {
   }
 }
 
-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) {
@@ -150,7 +148,7 @@ ANN void parse_args(Arg* arg, DriverInfo* di) {
         exit(1);
         break;
       case 'q':
-        arg->quit  = 1;
+        quit  = 1;
         break;
       case 'l':
         arg->loop = strtol(optarg, NULL, 10) > 0 ? 1 : -1;
@@ -166,4 +164,5 @@ ANN void parse_args(Arg* arg, DriverInfo* di) {
     }
   }
   arg_add(arg);
+  return quit;
 }
index b624afd146a7ee0e6bcc8101b664040ac411e8cc..3a149cfd0ca4b0d6ccc56c402b2801d17713b7a5 100644 (file)
@@ -5,9 +5,24 @@
 #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();
@@ -15,10 +30,33 @@ ANN void gwion_init(const Gwion gwion, const Vector args) {
   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);
index 4cc65fbd8c2aa6cb46e17e3fe07c42fa5494b4de..973e95f775e94eace54edd2cc89ea7537a1f1eba 100644 (file)
@@ -1,5 +1,3 @@
-#include <stdlib.h>
-#include <stdio.h>
 #include <signal.h>
 #include "gwion_util.h"
 #include "gwion_ast.h"
@@ -8,72 +6,38 @@
 #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;
 }