From b5f062d1f931bcaef356430db525842a57a67937 Mon Sep 17 00:00:00 2001 From: Zack Lee Date: Mon, 17 Dec 2018 21:29:38 +0900 Subject: [PATCH] v2.0.4 update --- CHANGES.txt | 7 +- Linux64External/src/ofeliaBindings.cpp | 29 ++-- Linux64External/src/ofeliaBindings.h | 17 ++- Linux64External/src/ofeliaBindings.i | 4 +- LinuxArmv6External/src/ofeliaBindings.cpp | 29 ++-- LinuxArmv6External/src/ofeliaBindings.h | 17 ++- LinuxArmv6External/src/ofeliaBindings.i | 4 +- WindowsExternal/src/ofeliaBindings.cpp | 29 ++-- WindowsExternal/src/ofeliaBindings.h | 17 ++- WindowsExternal/src/ofeliaBindings.i | 4 +- macOSExternal/src/ofeliaBindings.cpp | 29 ++-- macOSExternal/src/ofeliaBindings.h | 17 ++- macOSExternal/src/ofeliaBindings.i | 4 +- ofelia/CHANGES.txt | 7 +- ofelia/examples/pd/misc/main.pd | 173 ++++++++++++++++++++++ ofelia/src/ofeliaBindings.cpp | 29 ++-- ofelia/src/ofeliaBindings.h | 17 ++- ofelia/src/ofeliaBindings.i | 4 +- 18 files changed, 323 insertions(+), 114 deletions(-) create mode 100644 ofelia/examples/pd/misc/main.pd diff --git a/CHANGES.txt b/CHANGES.txt index aade8ac9..712adddd 100755 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,8 +1,11 @@ v2.0.4: 17 Dec 2018 -* fixed setTable method from Array class not working on Windows -* fixed crash issue when outputting large sized table through outlet +* fixed Array:setTable() bug on Windows +* renamed Array:getTable() and Array:setTable() to Array:get() and Array:set() +* added additional argument to Array:get() and Array:set() to set onset value +* fixed crashing issue when returning a large sized table as a list * disabled printing the bug fix version on the pd console +* added "examples/pd/misc" example to show various pd objects emulation v2.0.3: 23 Nov 2018 diff --git a/Linux64External/src/ofeliaBindings.cpp b/Linux64External/src/ofeliaBindings.cpp index cfcd27ba..74b95074 100644 --- a/Linux64External/src/ofeliaBindings.cpp +++ b/Linux64External/src/ofeliaBindings.cpp @@ -4002,23 +4002,24 @@ static int _wrap_Array_setAt(lua_State* L) { int SWIG_arg = 0; Array *arg1 = (Ar if (!SWIG_IsOK(SWIG_ConvertPtr(L,1,(void**)&arg1,SWIGTYPE_p_Array,0))){ SWIG_fail_ptr("Array_setAt",1,SWIGTYPE_p_Array); } arg2 = (int)lua_tonumber(L, 2); { arg3 = static_cast(lua_tonumber(L, 3)); } (arg1)->setAt(arg2,arg3); return SWIG_arg; if(0) SWIG_fail; fail: lua_error(L); return SWIG_arg; } -static int _wrap_Array_getTable(lua_State* L) { int SWIG_arg = 0; Array *arg1 = (Array *) 0 ; t_word **arg2 = (t_word **) 0 ; - int *arg3 = (int *) 0 ; t_word *tmp2 = nullptr ; int tsize2 = 0 ; arg2 = &tmp2; arg3 = &tsize2; - SWIG_check_num_args("Array::getTable",1,1) if(!SWIG_isptrtype(L,1)) SWIG_fail_arg("Array::getTable",1,"Array *"); - if (!SWIG_IsOK(SWIG_ConvertPtr(L,1,(void**)&arg1,SWIGTYPE_p_Array,0))){ SWIG_fail_ptr("Array_getTable",1,SWIGTYPE_p_Array); } - (arg1)->getTable(arg2,arg3); { lua_newtable(L); for (int i = 0; i < *arg3; ++i) { +static int _wrap_Array_get(lua_State* L) { int SWIG_arg = 0; Array *arg1 = (Array *) 0 ; t_word **arg2 = (t_word **) 0 ; + int *arg3 = (int *) 0 ; int arg4 ; t_word *tmp2 = nullptr ; int tsize2 = 0 ; arg2 = &tmp2; arg3 = &tsize2; + SWIG_check_num_args("Array::get",2,2) if(!SWIG_isptrtype(L,1)) SWIG_fail_arg("Array::get",1,"Array *"); + if(!lua_isnumber(L,2)) SWIG_fail_arg("Array::get",2,"int"); + if (!SWIG_IsOK(SWIG_ConvertPtr(L,1,(void**)&arg1,SWIGTYPE_p_Array,0))){ SWIG_fail_ptr("Array_get",1,SWIGTYPE_p_Array); } + arg4 = (int)lua_tonumber(L, 2); (arg1)->get(arg2,arg3,arg4); { lua_newtable(L); for (int i = 0; i < *arg3; ++i) { lua_pushnumber(L, static_cast((*arg2)[i].w_float)); lua_rawseti(L, -2, i + 1); } SWIG_arg++; } return SWIG_arg; if(0) SWIG_fail; fail: lua_error(L); return SWIG_arg; } -static int _wrap_Array_setTable(lua_State* L) { int SWIG_arg = 0; Array *arg1 = (Array *) 0 ; int arg2 ; - t_floatarg *arg3 = (t_floatarg *) 0 ; SWIG_check_num_args("Array::setTable",2,2) - if(!SWIG_isptrtype(L,1)) SWIG_fail_arg("Array::setTable",1,"Array *"); - if (!SWIG_IsOK(SWIG_ConvertPtr(L,1,(void**)&arg1,SWIGTYPE_p_Array,0))){ SWIG_fail_ptr("Array_setTable",1,SWIGTYPE_p_Array); } - { if (!lua_istable(L, 2)) SWIG_exception(SWIG_RuntimeError, "argument mismatch: table expected"); lua_len(L, 2); +static int _wrap_Array_set(lua_State* L) { int SWIG_arg = 0; Array *arg1 = (Array *) 0 ; int arg2 ; + t_floatarg *arg3 = (t_floatarg *) 0 ; int arg4 ; SWIG_check_num_args("Array::set",3,3) + if(!SWIG_isptrtype(L,1)) SWIG_fail_arg("Array::set",1,"Array *"); if(!lua_isnumber(L,3)) SWIG_fail_arg("Array::set",3,"int"); + if (!SWIG_IsOK(SWIG_ConvertPtr(L,1,(void**)&arg1,SWIGTYPE_p_Array,0))){ SWIG_fail_ptr("Array_set",1,SWIGTYPE_p_Array); } { + if (!lua_istable(L, 2)) SWIG_exception(SWIG_RuntimeError, "argument mismatch: table expected"); lua_len(L, 2); arg2 = static_cast(lua_tointeger(L, -1)); if (!arg2) SWIG_exception(SWIG_RuntimeError, "table is empty"); arg3 = static_cast(getbytes(arg2 * sizeof(t_float))); for (int i = 0; i < arg2; ++i) { lua_pushinteger(L, i + 1); lua_gettable(L, 2); if (lua_isnumber(L, -1)) arg3[i] = static_cast(lua_tonumber(L, -1)); else - SWIG_exception(SWIG_RuntimeError, "unhandled argument type"); } } (arg1)->setTable(arg2,arg3); { - freebytes(arg3, arg2 * sizeof(t_float)); } return SWIG_arg; if(0) SWIG_fail; fail: { + SWIG_exception(SWIG_RuntimeError, "unhandled argument type"); } } arg4 = (int)lua_tonumber(L, 3); + (arg1)->set(arg2,arg3,arg4); { freebytes(arg3, arg2 * sizeof(t_float)); } return SWIG_arg; if(0) SWIG_fail; fail: { freebytes(arg3, arg2 * sizeof(t_float)); } lua_error(L); return SWIG_arg; } static int _wrap_Array_getSize(lua_State* L) { int SWIG_arg = 0; Array *arg1 = (Array *) 0 ; int result; SWIG_check_num_args("Array::getSize",1,1) if(!SWIG_isptrtype(L,1)) SWIG_fail_arg("Array::getSize",1,"Array *"); @@ -4050,8 +4051,8 @@ static swig_lua_method swig_Array_methods[]= { { "exists", _wrap_Array_exists}, { "getAt", _wrap_Array_getAt}, { "setAt", _wrap_Array_setAt}, - { "getTable", _wrap_Array_getTable}, - { "setTable", _wrap_Array_setTable}, + { "get", _wrap_Array_get}, + { "set", _wrap_Array_set}, { "getSize", _wrap_Array_getSize}, { "setSize", _wrap_Array_setSize}, {0,0} diff --git a/Linux64External/src/ofeliaBindings.h b/Linux64External/src/ofeliaBindings.h index 41b83d42..7d6ea4ea 100644 --- a/Linux64External/src/ofeliaBindings.h +++ b/Linux64External/src/ofeliaBindings.h @@ -931,23 +931,28 @@ class Array garray_redraw(a); } } - void getTable(t_word **vecp, int *sizep) + void get(t_word **vecp, int *sizep, int onset) { t_garray *a; int size; t_word *vec; if (exists(&a) && getData(a, &size, &vec)) { - *vecp = vec; - *sizep = size; + if (onset < 0) onset = 0; + *vecp = vec + onset; + *sizep = size - onset; } } - void setTable(int n, t_floatarg *f) + void set(int n, t_floatarg *f, int onset) { t_garray *a; int size; t_word *vec; if (exists(&a) && getData(a, &size, &vec)) { + if (onset < 0) onset = 0; for (int i = 0; i < n; ++i) - vec[i].w_float = f[i]; - garray_resize_long(a, long(n)); + { + int io = i + onset; + if (io < size) vec[io].w_float = f[i]; + else break; + } garray_redraw(a); } } diff --git a/Linux64External/src/ofeliaBindings.i b/Linux64External/src/ofeliaBindings.i index ac7c8ed3..e168bd1e 100644 --- a/Linux64External/src/ofeliaBindings.i +++ b/Linux64External/src/ofeliaBindings.i @@ -261,7 +261,7 @@ static void lua_len(lua_State *L, int i) freebytes(*$1, 2 * sizeof(int)); } -/* used for Array:getTable() */ +/* used for Array:get() */ %typemap(in, numinputs = 0) (t_word **vecp, int *sizep) (t_word *tmp = nullptr, int tsize = 0) %{ @@ -279,7 +279,7 @@ static void lua_len(lua_State *L, int i) SWIG_arg++; } -/* used for Inlet:setFloatInlets() and Array:setTable() */ +/* used for Inlet:setFloatInlets() and Array:set() */ %typemap(in) (int n, t_floatarg *f) { if (!lua_istable(L, $input)) diff --git a/LinuxArmv6External/src/ofeliaBindings.cpp b/LinuxArmv6External/src/ofeliaBindings.cpp index cfcd27ba..74b95074 100644 --- a/LinuxArmv6External/src/ofeliaBindings.cpp +++ b/LinuxArmv6External/src/ofeliaBindings.cpp @@ -4002,23 +4002,24 @@ static int _wrap_Array_setAt(lua_State* L) { int SWIG_arg = 0; Array *arg1 = (Ar if (!SWIG_IsOK(SWIG_ConvertPtr(L,1,(void**)&arg1,SWIGTYPE_p_Array,0))){ SWIG_fail_ptr("Array_setAt",1,SWIGTYPE_p_Array); } arg2 = (int)lua_tonumber(L, 2); { arg3 = static_cast(lua_tonumber(L, 3)); } (arg1)->setAt(arg2,arg3); return SWIG_arg; if(0) SWIG_fail; fail: lua_error(L); return SWIG_arg; } -static int _wrap_Array_getTable(lua_State* L) { int SWIG_arg = 0; Array *arg1 = (Array *) 0 ; t_word **arg2 = (t_word **) 0 ; - int *arg3 = (int *) 0 ; t_word *tmp2 = nullptr ; int tsize2 = 0 ; arg2 = &tmp2; arg3 = &tsize2; - SWIG_check_num_args("Array::getTable",1,1) if(!SWIG_isptrtype(L,1)) SWIG_fail_arg("Array::getTable",1,"Array *"); - if (!SWIG_IsOK(SWIG_ConvertPtr(L,1,(void**)&arg1,SWIGTYPE_p_Array,0))){ SWIG_fail_ptr("Array_getTable",1,SWIGTYPE_p_Array); } - (arg1)->getTable(arg2,arg3); { lua_newtable(L); for (int i = 0; i < *arg3; ++i) { +static int _wrap_Array_get(lua_State* L) { int SWIG_arg = 0; Array *arg1 = (Array *) 0 ; t_word **arg2 = (t_word **) 0 ; + int *arg3 = (int *) 0 ; int arg4 ; t_word *tmp2 = nullptr ; int tsize2 = 0 ; arg2 = &tmp2; arg3 = &tsize2; + SWIG_check_num_args("Array::get",2,2) if(!SWIG_isptrtype(L,1)) SWIG_fail_arg("Array::get",1,"Array *"); + if(!lua_isnumber(L,2)) SWIG_fail_arg("Array::get",2,"int"); + if (!SWIG_IsOK(SWIG_ConvertPtr(L,1,(void**)&arg1,SWIGTYPE_p_Array,0))){ SWIG_fail_ptr("Array_get",1,SWIGTYPE_p_Array); } + arg4 = (int)lua_tonumber(L, 2); (arg1)->get(arg2,arg3,arg4); { lua_newtable(L); for (int i = 0; i < *arg3; ++i) { lua_pushnumber(L, static_cast((*arg2)[i].w_float)); lua_rawseti(L, -2, i + 1); } SWIG_arg++; } return SWIG_arg; if(0) SWIG_fail; fail: lua_error(L); return SWIG_arg; } -static int _wrap_Array_setTable(lua_State* L) { int SWIG_arg = 0; Array *arg1 = (Array *) 0 ; int arg2 ; - t_floatarg *arg3 = (t_floatarg *) 0 ; SWIG_check_num_args("Array::setTable",2,2) - if(!SWIG_isptrtype(L,1)) SWIG_fail_arg("Array::setTable",1,"Array *"); - if (!SWIG_IsOK(SWIG_ConvertPtr(L,1,(void**)&arg1,SWIGTYPE_p_Array,0))){ SWIG_fail_ptr("Array_setTable",1,SWIGTYPE_p_Array); } - { if (!lua_istable(L, 2)) SWIG_exception(SWIG_RuntimeError, "argument mismatch: table expected"); lua_len(L, 2); +static int _wrap_Array_set(lua_State* L) { int SWIG_arg = 0; Array *arg1 = (Array *) 0 ; int arg2 ; + t_floatarg *arg3 = (t_floatarg *) 0 ; int arg4 ; SWIG_check_num_args("Array::set",3,3) + if(!SWIG_isptrtype(L,1)) SWIG_fail_arg("Array::set",1,"Array *"); if(!lua_isnumber(L,3)) SWIG_fail_arg("Array::set",3,"int"); + if (!SWIG_IsOK(SWIG_ConvertPtr(L,1,(void**)&arg1,SWIGTYPE_p_Array,0))){ SWIG_fail_ptr("Array_set",1,SWIGTYPE_p_Array); } { + if (!lua_istable(L, 2)) SWIG_exception(SWIG_RuntimeError, "argument mismatch: table expected"); lua_len(L, 2); arg2 = static_cast(lua_tointeger(L, -1)); if (!arg2) SWIG_exception(SWIG_RuntimeError, "table is empty"); arg3 = static_cast(getbytes(arg2 * sizeof(t_float))); for (int i = 0; i < arg2; ++i) { lua_pushinteger(L, i + 1); lua_gettable(L, 2); if (lua_isnumber(L, -1)) arg3[i] = static_cast(lua_tonumber(L, -1)); else - SWIG_exception(SWIG_RuntimeError, "unhandled argument type"); } } (arg1)->setTable(arg2,arg3); { - freebytes(arg3, arg2 * sizeof(t_float)); } return SWIG_arg; if(0) SWIG_fail; fail: { + SWIG_exception(SWIG_RuntimeError, "unhandled argument type"); } } arg4 = (int)lua_tonumber(L, 3); + (arg1)->set(arg2,arg3,arg4); { freebytes(arg3, arg2 * sizeof(t_float)); } return SWIG_arg; if(0) SWIG_fail; fail: { freebytes(arg3, arg2 * sizeof(t_float)); } lua_error(L); return SWIG_arg; } static int _wrap_Array_getSize(lua_State* L) { int SWIG_arg = 0; Array *arg1 = (Array *) 0 ; int result; SWIG_check_num_args("Array::getSize",1,1) if(!SWIG_isptrtype(L,1)) SWIG_fail_arg("Array::getSize",1,"Array *"); @@ -4050,8 +4051,8 @@ static swig_lua_method swig_Array_methods[]= { { "exists", _wrap_Array_exists}, { "getAt", _wrap_Array_getAt}, { "setAt", _wrap_Array_setAt}, - { "getTable", _wrap_Array_getTable}, - { "setTable", _wrap_Array_setTable}, + { "get", _wrap_Array_get}, + { "set", _wrap_Array_set}, { "getSize", _wrap_Array_getSize}, { "setSize", _wrap_Array_setSize}, {0,0} diff --git a/LinuxArmv6External/src/ofeliaBindings.h b/LinuxArmv6External/src/ofeliaBindings.h index 41b83d42..7d6ea4ea 100644 --- a/LinuxArmv6External/src/ofeliaBindings.h +++ b/LinuxArmv6External/src/ofeliaBindings.h @@ -931,23 +931,28 @@ class Array garray_redraw(a); } } - void getTable(t_word **vecp, int *sizep) + void get(t_word **vecp, int *sizep, int onset) { t_garray *a; int size; t_word *vec; if (exists(&a) && getData(a, &size, &vec)) { - *vecp = vec; - *sizep = size; + if (onset < 0) onset = 0; + *vecp = vec + onset; + *sizep = size - onset; } } - void setTable(int n, t_floatarg *f) + void set(int n, t_floatarg *f, int onset) { t_garray *a; int size; t_word *vec; if (exists(&a) && getData(a, &size, &vec)) { + if (onset < 0) onset = 0; for (int i = 0; i < n; ++i) - vec[i].w_float = f[i]; - garray_resize_long(a, long(n)); + { + int io = i + onset; + if (io < size) vec[io].w_float = f[i]; + else break; + } garray_redraw(a); } } diff --git a/LinuxArmv6External/src/ofeliaBindings.i b/LinuxArmv6External/src/ofeliaBindings.i index ac7c8ed3..e168bd1e 100644 --- a/LinuxArmv6External/src/ofeliaBindings.i +++ b/LinuxArmv6External/src/ofeliaBindings.i @@ -261,7 +261,7 @@ static void lua_len(lua_State *L, int i) freebytes(*$1, 2 * sizeof(int)); } -/* used for Array:getTable() */ +/* used for Array:get() */ %typemap(in, numinputs = 0) (t_word **vecp, int *sizep) (t_word *tmp = nullptr, int tsize = 0) %{ @@ -279,7 +279,7 @@ static void lua_len(lua_State *L, int i) SWIG_arg++; } -/* used for Inlet:setFloatInlets() and Array:setTable() */ +/* used for Inlet:setFloatInlets() and Array:set() */ %typemap(in) (int n, t_floatarg *f) { if (!lua_istable(L, $input)) diff --git a/WindowsExternal/src/ofeliaBindings.cpp b/WindowsExternal/src/ofeliaBindings.cpp index cfcd27ba..74b95074 100644 --- a/WindowsExternal/src/ofeliaBindings.cpp +++ b/WindowsExternal/src/ofeliaBindings.cpp @@ -4002,23 +4002,24 @@ static int _wrap_Array_setAt(lua_State* L) { int SWIG_arg = 0; Array *arg1 = (Ar if (!SWIG_IsOK(SWIG_ConvertPtr(L,1,(void**)&arg1,SWIGTYPE_p_Array,0))){ SWIG_fail_ptr("Array_setAt",1,SWIGTYPE_p_Array); } arg2 = (int)lua_tonumber(L, 2); { arg3 = static_cast(lua_tonumber(L, 3)); } (arg1)->setAt(arg2,arg3); return SWIG_arg; if(0) SWIG_fail; fail: lua_error(L); return SWIG_arg; } -static int _wrap_Array_getTable(lua_State* L) { int SWIG_arg = 0; Array *arg1 = (Array *) 0 ; t_word **arg2 = (t_word **) 0 ; - int *arg3 = (int *) 0 ; t_word *tmp2 = nullptr ; int tsize2 = 0 ; arg2 = &tmp2; arg3 = &tsize2; - SWIG_check_num_args("Array::getTable",1,1) if(!SWIG_isptrtype(L,1)) SWIG_fail_arg("Array::getTable",1,"Array *"); - if (!SWIG_IsOK(SWIG_ConvertPtr(L,1,(void**)&arg1,SWIGTYPE_p_Array,0))){ SWIG_fail_ptr("Array_getTable",1,SWIGTYPE_p_Array); } - (arg1)->getTable(arg2,arg3); { lua_newtable(L); for (int i = 0; i < *arg3; ++i) { +static int _wrap_Array_get(lua_State* L) { int SWIG_arg = 0; Array *arg1 = (Array *) 0 ; t_word **arg2 = (t_word **) 0 ; + int *arg3 = (int *) 0 ; int arg4 ; t_word *tmp2 = nullptr ; int tsize2 = 0 ; arg2 = &tmp2; arg3 = &tsize2; + SWIG_check_num_args("Array::get",2,2) if(!SWIG_isptrtype(L,1)) SWIG_fail_arg("Array::get",1,"Array *"); + if(!lua_isnumber(L,2)) SWIG_fail_arg("Array::get",2,"int"); + if (!SWIG_IsOK(SWIG_ConvertPtr(L,1,(void**)&arg1,SWIGTYPE_p_Array,0))){ SWIG_fail_ptr("Array_get",1,SWIGTYPE_p_Array); } + arg4 = (int)lua_tonumber(L, 2); (arg1)->get(arg2,arg3,arg4); { lua_newtable(L); for (int i = 0; i < *arg3; ++i) { lua_pushnumber(L, static_cast((*arg2)[i].w_float)); lua_rawseti(L, -2, i + 1); } SWIG_arg++; } return SWIG_arg; if(0) SWIG_fail; fail: lua_error(L); return SWIG_arg; } -static int _wrap_Array_setTable(lua_State* L) { int SWIG_arg = 0; Array *arg1 = (Array *) 0 ; int arg2 ; - t_floatarg *arg3 = (t_floatarg *) 0 ; SWIG_check_num_args("Array::setTable",2,2) - if(!SWIG_isptrtype(L,1)) SWIG_fail_arg("Array::setTable",1,"Array *"); - if (!SWIG_IsOK(SWIG_ConvertPtr(L,1,(void**)&arg1,SWIGTYPE_p_Array,0))){ SWIG_fail_ptr("Array_setTable",1,SWIGTYPE_p_Array); } - { if (!lua_istable(L, 2)) SWIG_exception(SWIG_RuntimeError, "argument mismatch: table expected"); lua_len(L, 2); +static int _wrap_Array_set(lua_State* L) { int SWIG_arg = 0; Array *arg1 = (Array *) 0 ; int arg2 ; + t_floatarg *arg3 = (t_floatarg *) 0 ; int arg4 ; SWIG_check_num_args("Array::set",3,3) + if(!SWIG_isptrtype(L,1)) SWIG_fail_arg("Array::set",1,"Array *"); if(!lua_isnumber(L,3)) SWIG_fail_arg("Array::set",3,"int"); + if (!SWIG_IsOK(SWIG_ConvertPtr(L,1,(void**)&arg1,SWIGTYPE_p_Array,0))){ SWIG_fail_ptr("Array_set",1,SWIGTYPE_p_Array); } { + if (!lua_istable(L, 2)) SWIG_exception(SWIG_RuntimeError, "argument mismatch: table expected"); lua_len(L, 2); arg2 = static_cast(lua_tointeger(L, -1)); if (!arg2) SWIG_exception(SWIG_RuntimeError, "table is empty"); arg3 = static_cast(getbytes(arg2 * sizeof(t_float))); for (int i = 0; i < arg2; ++i) { lua_pushinteger(L, i + 1); lua_gettable(L, 2); if (lua_isnumber(L, -1)) arg3[i] = static_cast(lua_tonumber(L, -1)); else - SWIG_exception(SWIG_RuntimeError, "unhandled argument type"); } } (arg1)->setTable(arg2,arg3); { - freebytes(arg3, arg2 * sizeof(t_float)); } return SWIG_arg; if(0) SWIG_fail; fail: { + SWIG_exception(SWIG_RuntimeError, "unhandled argument type"); } } arg4 = (int)lua_tonumber(L, 3); + (arg1)->set(arg2,arg3,arg4); { freebytes(arg3, arg2 * sizeof(t_float)); } return SWIG_arg; if(0) SWIG_fail; fail: { freebytes(arg3, arg2 * sizeof(t_float)); } lua_error(L); return SWIG_arg; } static int _wrap_Array_getSize(lua_State* L) { int SWIG_arg = 0; Array *arg1 = (Array *) 0 ; int result; SWIG_check_num_args("Array::getSize",1,1) if(!SWIG_isptrtype(L,1)) SWIG_fail_arg("Array::getSize",1,"Array *"); @@ -4050,8 +4051,8 @@ static swig_lua_method swig_Array_methods[]= { { "exists", _wrap_Array_exists}, { "getAt", _wrap_Array_getAt}, { "setAt", _wrap_Array_setAt}, - { "getTable", _wrap_Array_getTable}, - { "setTable", _wrap_Array_setTable}, + { "get", _wrap_Array_get}, + { "set", _wrap_Array_set}, { "getSize", _wrap_Array_getSize}, { "setSize", _wrap_Array_setSize}, {0,0} diff --git a/WindowsExternal/src/ofeliaBindings.h b/WindowsExternal/src/ofeliaBindings.h index 41b83d42..7d6ea4ea 100644 --- a/WindowsExternal/src/ofeliaBindings.h +++ b/WindowsExternal/src/ofeliaBindings.h @@ -931,23 +931,28 @@ class Array garray_redraw(a); } } - void getTable(t_word **vecp, int *sizep) + void get(t_word **vecp, int *sizep, int onset) { t_garray *a; int size; t_word *vec; if (exists(&a) && getData(a, &size, &vec)) { - *vecp = vec; - *sizep = size; + if (onset < 0) onset = 0; + *vecp = vec + onset; + *sizep = size - onset; } } - void setTable(int n, t_floatarg *f) + void set(int n, t_floatarg *f, int onset) { t_garray *a; int size; t_word *vec; if (exists(&a) && getData(a, &size, &vec)) { + if (onset < 0) onset = 0; for (int i = 0; i < n; ++i) - vec[i].w_float = f[i]; - garray_resize_long(a, long(n)); + { + int io = i + onset; + if (io < size) vec[io].w_float = f[i]; + else break; + } garray_redraw(a); } } diff --git a/WindowsExternal/src/ofeliaBindings.i b/WindowsExternal/src/ofeliaBindings.i index ac7c8ed3..e168bd1e 100644 --- a/WindowsExternal/src/ofeliaBindings.i +++ b/WindowsExternal/src/ofeliaBindings.i @@ -261,7 +261,7 @@ static void lua_len(lua_State *L, int i) freebytes(*$1, 2 * sizeof(int)); } -/* used for Array:getTable() */ +/* used for Array:get() */ %typemap(in, numinputs = 0) (t_word **vecp, int *sizep) (t_word *tmp = nullptr, int tsize = 0) %{ @@ -279,7 +279,7 @@ static void lua_len(lua_State *L, int i) SWIG_arg++; } -/* used for Inlet:setFloatInlets() and Array:setTable() */ +/* used for Inlet:setFloatInlets() and Array:set() */ %typemap(in) (int n, t_floatarg *f) { if (!lua_istable(L, $input)) diff --git a/macOSExternal/src/ofeliaBindings.cpp b/macOSExternal/src/ofeliaBindings.cpp index cfcd27ba..74b95074 100644 --- a/macOSExternal/src/ofeliaBindings.cpp +++ b/macOSExternal/src/ofeliaBindings.cpp @@ -4002,23 +4002,24 @@ static int _wrap_Array_setAt(lua_State* L) { int SWIG_arg = 0; Array *arg1 = (Ar if (!SWIG_IsOK(SWIG_ConvertPtr(L,1,(void**)&arg1,SWIGTYPE_p_Array,0))){ SWIG_fail_ptr("Array_setAt",1,SWIGTYPE_p_Array); } arg2 = (int)lua_tonumber(L, 2); { arg3 = static_cast(lua_tonumber(L, 3)); } (arg1)->setAt(arg2,arg3); return SWIG_arg; if(0) SWIG_fail; fail: lua_error(L); return SWIG_arg; } -static int _wrap_Array_getTable(lua_State* L) { int SWIG_arg = 0; Array *arg1 = (Array *) 0 ; t_word **arg2 = (t_word **) 0 ; - int *arg3 = (int *) 0 ; t_word *tmp2 = nullptr ; int tsize2 = 0 ; arg2 = &tmp2; arg3 = &tsize2; - SWIG_check_num_args("Array::getTable",1,1) if(!SWIG_isptrtype(L,1)) SWIG_fail_arg("Array::getTable",1,"Array *"); - if (!SWIG_IsOK(SWIG_ConvertPtr(L,1,(void**)&arg1,SWIGTYPE_p_Array,0))){ SWIG_fail_ptr("Array_getTable",1,SWIGTYPE_p_Array); } - (arg1)->getTable(arg2,arg3); { lua_newtable(L); for (int i = 0; i < *arg3; ++i) { +static int _wrap_Array_get(lua_State* L) { int SWIG_arg = 0; Array *arg1 = (Array *) 0 ; t_word **arg2 = (t_word **) 0 ; + int *arg3 = (int *) 0 ; int arg4 ; t_word *tmp2 = nullptr ; int tsize2 = 0 ; arg2 = &tmp2; arg3 = &tsize2; + SWIG_check_num_args("Array::get",2,2) if(!SWIG_isptrtype(L,1)) SWIG_fail_arg("Array::get",1,"Array *"); + if(!lua_isnumber(L,2)) SWIG_fail_arg("Array::get",2,"int"); + if (!SWIG_IsOK(SWIG_ConvertPtr(L,1,(void**)&arg1,SWIGTYPE_p_Array,0))){ SWIG_fail_ptr("Array_get",1,SWIGTYPE_p_Array); } + arg4 = (int)lua_tonumber(L, 2); (arg1)->get(arg2,arg3,arg4); { lua_newtable(L); for (int i = 0; i < *arg3; ++i) { lua_pushnumber(L, static_cast((*arg2)[i].w_float)); lua_rawseti(L, -2, i + 1); } SWIG_arg++; } return SWIG_arg; if(0) SWIG_fail; fail: lua_error(L); return SWIG_arg; } -static int _wrap_Array_setTable(lua_State* L) { int SWIG_arg = 0; Array *arg1 = (Array *) 0 ; int arg2 ; - t_floatarg *arg3 = (t_floatarg *) 0 ; SWIG_check_num_args("Array::setTable",2,2) - if(!SWIG_isptrtype(L,1)) SWIG_fail_arg("Array::setTable",1,"Array *"); - if (!SWIG_IsOK(SWIG_ConvertPtr(L,1,(void**)&arg1,SWIGTYPE_p_Array,0))){ SWIG_fail_ptr("Array_setTable",1,SWIGTYPE_p_Array); } - { if (!lua_istable(L, 2)) SWIG_exception(SWIG_RuntimeError, "argument mismatch: table expected"); lua_len(L, 2); +static int _wrap_Array_set(lua_State* L) { int SWIG_arg = 0; Array *arg1 = (Array *) 0 ; int arg2 ; + t_floatarg *arg3 = (t_floatarg *) 0 ; int arg4 ; SWIG_check_num_args("Array::set",3,3) + if(!SWIG_isptrtype(L,1)) SWIG_fail_arg("Array::set",1,"Array *"); if(!lua_isnumber(L,3)) SWIG_fail_arg("Array::set",3,"int"); + if (!SWIG_IsOK(SWIG_ConvertPtr(L,1,(void**)&arg1,SWIGTYPE_p_Array,0))){ SWIG_fail_ptr("Array_set",1,SWIGTYPE_p_Array); } { + if (!lua_istable(L, 2)) SWIG_exception(SWIG_RuntimeError, "argument mismatch: table expected"); lua_len(L, 2); arg2 = static_cast(lua_tointeger(L, -1)); if (!arg2) SWIG_exception(SWIG_RuntimeError, "table is empty"); arg3 = static_cast(getbytes(arg2 * sizeof(t_float))); for (int i = 0; i < arg2; ++i) { lua_pushinteger(L, i + 1); lua_gettable(L, 2); if (lua_isnumber(L, -1)) arg3[i] = static_cast(lua_tonumber(L, -1)); else - SWIG_exception(SWIG_RuntimeError, "unhandled argument type"); } } (arg1)->setTable(arg2,arg3); { - freebytes(arg3, arg2 * sizeof(t_float)); } return SWIG_arg; if(0) SWIG_fail; fail: { + SWIG_exception(SWIG_RuntimeError, "unhandled argument type"); } } arg4 = (int)lua_tonumber(L, 3); + (arg1)->set(arg2,arg3,arg4); { freebytes(arg3, arg2 * sizeof(t_float)); } return SWIG_arg; if(0) SWIG_fail; fail: { freebytes(arg3, arg2 * sizeof(t_float)); } lua_error(L); return SWIG_arg; } static int _wrap_Array_getSize(lua_State* L) { int SWIG_arg = 0; Array *arg1 = (Array *) 0 ; int result; SWIG_check_num_args("Array::getSize",1,1) if(!SWIG_isptrtype(L,1)) SWIG_fail_arg("Array::getSize",1,"Array *"); @@ -4050,8 +4051,8 @@ static swig_lua_method swig_Array_methods[]= { { "exists", _wrap_Array_exists}, { "getAt", _wrap_Array_getAt}, { "setAt", _wrap_Array_setAt}, - { "getTable", _wrap_Array_getTable}, - { "setTable", _wrap_Array_setTable}, + { "get", _wrap_Array_get}, + { "set", _wrap_Array_set}, { "getSize", _wrap_Array_getSize}, { "setSize", _wrap_Array_setSize}, {0,0} diff --git a/macOSExternal/src/ofeliaBindings.h b/macOSExternal/src/ofeliaBindings.h index 41b83d42..7d6ea4ea 100644 --- a/macOSExternal/src/ofeliaBindings.h +++ b/macOSExternal/src/ofeliaBindings.h @@ -931,23 +931,28 @@ class Array garray_redraw(a); } } - void getTable(t_word **vecp, int *sizep) + void get(t_word **vecp, int *sizep, int onset) { t_garray *a; int size; t_word *vec; if (exists(&a) && getData(a, &size, &vec)) { - *vecp = vec; - *sizep = size; + if (onset < 0) onset = 0; + *vecp = vec + onset; + *sizep = size - onset; } } - void setTable(int n, t_floatarg *f) + void set(int n, t_floatarg *f, int onset) { t_garray *a; int size; t_word *vec; if (exists(&a) && getData(a, &size, &vec)) { + if (onset < 0) onset = 0; for (int i = 0; i < n; ++i) - vec[i].w_float = f[i]; - garray_resize_long(a, long(n)); + { + int io = i + onset; + if (io < size) vec[io].w_float = f[i]; + else break; + } garray_redraw(a); } } diff --git a/macOSExternal/src/ofeliaBindings.i b/macOSExternal/src/ofeliaBindings.i index ac7c8ed3..e168bd1e 100644 --- a/macOSExternal/src/ofeliaBindings.i +++ b/macOSExternal/src/ofeliaBindings.i @@ -261,7 +261,7 @@ static void lua_len(lua_State *L, int i) freebytes(*$1, 2 * sizeof(int)); } -/* used for Array:getTable() */ +/* used for Array:get() */ %typemap(in, numinputs = 0) (t_word **vecp, int *sizep) (t_word *tmp = nullptr, int tsize = 0) %{ @@ -279,7 +279,7 @@ static void lua_len(lua_State *L, int i) SWIG_arg++; } -/* used for Inlet:setFloatInlets() and Array:setTable() */ +/* used for Inlet:setFloatInlets() and Array:set() */ %typemap(in) (int n, t_floatarg *f) { if (!lua_istable(L, $input)) diff --git a/ofelia/CHANGES.txt b/ofelia/CHANGES.txt index aade8ac9..712adddd 100755 --- a/ofelia/CHANGES.txt +++ b/ofelia/CHANGES.txt @@ -1,8 +1,11 @@ v2.0.4: 17 Dec 2018 -* fixed setTable method from Array class not working on Windows -* fixed crash issue when outputting large sized table through outlet +* fixed Array:setTable() bug on Windows +* renamed Array:getTable() and Array:setTable() to Array:get() and Array:set() +* added additional argument to Array:get() and Array:set() to set onset value +* fixed crashing issue when returning a large sized table as a list * disabled printing the bug fix version on the pd console +* added "examples/pd/misc" example to show various pd objects emulation v2.0.3: 23 Nov 2018 diff --git a/ofelia/examples/pd/misc/main.pd b/ofelia/examples/pd/misc/main.pd new file mode 100644 index 00000000..fabe9bcc --- /dev/null +++ b/ofelia/examples/pd/misc/main.pd @@ -0,0 +1,173 @@ +#N canvas 321 23 774 751 10; +#X floatatom 303 116 5 0 0 0 - - -; +#X obj 265 118 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 +-1 -1; +#X floatatom 72 114 5 0 0 0 - - -; +#X obj 42 114 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1 +-1; +#X floatatom 43 243 5 0 0 0 - - -; +#X floatatom 270 166 5 0 0 0 - - -; +#X floatatom 214 297 5 0 0 0 - - -; +#X floatatom 48 398 5 0 0 0 - - -; +#X obj 272 196 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 +-1 -1; +#X floatatom 272 240 5 0 0 0 - - -; +#X obj 43 145 ofelia d \; local value = pd.Value("v\$0_foo") \; function +ofelia.float(f) \; value:set(f) \; end \; function ofelia.bang() \; +return value:get() \; end \;; +#X obj 270 145 value v\$0_foo; +#X obj 272 219 expr v\$0_foo * 2; +#N canvas 0 22 450 278 (subpatch) 0; +#X array \$0-boo 10 float 3; +#A 0 0 0.5 0.9 0.2 -0.5 -0.7 -0.9 0 0.5 0.7; +#X coords 0 1 10 -1 200 140 1 0 0; +#X restore 453 438 graph; +#X obj 290 376 tabread \$0-boo; +#X floatatom 290 401 5 0 0 0 - - -; +#X obj 48 333 ofelia d \; local array = pd.Array("\$0-boo") \; function +ofelia.float(f) \; return array:getAt(f) \; end \;; +#X obj 266 542 tabwrite \$0-boo; +#X floatatom 314 475 5 0 0 0 - - -; +#X obj 42 500 ofelia d -c20 \; local array = pd.Array("\$0-boo") \; +function ofelia.list(fv) \; array:setAt(fv[2] \, fv[1]) \; end \;; +#X msg 99 457 0.8; +#X msg 135 459 -0.8; +#X obj 272 655 array get \$0-boo; +#X obj 45 705 print A; +#X obj 272 700 print B; +#X obj 310 892 array set \$0-boo; +#X msg 318 814 0 0.5 0.9 0.2 -0.5 -0.7 -0.9 0 0.5 0.7; +#X msg 49 785 0.7 0.5 0 -0.9 -0.7 -0.5 0.2 0.9 0.5 0; +#X obj 95 982 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1 +-1; +#X obj 284 1031 array size \$0-boo; +#X floatatom 283 1121 5 0 0 0 - - -; +#X floatatom 57 1116 5 0 0 0 - - -; +#X obj 57 1016 ofelia d \; local array = pd.Array("\$0-boo") \; function +ofelia.bang() \; return array:getSize() \; end \; function ofelia.float(f) +\; return array:setSize(f) \; end \;; +#X msg 161 986 5; +#X msg 283 973 10; +#X obj 364 1293 r \$0-goo; +#X obj 364 1314 print Result; +#X obj 59 1188 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 +-1 -1; +#X floatatom 89 1188 5 0 0 0 - - -; +#X msg 133 1189 symbol haha; +#X obj 78 1219 ofelia d \; local send = pd.Send("\$0-goo") \; function +ofelia.bang() \; send:sendBang() \; end \; function ofelia.float(f) +\; send:sendFloat(f) \; end \; function ofelia.symbol(s) \; send:sendSymbol(s) +\; end \; function ofelia.pointer(p) \; send:sendPointer(p) \; end +\; function ofelia.list(av) \; send:sendList(av) \; end \; function +ofelia.any(av) \; send:sendAnything(av) \; end \;; +#X msg 217 1189 list a b c; +#X msg 295 1188 any a b c; +#X obj 89 1501 ofelia d \$0-voo \; function ofelia.float(f) \; return +f \; end \;; +#X floatatom 89 1556 5 0 0 0 - - -; +#X obj 378 1527 s \$0-voo; +#X floatatom 378 1504 5 0 0 0 - - -; +#X obj 100 1651 ofelia d -c14 -k; +#A set local outlet = pd.Outlet(this) \; function ofelia.bang() \; +outlet:outletFloat(0 \, 123) \; outlet:outletSymbol(1 \, "hello") \; +outlet:outletList(2 \, {"abc" \, 1 \, 2}) \; outlet:outletAnything(3 +\, {"abc" \, 1 \, 2}) \; end \;; +#X obj 98 1627 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 +-1 -1; +#X floatatom 61 1691 5 0 0 0 - - -; +#X symbolatom 113 1693 10 0 0 0 - - -; +#X obj 191 1691 unpack s f f; +#X symbolatom 174 1718 10 0 0 0 - - -; +#X floatatom 241 1719 5 0 0 0 - - -; +#X floatatom 276 1720 5 0 0 0 - - -; +#X obj 335 1688 route abc; +#X obj 338 1712 unpack f f; +#X floatatom 338 1733 5 0 0 0 - - -; +#X floatatom 401 1734 5 0 0 0 - - -; +#X text 340 1669 abc 1 2; +#X text 199 1675 list abc 1 2; +#X text 40 92 value emulation; +#X text 38 290 tabread emulation; +#X text 38 437 tabwrite emulation; +#X text 41 605 array get emulation; +#X text 49 753 array set emulation; +#X text 53 962 array size emulation; +#X text 67 1162 send emulation; +#X text 90 1472 receive emulation; +#X msg 315 788 0.7 0.5 0 -0.9 -0.7 -0.5 0.2 0.9 0.5 0; +#X msg 63 813 0 0.5 0.9 0.2 -0.5 -0.7 -0.9 0 0.5 0.7; +#X msg 113 839 onset \$1; +#X floatatom 402 753 5 0 0 0 - - -; +#X obj 56 862 ofelia d -c10 \; ofelia.onset = 0 \; local array = pd.Array("\$0-boo") +\; function ofelia.list(fv) \; return array:set(fv \, ofelia.onset) +\; end \;; +#X text 237 583 onset; +#X obj 45 640 ofelia d \; local array = pd.Array("\$0-boo") \; function +ofelia.float(f) \; return array:get(f) \; end \;; +#X msg 202 584 0; +#X msg 405 731 0; +#X text 436 731 onset; +#X floatatom 202 605 5 0 0 0 - - -; +#X text 173 460 y value; +#X text 351 473 x index; +#X text 251 296 x index; +#X text 89 399 y value; +#X text 330 399 y value; +#X text 94 1604 outputting values individually. (unlike return); +#X text 38 16 You can use various pd's internal features within "ofelia +define" object using a "pd" module. These examples show how classes +in a "pd" module can be used to emulate some of pd objects.; +#X connect 0 0 11 0; +#X connect 1 0 11 0; +#X connect 2 0 10 0; +#X connect 3 0 10 0; +#X connect 6 0 14 0; +#X connect 6 0 16 0; +#X connect 8 0 12 0; +#X connect 10 0 4 0; +#X connect 11 0 5 0; +#X connect 12 0 9 0; +#X connect 14 0 15 0; +#X connect 16 0 7 0; +#X connect 18 0 19 1; +#X connect 18 0 17 1; +#X connect 20 0 19 0; +#X connect 21 0 17 0; +#X connect 22 0 24 0; +#X connect 26 0 25 0; +#X connect 27 0 73 0; +#X connect 28 0 29 0; +#X connect 28 0 32 0; +#X connect 29 0 30 0; +#X connect 32 0 31 0; +#X connect 33 0 32 0; +#X connect 34 0 29 0; +#X connect 35 0 36 0; +#X connect 37 0 40 0; +#X connect 38 0 40 0; +#X connect 39 0 40 0; +#X connect 41 0 40 0; +#X connect 42 0 40 0; +#X connect 43 0 44 0; +#X connect 46 0 45 0; +#X connect 47 0 49 0; +#X connect 47 1 50 0; +#X connect 47 2 51 0; +#X connect 47 3 55 0; +#X connect 48 0 47 0; +#X connect 51 0 52 0; +#X connect 51 1 53 0; +#X connect 51 2 54 0; +#X connect 55 0 56 0; +#X connect 56 0 57 0; +#X connect 56 1 58 0; +#X connect 69 0 25 0; +#X connect 70 0 73 0; +#X connect 71 0 73 0; +#X connect 72 0 71 0; +#X connect 72 0 25 1; +#X connect 75 0 23 0; +#X connect 76 0 79 0; +#X connect 77 0 72 0; +#X connect 79 0 75 0; +#X connect 79 0 22 0; diff --git a/ofelia/src/ofeliaBindings.cpp b/ofelia/src/ofeliaBindings.cpp index cfcd27ba..74b95074 100644 --- a/ofelia/src/ofeliaBindings.cpp +++ b/ofelia/src/ofeliaBindings.cpp @@ -4002,23 +4002,24 @@ static int _wrap_Array_setAt(lua_State* L) { int SWIG_arg = 0; Array *arg1 = (Ar if (!SWIG_IsOK(SWIG_ConvertPtr(L,1,(void**)&arg1,SWIGTYPE_p_Array,0))){ SWIG_fail_ptr("Array_setAt",1,SWIGTYPE_p_Array); } arg2 = (int)lua_tonumber(L, 2); { arg3 = static_cast(lua_tonumber(L, 3)); } (arg1)->setAt(arg2,arg3); return SWIG_arg; if(0) SWIG_fail; fail: lua_error(L); return SWIG_arg; } -static int _wrap_Array_getTable(lua_State* L) { int SWIG_arg = 0; Array *arg1 = (Array *) 0 ; t_word **arg2 = (t_word **) 0 ; - int *arg3 = (int *) 0 ; t_word *tmp2 = nullptr ; int tsize2 = 0 ; arg2 = &tmp2; arg3 = &tsize2; - SWIG_check_num_args("Array::getTable",1,1) if(!SWIG_isptrtype(L,1)) SWIG_fail_arg("Array::getTable",1,"Array *"); - if (!SWIG_IsOK(SWIG_ConvertPtr(L,1,(void**)&arg1,SWIGTYPE_p_Array,0))){ SWIG_fail_ptr("Array_getTable",1,SWIGTYPE_p_Array); } - (arg1)->getTable(arg2,arg3); { lua_newtable(L); for (int i = 0; i < *arg3; ++i) { +static int _wrap_Array_get(lua_State* L) { int SWIG_arg = 0; Array *arg1 = (Array *) 0 ; t_word **arg2 = (t_word **) 0 ; + int *arg3 = (int *) 0 ; int arg4 ; t_word *tmp2 = nullptr ; int tsize2 = 0 ; arg2 = &tmp2; arg3 = &tsize2; + SWIG_check_num_args("Array::get",2,2) if(!SWIG_isptrtype(L,1)) SWIG_fail_arg("Array::get",1,"Array *"); + if(!lua_isnumber(L,2)) SWIG_fail_arg("Array::get",2,"int"); + if (!SWIG_IsOK(SWIG_ConvertPtr(L,1,(void**)&arg1,SWIGTYPE_p_Array,0))){ SWIG_fail_ptr("Array_get",1,SWIGTYPE_p_Array); } + arg4 = (int)lua_tonumber(L, 2); (arg1)->get(arg2,arg3,arg4); { lua_newtable(L); for (int i = 0; i < *arg3; ++i) { lua_pushnumber(L, static_cast((*arg2)[i].w_float)); lua_rawseti(L, -2, i + 1); } SWIG_arg++; } return SWIG_arg; if(0) SWIG_fail; fail: lua_error(L); return SWIG_arg; } -static int _wrap_Array_setTable(lua_State* L) { int SWIG_arg = 0; Array *arg1 = (Array *) 0 ; int arg2 ; - t_floatarg *arg3 = (t_floatarg *) 0 ; SWIG_check_num_args("Array::setTable",2,2) - if(!SWIG_isptrtype(L,1)) SWIG_fail_arg("Array::setTable",1,"Array *"); - if (!SWIG_IsOK(SWIG_ConvertPtr(L,1,(void**)&arg1,SWIGTYPE_p_Array,0))){ SWIG_fail_ptr("Array_setTable",1,SWIGTYPE_p_Array); } - { if (!lua_istable(L, 2)) SWIG_exception(SWIG_RuntimeError, "argument mismatch: table expected"); lua_len(L, 2); +static int _wrap_Array_set(lua_State* L) { int SWIG_arg = 0; Array *arg1 = (Array *) 0 ; int arg2 ; + t_floatarg *arg3 = (t_floatarg *) 0 ; int arg4 ; SWIG_check_num_args("Array::set",3,3) + if(!SWIG_isptrtype(L,1)) SWIG_fail_arg("Array::set",1,"Array *"); if(!lua_isnumber(L,3)) SWIG_fail_arg("Array::set",3,"int"); + if (!SWIG_IsOK(SWIG_ConvertPtr(L,1,(void**)&arg1,SWIGTYPE_p_Array,0))){ SWIG_fail_ptr("Array_set",1,SWIGTYPE_p_Array); } { + if (!lua_istable(L, 2)) SWIG_exception(SWIG_RuntimeError, "argument mismatch: table expected"); lua_len(L, 2); arg2 = static_cast(lua_tointeger(L, -1)); if (!arg2) SWIG_exception(SWIG_RuntimeError, "table is empty"); arg3 = static_cast(getbytes(arg2 * sizeof(t_float))); for (int i = 0; i < arg2; ++i) { lua_pushinteger(L, i + 1); lua_gettable(L, 2); if (lua_isnumber(L, -1)) arg3[i] = static_cast(lua_tonumber(L, -1)); else - SWIG_exception(SWIG_RuntimeError, "unhandled argument type"); } } (arg1)->setTable(arg2,arg3); { - freebytes(arg3, arg2 * sizeof(t_float)); } return SWIG_arg; if(0) SWIG_fail; fail: { + SWIG_exception(SWIG_RuntimeError, "unhandled argument type"); } } arg4 = (int)lua_tonumber(L, 3); + (arg1)->set(arg2,arg3,arg4); { freebytes(arg3, arg2 * sizeof(t_float)); } return SWIG_arg; if(0) SWIG_fail; fail: { freebytes(arg3, arg2 * sizeof(t_float)); } lua_error(L); return SWIG_arg; } static int _wrap_Array_getSize(lua_State* L) { int SWIG_arg = 0; Array *arg1 = (Array *) 0 ; int result; SWIG_check_num_args("Array::getSize",1,1) if(!SWIG_isptrtype(L,1)) SWIG_fail_arg("Array::getSize",1,"Array *"); @@ -4050,8 +4051,8 @@ static swig_lua_method swig_Array_methods[]= { { "exists", _wrap_Array_exists}, { "getAt", _wrap_Array_getAt}, { "setAt", _wrap_Array_setAt}, - { "getTable", _wrap_Array_getTable}, - { "setTable", _wrap_Array_setTable}, + { "get", _wrap_Array_get}, + { "set", _wrap_Array_set}, { "getSize", _wrap_Array_getSize}, { "setSize", _wrap_Array_setSize}, {0,0} diff --git a/ofelia/src/ofeliaBindings.h b/ofelia/src/ofeliaBindings.h index 41b83d42..7d6ea4ea 100644 --- a/ofelia/src/ofeliaBindings.h +++ b/ofelia/src/ofeliaBindings.h @@ -931,23 +931,28 @@ class Array garray_redraw(a); } } - void getTable(t_word **vecp, int *sizep) + void get(t_word **vecp, int *sizep, int onset) { t_garray *a; int size; t_word *vec; if (exists(&a) && getData(a, &size, &vec)) { - *vecp = vec; - *sizep = size; + if (onset < 0) onset = 0; + *vecp = vec + onset; + *sizep = size - onset; } } - void setTable(int n, t_floatarg *f) + void set(int n, t_floatarg *f, int onset) { t_garray *a; int size; t_word *vec; if (exists(&a) && getData(a, &size, &vec)) { + if (onset < 0) onset = 0; for (int i = 0; i < n; ++i) - vec[i].w_float = f[i]; - garray_resize_long(a, long(n)); + { + int io = i + onset; + if (io < size) vec[io].w_float = f[i]; + else break; + } garray_redraw(a); } } diff --git a/ofelia/src/ofeliaBindings.i b/ofelia/src/ofeliaBindings.i index ac7c8ed3..e168bd1e 100644 --- a/ofelia/src/ofeliaBindings.i +++ b/ofelia/src/ofeliaBindings.i @@ -261,7 +261,7 @@ static void lua_len(lua_State *L, int i) freebytes(*$1, 2 * sizeof(int)); } -/* used for Array:getTable() */ +/* used for Array:get() */ %typemap(in, numinputs = 0) (t_word **vecp, int *sizep) (t_word *tmp = nullptr, int tsize = 0) %{ @@ -279,7 +279,7 @@ static void lua_len(lua_State *L, int i) SWIG_arg++; } -/* used for Inlet:setFloatInlets() and Array:setTable() */ +/* used for Inlet:setFloatInlets() and Array:set() */ %typemap(in) (int n, t_floatarg *f) { if (!lua_istable(L, $input))