]> Nishi Git Mirror - gwion.git/commitdiff
:art: Inital *virtual time* commit
authorJérémie Astor <fennecdjay@gmail.com>
Sun, 10 Apr 2022 21:24:03 +0000 (23:24 +0200)
committerJérémie Astor <fennecdjay@gmail.com>
Sun, 10 Apr 2022 21:24:03 +0000 (23:24 +0200)
include/ugen.h
include/vm.h
src/gwion.c
src/lib/shred.c
src/lib/ugen.c
src/vm/vm.c

index afa2adbda3c87a4d5ddd2b6b1bd88e45c4f924cc..8214f27e754399661a6ad1d2926cbf284c9e1444 100644 (file)
@@ -46,4 +46,5 @@ ANN void ugen_gen(const struct Gwion_ *, const UGen, const f_tick, void *,
                   const m_bool);
 ANN void ugen_connect(const UGen lhs, const UGen rhs);
 ANN void ugen_disconnect(const UGen lhs, const UGen rhs);
+ANN void compute_mono(const UGen u);
 #endif
index 869559ec94756e3b753a609491203ec45dde72b8..515e2b671e42419b5651c916c64ab515ba011176 100644 (file)
@@ -127,6 +127,7 @@ void vm_prepare(const VM *vm, m_bit*) __attribute__((hot));
 ANN static inline void vm_run(const VM *vm) {
   vm_prepare(vm, NULL);
 }
+ANN void vm_run_audio(const VM *vm);
 ANEW VM * new_vm(MemPool, const bool);
 ANN void  vm_lock(VM const *);
 ANN void  vm_unlock(VM const *);
index b45ba76f459925e1e1b38aea49a4d4a9a92fd43d..9fca9311e246c01a88af5c57d3845c14d23f0d0a 100644 (file)
@@ -17,6 +17,7 @@
 #include "object.h" // fork_clean
 #include "pass.h"   // fork_clean
 #include "shreduler_private.h"
+#include "ugen.h"
 
 ANN m_bool gwion_audio(const Gwion gwion) {
   Driver *const di = gwion->vm->bbq;
@@ -35,9 +36,18 @@ ANN static VM_Shred gwion_cleaner(const Gwion gwion) {
   return shred;
 }
 
+ANN void gwion_cpy_blackhole(const Gwion gwion) {
+  dummy_driver(gwion->vm->bbq->driver);
+  const M_Object o  = new_M_UGen(gwion);
+  const UGen     u  = UGEN(o);
+  ugen_ini(gwion, u, 1, 1);
+  ugen_gen(gwion, u, compute_mono, o, 0);
+  vector_add(&gwion->vm->ugen, (vtype)u);
+}
+
 ANN VM *gwion_cpy(const VM *src) {
   const Gwion gwion  = mp_calloc(src->gwion->mp, Gwion);
-  gwion->vm          = new_vm(src->gwion->mp, false);
+  gwion->vm          = new_vm(src->gwion->mp, true);
   gwion->vm->gwion   = gwion;
   gwion->vm->bbq->si = soundinfo_cpy(src->gwion->mp, src->bbq->si);
   gwion->emit        = src->gwion->emit;
@@ -46,6 +56,7 @@ ANN VM *gwion_cpy(const VM *src) {
   gwion->st          = src->gwion->st;
   gwion->mp          = src->gwion->mp;
   gwion->type        = src->gwion->type;
+  gwion_cpy_blackhole(gwion);
   return gwion->vm;
 }
 
@@ -118,6 +129,9 @@ ANN void gwion_run(const Gwion gwion) {
 
 ANN static inline void free_gwion_cpy(const Gwion gwion, const VM_Shred shred) {
   gwion_end_child(shred, gwion);
+  const UGen u = (UGen)vector_front(&gwion->vm->ugen);
+  M_Object blackhole = u->module.gen.data;
+  release(blackhole, shred);
   free_vm(gwion->vm);
   free_gwiondata_cpy(gwion->mp, gwion->data);
   mp_free(gwion->mp, Gwion, gwion);
index 441d421c7c22b89482f63ea3577cf216423fb241..0d3f5100dffa2b1ddd0caecc4782cf0776fe215b 100644 (file)
@@ -13,6 +13,7 @@
 #include "emit.h"
 #include "specialid.h"
 #include "gwi.h"
+#include "ugen.h"
 
 static m_int o_fork_thread, o_shred_cancel,
     o_fork_done, o_fork_ev;
@@ -245,6 +246,15 @@ static MFUN(shred_now) {
   MUTEX_UNLOCK(vm->shreduler->mutex);
 }
 
+static MFUN(shred_blackhole) {
+  VM *vm = ME(o)->info->vm;
+  const UGen u = (UGen)vector_front(&vm->ugen);
+  M_Object blackhole = u->module.gen.data;
+  // adding ref for the moment
+  blackhole->ref++;
+  *(void**)RETURN = u->module.gen.data;
+}
+
 struct ThreadLauncher {
   MUTEX_TYPE       mutex;
   THREAD_COND_TYPE cond;
@@ -273,7 +283,7 @@ static ANN THREAD_FUNC(fork_run) {
 // THREAD_COND_CLEANUP(tl->cond);
 //  MUTEX_CLEANUP(tl->mutex);
   while (fork_running(vm, me)) {
-    vm_run(vm);
+    vm_run_audio(vm);
     ++vm->bbq->pos;
   }
   gwion_end_child(ME(me), vm->gwion);
@@ -395,6 +405,11 @@ GWION_IMPORT(shred) {
   GWI_BB(gwi_func_end(gwi, shred_unlock, ae_flag_none))
   gwi_func_ini(gwi, "float", "get_now");
   GWI_BB(gwi_func_end(gwi, shred_now, ae_flag_none))
+
+  gwi_func_ini(gwi, "UGen", "get_blackhole");
+  GWI_BB(gwi_func_end(gwi, shred_blackhole, ae_flag_none))
+
+
   GWI_BB(gwi_class_end(gwi))
   SET_FLAG(t_shred, abstract | ae_flag_final);
   gwi->gwion->type[et_shred] = t_shred;
index 417e693a61cbfa53c46647b95f4c3916445ed476..4c256e4cfcd4101fd03a1296faa9097efd36fef5 100644 (file)
@@ -281,7 +281,7 @@ describe_connect_instr(Ugen, Connect, UGEN(rhs), ) describe_connect_instr(
                                                 UGEN(rhs)->module.gen.trig,
                                                 TRIG_EX)
 
-                                                static CTOR(ugen_ctor) {
+static CTOR(ugen_ctor) {
   UGEN(o) = new_UGen(shred->info->mp);
   vector_add(&shred->info->vm->ugen, (vtype)UGEN(o));
 }
@@ -365,7 +365,8 @@ ANN static UGen add_ugen(const Gwi gwi, struct ugen_importer *imp) {
   const M_Object o  = new_M_UGen(gwi->gwion);
   const UGen     u  = UGEN(o);
   ugen_ini(vm->gwion, u, imp->nchan, imp->nchan);
-  ugen_gen(vm->gwion, u, imp->tick, (void *)imp->vm, 0);
+//  ugen_gen(vm->gwion, u, imp->tick, (void *)imp->vm, 0);
+  ugen_gen(vm->gwion, u, imp->tick, o, 0);
   vector_add(&vm->ugen, (vtype)u);
   gwi_item_ini(gwi, "UGen", imp->name);
   gwi_item_end(gwi, ae_flag_const, obj, o);
index 5ec758f992f7a8cece1f1cec8dbdb3e48d6c2a5a..deb2b8eb0aa8920172c0769cd882dad3773430a3 100644 (file)
@@ -1600,7 +1600,7 @@ ANN void next_bbq_pos(const VM *vm) {
   MUTEX_UNLOCK(vm->shreduler->mutex);
 }
 
-static void vm_run_audio(const VM *vm) {
+ANN void vm_run_audio(const VM *vm) {
   vm_run(vm);
   vm_ugen_init(vm);
 }