diff options
author | Thomas Grill <xovo@users.sourceforge.net> | 2004-06-21 14:08:57 +0000 |
---|---|---|
committer | Thomas Grill <xovo@users.sourceforge.net> | 2004-06-21 14:08:57 +0000 |
commit | e728a5bc3db296b4b67c2d3e5b56558c42c566a8 (patch) | |
tree | 180656eeb13352bc2cee7fb759e2ff74332069d2 /externals/grill/flext/source | |
parent | cefab503b7db648244a4244ef255d15609e2c205 (diff) |
""
svn path=/trunk/; revision=1826
Diffstat (limited to 'externals/grill/flext/source')
45 files changed, 3810 insertions, 3722 deletions
diff --git a/externals/grill/flext/source/flatom_app.cpp b/externals/grill/flext/source/flatom_app.cpp index 90b4af82..96fe010d 100755 --- a/externals/grill/flext/source/flatom_app.cpp +++ b/externals/grill/flext/source/flatom_app.cpp @@ -17,60 +17,60 @@ WARRANTIES, see the file, "license.txt," in this distribution. flext::AtomList &flext::AtomList::Append(const t_atom &a) { - t_atom *nlst = new t_atom[cnt+1]; - for(int i = 0; i < cnt; ++i) SetAtom(nlst[i],lst[i]); - SetAtom(nlst[cnt],a); - - if(lst) delete[] lst; - lst = nlst; - ++cnt; + t_atom *nlst = new t_atom[cnt+1]; + for(int i = 0; i < cnt; ++i) SetAtom(nlst[i],lst[i]); + SetAtom(nlst[cnt],a); + + if(lst) delete[] lst; + lst = nlst; + ++cnt; - return *this; + return *this; } flext::AtomList &flext::AtomList::Append(int argc,const t_atom *argv) { - if(argc) { - t_atom *nlst = new t_atom[cnt+argc]; - int i; - for(i = 0; i < cnt; ++i) SetAtom(nlst[i],lst[i]); - if(argv) - for(i = 0; i < argc; ++i) SetAtom(nlst[cnt+i],argv[i]); - - if(lst) delete[] lst; - lst = nlst; - cnt += argc; - } - return *this; + if(argc) { + t_atom *nlst = new t_atom[cnt+argc]; + int i; + for(i = 0; i < cnt; ++i) SetAtom(nlst[i],lst[i]); + if(argv) + for(i = 0; i < argc; ++i) SetAtom(nlst[cnt+i],argv[i]); + + if(lst) delete[] lst; + lst = nlst; + cnt += argc; + } + return *this; } flext::AtomList &flext::AtomList::Prepend(const t_atom &a) { - t_atom *nlst = new t_atom[cnt+1]; - for(int i = 0; i < cnt; ++i) SetAtom(nlst[i+1],lst[i]); - SetAtom(nlst[0],a); - - if(lst) delete[] lst; - lst = nlst; - ++cnt; + t_atom *nlst = new t_atom[cnt+1]; + for(int i = 0; i < cnt; ++i) SetAtom(nlst[i+1],lst[i]); + SetAtom(nlst[0],a); + + if(lst) delete[] lst; + lst = nlst; + ++cnt; - return *this; + return *this; } flext::AtomList &flext::AtomList::Prepend(int argc,const t_atom *argv) { - if(argc) { - t_atom *nlst = new t_atom[cnt+argc]; - int i; + if(argc) { + t_atom *nlst = new t_atom[cnt+argc]; + int i; - if(argv) - for(i = 0; i < argc; ++i) SetAtom(nlst[i],argv[i]); - for(i = 0; i < cnt; ++i) SetAtom(nlst[argc+i],lst[i]); - - if(lst) delete[] lst; - lst = nlst; - cnt += argc; - } - return *this; + if(argv) + for(i = 0; i < argc; ++i) SetAtom(nlst[i],argv[i]); + for(i = 0; i < cnt; ++i) SetAtom(nlst[argc+i],lst[i]); + + if(lst) delete[] lst; + lst = nlst; + cnt += argc; + } + return *this; } diff --git a/externals/grill/flext/source/flatom_part.cpp b/externals/grill/flext/source/flatom_part.cpp index 05a3710d..e5c9c533 100755 --- a/externals/grill/flext/source/flatom_part.cpp +++ b/externals/grill/flext/source/flatom_part.cpp @@ -16,22 +16,22 @@ WARRANTIES, see the file, "license.txt," in this distribution. int flext::AtomList::Get(t_atom *argv,int mxsz) const { - int argc = Count(); - if(mxsz >= 0 && argc > mxsz) argc = mxsz; + int argc = Count(); + if(mxsz >= 0 && argc > mxsz) argc = mxsz; - for(int i = 0; i < argc; ++i) SetAtom(argv[i],lst[i]); + for(int i = 0; i < argc; ++i) SetAtom(argv[i],lst[i]); - return argc; + return argc; } flext::AtomList flext::AtomList::GetPart(int offs,int len) const { - if(offs+len > Count()) { - len = Count()-offs; - if(len < 0) len = 0; - } + if(offs+len > Count()) { + len = Count()-offs; + if(len < 0) len = 0; + } - return AtomList(len,Atoms()+offs); + return AtomList(len,Atoms()+offs); } diff --git a/externals/grill/flext/source/flatom_pr.cpp b/externals/grill/flext/source/flatom_pr.cpp index 9d5eeb29..43721388 100644 --- a/externals/grill/flext/source/flatom_pr.cpp +++ b/externals/grill/flext/source/flatom_pr.cpp @@ -25,95 +25,95 @@ WARRANTIES, see the file, "license.txt," in this distribution. // \TODO take bufsz into account! bool flext::PrintAtom(const t_atom &a,char *buf,int bufsz) { - bool ok = true; - if(IsFloat(a)) { - STD::snprintf(buf,bufsz,"%g",GetFloat(a)); - } - else if(IsInt(a)) { - STD::snprintf(buf,bufsz,"%i",GetInt(a)); - } - else if(IsSymbol(a)) { + bool ok = true; + if(IsFloat(a)) { + STD::snprintf(buf,bufsz,"%g",GetFloat(a)); + } + else if(IsInt(a)) { + STD::snprintf(buf,bufsz,"%i",GetInt(a)); + } + else if(IsSymbol(a)) { if(!FLEXT_ASSERT(GetSymbol(a))) *buf = 0; else STD::strncpy(buf,GetString(a),bufsz); - } - else if(IsPointer(a)) { - STD::snprintf(buf,bufsz,"%p",GetPointer(a)); - } + } + else if(IsPointer(a)) { + STD::snprintf(buf,bufsz,"%p",GetPointer(a)); + } #if FLEXT_SYS == FLEXT_SYS_PD - else if(a.a_type == A_DOLLAR) { - STD::snprintf(buf,bufsz,"$%d",a.a_w.w_index); - } - else if(a.a_type == A_DOLLSYM) { - STD::snprintf(buf,bufsz,"$%s",GetString(a)); - } + else if(a.a_type == A_DOLLAR) { + STD::snprintf(buf,bufsz,"$%d",a.a_w.w_index); + } + else if(a.a_type == A_DOLLSYM) { + STD::snprintf(buf,bufsz,"$%s",GetString(a)); + } #elif FLEXT_SYS == FLEXT_SYS_MAX - else if(a.a_type == A_DOLLAR) { - STD::snprintf(buf,bufsz,"$%d",a.a_w.w_long); - } + else if(a.a_type == A_DOLLAR) { + STD::snprintf(buf,bufsz,"$%d",a.a_w.w_long); + } #else //#pragma message("Not implemented") #endif - else { + else { error("flext: atom type unknown"); - ok = false; - } - return ok; + ok = false; + } + return ok; } bool flext::PrintList(int argc,const t_atom *argv,char *buf,int bufsz) { - bool ok = true; + bool ok = true; for(int i = 0; ok && i < argc && bufsz > 0; ++i) { - if(i) { *(buf++) = ' '; --bufsz; } // prepend space - - if(PrintAtom(argv[i],buf,bufsz)) { - int len = strlen(buf); - buf += len,bufsz -= len; - } - else - ok = false; + if(i) { *(buf++) = ' '; --bufsz; } // prepend space + + if(PrintAtom(argv[i],buf,bufsz)) { + int len = strlen(buf); + buf += len,bufsz -= len; + } + else + ok = false; } - *buf = 0; + *buf = 0; return ok; } bool flext::ScanAtom(t_atom &a,const char *buf) { - // skip whitespace - while(*buf && isspace(*buf)) ++buf; - if(!*buf) return false; - - char tmp[1024]; - strcpy(tmp,buf); - char *c = tmp; - - // check for word type (s = 0,1,2 ... int,float,symbol) - int s = 0; - for(; *c && !isspace(*c); ++c) { - if(!isdigit(*c)) - s = (*c != '.' || s == 1)?2:1; - } - - switch(s) { - case 0: // integer + // skip whitespace + while(*buf && isspace(*buf)) ++buf; + if(!*buf) return false; + + char tmp[1024]; + strcpy(tmp,buf); + char *c = tmp; + + // check for word type (s = 0,1,2 ... int,float,symbol) + int s = 0; + for(; *c && !isspace(*c); ++c) { + if(!isdigit(*c)) + s = (*c != '.' || s == 1)?2:1; + } + + switch(s) { + case 0: // integer #if FLEXT_SYS == FLEXT_SYS_MAX - SetInt(a,atol(tmp)); - break; + SetInt(a,atol(tmp)); + break; #endif - case 1: // float - SetFloat(a,(float)atof(tmp)); - break; - default: { // anything else is a symbol - char t = *c; *c = 0; - SetString(a,tmp); - *c = t; - break; - } - } - - return true; + case 1: // float + SetFloat(a,(float)atof(tmp)); + break; + default: { // anything else is a symbol + char t = *c; *c = 0; + SetString(a,tmp); + *c = t; + break; + } + } + + return true; } diff --git a/externals/grill/flext/source/flattr_ed.cpp b/externals/grill/flext/source/flattr_ed.cpp index 797eec19..8a4b98f5 100644 --- a/externals/grill/flext/source/flattr_ed.cpp +++ b/externals/grill/flext/source/flattr_ed.cpp @@ -45,18 +45,18 @@ static void (*ori_vis)(t_gobj *c, t_glist *, int vis) = NULL; void flext_base::SetAttrEditor(t_classid c) { - // widgetbehavior struct MUST be resident... (static is just ok here) + // widgetbehavior struct MUST be resident... (static is just ok here) #ifndef FLEXT_CLONEWIDGET - ori_vis = c->c_wb->w_visfn; - widgetbehavior.w_getrectfn = c->c_wb->w_getrectfn; + ori_vis = c->c_wb->w_visfn; + widgetbehavior.w_getrectfn = c->c_wb->w_getrectfn; widgetbehavior.w_displacefn = c->c_wb->w_displacefn; widgetbehavior.w_selectfn = c->c_wb->w_selectfn; widgetbehavior.w_activatefn = c->c_wb->w_activatefn; widgetbehavior.w_deletefn = c->c_wb->w_deletefn; widgetbehavior.w_clickfn = c->c_wb->w_clickfn; #else - widgetbehavior.w_getrectfn = text_widgetbehavior.w_getrectfn; + widgetbehavior.w_getrectfn = text_widgetbehavior.w_getrectfn; widgetbehavior.w_displacefn = text_widgetbehavior.w_displacefn; widgetbehavior.w_selectfn = text_widgetbehavior.w_selectfn; widgetbehavior.w_activatefn = text_widgetbehavior.w_activatefn; @@ -75,80 +75,80 @@ void flext_base::SetAttrEditor(t_classid c) widgetbehavior.w_visfn = cb_GfxVis; class_setwidget(c, &widgetbehavior); - // generate the script for the property dialog + // generate the script for the property dialog - sys_gui( - "proc flext_apply {id alen} {\n" - // strip "." from the TK id to make a variable name suffix - "set vid [string trimleft $id .]\n" + sys_gui( + "proc flext_apply {id alen} {\n" + // strip "." from the TK id to make a variable name suffix + "set vid [string trimleft $id .]\n" - // make a list of the attribute values (including save flags) + // make a list of the attribute values (including save flags) - "set lst {}\n" - "for {set ix 1} {$ix <= $alen} {incr ix} {\n" - "set var_attr_name [concat [concat var_name_$ix]_$vid ]\n" - "set var_attr_init [concat [concat var_init_$ix]_$vid ]\n" - "set var_attr_val [concat [concat var_val_$ix]_$vid ]\n" - "set var_attr_save [concat [concat var_save_$ix]_$vid ]\n" - "set var_attr_type [concat [concat var_type_$ix]_$vid ]\n" + "set lst {}\n" + "for {set ix 1} {$ix <= $alen} {incr ix} {\n" + "set var_attr_name [concat [concat var_name_$ix]_$vid ]\n" + "set var_attr_init [concat [concat var_init_$ix]_$vid ]\n" + "set var_attr_val [concat [concat var_val_$ix]_$vid ]\n" + "set var_attr_save [concat [concat var_save_$ix]_$vid ]\n" + "set var_attr_type [concat [concat var_type_$ix]_$vid ]\n" - "global $var_attr_name $var_attr_init $var_attr_val $var_attr_save $var_attr_type\n" - - "if { [expr $$var_attr_type] != 0 } {\n" - // attribute is puttable + "global $var_attr_name $var_attr_init $var_attr_val $var_attr_save $var_attr_type\n" + + "if { [expr $$var_attr_type] != 0 } {\n" + // attribute is puttable - "lappend lst [eval concat $$var_attr_name]\n" + "lappend lst [eval concat $$var_attr_name]\n" - // process current value + // process current value "set tmp [eval concat $$var_attr_val]\n" - "set len [llength $tmp]\n" - "if { $len == 1 } {\n" - // it's an atom + "set len [llength $tmp]\n" + "if { $len == 1 } {\n" + // it's an atom // if atom starts with $, replace it by # ($ can't be passed by TCL) "if { [string index $tmp 0] == \"$\" } {\n" "set tmp [string replace $tmp 0 0 #]\n" "}\n" "lappend lst $tmp\n" - "} else {\n" - // it's a list - "set lst [concat $lst {list} $len $tmp]\n" - "}\n" - - // process init value - "set tmp [eval concat $$var_attr_init]\n" - "set len [llength $tmp]\n" - "if { $len == 1 } {\n" - // it's an atom + "} else {\n" + // it's a list + "set lst [concat $lst {list} $len $tmp]\n" + "}\n" + + // process init value + "set tmp [eval concat $$var_attr_init]\n" + "set len [llength $tmp]\n" + "if { $len == 1 } {\n" + // it's an atom // if atom starts with $, replace it by # ($ can't be passed by TCL) "if { [string index $tmp 0] == \"$\" } {\n" "set tmp [string replace $tmp 0 0 #]\n" "}\n" "lappend lst $tmp\n" - "} else {\n" - // it's a list - "set lst [concat $lst {list} $len $tmp]\n" - "}\n" + "} else {\n" + // it's a list + "set lst [concat $lst {list} $len $tmp]\n" + "}\n" - "lappend lst [eval concat $$var_attr_save]\n" - "}\n" - "}\n" + "lappend lst [eval concat $$var_attr_save]\n" + "}\n" + "}\n" - "set cmd [concat $id attributedialog $lst \\;]\n" - "pd $cmd\n" - "}\n" + "set cmd [concat $id attributedialog $lst \\;]\n" + "pd $cmd\n" + "}\n" - "proc flext_cancel {id} {\n" - "set cmd [concat $id cancel \\;]\n" - "pd $cmd\n" - "}\n" + "proc flext_cancel {id} {\n" + "set cmd [concat $id cancel \\;]\n" + "pd $cmd\n" + "}\n" - "proc flext_ok {id alen} {\n" - "flext_apply $id $alen\n" - "flext_cancel $id\n" - "}\n" + "proc flext_ok {id alen} {\n" + "flext_apply $id $alen\n" + "flext_cancel $id\n" + "}\n" "proc flext_help {id} {\n" - "toplevel $id.hw\n" + "toplevel $id.hw\n" "wm title $id.hw \"Flext attribute editor help\"\n" "frame $id.hw.buttons\n" @@ -161,7 +161,7 @@ void flext_base::SetAttrEditor(t_classid c) "button $id.hw.buttons.ok -text OK -command \"destroy $id.hw\"\n" "pack $id.hw.buttons.ok -side left -expand 1\n" - "bind $id.hw {<KeyPress-Escape>} \"destroy $id.hw\"\n" + "bind $id.hw {<KeyPress-Escape>} \"destroy $id.hw\"\n" "$id.hw.text tag configure big -font {Arial 10 bold}\n" "$id.hw.text configure -font {Arial 8 bold}\n" @@ -172,22 +172,22 @@ void flext_base::SetAttrEditor(t_classid c) "Ctrl-Button on a text field will open an editor window where text can be entered more comfortably.\n" "\"\n" "$id.hw.text configure -state disabled\n" - "}\n" + "}\n" - "proc flext_copyval {dst src} {\n" - "global $src $dst\n" - "set $dst [expr $$src]\n" - "}\n" + "proc flext_copyval {dst src} {\n" + "global $src $dst\n" + "set $dst [expr $$src]\n" + "}\n" - "proc flext_textcopy {id idtxt var} {\n" - "global $var\n" + "proc flext_textcopy {id idtxt var} {\n" + "global $var\n" "set $var [eval $idtxt get 0.0 end]\n" "destroy $id\n" - "}\n" + "}\n" - "proc flext_textzoom {id var title attr edit} {\n" - "global $var\n" - "toplevel $id.w\n" + "proc flext_textzoom {id var title attr edit} {\n" + "global $var\n" + "toplevel $id.w\n" "wm title $id.w [concat $title \" @\" $attr]\n" // "wm iconname $w \"text\"\n" // "positionWindow $id.w\n" @@ -203,27 +203,27 @@ void flext_base::SetAttrEditor(t_classid c) "$id.w.text insert 0.0 [expr $$var]\n" "$id.w.text mark set insert 0.0\n" - "if { $edit != 0 } then {\n" + "if { $edit != 0 } then {\n" "button $id.w.buttons.ok -text OK -command \"flext_textcopy $id.w $id.w.text $var\"\n" "pack $id.w.buttons.ok -side left -expand 1\n" -// "bind $id.w {<Shift-KeyPress-Return>} \"flext_textcopy $id.w $id.w.text $var\"\n" +// "bind $id.w {<Shift-KeyPress-Return>} \"flext_textcopy $id.w $id.w.text $var\"\n" "} " "else { $id.w.text configure -state disabled }\n" "button $id.w.buttons.cancel -text Cancel -command \"destroy $id.w\"\n" "pack $id.w.buttons.cancel -side left -expand 1\n" - "bind $id.w {<KeyPress-Escape>} \"destroy $id.w\"\n" + "bind $id.w {<KeyPress-Escape>} \"destroy $id.w\"\n" "}\n" - "proc pdtk_flext_dialog {id title attrlist} {\n" - "set vid [string trimleft $id .]\n" - "set alen [expr [llength $attrlist] / 6 ]\n" + "proc pdtk_flext_dialog {id title attrlist} {\n" + "set vid [string trimleft $id .]\n" + "set alen [expr [llength $attrlist] / 6 ]\n" - "toplevel $id\n" - "wm title $id $title\n" - "wm protocol $id WM_DELETE_WINDOW [concat flext_cancel $id]\n" + "toplevel $id\n" + "wm title $id $title\n" + "wm protocol $id WM_DELETE_WINDOW [concat flext_cancel $id]\n" - "set row 0\n" + "set row 0\n" // set grow parameters "grid columnconfigure $id 0 -weight 1\n" // label @@ -233,266 +233,266 @@ void flext_base::SetAttrEditor(t_classid c) // "grid rowconfigure $id {0 1 2} -weight 0\n" - // set column labels - "label $id.label -text {attribute} -height 2 -font {Helvetica 9 bold}\n" - "label $id.init -text {initial value} -height 2 -font {Helvetica 9 bold}\n" - "label $id.copy -text {copy} -height 2 -font {Helvetica 9 bold}\n" - "label $id.val -text {current value} -height 2 -font {Helvetica 9 bold}\n" - "foreach {i txt} {0 {don't\rsave} 1 {do\rinit} 2 {always\rsave} } {\n" - "label $id.b$i -text $txt -height 2 -font {Helvetica 9 bold}\n" - "}\n" -// "label $id.options -text {options} -height 2\n" - - "grid config $id.label -column 0 -row $row \n" - "grid config $id.init -column 1 -row $row \n" - "grid config $id.copy -column 2 -columnspan 2 -row $row \n" - "grid config $id.val -column 4 -row $row \n" - "foreach i {0 1 2} { grid config $id.b$i -column [expr $i + 5] -row $row }\n" -// "grid config $id.options -column 3 -row 0 \n" - "incr row\n" - - // Separator - "frame $id.sep -relief ridge -bd 1 -height 2\n" - "grid config $id.sep -column 0 -columnspan 8 -row $row -pady 2 -sticky {snew}\n" - "incr row\n" - - "set ix 1\n" - "foreach {an av ai atp asv afl} $attrlist {\n" + // set column labels + "label $id.label -text {attribute} -height 2 -font {Helvetica 9 bold}\n" + "label $id.init -text {initial value} -height 2 -font {Helvetica 9 bold}\n" + "label $id.copy -text {copy} -height 2 -font {Helvetica 9 bold}\n" + "label $id.val -text {current value} -height 2 -font {Helvetica 9 bold}\n" + "foreach {i txt} {0 {don't\rsave} 1 {do\rinit} 2 {always\rsave} } {\n" + "label $id.b$i -text $txt -height 2 -font {Helvetica 9 bold}\n" + "}\n" +// "label $id.options -text {options} -height 2\n" + + "grid config $id.label -column 0 -row $row \n" + "grid config $id.init -column 1 -row $row \n" + "grid config $id.copy -column 2 -columnspan 2 -row $row \n" + "grid config $id.val -column 4 -row $row \n" + "foreach i {0 1 2} { grid config $id.b$i -column [expr $i + 5] -row $row }\n" +// "grid config $id.options -column 3 -row 0 \n" + "incr row\n" + + // Separator + "frame $id.sep -relief ridge -bd 1 -height 2\n" + "grid config $id.sep -column 0 -columnspan 8 -row $row -pady 2 -sticky {snew}\n" + "incr row\n" + + "set ix 1\n" + "foreach {an av ai atp asv afl} $attrlist {\n" "grid rowconfigure $id $row -weight 0\n" // get attribute name - "set var_attr_name [concat [concat var_name_$ix]_$vid ]\n" - "global $var_attr_name\n" - "set $var_attr_name $an\n" - - // get attribute init value (list) - "set var_attr_init [concat [concat var_init_$ix]_$vid ]\n" - "global $var_attr_init\n" - "set $var_attr_init $ai\n" - - // get attribute value (list) - "set var_attr_val [concat [concat var_val_$ix]_$vid ]\n" - "global $var_attr_val\n" - "set $var_attr_val $av\n" - - // get save flag - "set var_attr_save [concat [concat var_save_$ix]_$vid ]\n" - "global $var_attr_save\n" - "set $var_attr_save $asv\n" - - // get type flag - "set var_attr_type [concat [concat var_type_$ix]_$vid ]\n" - "global $var_attr_type\n" - "set $var_attr_type $afl\n" - - // add dialog elements to window - - // attribute label - "label $id.label-$ix -text \"$an :\" -font {Helvetica 8 bold}\n" - "grid config $id.label-$ix -column 0 -row $row -padx 5 -sticky {e}\n" - - "if { $afl != 0 } {\n" - // attribute is puttable - - // entry field for initial value - // entry field for current value - - // choose entry field type - "switch $atp {\n" - "0 - 1 {\n" // int or float - "entry $id.init-$ix -textvariable $var_attr_init\n" - "entry $id.val-$ix -textvariable $var_attr_val\n" - "}\n" - "2 {\n" // boolean - "checkbutton $id.init-$ix -variable $var_attr_init\n" - "checkbutton $id.val-$ix -variable $var_attr_val\n" - "}\n" - "3 {\n" // symbol - "entry $id.init-$ix -textvariable $var_attr_init\n" - "entry $id.val-$ix -textvariable $var_attr_val\n" - "}\n" - "4 - 5 {\n" // list or unknown - "entry $id.init-$ix -textvariable $var_attr_init\n" + "set var_attr_name [concat [concat var_name_$ix]_$vid ]\n" + "global $var_attr_name\n" + "set $var_attr_name $an\n" + + // get attribute init value (list) + "set var_attr_init [concat [concat var_init_$ix]_$vid ]\n" + "global $var_attr_init\n" + "set $var_attr_init $ai\n" + + // get attribute value (list) + "set var_attr_val [concat [concat var_val_$ix]_$vid ]\n" + "global $var_attr_val\n" + "set $var_attr_val $av\n" + + // get save flag + "set var_attr_save [concat [concat var_save_$ix]_$vid ]\n" + "global $var_attr_save\n" + "set $var_attr_save $asv\n" + + // get type flag + "set var_attr_type [concat [concat var_type_$ix]_$vid ]\n" + "global $var_attr_type\n" + "set $var_attr_type $afl\n" + + // add dialog elements to window + + // attribute label + "label $id.label-$ix -text \"$an :\" -font {Helvetica 8 bold}\n" + "grid config $id.label-$ix -column 0 -row $row -padx 5 -sticky {e}\n" + + "if { $afl != 0 } {\n" + // attribute is puttable + + // entry field for initial value + // entry field for current value + + // choose entry field type + "switch $atp {\n" + "0 - 1 {\n" // int or float + "entry $id.init-$ix -textvariable $var_attr_init\n" + "entry $id.val-$ix -textvariable $var_attr_val\n" + "}\n" + "2 {\n" // boolean + "checkbutton $id.init-$ix -variable $var_attr_init\n" + "checkbutton $id.val-$ix -variable $var_attr_val\n" + "}\n" + "3 {\n" // symbol + "entry $id.init-$ix -textvariable $var_attr_init\n" + "entry $id.val-$ix -textvariable $var_attr_val\n" + "}\n" + "4 - 5 {\n" // list or unknown + "entry $id.init-$ix -textvariable $var_attr_init\n" "bind $id.init-$ix {<Control-Button-1>} \" flext_textzoom $id.init-$ix $var_attr_init { $title } $an 1\"\n" - "entry $id.val-$ix -textvariable $var_attr_val\n" + "entry $id.val-$ix -textvariable $var_attr_val\n" "bind $id.val-$ix {<Control-Button-1>} \" flext_textzoom $id.val-$ix $var_attr_val { $title } $an 1\"\n" - "}\n" - "}\n" - - "grid config $id.init-$ix -column 1 -row $row -padx 5 -sticky {ew}\n" - "grid config $id.val-$ix -column 4 -row $row -padx 5 -sticky {ew}\n" - - "button $id.b2i-$ix -text {<-} -height 1 -command \" flext_copyval $var_attr_init $var_attr_val \"\n" - "grid config $id.b2i-$ix -column 2 -row $row -sticky {ew}\n" - "button $id.b2c-$ix -text {->} -height 1 -command \" flext_copyval $var_attr_val $var_attr_init \"\n" - "grid config $id.b2c-$ix -column 3 -row $row -sticky {ew}\n" - - // "tk_optionMenu $id.opt-$ix $var_attr_save {don't save} {initialize} {always save}\n" - // "grid config $id.opt-$ix -column 5 -row $ix \n" - - // radiobuttons - "foreach {i c} {0 black 1 blue 2 red} {\n" - "radiobutton $id.b$i-$ix -value $i -foreground $c -variable $var_attr_save \n" - "grid config $id.b$i-$ix -column [expr $i + 5] -row $row \n" - "}\n" - "} else {\n" - // attribute is gettable only - - // entry field for current value (read-only) - - // choose display field type - "switch $atp {\n" - "0 - 1 {\n" // int or float - "entry $id.val-$ix -textvariable $var_attr_val -state disabled\n" - "}\n" - "2 {\n" // boolean - "checkbutton $id.val-$ix -variable $var_attr_val -state disabled\n" - "}\n" - "3 {\n" // symbol - "entry $id.val-$ix -textvariable $var_attr_val -state disabled\n" - "}\n" - "4 - 5 {\n" // list or unknown - "entry $id.val-$ix -textvariable $var_attr_val -state disabled\n" + "}\n" + "}\n" + + "grid config $id.init-$ix -column 1 -row $row -padx 5 -sticky {ew}\n" + "grid config $id.val-$ix -column 4 -row $row -padx 5 -sticky {ew}\n" + + "button $id.b2i-$ix -text {<-} -height 1 -command \" flext_copyval $var_attr_init $var_attr_val \"\n" + "grid config $id.b2i-$ix -column 2 -row $row -sticky {ew}\n" + "button $id.b2c-$ix -text {->} -height 1 -command \" flext_copyval $var_attr_val $var_attr_init \"\n" + "grid config $id.b2c-$ix -column 3 -row $row -sticky {ew}\n" + + // "tk_optionMenu $id.opt-$ix $var_attr_save {don't save} {initialize} {always save}\n" + // "grid config $id.opt-$ix -column 5 -row $ix \n" + + // radiobuttons + "foreach {i c} {0 black 1 blue 2 red} {\n" + "radiobutton $id.b$i-$ix -value $i -foreground $c -variable $var_attr_save \n" + "grid config $id.b$i-$ix -column [expr $i + 5] -row $row \n" + "}\n" + "} else {\n" + // attribute is gettable only + + // entry field for current value (read-only) + + // choose display field type + "switch $atp {\n" + "0 - 1 {\n" // int or float + "entry $id.val-$ix -textvariable $var_attr_val -state disabled\n" + "}\n" + "2 {\n" // boolean + "checkbutton $id.val-$ix -variable $var_attr_val -state disabled\n" + "}\n" + "3 {\n" // symbol + "entry $id.val-$ix -textvariable $var_attr_val -state disabled\n" + "}\n" + "4 - 5 {\n" // list or unknown + "entry $id.val-$ix -textvariable $var_attr_val -state disabled\n" "bind $id.val-$ix {<Control-Button-1>} \" flext_textzoom $id.val-$ix $var_attr_val { $title } $an 0\"\n" - "}\n" - "}\n" + "}\n" + "}\n" -// "entry $id.val-$ix -textvariable $var_attr_val -state disabled\n" - "grid config $id.val-$ix -column 4 -row $row -padx 5 -sticky {ew}\n" +// "entry $id.val-$ix -textvariable $var_attr_val -state disabled\n" + "grid config $id.val-$ix -column 4 -row $row -padx 5 -sticky {ew}\n" - "label $id.readonly-$ix -text \"read-only\"\n" - "grid config $id.readonly-$ix -column 5 -columnspan 3 -row $row -padx 5 -sticky {ew}\n" - "}\n" + "label $id.readonly-$ix -text \"read-only\"\n" + "grid config $id.readonly-$ix -column 5 -columnspan 3 -row $row -padx 5 -sticky {ew}\n" + "}\n" - // increase counter - "incr ix\n" - "incr row\n" - "}\n" + // increase counter + "incr ix\n" + "incr row\n" + "}\n" - // Separator - "frame $id.sep2 -relief ridge -bd 1 -height 2\n" + // Separator + "frame $id.sep2 -relief ridge -bd 1 -height 2\n" // "grid rowconfigure $id $row -weight 0\n" - "grid config $id.sep2 -column 0 -columnspan 8 -row $row -pady 5 -sticky {snew}\n" - "incr row\n" + "grid config $id.sep2 -column 0 -columnspan 8 -row $row -pady 5 -sticky {snew}\n" + "incr row\n" - // Buttons - "frame $id.buttonframe\n" - "pack $id.buttonframe -side bottom -fill x\n" + // Buttons + "frame $id.buttonframe\n" + "pack $id.buttonframe -side bottom -fill x\n" - "button $id.buttonframe.cancel -text {Cancel} -width 20 -command \" flext_cancel $id \"\n" - "button $id.buttonframe.apply -text {Apply} -width 20 -command \" flext_apply $id $alen \"\n" - "button $id.buttonframe.ok -text {OK} -width 20 -command \" flext_ok $id $alen \"\n" - "button $id.buttonframe.help -text {Help} -width 10 -command \" flext_help $id \"\n" + "button $id.buttonframe.cancel -text {Cancel} -width 20 -command \" flext_cancel $id \"\n" + "button $id.buttonframe.apply -text {Apply} -width 20 -command \" flext_apply $id $alen \"\n" + "button $id.buttonframe.ok -text {OK} -width 20 -command \" flext_ok $id $alen \"\n" + "button $id.buttonframe.help -text {Help} -width 10 -command \" flext_help $id \"\n" - "pack $id.buttonframe.cancel -side left -expand 1\n" - "pack $id.buttonframe.apply -side left -expand 1\n" - "pack $id.buttonframe.ok -side left -expand 1\n" - "pack $id.buttonframe.help -side left -expand 1\n" + "pack $id.buttonframe.cancel -side left -expand 1\n" + "pack $id.buttonframe.apply -side left -expand 1\n" + "pack $id.buttonframe.ok -side left -expand 1\n" + "pack $id.buttonframe.help -side left -expand 1\n" // "grid rowconfigure $id $row -weight 0\n" - "grid config $id.buttonframe -column 0 -columnspan 8 -row $row -pady 5 -sticky {ew}\n" - - // Key bindings - "bind $id {<KeyPress-Escape>} \" flext_cancel $id \"\n" - "bind $id {<KeyPress-Return>} \" flext_ok $id $alen \"\n" - "bind $id {<Shift-KeyPress-Return>} \" flext_apply $id $alen \"\n" - "}\n" - ); + "grid config $id.buttonframe -column 0 -columnspan 8 -row $row -pady 5 -sticky {ew}\n" + + // Key bindings + "bind $id {<KeyPress-Escape>} \" flext_cancel $id \"\n" + "bind $id {<KeyPress-Return>} \" flext_ok $id $alen \"\n" + "bind $id {<Shift-KeyPress-Return>} \" flext_apply $id $alen \"\n" + "}\n" + ); } void flext_base::cb_GfxProperties(t_gobj *c, t_glist *) { - flext_base *th = thisObject(c); - char buf[10000],*b = buf; - - STD::sprintf(b, "pdtk_flext_dialog %%s { "); b += strlen(b); - - t_text *x = (t_text *)c; - FLEXT_ASSERT(x->te_binbuf); - - int argc = binbuf_getnatom(x->te_binbuf); - t_atom *argv = binbuf_getvec(x->te_binbuf); - - PrintList(argc,argv,b,sizeof(buf)+buf-b); b += strlen(b); - - STD::sprintf(b, " } { "); b += strlen(b); - - AtomList la; - th->ListAttrib(la); - int cnt = la.Count(); - - for(int i = 0; i < cnt; ++i) { - const t_symbol *sym = GetSymbol(la[i]); - - // get attribute - AttrItem *gattr = th->FindAttrib(sym,true); - // get puttable attribute - AttrItem *pattr = gattr?gattr->Counterpart():th->FindAttrib(sym,false); - - // get flags - int sv; - const AtomList *initdata; - AttrDataCont::iterator it = th->attrdata->find(sym); - if(it == th->attrdata->end()) - sv = 0,initdata = NULL; - else { - const AttrData &a = *it.data(); - if(a.IsSaved()) - sv = 2; - else if(a.IsInit()) - sv = 1; - else - sv = 0; - initdata = a.IsInitValue()?&a.GetInitValue():NULL; - } - - // get attribute type - int tp; - bool list; - switch((gattr?gattr:pattr)->argtp) { - case a_int: tp = 0; list = false; break; - case a_float: tp = 1; list = false; break; - case a_bool: tp = 2; list = false; break; - case a_symbol: tp = 3; list = true; break; - case a_list: - case a_LIST: tp = 4; list = true; break; - default: - tp = 5; list = true; - FLEXT_ASSERT(false); - } - - STD::sprintf(b,list?"%s {":"%s ",GetString(sym)); b += strlen(b); - - AtomList lv; - if(gattr) { // gettable attribute is present - // Retrieve attribute value - th->GetAttrib(sym,gattr,lv); - - PrintList(lv.Count(),lv.Atoms(),b,sizeof(buf)+buf-b); b += strlen(b); - } - else { - strcpy(b,"{}"); b += strlen(b); - } - - strcpy(b, list?"} {":" "); b += strlen(b); - - if(pattr) { - // if there is initialization data take this, otherwise take the current data - const AtomList &lp = initdata?*initdata:lv; - - PrintList(lp.Count(),lp.Atoms(),b,sizeof(buf)+buf-b); b += strlen(b); - } - else { - strcpy(b,"{}"); b += strlen(b); - } - - - STD::sprintf(b, list?"} %i %i %i ":" %i %i %i ",tp,sv,pattr?(pattr->BothExist()?2:1):0); b += strlen(b); - } - - strcpy(b, " }\n"); - - gfxstub_new((t_pd *)th->thisHdr(), th->thisHdr(), buf); + flext_base *th = thisObject(c); + char buf[10000],*b = buf; + + STD::sprintf(b, "pdtk_flext_dialog %%s { "); b += strlen(b); + + t_text *x = (t_text *)c; + FLEXT_ASSERT(x->te_binbuf); + + int argc = binbuf_getnatom(x->te_binbuf); + t_atom *argv = binbuf_getvec(x->te_binbuf); + + PrintList(argc,argv,b,sizeof(buf)+buf-b); b += strlen(b); + + STD::sprintf(b, " } { "); b += strlen(b); + + AtomList la; + th->ListAttrib(la); + int cnt = la.Count(); + + for(int i = 0; i < cnt; ++i) { + const t_symbol *sym = GetSymbol(la[i]); + + // get attribute + AttrItem *gattr = th->FindAttrib(sym,true); + // get puttable attribute + AttrItem *pattr = gattr?gattr->Counterpart():th->FindAttrib(sym,false); + + // get flags + int sv; + const AtomList *initdata; + AttrDataCont::iterator it = th->attrdata->find(sym); + if(it == th->attrdata->end()) + sv = 0,initdata = NULL; + else { + const AttrData &a = *it.data(); + if(a.IsSaved()) + sv = 2; + else if(a.IsInit()) + sv = 1; + else + sv = 0; + initdata = a.IsInitValue()?&a.GetInitValue():NULL; + } + + // get attribute type + int tp; + bool list; + switch((gattr?gattr:pattr)->argtp) { + case a_int: tp = 0; list = false; break; + case a_float: tp = 1; list = false; break; + case a_bool: tp = 2; list = false; break; + case a_symbol: tp = 3; list = true; break; + case a_list: + case a_LIST: tp = 4; list = true; break; + default: + tp = 5; list = true; + FLEXT_ASSERT(false); + } + + STD::sprintf(b,list?"%s {":"%s ",GetString(sym)); b += strlen(b); + + AtomList lv; + if(gattr) { // gettable attribute is present + // Retrieve attribute value + th->GetAttrib(sym,gattr,lv); + + PrintList(lv.Count(),lv.Atoms(),b,sizeof(buf)+buf-b); b += strlen(b); + } + else { + strcpy(b,"{}"); b += strlen(b); + } + + strcpy(b, list?"} {":" "); b += strlen(b); + + if(pattr) { + // if there is initialization data take this, otherwise take the current data + const AtomList &lp = initdata?*initdata:lv; + + PrintList(lp.Count(),lp.Atoms(),b,sizeof(buf)+buf-b); b += strlen(b); + } + else { + strcpy(b,"{}"); b += strlen(b); + } + + + STD::sprintf(b, list?"} %i %i %i ":" %i %i %i ",tp,sv,pattr?(pattr->BothExist()?2:1):0); b += strlen(b); + } + + strcpy(b, " }\n"); + + gfxstub_new((t_pd *)th->thisHdr(), th->thisHdr(), buf); } //! Strip the attributes off the object command line @@ -501,202 +501,202 @@ void flext_base::cb_GfxVis(t_gobj *c, t_glist *gl, int vis) // show object if it's not a GOP if(!gl->gl_isgraph || gl->gl_havewindow) { - t_text *x = (t_text *)c; - FLEXT_ASSERT(x->te_binbuf); + t_text *x = (t_text *)c; + FLEXT_ASSERT(x->te_binbuf); - int argc = binbuf_getnatom(x->te_binbuf); - t_atom *argv = binbuf_getvec(x->te_binbuf); - int cnt = CheckAttrib(argc,argv); + int argc = binbuf_getnatom(x->te_binbuf); + t_atom *argv = binbuf_getvec(x->te_binbuf); + int cnt = CheckAttrib(argc,argv); - if(cnt) { - t_binbuf *nb = binbuf_new(); - binbuf_restore(nb,cnt,argv); - binbuf_free(x->te_binbuf); - x->te_binbuf = nb; - } + if(cnt) { + t_binbuf *nb = binbuf_new(); + binbuf_restore(nb,cnt,argv); + binbuf_free(x->te_binbuf); + x->te_binbuf = nb; + } - t_rtext *rt = glist_findrtext(gl,x); - rtext_retext(rt); + t_rtext *rt = glist_findrtext(gl,x); + rtext_retext(rt); // now display the changed text with the normal drawing function #ifdef FLEXT_CLONEWIDGET - text_widgetbehavior.w_visfn(c,gl,vis); + text_widgetbehavior.w_visfn(c,gl,vis); #else - ori_vis(c,gl,vis); + ori_vis(c,gl,vis); #endif } } static void BinbufAdd(t_binbuf *b,const t_atom &at) { - char tbuf[MAXPDSTRING]; - if(flext::IsString(at)) - binbuf_addv(b,"s",flext::GetSymbol(at)); - else if(flext::IsFloat(at)) - binbuf_addv(b,"f",flext::GetFloat(at)); - else if(flext::IsInt(at)) - binbuf_addv(b,"i",flext::GetInt(at)); - else if(at.a_type == A_DOLLAR) { - sprintf(tbuf, "$%d", at.a_w.w_index); - binbuf_addv(b,"s",flext::MakeSymbol(tbuf)); - } - else if(at.a_type == A_DOLLSYM) { - sprintf(tbuf, "$%s", at.a_w.w_symbol->s_name); - binbuf_addv(b,"s",flext::MakeSymbol(tbuf)); - } - else - FLEXT_ASSERT(false); + char tbuf[MAXPDSTRING]; + if(flext::IsString(at)) + binbuf_addv(b,"s",flext::GetSymbol(at)); + else if(flext::IsFloat(at)) + binbuf_addv(b,"f",flext::GetFloat(at)); + else if(flext::IsInt(at)) + binbuf_addv(b,"i",flext::GetInt(at)); + else if(at.a_type == A_DOLLAR) { + sprintf(tbuf, "$%d", at.a_w.w_index); + binbuf_addv(b,"s",flext::MakeSymbol(tbuf)); + } + else if(at.a_type == A_DOLLSYM) { + sprintf(tbuf, "$%s", at.a_w.w_symbol->s_name); + binbuf_addv(b,"s",flext::MakeSymbol(tbuf)); + } + else + FLEXT_ASSERT(false); } void flext_base::cb_GfxSave(t_gobj *c, t_binbuf *b) { - flext_base *th = thisObject(c); - t_text *t = (t_text *)c; - binbuf_addv(b, "ssiis", gensym("#X"),gensym("obj"), t->te_xpix, t->te_ypix,MakeSymbol(th->thisName())); - - int argc = binbuf_getnatom(t->te_binbuf); - t_atom *argv = binbuf_getvec(t->te_binbuf); - int i,cnt = CheckAttrib(argc,argv); - - // process the creation arguments - for(i = 1; i < cnt; ++i) BinbufAdd(b,argv[i]); - - // process the attributes - AtomList la; - th->ListAttrib(la); - cnt = la.Count(); - - for(i = 0; i < cnt; ++i) { - const t_symbol *sym = GetSymbol(la[i]); - AtomList lv; - const AtomList *lref = NULL; - AttrDataCont::iterator it = th->attrdata->find(sym); - - if(it != th->attrdata->end()) { - const AttrData &a = *it.data(); - if(a.IsInit() && a.IsInitValue()) { - lref = &a.GetInitValue(); + flext_base *th = thisObject(c); + t_text *t = (t_text *)c; + binbuf_addv(b, "ssiis", gensym("#X"),gensym("obj"), t->te_xpix, t->te_ypix,MakeSymbol(th->thisName())); + + int argc = binbuf_getnatom(t->te_binbuf); + t_atom *argv = binbuf_getvec(t->te_binbuf); + int i,cnt = CheckAttrib(argc,argv); + + // process the creation arguments + for(i = 1; i < cnt; ++i) BinbufAdd(b,argv[i]); + + // process the attributes + AtomList la; + th->ListAttrib(la); + cnt = la.Count(); + + for(i = 0; i < cnt; ++i) { + const t_symbol *sym = GetSymbol(la[i]); + AtomList lv; + const AtomList *lref = NULL; + AttrDataCont::iterator it = th->attrdata->find(sym); + + if(it != th->attrdata->end()) { + const AttrData &a = *it.data(); + if(a.IsInit() && a.IsInitValue()) { + lref = &a.GetInitValue(); /* - // check for $-parameters - lv = lref->Count(); - for(int j = 0; j < lref->Count(); ++j) { - const char *s = IsSymbol((*lref)[j])?GetString((*lref)[j]):NULL; - if(s && s[0] == '$') { // TODO: More refined checking? - // prepend a "\" - char tmp[256]; *tmp = '\\'; - strcpy(tmp+1,s); - SetString(lv[j],tmp); - } - else - lv[i] = (*lref)[j]; - } - - lref = &lv; + // check for $-parameters + lv = lref->Count(); + for(int j = 0; j < lref->Count(); ++j) { + const char *s = IsSymbol((*lref)[j])?GetString((*lref)[j]):NULL; + if(s && s[0] == '$') { // TODO: More refined checking? + // prepend a "\" + char tmp[256]; *tmp = '\\'; + strcpy(tmp+1,s); + SetString(lv[j],tmp); + } + else + lv[i] = (*lref)[j]; + } + + lref = &lv; */ - } - else if(a.IsSaved()) { - AttrItem *attr = th->FindAttrib(sym,true); - - // attribute must be gettable (so that the data can be retrieved) and puttable (so that the data can be inited) - if(attr && attr->BothExist()) { - th->GetAttrib(sym,attr,lv); - lref = &lv; - } - } - } - - if(lref) { - char attrname[256]; *attrname= '@'; - // store name - strcpy(attrname+1,GetString(sym)); - binbuf_addv(b,"s",MakeSymbol(attrname)); - - // store value - for(int j = 0; j < lref->Count(); ++j) BinbufAdd(b,(*lref)[j]); - } - } - - binbuf_addv(b, ";"); + } + else if(a.IsSaved()) { + AttrItem *attr = th->FindAttrib(sym,true); + + // attribute must be gettable (so that the data can be retrieved) and puttable (so that the data can be inited) + if(attr && attr->BothExist()) { + th->GetAttrib(sym,attr,lv); + lref = &lv; + } + } + } + + if(lref) { + char attrname[256]; *attrname= '@'; + // store name + strcpy(attrname+1,GetString(sym)); + binbuf_addv(b,"s",MakeSymbol(attrname)); + + // store value + for(int j = 0; j < lref->Count(); ++j) BinbufAdd(b,(*lref)[j]); + } + } + + binbuf_addv(b, ";"); } bool flext_base::cb_AttrDialog(flext_base *th,int argc,const t_atom *argv) { - int i = 0; - if(IsSymbol(argv[i]) && GetSymbol(argv[i]) == sym_list) ++i; - - for(; i < argc; ) { - FLEXT_ASSERT(IsSymbol(argv[i])); - - // get name - const t_symbol *aname = GetSymbol(argv[i]); - i++; - - // get current value - int ccnt,coffs; - if(IsSymbol(argv[i]) && GetSymbol(argv[i]) == sym_list) { - i++; - FLEXT_ASSERT(CanbeInt(argv[i])); - ccnt = GetAInt(argv[i]); - coffs = ++i; - } - else - coffs = i,ccnt = 1; - i += ccnt; - - // get init value - int icnt,ioffs; - if(IsSymbol(argv[i]) && GetSymbol(argv[i]) == sym_list) { - i++; - FLEXT_ASSERT(CanbeInt(argv[i])); - icnt = GetAInt(argv[i]); - ioffs = ++i; - } - else - ioffs = i,icnt = 1; - i += icnt; - - FLEXT_ASSERT(i < argc); - int sv = GetAInt(argv[i]); - ++i; - - // find puttable attribute - AttrItem *attr = th->FindAttrib(aname,false); - if(attr) { - bool ret = th->SetAttrib(aname,attr,ccnt,argv+coffs); - FLEXT_ASSERT(ret); - - AttrDataCont::iterator it = th->attrdata->find(aname); - - if(sv >= 1) { - // if data not present create it - if(it == th->attrdata->end()) { - AttrDataCont::pair pair; - pair.key() = aname; - pair.data() = new AttrData; - it = th->attrdata->insert(th->attrdata->begin(),pair); - } - - AttrData &a = *it.data(); - a.SetSave(sv == 2); - a.SetInit(true); - a.SetInitValue(icnt,argv+ioffs); - } - else { - if(it != th->attrdata->end()) { - AttrData &a = *it.data(); - // if data is present reset flags - a.SetSave(false); - a.SetInit(false); - - // let init data as is - } - } - } - else { - post("%s - Attribute %s can't be set",th->thisName(),GetString(aname)); - } - } - return true; + int i = 0; + if(IsSymbol(argv[i]) && GetSymbol(argv[i]) == sym_list) ++i; + + for(; i < argc; ) { + FLEXT_ASSERT(IsSymbol(argv[i])); + + // get name + const t_symbol *aname = GetSymbol(argv[i]); + i++; + + // get current value + int ccnt,coffs; + if(IsSymbol(argv[i]) && GetSymbol(argv[i]) == sym_list) { + i++; + FLEXT_ASSERT(CanbeInt(argv[i])); + ccnt = GetAInt(argv[i]); + coffs = ++i; + } + else + coffs = i,ccnt = 1; + i += ccnt; + + // get init value + int icnt,ioffs; + if(IsSymbol(argv[i]) && GetSymbol(argv[i]) == sym_list) { + i++; + FLEXT_ASSERT(CanbeInt(argv[i])); + icnt = GetAInt(argv[i]); + ioffs = ++i; + } + else + ioffs = i,icnt = 1; + i += icnt; + + FLEXT_ASSERT(i < argc); + int sv = GetAInt(argv[i]); + ++i; + + // find puttable attribute + AttrItem *attr = th->FindAttrib(aname,false); + if(attr) { + bool ret = th->SetAttrib(aname,attr,ccnt,argv+coffs); + FLEXT_ASSERT(ret); + + AttrDataCont::iterator it = th->attrdata->find(aname); + + if(sv >= 1) { + // if data not present create it + if(it == th->attrdata->end()) { + AttrDataCont::pair pair; + pair.key() = aname; + pair.data() = new AttrData; + it = th->attrdata->insert(th->attrdata->begin(),pair); + } + + AttrData &a = *it.data(); + a.SetSave(sv == 2); + a.SetInit(true); + a.SetInitValue(icnt,argv+ioffs); + } + else { + if(it != th->attrdata->end()) { + AttrData &a = *it.data(); + // if data is present reset flags + a.SetSave(false); + a.SetInit(false); + + // let init data as is + } + } + } + else { + post("%s - Attribute %s can't be set",th->thisName(),GetString(aname)); + } + } + return true; } #endif // FLEXT_SYS_PD diff --git a/externals/grill/flext/source/flbase.cpp b/externals/grill/flext/source/flbase.cpp index 72e07999..04bad89f 100644 --- a/externals/grill/flext/source/flbase.cpp +++ b/externals/grill/flext/source/flbase.cpp @@ -11,7 +11,7 @@ WARRANTIES, see the file, "license.txt," in this distribution. /*! \file flbase.cpp \brief Implementation of the internal flext base classes. - \remark This is all derived from GEM by Mark Danks + \remark This is all derived from GEM by Mark Danks */ #include "flext.h" @@ -21,12 +21,12 @@ WARRANTIES, see the file, "license.txt," in this distribution. #if FLEXT_SYS == FLEXT_SYS_PD #ifdef _MSC_VER - #pragma warning (push) - #pragma warning (disable:4091) + #pragma warning (push) + #pragma warning (disable:4091) #endif #include <g_canvas.h> #ifdef _MSC_VER - #pragma warning (pop) + #pragma warning (pop) #endif #endif @@ -52,9 +52,9 @@ void flext_obj::ProcessAttributes(bool attr) { process_attributes = attr; } ///////////////////////////////////////////////////////// flext_obj :: FLEXT_CLASSDEF(flext_obj)() : x_obj(m_holder) - , procattr(m_holdattr) - , init_ok(true) - , m_name(m_holdname) + , procattr(m_holdattr) + , init_ok(true) + , m_name(m_holdname) { #if FLEXT_SYS == FLEXT_SYS_PD m_canvas = canvas_getcurrent(); @@ -69,7 +69,7 @@ flext_obj :: FLEXT_CLASSDEF(flext_obj)() // ///////////////////////////////////////////////////////// flext_obj :: ~FLEXT_CLASSDEF(flext_obj)() { - x_obj = NULL; + x_obj = NULL; } @@ -80,56 +80,56 @@ void flext_obj::Exit() {} void flext_obj::DefineHelp(t_classid c,const char *ref,const char *dir,bool addtilde) { #if FLEXT_SYS == FLEXT_SYS_PD - char tmp[256]; - if(dir) { - strcpy(tmp,dir); - strcat(tmp,"/"); - strcat(tmp,ref); - } - else - strcpy(tmp,ref); - if(addtilde) strcat(tmp,"~"); + char tmp[256]; + if(dir) { + strcpy(tmp,dir); + strcat(tmp,"/"); + strcat(tmp,ref); + } + else + strcpy(tmp,ref); + if(addtilde) strcat(tmp,"~"); ::class_sethelpsymbol(getClass(c),gensym(const_cast<char *>(tmp))); #else - // no solution for Max/MSP yet + // no solution for Max/MSP yet #endif } bool flext_obj::GetParamSym(t_atom &dst,const t_symbol *sym,t_canvas *c) { #if FLEXT_SYS == FLEXT_SYS_PD - if(!c) c = canvas_getcurrent(); - - const char *s = GetString(sym); - if((s[0] == '$' || s[0] == '#') && isdigit(s[1])) { - const t_symbol *res; - // patcher parameter detected... get value! - if(s[0] != '$') { - char tmp[MAXPDSTRING]; - strcpy(tmp,s); - tmp[0] = '$'; - res = canvas_realizedollar(c,const_cast<t_symbol *>(MakeSymbol(tmp))); - } - else - res = canvas_realizedollar(c,const_cast<t_symbol *>(sym)); - - // check for number - const char *c = GetString(res); - while(*c && (isdigit(*c) || *c == '.')) ++c; - - if(!*c) - SetFloat(dst,(float)atof(GetString(res))); - else - SetSymbol(dst,res); - return true; - } - else + if(!c) c = canvas_getcurrent(); + + const char *s = GetString(sym); + if((s[0] == '$' || s[0] == '#') && isdigit(s[1])) { + const t_symbol *res; + // patcher parameter detected... get value! + if(s[0] != '$') { + char tmp[MAXPDSTRING]; + strcpy(tmp,s); + tmp[0] = '$'; + res = canvas_realizedollar(c,const_cast<t_symbol *>(MakeSymbol(tmp))); + } + else + res = canvas_realizedollar(c,const_cast<t_symbol *>(sym)); + + // check for number + const char *c = GetString(res); + while(*c && (isdigit(*c) || *c == '.')) ++c; + + if(!*c) + SetFloat(dst,(float)atof(GetString(res))); + else + SetSymbol(dst,res); + return true; + } + else #else - #pragma message("Not implemented") + #pragma message("Not implemented") #endif - SetSymbol(dst,sym); - return true; + SetSymbol(dst,sym); + return true; } @@ -142,13 +142,13 @@ extern "C" void canvas_getargs(int *argcp, t_atom **argvp); void flext_obj::CanvasArgs(AtomList &args) const { #if FLEXT_SYS == FLEXT_SYS_PD - int argc; - t_atom *argv; - canvas_getargs(&argc,&argv); - args(argc); - for(int i = 0; i < argc; ++i) args[i] = argv[i]; + int argc; + t_atom *argv; + canvas_getargs(&argc,&argv); + args(argc); + for(int i = 0; i < argc; ++i) args[i] = argv[i]; #else - #pragma message("Not implemented") - args(0); + #pragma message("Not implemented") + args(0); #endif } diff --git a/externals/grill/flext/source/flbase.h b/externals/grill/flext/source/flbase.h index 85633f20..a9a9d8e5 100644 --- a/externals/grill/flext/source/flbase.h +++ b/externals/grill/flext/source/flbase.h @@ -443,10 +443,16 @@ fts_module_t __##NAME##_module = {#NAME,#NAME,__##NAME##_initfun,0,0}; #define FLEXTTYPE_int FLEXTTPN_FLOAT #define FLEXTTYPE_int0 FLEXTTPN_DEFFLOAT #define CALLBTYPE_int float +#define FLEXTTYPE_bool FLEXTTPN_FLOAT +#define FLEXTTYPE_bool0 FLEXTTPN_DEFFLOAT +#define CALLBTYPE_bool float #elif FLEXT_SYS == FLEXT_SYS_MAX || FLEXT_SYS == FLEXT_SYS_JMAX #define FLEXTTYPE_int FLEXTTPN_INT #define FLEXTTYPE_int0 FLEXTTPN_DEFINT #define CALLBTYPE_int int +#define FLEXTTYPE_bool FLEXTTPN_INT +#define FLEXTTYPE_bool0 FLEXTTPN_DEFINT +#define CALLBTYPE_bool int #else #error #endif @@ -464,6 +470,8 @@ fts_module_t __##NAME##_module = {#NAME,#NAME,__##NAME##_initfun,0,0}; #define CALLBTP(TP) CALLBTYPE_ ## TP +#define ARGMEMBER_bool(a) GetBool(a) +#define ARGMEMBER_bool0(a) ARGMEMBER_bool(a) #define ARGMEMBER_int(a) GetInt(a) #define ARGMEMBER_int0(a) ARGMEMBER_int(a) #define ARGMEMBER_float(a) GetFloat(a) diff --git a/externals/grill/flext/source/flbind.cpp b/externals/grill/flext/source/flbind.cpp index 5a8f0743..8eefefb4 100644 --- a/externals/grill/flext/source/flbind.cpp +++ b/externals/grill/flext/source/flbind.cpp @@ -27,37 +27,37 @@ t_messlist px_messlist[3]; */ void flext_base::SetupBindProxy() { - // already initialized? - if(!pxbnd_class) { + // already initialized? + if(!pxbnd_class) { #if FLEXT_SYS == FLEXT_SYS_PD - pxbnd_class = class_new(gensym("flext_base bind proxy"),NULL,NULL,sizeof(pxbnd_object),CLASS_PD|CLASS_NOINLET, A_NULL); - add_anything(pxbnd_class,pxbnd_object::px_method); // for symbol-bound methods + pxbnd_class = class_new(gensym("flext_base bind proxy"),NULL,NULL,sizeof(pxbnd_object),CLASS_PD|CLASS_NOINLET, A_NULL); + add_anything(pxbnd_class,pxbnd_object::px_method); // for symbol-bound methods #elif FLEXT_SYS == FLEXT_SYS_MAX - pxbnd_class = new t_class; - - pxbnd_class->c_sym = gensym(""); - pxbnd_class->c_freelist = &px_freelist; - pxbnd_class->c_freefun = NULL; - pxbnd_class->c_size = sizeof(pxbnd_object); - pxbnd_class->c_tiny = 0; - pxbnd_class->c_noinlet = 1; - px_messlist[0].m_sym = (t_symbol *)pxbnd_class; - - px_messlist[1].m_sym = gensym("anything"); - px_messlist[1].m_fun = (method)pxbnd_object::px_method; - px_messlist[1].m_type[0] = A_GIMME; - px_messlist[1].m_type[1] = 0; - - px_messlist[2].m_sym = 0; + pxbnd_class = new t_class; + + pxbnd_class->c_sym = gensym(""); + pxbnd_class->c_freelist = &px_freelist; + pxbnd_class->c_freefun = NULL; + pxbnd_class->c_size = sizeof(pxbnd_object); + pxbnd_class->c_tiny = 0; + pxbnd_class->c_noinlet = 1; + px_messlist[0].m_sym = (t_symbol *)pxbnd_class; + + px_messlist[1].m_sym = gensym("anything"); + px_messlist[1].m_fun = (method)pxbnd_object::px_method; + px_messlist[1].m_type[0] = A_GIMME; + px_messlist[1].m_type[1] = 0; + + px_messlist[2].m_sym = 0; #else #pragma warning("Not implemented!") #endif - } + } } flext_base::BindItem::BindItem(bool (*f)(flext_base *,t_symbol *s,int,t_atom *,void *data),pxbnd_object *p): - Item(NULL),fun(f),px(p) + Item(NULL),fun(f),px(p) {} flext_base::BindItem::~BindItem() @@ -122,13 +122,13 @@ bool flext_base::BindMethod(const t_symbol *sym,bool (*fun)(flext_base *,t_symbo #endif if(px) { - BindItem *mi = new BindItem(fun,px); - bindhead->Add(mi,sym); + BindItem *mi = new BindItem(fun,px); + bindhead->Add(mi,sym); px->init(this,mi,data); #if FLEXT_SYS == FLEXT_SYS_PD - pd_bind(&px->obj.ob_pd,const_cast<t_symbol *>(sym)); + pd_bind(&px->obj.ob_pd,const_cast<t_symbol *>(sym)); #elif FLEXT_SYS == FLEXT_SYS_MAX if(!sym->s_thing) const_cast<t_symbol *>(sym)->s_thing = (t_object *)px; @@ -205,16 +205,16 @@ bool flext_base::UnbindAll() for(ItemSet::iterator si = set.begin(); si != set.end(); ++si) { Item *lst = si.data(); while(lst) { - Item *nxt = lst->nxt; + Item *nxt = lst->nxt; BindItem *it = (BindItem *)lst; it->Unbind(si.key()); delete it; - lst = nxt; + lst = nxt; } } set.clear(); } - return true; + return true; } void flext_base::pxbnd_object::px_method(pxbnd_object *c,const t_symbol *s,int argc,t_atom *argv) diff --git a/externals/grill/flext/source/flbuf.cpp b/externals/grill/flext/source/flbuf.cpp index 6d2f651d..4dc0b6e8 100644 --- a/externals/grill/flext/source/flbuf.cpp +++ b/externals/grill/flext/source/flbuf.cpp @@ -27,25 +27,25 @@ WARRANTIES, see the file, "license.txt," in this distribution. // check if PD API supports buffer dirty time #if defined(PD_DEVEL_VERSION) && defined(PD_MAJOR_VERSION) && defined(PD_MINOR_VERSION) #if PD_MINOR_VERSION >= 36 - #define FLEXT_PDBUFDIRTYTIME + #define FLEXT_PDBUFDIRTYTIME #endif #endif flext::buffer::buffer(const t_symbol *bn,bool delayed): - sym(NULL),data(NULL), - chns(0),frames(0) + sym(NULL),data(NULL), + chns(0),frames(0) { #if FLEXT_SYS == FLEXT_SYS_PD - arr = NULL; - interval = DIRTY_INTERVAL; - isdirty = false; - ticking = false; + arr = NULL; + interval = DIRTY_INTERVAL; + isdirty = false; + ticking = false; tick = clock_new(this,(t_method)cb_tick); #endif - if(bn) Set(bn,delayed); + if(bn) Set(bn,delayed); - ClearDirty(); + ClearDirty(); } flext::buffer::~buffer() @@ -57,167 +57,167 @@ flext::buffer::~buffer() int flext::buffer::Set(const t_symbol *s,bool nameonly) { - int ret = 0; - bool valid = data != NULL; // valid now? (before change) - - if(s && sym != s) { - ret = 1; - data = NULL; - frames = 0; - chns = 0; - } - - if(s && *GetString(s)) sym = s; - - if(!sym) { - if(valid) ret = -1; - } - else if(!nameonly) { + int ret = 0; + bool valid = data != NULL; // valid now? (before change) + + if(s && sym != s) { + ret = 1; + data = NULL; + frames = 0; + chns = 0; + } + + if(s && *GetString(s)) sym = s; + + if(!sym) { + if(valid) ret = -1; + } + else if(!nameonly) { #if FLEXT_SYS == FLEXT_SYS_PD - int frames1; - t_sample *data1; + int frames1; + t_sample *data1; - arr = (t_garray *)pd_findbyclass(const_cast<t_symbol *>(sym), garray_class); - if(!arr) - { - if (*GetString(sym)) FLEXT_LOG1("buffer: no such array '%s'",GetString(sym)); - sym = NULL; - if(valid) ret = -1; - } - else if(!garray_getfloatarray(arr, &frames1, &data1)) - { - error("buffer: bad template '%s'",GetString(sym)); - data = NULL; - frames = 0; - if(valid) ret = -1; - } - else { + arr = (t_garray *)pd_findbyclass(const_cast<t_symbol *>(sym), garray_class); + if(!arr) + { + if (*GetString(sym)) FLEXT_LOG1("buffer: no such array '%s'",GetString(sym)); + sym = NULL; + if(valid) ret = -1; + } + else if(!garray_getfloatarray(arr, &frames1, &data1)) + { + error("buffer: bad template '%s'",GetString(sym)); + data = NULL; + frames = 0; + if(valid) ret = -1; + } + else { ret = 0; - garray_usedindsp(arr); - if(frames != frames1) { frames = frames1; if(!ret) ret = 1; } - if(data != data1) { data = data1; if(!ret) ret = 1; } - chns = 1; - } + garray_usedindsp(arr); + if(frames != frames1) { frames = frames1; if(!ret) ret = 1; } + if(data != data1) { data = data1; if(!ret) ret = 1; } + chns = 1; + } #elif FLEXT_SYS == FLEXT_SYS_MAX - if(sym->s_thing) { - const _buffer *p = (const _buffer *)sym->s_thing; - - if(NOGOOD(p) || !p->b_valid) { - post("buffer: buffer object '%s' no good",GetString(sym)); - if(valid) ret = -2; - } - else { + if(sym->s_thing) { + const _buffer *p = (const _buffer *)sym->s_thing; + + if(NOGOOD(p) || !p->b_valid) { + post("buffer: buffer object '%s' no good",GetString(sym)); + if(valid) ret = -2; + } + else { #ifdef FLEXT_DEBUG -// post("flext: buffer object '%s' - valid:%i samples:%i channels:%i frames:%i",GetString(sym),p->b_valid,p->b_frames,p->b_nchans,p->b_frames); +// post("flext: buffer object '%s' - valid:%i samples:%i channels:%i frames:%i",GetString(sym),p->b_valid,p->b_frames,p->b_nchans,p->b_frames); #endif - if(data != p->b_samples) { data = p->b_samples; if(!ret) ret = 1; } - if(chns != p->b_nchans) { chns = p->b_nchans; if(!ret) ret = 1; } - if(frames != p->b_frames) { frames = p->b_frames; if(!ret) ret = 1; } - } - } - else { - FLEXT_LOG1("buffer: symbol '%s' not defined", GetString(sym)); - /*if(valid)*/ ret = -1; - } + if(data != p->b_samples) { data = p->b_samples; if(!ret) ret = 1; } + if(chns != p->b_nchans) { chns = p->b_nchans; if(!ret) ret = 1; } + if(frames != p->b_frames) { frames = p->b_frames; if(!ret) ret = 1; } + } + } + else { + FLEXT_LOG1("buffer: symbol '%s' not defined", GetString(sym)); + /*if(valid)*/ ret = -1; + } #else #error not implemented #endif - } + } - return ret; + return ret; } bool flext::buffer::Valid() const { - if(sym) { + if(sym) { #if FLEXT_SYS == FLEXT_SYS_PD - int frames1; - t_sample *data1; - return arr && garray_getfloatarray(arr, &frames1, &data1) != 0; + int frames1; + t_sample *data1; + return arr && garray_getfloatarray(arr, &frames1, &data1) != 0; #elif FLEXT_SYS == FLEXT_SYS_MAX - const _buffer *p = (const _buffer *)sym->s_thing; - return p && p->b_valid; + const _buffer *p = (const _buffer *)sym->s_thing; + return p && p->b_valid; #else #error #endif - } - else return false; + } + else return false; } bool flext::buffer::Update() { - if(!Ok()) return false; + if(!Ok()) return false; - bool ok = false; + bool ok = false; #if FLEXT_SYS == FLEXT_SYS_PD - int frames1; - t_sample *data1; - if(!garray_getfloatarray(arr, &frames1, &data1)) { - frames = 0; - data = NULL; - chns = 0; - ok = true; - } - else if(data != data1 || frames != frames1) { - frames = frames1; - data = data1; - ok = true; - } + int frames1; + t_sample *data1; + if(!garray_getfloatarray(arr, &frames1, &data1)) { + frames = 0; + data = NULL; + chns = 0; + ok = true; + } + else if(data != data1 || frames != frames1) { + frames = frames1; + data = data1; + ok = true; + } #elif FLEXT_SYS == FLEXT_SYS_MAX - if(sym->s_thing) { - const _buffer *p = (const _buffer *)sym->s_thing; - if(data != p->b_samples || chns != p->b_nchans || frames != p->b_frames) { - data = p->b_samples; - chns = p->b_nchans; - frames = p->b_frames; - ok = true; - } - } + if(sym->s_thing) { + const _buffer *p = (const _buffer *)sym->s_thing; + if(data != p->b_samples || chns != p->b_nchans || frames != p->b_frames) { + data = p->b_samples; + chns = p->b_nchans; + frames = p->b_frames; + ok = true; + } + } #else #error not implemented #endif - return ok; + return ok; } void flext::buffer::Frames(int fr,bool keep,bool zero) { #if FLEXT_SYS == FLEXT_SYS_PD // is this function guaranteed to keep memory and set rest to zero? - ::garray_resize(arr,(float)fr); - Update(); + ::garray_resize(arr,(float)fr); + Update(); #elif FLEXT_SYS == FLEXT_SYS_MAX - t_sample *tmp = NULL; - int sz = frames; - if(fr < sz) sz = fr; + t_sample *tmp = NULL; + int sz = frames; + if(fr < sz) sz = fr; - if(keep) { - // copy buffer data to tmp storage + if(keep) { + // copy buffer data to tmp storage tmp = (t_sample *)NewAligned(sz*sizeof(t_sample)); if(tmp) - CopySamples(tmp,data,sz); - else - error("flext::buffer - not enough memory for keeping buffer~ contents"); - } - - t_atom msg; - _buffer *buf = (_buffer *)sym->s_thing; - // b_msr reflects buffer sample rate... is this what we want? - // Max bug: adding half a sample to prevent roundoff errors.... - float ms = (fr+0.5)/buf->b_msr; - - SetFloat(msg,ms); - ::typedmess((object *)buf,gensym("size"),1,&msg); - - Update(); - - if(tmp) { - // copy data back - CopySamples(data,tmp,sz); - FreeAligned(tmp); + CopySamples(tmp,data,sz); + else + error("flext::buffer - not enough memory for keeping buffer~ contents"); + } + + t_atom msg; + _buffer *buf = (_buffer *)sym->s_thing; + // b_msr reflects buffer sample rate... is this what we want? + // Max bug: adding half a sample to prevent roundoff errors.... + float ms = (fr+0.5)/buf->b_msr; + + SetFloat(msg,ms); + ::typedmess((object *)buf,gensym("size"),1,&msg); + + Update(); + + if(tmp) { + // copy data back + CopySamples(data,tmp,sz); + FreeAligned(tmp); if(zero && sz < fr) ZeroSamples(data+sz,fr-sz); - } + } else if(zero) ZeroSamples(data,fr); #else @@ -229,11 +229,11 @@ void flext::buffer::Frames(int fr,bool keep,bool zero) #if FLEXT_SYS == FLEXT_SYS_PD void flext::buffer::SetRefrIntv(float intv) { - interval = intv; - if(interval == 0 && ticking) { - clock_unset(tick); - ticking = false; - } + interval = intv; + if(interval == 0 && ticking) { + clock_unset(tick); + ticking = false; + } } #elif FLEXT_SYS == FLEXT_SYS_MAX void flext::buffer::SetRefrIntv(float) {} @@ -244,60 +244,60 @@ void flext::buffer::SetRefrIntv(float) {} void flext::buffer::Dirty(bool force) { - if(sym) { + if(sym) { #if FLEXT_SYS == FLEXT_SYS_PD - if((!ticking) && (interval || force)) { - ticking = true; - cb_tick(this); // immediately redraw - } - else { - if(force) clock_delay(tick,0); - isdirty = true; - } + if((!ticking) && (interval || force)) { + ticking = true; + cb_tick(this); // immediately redraw + } + else { + if(force) clock_delay(tick,0); + isdirty = true; + } #elif FLEXT_SYS == FLEXT_SYS_MAX - if(sym->s_thing) { - _buffer *p = (_buffer *)sym->s_thing; - - if(NOGOOD(p)) { - post("buffer: buffer object '%s' no good",sym->s_name); - } - else { - p->b_modtime = gettime(); - } - } - else { - FLEXT_LOG1("buffer: symbol '%s' not defined",sym->s_name); - } + if(sym->s_thing) { + _buffer *p = (_buffer *)sym->s_thing; + + if(NOGOOD(p)) { + post("buffer: buffer object '%s' no good",sym->s_name); + } + else { + p->b_modtime = gettime(); + } + } + else { + FLEXT_LOG1("buffer: symbol '%s' not defined",sym->s_name); + } #else #error Not implemented #endif - } + } } #if FLEXT_SYS == FLEXT_SYS_PD void flext::buffer::cb_tick(buffer *b) { - if(b->arr) garray_redraw(b->arr); + if(b->arr) garray_redraw(b->arr); #ifdef FLEXT_DEBUG - else error("buffer: array is NULL"); + else error("buffer: array is NULL"); #endif - if(b->isdirty && b->interval) { - b->isdirty = false; - b->ticking = true; - clock_delay(b->tick,b->interval); - } - else - b->ticking = false; + if(b->isdirty && b->interval) { + b->isdirty = false; + b->ticking = true; + clock_delay(b->tick,b->interval); + } + else + b->ticking = false; } #endif void flext::buffer::ClearDirty() { #if FLEXT_SYS == FLEXT_SYS_PD - cleantime = clock_getlogicaltime(); + cleantime = clock_getlogicaltime(); #elif FLEXT_SYS == FLEXT_SYS_MAX - cleantime = gettime(); + cleantime = gettime(); #else #error Not implemented #endif @@ -306,24 +306,24 @@ void flext::buffer::ClearDirty() bool flext::buffer::IsDirty() const { #if FLEXT_SYS == FLEXT_SYS_PD - if(!arr) return false; - #ifdef FLEXT_PDBUFDIRTYTIME - return isdirty || garray_updatetime(arr) > cleantime; - #else - // Don't know.... (no method in PD judging whether buffer has been changed from outside flext...) - return true; - #endif + if(!arr) return false; + #ifdef FLEXT_PDBUFDIRTYTIME + return isdirty || garray_updatetime(arr) > cleantime; + #else + // Don't know.... (no method in PD judging whether buffer has been changed from outside flext...) + return true; + #endif #elif FLEXT_SYS == FLEXT_SYS_MAX - if(!sym->s_thing) return false; + if(!sym->s_thing) return false; - _buffer *p = (_buffer *)sym->s_thing; + _buffer *p = (_buffer *)sym->s_thing; #ifdef FLEXT_DEBUG - if(NOGOOD(p)) { - post("buffer: buffer object '%s' no good",sym->s_name); - return false; - } + if(NOGOOD(p)) { + post("buffer: buffer object '%s' no good",sym->s_name); + return false; + } #endif - return p->b_modtime > cleantime; + return p->b_modtime > cleantime; #else #error Not implemented #endif diff --git a/externals/grill/flext/source/flcwmax-thr.h b/externals/grill/flext/source/flcwmax-thr.h index 2e883dbe..4167be9f 100755 --- a/externals/grill/flext/source/flcwmax-thr.h +++ b/externals/grill/flext/source/flcwmax-thr.h @@ -18,12 +18,12 @@ WARRANTIES, see the file, "license.txt," in this distribution. #define FLEXT_THREADS /* - old CodeWarrior version (<= 6) don't have sigset_t defined which - is needed for pthreads + old CodeWarrior version (<= 6) don't have sigset_t defined which + is needed for pthreads */ #if defined(__MWERKS__) && (__MWERKS__ == 1) // read __MWERKS__ numbering starts with CW7 - typedef unsigned int sigset_t; - #define _CW_NOPRECOMP // no precompiled headers + typedef unsigned int sigset_t; + #define _CW_NOPRECOMP // no precompiled headers #endif #include "flcwmax.h" diff --git a/externals/grill/flext/source/flcwmax-x-thr.h b/externals/grill/flext/source/flcwmax-x-thr.h index e737ff19..93b78289 100755 --- a/externals/grill/flext/source/flcwmax-x-thr.h +++ b/externals/grill/flext/source/flcwmax-x-thr.h @@ -18,12 +18,12 @@ WARRANTIES, see the file, "license.txt," in this distribution. #define FLEXT_THREADS /* - old CodeWarrior version (<= 6) don't have sigset_t defined which - is needed for pthreads + old CodeWarrior version (<= 6) don't have sigset_t defined which + is needed for pthreads */ #if defined(__MWERKS__) && (__MWERKS__ == 1) // read __MWERKS__ numbering starts with CW7 - typedef unsigned int sigset_t; - #define _CW_NOPRECOMP // no precompiled headers + typedef unsigned int sigset_t; + #define _CW_NOPRECOMP // no precompiled headers #endif #include "flcwmax-x.h" diff --git a/externals/grill/flext/source/flcwmax.h b/externals/grill/flext/source/flcwmax.h index 56fe03c3..4d108e2e 100644 --- a/externals/grill/flext/source/flcwmax.h +++ b/externals/grill/flext/source/flcwmax.h @@ -16,19 +16,19 @@ WARRANTIES, see the file, "license.txt," in this distribution. #define _FLEXT_CW_MAX_H #ifndef __MWERKS__ - #error "This header file is for CodeWarrior only." + #error "This header file is for CodeWarrior only." #endif #define FLEXT_SYS 1 #define FLEXT_USE_SIMD #ifndef _CW_NOPRECOMP - #include <MacHeaders.h> + #include <MacHeaders.h> #endif #if /*__option(sym) ||*/ !__option(opt_dead_code) - #pragma message("Optimization disabled -> Compiling a debug version (with FLEXT_DEBUG)") - #define FLEXT_DEBUG + #pragma message("Optimization disabled -> Compiling a debug version (with FLEXT_DEBUG)") + #define FLEXT_DEBUG #endif /* #define _LOG */ diff --git a/externals/grill/flext/source/flcwpd-x-thr.h b/externals/grill/flext/source/flcwpd-x-thr.h index 56a193ef..d3075069 100755 --- a/externals/grill/flext/source/flcwpd-x-thr.h +++ b/externals/grill/flext/source/flcwpd-x-thr.h @@ -17,12 +17,12 @@ WARRANTIES, see the file, "license.txt," in this distribution. #if 0 /* - old CodeWarrior version (<= 6) don't have sigset_t defined which - is needed for pthreads + old CodeWarrior version (<= 6) don't have sigset_t defined which + is needed for pthreads */ #if defined(__MWERKS__) && (__MWERKS__ <= 0x6000) - typedef unsigned int sigset_t; - #define _CW_NOPRECOMP // no precompiled headers + typedef unsigned int sigset_t; + #define _CW_NOPRECOMP // no precompiled headers #endif #endif diff --git a/externals/grill/flext/source/flcwpd-x.h b/externals/grill/flext/source/flcwpd-x.h index 3a5087ae..f6b5192b 100755 --- a/externals/grill/flext/source/flcwpd-x.h +++ b/externals/grill/flext/source/flcwpd-x.h @@ -14,7 +14,7 @@ WARRANTIES, see the file, "license.txt," in this distribution. #define _FLEXT_CW_PD_X_H #ifndef __MWERKS__ - #error "This header file is for CodeWarrior only." + #error "This header file is for CodeWarrior only." #endif #define FLEXT_SYS 2 @@ -24,12 +24,12 @@ WARRANTIES, see the file, "license.txt," in this distribution. #define _POSIX_C_SOURCE #ifndef _CW_NOPRECOMP -// #include <MacHeadersMach-O.h> -// #include <MSL MacHeadersMach-O.h> +// #include <MacHeadersMach-O.h> +// #include <MSL MacHeadersMach-O.h> #endif #if __option(sym) || !__option(opt_dead_code) - #define FLEXT_DEBUG + #define FLEXT_DEBUG #endif /* #define _LOG */ diff --git a/externals/grill/flext/source/fldefs.h b/externals/grill/flext/source/fldefs.h index f0e37ab8..4f8a4264 100644 --- a/externals/grill/flext/source/fldefs.h +++ b/externals/grill/flext/source/fldefs.h @@ -15,13 +15,13 @@ WARRANTIES, see the file, "license.txt," in this distribution. #ifndef __FLEXT_DEFS_H #define __FLEXT_DEFS_H -/*! \defgroup FLEXT_DEFS Definitions for basic flext functionality - @{ +/*! \defgroup FLEXT_DEFS Definitions for basic flext functionality + @{ */ /*! \brief Switch for compilation of derived virtual classes - \remark These need dynamic type casts (and RTTI, naturally) - \ingroup FLEXT_GLOBALS + \remark These need dynamic type casts (and RTTI, naturally) + \ingroup FLEXT_GLOBALS */ #ifdef FLEXT_VIRT #define FLEXT_CAST dynamic_cast @@ -29,7 +29,7 @@ WARRANTIES, see the file, "license.txt," in this distribution. #define FLEXT_CAST static_cast #endif -//! @} FLEXT_DEFS +//! @} FLEXT_DEFS #include "fldefs_hdr.h" @@ -38,8 +38,8 @@ WARRANTIES, see the file, "license.txt," in this distribution. // ==================================================================================== -/*! \defgroup FLEXT_D_METHOD Declarations for flext methods - @{ +/*! \defgroup FLEXT_D_METHOD Declarations for flext methods + @{ */ #include "fldefs_methcb.h" @@ -54,9 +54,9 @@ WARRANTIES, see the file, "license.txt," in this distribution. #ifdef FLEXT_ATTRIBUTES -/*! \defgroup FLEXT_D_ATTRIB Attribute definition - \note These have to reside inside the class declaration - @{ +/*! \defgroup FLEXT_D_ATTRIB Attribute definition + \note These have to reside inside the class declaration + @{ */ #include "fldefs_attrcb.h" diff --git a/externals/grill/flext/source/fldefs_attradd.h b/externals/grill/flext/source/fldefs_attradd.h index 50aef3cb..df2f9407 100644 --- a/externals/grill/flext/source/fldefs_attradd.h +++ b/externals/grill/flext/source/fldefs_attradd.h @@ -17,101 +17,101 @@ WARRANTIES, see the file, "license.txt," in this distribution. #define __FLEXT_DEFS_ATTRADD_H -/*! \defgroup FLEXT_D_CADDATTR Announce object attributes at class scope +/*! \defgroup FLEXT_D_CADDATTR Announce object attributes at class scope \ingroup FLEXT_D_ATTRIB - \note These can only be used at class construction time - @{ + \note These can only be used at class construction time + @{ */ //! Add handler for a gettable attribute -#define FLEXT_CADDATTR_GET(CL,NAME,GFUN) \ +#define FLEXT_CADDATTR_GET(CL,NAME,GFUN) \ \ AddAttrib(CL,NAME,(FLEXT_GET_PRE(GFUN)),NULL) //! Add handler for a settable attribute -#define FLEXT_CADDATTR_SET(CL,NAME,SFUN) \ +#define FLEXT_CADDATTR_SET(CL,NAME,SFUN) \ \ AddAttrib(CL,NAME,NULL,(FLEXT_SET_PRE(SFUN))) //! Add handlers for a both get- and settable attribute -#define FLEXT_CADDATTR_VAR(CL,NAME,GFUN,SFUN) \ +#define FLEXT_CADDATTR_VAR(CL,NAME,GFUN,SFUN) \ \ AddAttrib(CL,NAME,(FLEXT_GET_PRE(GFUN)),(FLEXT_SET_PRE(SFUN))) //! Add handlers for a both get- and settable attribute -#define FLEXT_CADDATTR_VAR1(CL,NAME,FUN) \ +#define FLEXT_CADDATTR_VAR1(CL,NAME,FUN) \ \ AddAttrib(CL,NAME,(FLEXT_GET_PRE(FUN)),(FLEXT_SET_PRE(FUN))) //! Add handler for a gettable enum attribute -#define FLEXT_CADDATTR_GET_E(CL,NAME,GFUN) \ +#define FLEXT_CADDATTR_GET_E(CL,NAME,GFUN) \ \ AddAttrib(CL,NAME,(bool (*)(flext_base *,int &))(FLEXT_GET_PRE(GFUN)),NULL) //! Add handler for a settable enum attribute -#define FLEXT_CADDATTR_SET_E(CL,NAME,SFUN) \ +#define FLEXT_CADDATTR_SET_E(CL,NAME,SFUN) \ \ AddAttrib(CL,NAME,NULL,(bool (*)(flext_base *,int &))(FLEXT_SET_PRE(SFUN))) //! Add handlers for a both get- and settable enum attribute -#define FLEXT_CADDATTR_VAR_E(CL,NAME,GFUN,SFUN) \ +#define FLEXT_CADDATTR_VAR_E(CL,NAME,GFUN,SFUN) \ \ AddAttrib(CL,NAME,(bool (*)(flext_base *,int &))(FLEXT_GET_PRE(GFUN)),(bool (*)(flext_base *,int &))(FLEXT_SET_PRE(SFUN))) //! Add handlers for a both get- and settable enum attribute -#define FLEXT_CADDATTR_VAR1_E(CL,NAME,FUN) \ +#define FLEXT_CADDATTR_VAR1_E(CL,NAME,FUN) \ \ AddAttrib(CL,NAME,(bool (*)(flext_base *,int &))(FLEXT_GET_PRE(FUN)),(bool (*)(flext_base *,int &))(FLEXT_SET_PRE(FUN))) //! @} FLEXT_D_CADDATTR -/*! \defgroup FLEXT_D_ADDATTR Announce object attributes +/*! \defgroup FLEXT_D_ADDATTR Announce object attributes \ingroup FLEXT_D_ATTRIB - \note These can only be used at object construction time - \note (in constructor or in Init() function before call to parent's Init()) - @{ + \note These can only be used at object construction time + \note (in constructor or in Init() function before call to parent's Init()) + @{ */ //! Add handler for a gettable attribute -#define FLEXT_ADDATTR_GET(NAME,GFUN) \ +#define FLEXT_ADDATTR_GET(NAME,GFUN) \ \ AddAttrib(NAME,(FLEXT_GET_PRE(GFUN)),NULL) //! Add handler for a settable attribute -#define FLEXT_ADDATTR_SET(NAME,SFUN) \ +#define FLEXT_ADDATTR_SET(NAME,SFUN) \ \ AddAttrib(NAME,NULL,(FLEXT_SET_PRE(SFUN))) //! Add handlers for a both get- and settable attribute -#define FLEXT_ADDATTR_VAR(NAME,GFUN,SFUN) \ +#define FLEXT_ADDATTR_VAR(NAME,GFUN,SFUN) \ \ AddAttrib(NAME,(FLEXT_GET_PRE(GFUN)),(FLEXT_SET_PRE(SFUN))) //! Add handlers for a both get- and settable attribute -#define FLEXT_ADDATTR_VAR1(NAME,FUN) \ +#define FLEXT_ADDATTR_VAR1(NAME,FUN) \ \ AddAttrib(NAME,(FLEXT_GET_PRE(FUN)),(FLEXT_SET_PRE(FUN))) //! Add handler for a gettable enum attribute -#define FLEXT_ADDATTR_GET_E(NAME,GFUN) \ +#define FLEXT_ADDATTR_GET_E(NAME,GFUN) \ \ AddAttrib(NAME,(bool (*)(flext_base *,int &))(FLEXT_GET_PRE(GFUN)),NULL) //! Add handler for a settable enum attribute -#define FLEXT_ADDATTR_SET_E(NAME,SFUN) \ +#define FLEXT_ADDATTR_SET_E(NAME,SFUN) \ \ AddAttrib(NAME,NULL,(bool (*)(flext_base *,int &))(FLEXT_SET_PRE(SFUN))) //! Add handlers for a both get- and settable enum attribute -#define FLEXT_ADDATTR_VAR_E(NAME,GFUN,SFUN) \ +#define FLEXT_ADDATTR_VAR_E(NAME,GFUN,SFUN) \ \ AddAttrib(NAME,(bool (*)(flext_base *,int &))(FLEXT_GET_PRE(GFUN)),(bool (*)(flext_base *,int &))(FLEXT_SET_PRE(SFUN))) //! Add handlers for a both get- and settable enum attribute -#define FLEXT_ADDATTR_VAR1_E(NAME,FUN) \ +#define FLEXT_ADDATTR_VAR1_E(NAME,FUN) \ \ AddAttrib(NAME,(bool (*)(flext_base *,int &))(FLEXT_GET_PRE(FUN)),(bool (*)(flext_base *,int &))(FLEXT_SET_PRE(FUN))) diff --git a/externals/grill/flext/source/fldefs_attrcb.h b/externals/grill/flext/source/fldefs_attrcb.h index cf9aec4c..85625a23 100644 --- a/externals/grill/flext/source/fldefs_attrcb.h +++ b/externals/grill/flext/source/fldefs_attrcb.h @@ -19,14 +19,14 @@ WARRANTIES, see the file, "license.txt," in this distribution. /*! \brief Declare a attribute set function - \internal + \internal */ #define FLEXT_CALLSET_(FUN,TP) \ static bool FLEXT_SET_PRE(FUN)(flext_base *c,TP &arg) \ { FLEXT_CAST<thisType *>(c)->FUN(arg); return true; } /*! \brief Declare a attribute get function - \internal + \internal */ #define FLEXT_CALLGET_(FUN,TP) \ static bool FLEXT_GET_PRE(FUN)(flext_base *c,TP &arg) \ @@ -34,9 +34,9 @@ static bool FLEXT_GET_PRE(FUN)(flext_base *c,TP &arg) \ -/*! \defgroup FLEXT_DA_CALLSET Definition of attribute set handlers +/*! \defgroup FLEXT_DA_CALLSET Definition of attribute set handlers \ingroup FLEXT_D_ATTRIB - @{ + @{ */ //! Declare a set function for a float attribute @@ -75,9 +75,9 @@ static bool FLEXT_SET_PRE(FUN)(flext_base *c,AtomList *&arg) \ //! @} FLEXT_DA_CALLSET -/*! \defgroup FLEXT_DA_CALLGET Definition of attribute get handlers +/*! \defgroup FLEXT_DA_CALLGET Definition of attribute get handlers \ingroup FLEXT_D_ATTRIB - @{ + @{ */ //! Declare a get function for a float attribute @@ -117,9 +117,9 @@ static bool FLEXT_GET_PRE(FUN)(flext_base *c,AtomList *&arg) \ //! @} FLEXT_DA_CALLGET -/*! \defgroup FLEXT_DA_CALLVAR Definition of attribute transfer handlers (both get and set) +/*! \defgroup FLEXT_DA_CALLVAR Definition of attribute transfer handlers (both get and set) \ingroup FLEXT_D_ATTRIB - @{ + @{ */ //! Declare both get and set functions for a float attribute diff --git a/externals/grill/flext/source/fldefs_attrvar.h b/externals/grill/flext/source/fldefs_attrvar.h index c63fbb35..7f7db5ef 100644 --- a/externals/grill/flext/source/fldefs_attrvar.h +++ b/externals/grill/flext/source/fldefs_attrvar.h @@ -18,14 +18,14 @@ WARRANTIES, see the file, "license.txt," in this distribution. /*! \brief Declare an implicit attribute set function - \internal + \internal */ #define FLEXT_ATTRSET_(VAR,TP) \ static bool FLEXT_SET_PRE(VAR)(flext_base *c,TP &arg) \ { FLEXT_CAST<thisType *>(c)->VAR = arg; return true; } /*! \brief Declare an implicit attribute get function - \internal + \internal */ #define FLEXT_ATTRGET_(VAR,TP) \ static bool FLEXT_GET_PRE(VAR)(flext_base *c,TP &arg) \ @@ -33,9 +33,9 @@ static bool FLEXT_GET_PRE(VAR)(flext_base *c,TP &arg) \ -/*! \defgroup FLEXT_DA_ATTRSET Definition of implicit attribute set handlers +/*! \defgroup FLEXT_DA_ATTRSET Definition of implicit attribute set handlers \ingroup FLEXT_D_ATTRIB - @{ + @{ */ //! Declare an implicit set function for a float attribute @@ -74,9 +74,9 @@ static bool FLEXT_SET_PRE(VAR)(flext_base *c,AtomList *&arg) \ //! @} FLEXT_DA_ATTRSET -/*! \defgroup FLEXT_DA_ATTRGET Definition of implicit attribute get handlers +/*! \defgroup FLEXT_DA_ATTRGET Definition of implicit attribute get handlers \ingroup FLEXT_D_ATTRIB - @{ + @{ */ //! Declare an implicit get function for a float attribute @@ -116,9 +116,9 @@ static bool FLEXT_GET_PRE(VAR)(flext_base *c,AtomList *&arg) \ //! @} FLEXT_DA_ATTRGET -/*! \defgroup FLEXT_DA_ATTRVAR Definition of implicit attribute transfer handlers (both get and set) +/*! \defgroup FLEXT_DA_ATTRVAR Definition of implicit attribute transfer handlers (both get and set) \ingroup FLEXT_D_ATTRIB - @{ + @{ */ //! Declare both implicit get and set functions for a float attribute diff --git a/externals/grill/flext/source/fldefs_methadd.h b/externals/grill/flext/source/fldefs_methadd.h index e9cb93d4..562b72e3 100644 --- a/externals/grill/flext/source/fldefs_methadd.h +++ b/externals/grill/flext/source/fldefs_methadd.h @@ -17,25 +17,25 @@ WARRANTIES, see the file, "license.txt," in this distribution. #define __FLEXT_DEFS_METHADD_H -/*! \defgroup FLEXT_D_CADDMETHOD Add flext methods within class scope +/*! \defgroup FLEXT_D_CADDMETHOD Add flext methods within class scope \ingroup FLEXT_D_METHOD - \note These can only be used at class construction time - @{ + \note These can only be used at class construction time + @{ */ //! Add a method handler for bang #define FLEXT_CADDBANG(CL,IX,M_FUN) \ \ -AddMethod(CL,IX,"bang",FLEXT_CALL_PRE(M_FUN)) +AddMethod(CL,IX,"bang",FLEXT_CALL_PRE(M_FUN)) //! Add a handler for a method with either no, list or anything arguments #define FLEXT_CADDMETHOD(CL,IX,M_FUN) \ -AddMethod(CL,IX,FLEXT_CALL_PRE(M_FUN)) +AddMethod(CL,IX,FLEXT_CALL_PRE(M_FUN)) //! Add a a handler for a method with implicit arguments #define FLEXT_CADDMETHOD_(CL,IX,M_TAG,M_FUN) \ \ -AddMethod(CL,IX,M_TAG,FLEXT_CALL_PRE(M_FUN)) +AddMethod(CL,IX,M_TAG,FLEXT_CALL_PRE(M_FUN)) //! Add a handler for a method with 1 enum type argument #define FLEXT_CADDMETHOD_E(CL,IX,M_TAG,M_FUN) \ @@ -45,7 +45,7 @@ AddMethod(ClMeths(CL),IX,M_TAG,(methfun)(FLEXT_CALL_PRE(M_FUN)),a_int,a_null) //! Add a handler for a method with 1 argument #define FLEXT_CADDMETHOD_1(CL,IX,M_TAG,M_FUN,TP1) \ \ -AddMethod(ClMeths(CL),IX,M_TAG,(methfun)(FLEXT_CALL_PRE(M_FUN)),FLEXTARG(TP1),a_null) +AddMethod(ClMeths(CL),IX,M_TAG,(methfun)(FLEXT_CALL_PRE(M_FUN)),FLEXTARG(TP1),a_null) //! Add a handler for a method with 2 arguments #define FLEXT_CADDMETHOD_2(CL,IX,M_TAG,M_FUN,TP1,TP2) \ @@ -68,7 +68,7 @@ AddMethod(ClMeths(CL),IX,M_TAG,(methfun)(FLEXT_CALL_PRE(M_FUN)),FLEXTARG(TP1),FL AddMethod(ClMeths(CL),IX,M_TAG,(methfun)(FLEXT_CALL_PRE(M_FUN)),FLEXTARG(TP1),FLEXTARG(TP2),FLEXTARG(TP3),FLEXTARG(TP4),FLEXTARG(TP5),a_null) -// Shortcuts +// Shortcuts //! Add a handler for a method with a boolean argument #define FLEXT_CADDMETHOD_B(CL,IX,M_TAG,M_FUN) \ @@ -108,11 +108,11 @@ FLEXT_CADDMETHOD_3(CL,IX,M_TAG,M_FUN,int,int,int) //! @} FLEXT_D_CADDMETHOD -/*! \defgroup FLEXT_D_ADDMETHOD Add flext methods +/*! \defgroup FLEXT_D_ADDMETHOD Add flext methods \ingroup FLEXT_D_METHOD - \note These can only be used at object construction time - \note (in constructor or in Init() function before call to parent's Init()) - @{ + \note These can only be used at object construction time + \note (in constructor or in Init() function before call to parent's Init()) + @{ */ //! Set timer callback @@ -123,37 +123,37 @@ TMR.SetCallback(*this,FLEXT_CALL_PRE(M_FUN)) //! Enable list element distribution over inlets (if no better handler found) #define FLEXT_ADDDIST() \ \ -SetDist(true) +SetDist(true) //! Add a method handler for bang #define FLEXT_ADDBANG(IX,M_FUN) \ \ -AddMethod(IX,"bang",FLEXT_CALL_PRE(M_FUN)) +AddMethod(IX,"bang",FLEXT_CALL_PRE(M_FUN)) //! Add a handler for a method with either no, list or anything arguments #define FLEXT_ADDMETHOD(IX,M_FUN) \ -AddMethod(IX,FLEXT_CALL_PRE(M_FUN)) +AddMethod(IX,FLEXT_CALL_PRE(M_FUN)) /*! \brief Add a handler for a method with a (variable argument) list - \deprecated This definition obscures that _ indicates the usage of a message tag - use FLEXT_ADDMETHOD instead - \note This is already covered by FLEXT_ADDMETHOD, but here for the sake of clarity + \deprecated This definition obscures that _ indicates the usage of a message tag - use FLEXT_ADDMETHOD instead + \note This is already covered by FLEXT_ADDMETHOD, but here for the sake of clarity */ #define FLEXT_ADDMETHOD_V(IX,M_FUN) \ \ -AddMethod(IX,FLEXT_CALL_PRE(M_FUN)) +AddMethod(IX,FLEXT_CALL_PRE(M_FUN)) /*! \brief Add a handler for a method with an anything argument - \deprecated This definition obscures that _ indicates the usage of a message tag - use FLEXT_ADDMETHOD instead - \note This is already covered by FLEXT_ADDMETHOD, but here for the sake of clarity + \deprecated This definition obscures that _ indicates the usage of a message tag - use FLEXT_ADDMETHOD instead + \note This is already covered by FLEXT_ADDMETHOD, but here for the sake of clarity */ #define FLEXT_ADDMETHOD_A(IX,M_FUN) \ \ -AddMethod(IX,FLEXT_CALL_PRE(M_FUN)) +AddMethod(IX,FLEXT_CALL_PRE(M_FUN)) //! Add a a handler for a tagged method with implicit arguments #define FLEXT_ADDMETHOD_(IX,M_TAG,M_FUN) \ \ -AddMethod(IX,M_TAG,FLEXT_CALL_PRE(M_FUN)) +AddMethod(IX,M_TAG,FLEXT_CALL_PRE(M_FUN)) //! Add a handler for a method with 1 enum type argument #define FLEXT_ADDMETHOD_E(IX,M_TAG,M_FUN) \ @@ -163,7 +163,7 @@ AddMethod(ThMeths(),IX,M_TAG,(methfun)(FLEXT_CALL_PRE(M_FUN)),a_int,a_null) //! Add a handler for a method with 1 argument #define FLEXT_ADDMETHOD_1(IX,M_TAG,M_FUN,TP1) \ \ -AddMethod(ThMeths(),IX,M_TAG,(methfun)(FLEXT_CALL_PRE(M_FUN)),FLEXTARG(TP1),a_null) +AddMethod(ThMeths(),IX,M_TAG,(methfun)(FLEXT_CALL_PRE(M_FUN)),FLEXTARG(TP1),a_null) //! Add a handler for a method with 2 arguments #define FLEXT_ADDMETHOD_2(IX,M_TAG,M_FUN,TP1,TP2) \ @@ -186,7 +186,7 @@ AddMethod(ThMeths(),IX,M_TAG,(methfun)(FLEXT_CALL_PRE(M_FUN)),FLEXTARG(TP1),FLEX AddMethod(ThMeths(),IX,M_TAG,(methfun)(FLEXT_CALL_PRE(M_FUN)),FLEXTARG(TP1),FLEXTARG(TP2),FLEXTARG(TP3),FLEXTARG(TP4),FLEXTARG(TP5),a_null) -// Shortcuts +// Shortcuts //! Add a handler for a method with a boolean argument #define FLEXT_ADDMETHOD_B(IX,M_TAG,M_FUN) \ diff --git a/externals/grill/flext/source/fldefs_methcall.h b/externals/grill/flext/source/fldefs_methcall.h index 8b6e1bde..1c4d30c1 100644 --- a/externals/grill/flext/source/fldefs_methcall.h +++ b/externals/grill/flext/source/fldefs_methcall.h @@ -17,9 +17,9 @@ WARRANTIES, see the file, "license.txt," in this distribution. #define __FLEXT_DEFS_METHCALL_H -/*! \defgroup FLEXT_D_CALLMETHOD Call flext methods manually +/*! \defgroup FLEXT_D_CALLMETHOD Call flext methods manually \ingroup FLEXT_D_METHOD - @{ + @{ */ //! Call a (already defined) method with no arguments diff --git a/externals/grill/flext/source/fldefs_methcb.h b/externals/grill/flext/source/fldefs_methcb.h index 45763f59..929a7929 100644 --- a/externals/grill/flext/source/fldefs_methcb.h +++ b/externals/grill/flext/source/fldefs_methcb.h @@ -17,9 +17,9 @@ WARRANTIES, see the file, "license.txt," in this distribution. #define __FLEXT_DEFS_METHCB_H -/*! \defgroup FLEXT_D_CALLBACK Declare callbacks for class methods +/*! \defgroup FLEXT_D_CALLBACK Declare callbacks for class methods \ingroup FLEXT_D_METHOD - @{ + @{ */ //! Set up a method callback with no arguments @@ -83,7 +83,7 @@ static bool FLEXT_CALL_PRE(M_FUN)(flext_base *c,TP1 &arg1,TP2 &arg2,TP3 &arg3,TP { FLEXT_CAST<thisType *>(c)->M_FUN(arg1,arg2,arg3,arg4,arg5); return true; } -// Shortcuts +// Shortcuts //! Set up a method callback for 1 float argument #define FLEXT_CALLBACK_F(M_FUN) \ diff --git a/externals/grill/flext/source/fldefs_setup.h b/externals/grill/flext/source/fldefs_setup.h index 255b18ad..9864c3c9 100644 --- a/externals/grill/flext/source/fldefs_setup.h +++ b/externals/grill/flext/source/fldefs_setup.h @@ -18,7 +18,7 @@ WARRANTIES, see the file, "license.txt," in this distribution. // ==================================================================================== -/*! \defgroup FLEXT_D_INSTANCE Class instantiation +/*! \defgroup FLEXT_D_INSTANCE Class instantiation \note For stand-alone externals (not part of a library) the name of your class \note is of importance! It must be the same as the external (excluded an eventual ~ (tilde)) @@ -32,53 +32,53 @@ WARRANTIES, see the file, "license.txt," in this distribution. */ -/*! \defgroup FLEXT_D_NEW Stand-alone class instantiation - Makes an actual instance of a stand-alone class. +/*! \defgroup FLEXT_D_NEW Stand-alone class instantiation + Makes an actual instance of a stand-alone class. */ -/*! \defgroup FLEXT_D_NEW_DSP Dsp class instantiation - Makes an actual instance of a dsp (aka "tilde") class (with signal processing). +/*! \defgroup FLEXT_D_NEW_DSP Dsp class instantiation + Makes an actual instance of a dsp (aka "tilde") class (with signal processing). */ -/*! \defgroup FLEXT_D_LIB Library class instantiation - Makes an actual instance of a class which is part of an object library (and not stand-alone). +/*! \defgroup FLEXT_D_LIB Library class instantiation + Makes an actual instance of a class which is part of an object library (and not stand-alone). */ -/*! \defgroup FLEXT_D_LIB_DSP Dsp library class instantiation - Makes an actual instance of a dsp (aka "tilde") class with signal processing - which is part of an object library (and not stand-alone). +/*! \defgroup FLEXT_D_LIB_DSP Dsp library class instantiation + Makes an actual instance of a dsp (aka "tilde") class with signal processing + which is part of an object library (and not stand-alone). */ // NO ARGUMENTS // ---------------------------------------- /*! \brief Implementation of a flext class with no arguments - \ingroup FLEXT_D_NEW - \param NAME the object's actual name(s) as a string (like "*", "trigger", "noise~", etc.) - \param NEW_CLASS the object's C++ class name + \ingroup FLEXT_D_NEW + \param NAME the object's actual name(s) as a string (like "*", "trigger", "noise~", etc.) + \param NEW_CLASS the object's C++ class name */ -#define FLEXT_NEW(NAME,NEW_CLASS) \ +#define FLEXT_NEW(NAME,NEW_CLASS) \ \ REAL_NEW(NAME,NEW_CLASS,0,0) /*! \brief Implementation of a flext dsp class with no arguments - \ingroup FLEXT_D_NEW_DSP + \ingroup FLEXT_D_NEW_DSP */ -#define FLEXT_NEW_DSP(NAME,NEW_CLASS) \ +#define FLEXT_NEW_DSP(NAME,NEW_CLASS) \ \ REAL_NEW(NAME,NEW_CLASS,1,0) /*! \brief Implementation of a flext class (part of a library) with no arguments - \ingroup FLEXT_D_LIB + \ingroup FLEXT_D_LIB */ #define FLEXT_LIB(NAME,NEW_CLASS) \ \ REAL_NEW(NAME,NEW_CLASS,0,1) /*! \brief Implementation of a flext dsp class (part of a library) with no arguments - \ingroup FLEXT_D_LIB_DSP + \ingroup FLEXT_D_LIB_DSP */ -#define FLEXT_LIB_DSP(NAME,NEW_CLASS) \ +#define FLEXT_LIB_DSP(NAME,NEW_CLASS) \ \ REAL_NEW(NAME,NEW_CLASS,1,1) @@ -87,30 +87,30 @@ REAL_NEW(NAME,NEW_CLASS,1,1) // ---------------------------------------- /*! \brief Implementation of a flext class with a variable argument list - \ingroup FLEXT_D_NEW + \ingroup FLEXT_D_NEW */ -#define FLEXT_NEW_V(NAME,NEW_CLASS) \ +#define FLEXT_NEW_V(NAME,NEW_CLASS) \ \ REAL_NEW_V(NAME,NEW_CLASS,0,0) \ /*! \brief Implementation of a flext dsp class with a variable argument list - \ingroup FLEXT_D_NEW_DSP + \ingroup FLEXT_D_NEW_DSP */ -#define FLEXT_NEW_DSP_V(NAME,NEW_CLASS) \ +#define FLEXT_NEW_DSP_V(NAME,NEW_CLASS) \ \ REAL_NEW_V(NAME,NEW_CLASS,1,0) \ /*! \brief Implementation of a flext class (part of a library) with a variable argument list - \ingroup FLEXT_D_LIB + \ingroup FLEXT_D_LIB */ -#define FLEXT_LIB_V(NAME,NEW_CLASS) \ +#define FLEXT_LIB_V(NAME,NEW_CLASS) \ \ REAL_NEW_V(NAME,NEW_CLASS, 0,1) /*! \brief Implementation of a flext dsp class (part of a library) with a variable argument list - \ingroup FLEXT_D_LIB_DSP + \ingroup FLEXT_D_LIB_DSP */ -#define FLEXT_LIB_DSP_V(NAME,NEW_CLASS) \ +#define FLEXT_LIB_DSP_V(NAME,NEW_CLASS) \ \ REAL_NEW_V(NAME,NEW_CLASS, 1,1) @@ -119,30 +119,30 @@ REAL_NEW_V(NAME,NEW_CLASS, 1,1) // ---------------------------------------- /*! \brief Implementation of a flext class with one argument - \ingroup FLEXT_D_NEW + \ingroup FLEXT_D_NEW */ -#define FLEXT_NEW_1(NAME,NEW_CLASS, TYPE) \ +#define FLEXT_NEW_1(NAME,NEW_CLASS, TYPE) \ \ REAL_NEW_1(NAME,NEW_CLASS, 0, 0,TYPE) \ /*! \brief Implementation of a flext dsp class with one argument - \ingroup FLEXT_D_NEW_DSP + \ingroup FLEXT_D_NEW_DSP */ -#define FLEXT_NEW_DSP_1(NAME,NEW_CLASS, TYPE) \ +#define FLEXT_NEW_DSP_1(NAME,NEW_CLASS, TYPE) \ \ REAL_NEW_1(NAME,NEW_CLASS, 1, 0,TYPE) \ /*! \brief Implementation of a flext class (part of a library) with one argument - \ingroup FLEXT_D_LIB + \ingroup FLEXT_D_LIB */ #define FLEXT_LIB_1(NAME,NEW_CLASS, TYPE) \ \ REAL_NEW_1(NAME,NEW_CLASS, 0,1,TYPE) /*! \brief Implementation of a flext dsp class (part of a library) with one argument - \ingroup FLEXT_D_LIB_DSP + \ingroup FLEXT_D_LIB_DSP */ -#define FLEXT_LIB_DSP_1(NAME,NEW_CLASS, TYPE) \ +#define FLEXT_LIB_DSP_1(NAME,NEW_CLASS, TYPE) \ \ REAL_NEW_1(NAME,NEW_CLASS, 1,1, TYPE) @@ -151,30 +151,30 @@ REAL_NEW_1(NAME,NEW_CLASS, 1,1, TYPE) // ---------------------------------------- /*! \brief Implementation of a flext class with 2 arguments - \ingroup FLEXT_D_NEW + \ingroup FLEXT_D_NEW */ -#define FLEXT_NEW_2(NAME,NEW_CLASS, TYPE1, TYPE2) \ +#define FLEXT_NEW_2(NAME,NEW_CLASS, TYPE1, TYPE2) \ \ REAL_NEW_2(NAME,NEW_CLASS, 0,0, TYPE1, TYPE2) \ /*! \brief Implementation of a flext dsp class with 2 arguments - \ingroup FLEXT_D_NEW_DSP + \ingroup FLEXT_D_NEW_DSP */ -#define FLEXT_NEW_DSP_2(NAME,NEW_CLASS, TYPE1, TYPE2) \ +#define FLEXT_NEW_DSP_2(NAME,NEW_CLASS, TYPE1, TYPE2) \ \ REAL_NEW_2(NAME,NEW_CLASS, 1,0, TYPE1, TYPE2) \ /*! \brief Implementation of a flext class (part of a library) with 2 arguments - \ingroup FLEXT_D_LIB + \ingroup FLEXT_D_LIB */ -#define FLEXT_LIB_2(NAME,NEW_CLASS, TYPE1, TYPE2) \ +#define FLEXT_LIB_2(NAME,NEW_CLASS, TYPE1, TYPE2) \ \ REAL_NEW_2(NAME,NEW_CLASS, 0,1, TYPE1, TYPE2) /*! \brief Implementation of a flext dsp class (part of a library) with 2 arguments - \ingroup FLEXT_D_LIB_DSP + \ingroup FLEXT_D_LIB_DSP */ -#define FLEXT_LIB_DSP_2(NAME,NEW_CLASS, TYPE1, TYPE2) \ +#define FLEXT_LIB_DSP_2(NAME,NEW_CLASS, TYPE1, TYPE2) \ \ REAL_NEW_2(NAME,NEW_CLASS, 1,1, TYPE1, TYPE2) @@ -183,39 +183,39 @@ REAL_NEW_2(NAME,NEW_CLASS, 1,1, TYPE1, TYPE2) // ---------------------------------------- /*! \brief Implementation of a flext class with 3 arguments - \ingroup FLEXT_D_NEW + \ingroup FLEXT_D_NEW */ #define FLEXT_NEW_3(NAME,NEW_CLASS, TYPE1, TYPE2, TYPE3) \ \ REAL_NEW_3(NAME,NEW_CLASS, 0,0, TYPE1, TYPE2, TYPE3) \ /*! \brief Implementation of a flext dsp class with 3 arguments - \ingroup FLEXT_D_NEW_DSP + \ingroup FLEXT_D_NEW_DSP */ -#define FLEXT_NEW_DSP_3(NAME,NEW_CLASS, TYPE1, TYPE2, TYPE3) \ +#define FLEXT_NEW_DSP_3(NAME,NEW_CLASS, TYPE1, TYPE2, TYPE3) \ \ REAL_NEW_3(NAME,NEW_CLASS, 1,0, TYPE1, TYPE2, TYPE3) \ /*! \brief Implementation of a flext class (part of a library) with 3 arguments - \ingroup FLEXT_D_LIB + \ingroup FLEXT_D_LIB */ -#define FLEXT_LIB_3(NAME,NEW_CLASS, TYPE1, TYPE2, TYPE3) \ +#define FLEXT_LIB_3(NAME,NEW_CLASS, TYPE1, TYPE2, TYPE3) \ \ REAL_NEW_3(NAME,NEW_CLASS, 0,1,TYPE1, TYPE2, TYPE3) /*! \brief Implementation of a flext dsp class (part of a library) with 3 arguments - \ingroup FLEXT_D_LIB_DSP + \ingroup FLEXT_D_LIB_DSP */ -#define FLEXT_LIB_DSP_3(NAME,NEW_CLASS, TYPE1, TYPE2, TYPE3) \ +#define FLEXT_LIB_DSP_3(NAME,NEW_CLASS, TYPE1, TYPE2, TYPE3) \ \ REAL_NEW_3(NAME,NEW_CLASS, 1,1, TYPE1, TYPE2, TYPE3) // deprecated stuff -/*! \defgroup FLEXT_D_DEPRECATED Deprecated definitions - \deprecated - @{ +/*! \defgroup FLEXT_D_DEPRECATED Deprecated definitions + \deprecated + @{ */ #define FLEXT_NEW_G FLEXT_NEW_V @@ -239,22 +239,22 @@ REAL_NEW_3(NAME,NEW_CLASS, 1,1, TYPE1, TYPE2, TYPE3) //! @} FLEXT_D_DEPRECATED -/*! \defgroup FLEXT_D_LIBRARY Definitions for library objects - @{ +/*! \defgroup FLEXT_D_LIBRARY Definitions for library objects + @{ */ /*! \brief Specify that to declare the library itself. - \note If you have a library this is compulsory (to register all the objects of the library) + \note If you have a library this is compulsory (to register all the objects of the library) */ #define FLEXT_LIB_SETUP(NAME,SETUPFUN) REAL_LIB_SETUP(NAME,SETUPFUN) /*! \brief Register an object in the library. - \note This is used in the library setup function + \note This is used in the library setup function */ #define FLEXT_SETUP(cl) REAL_SETUP(cl,0) /*! \brief Register a DSP object in the library. - \note This is used in the library setup function + \note This is used in the library setup function */ #define FLEXT_DSP_SETUP(cl) REAL_SETUP(cl,1) diff --git a/externals/grill/flext/source/fldoxygen.h b/externals/grill/flext/source/fldoxygen.h index 27b000c0..c55859db 100644 --- a/externals/grill/flext/source/fldoxygen.h +++ b/externals/grill/flext/source/fldoxygen.h @@ -2,8 +2,8 @@ #define __FLEXT_DOXYGEN_H /*! \file fldoxygen.h - \brief Doxygen definitions - \remark There is no code in here, just documentation stuff. + \brief Doxygen definitions + \remark There is no code in here, just documentation stuff. */ /*! @@ -110,9 +110,9 @@ With these lines, all the necessary definitions from the flext package have been \verbatim class attr1: - public flext_base + public flext_base { - FLEXT_HEADER(attr1,flext_base) + FLEXT_HEADER(attr1,flext_base) \endverbatim A flext class is simply defined by inheriting from the flext_base (see also \ref FLEXT_CLASS) @@ -121,18 +121,18 @@ Additionally some information has to be added using FLEXT_HEADER (see \ref FLEXT \verbatim public: - // constructor - attr1(); + // constructor + attr1(); \endverbatim Normally the constructor takes the creation arguments of an object. Here there are none. \verbatim protected: - void m_trigger(float f); - - // stored argument - float arg; + void m_trigger(float f); + + // stored argument + float arg; \endverbatim These are methods and data elements for internal class usage. Flext doesn't know about them @@ -140,11 +140,11 @@ as long as they are not registered. \verbatim private: - // callback for method "m_trigger" (with one float argument) - FLEXT_CALLBACK_F(m_trigger); + // callback for method "m_trigger" (with one float argument) + FLEXT_CALLBACK_F(m_trigger); - // define attribute callbacks for variable "arg" (with GET and SET properties) - FLEXT_ATTRVAR_F(arg); + // define attribute callbacks for variable "arg" (with GET and SET properties) + FLEXT_ATTRVAR_F(arg); }; \endverbatim @@ -166,23 +166,23 @@ or a DSP object (see \ref FLEXT_D_NEW_DSP) is created and whether it resides in \verbatim attr1::attr1(): - arg(0) // initialize argument + arg(0) // initialize argument { - // define inlets - AddInAnything(); // first inlet of type anything (index 0) - - // define outlets - AddOutFloat(); // one float outlet (has index 0) + // define inlets + AddInAnything(); // first inlet of type anything (index 0) + + // define outlets + AddOutFloat(); // one float outlet (has index 0) \endverbatim - + Every inlet and outlet that the object shall have has to be registered. This is done with the functions in \ref FLEXT_C_IO_ADD. \verbatim - // register methods - FLEXT_ADDMETHOD(0,m_trigger); // register method (for floats) "m_trigger" for inlet 0 + // register methods + FLEXT_ADDMETHOD(0,m_trigger); // register method (for floats) "m_trigger" for inlet 0 - FLEXT_ADDATTR_VAR1("arg",arg); // register attribute "arg" with variable arg + FLEXT_ADDATTR_VAR1("arg",arg); // register attribute "arg" with variable arg } \endverbatim @@ -195,10 +195,10 @@ used are known beforehand (see \ref FLEXT_D_CADDMETHOD and \ref FLEXT_D_CADDATTR \verbatim void attr1::m_trigger(float f) { - float res = arg+f; - - // output value to outlet - ToOutFloat(0,res); // (0 stands for the outlet index 0) + float res = arg+f; + + // output value to outlet + ToOutFloat(0,res); // (0 stands for the outlet index 0) } \endverbatim diff --git a/externals/grill/flext/source/fldsp.cpp b/externals/grill/flext/source/fldsp.cpp index b8dce7ca..3344f4a1 100644 --- a/externals/grill/flext/source/fldsp.cpp +++ b/externals/grill/flext/source/fldsp.cpp @@ -24,50 +24,50 @@ const t_symbol *flext_dsp::dspsym = MakeSymbol("__flext_dspfun__"); void flext_dsp::Setup(t_classid id) { - t_class *c = getClass(id); + t_class *c = getClass(id); #if FLEXT_SYS == FLEXT_SYS_MAX -// dsp_initclass(); - dsp_initboxclass(); - add_dsp(c,cb_dsp); +// dsp_initclass(); + dsp_initboxclass(); + add_dsp(c,cb_dsp); #elif FLEXT_SYS == FLEXT_SYS_PD - CLASS_MAINSIGNALIN(c,flext_hdr,defsig); // float messages going into the left inlet are converted to signal - add_dsp(c,cb_dsp); - add_method1(c,cb_enable,"enable",A_FLOAT); + CLASS_MAINSIGNALIN(c,flext_hdr,defsig); // float messages going into the left inlet are converted to signal + add_dsp(c,cb_dsp); + add_method1(c,cb_enable,"enable",A_FLOAT); #elif FLEXT_SYS == FLEXT_SYS_JMAX - fts_dsp_declare_function(dspsym,dspmeth); - fts_class_message_varargs(c, fts_s_put, cb_dsp); - fts_class_message_varargs(c, MakeSymbol("enable"), cb_enable); + fts_dsp_declare_function(dspsym,dspmeth); + fts_class_message_varargs(c, fts_s_put, cb_dsp); + fts_class_message_varargs(c, MakeSymbol("enable"), cb_enable); #endif } flext_dsp::FLEXT_CLASSDEF(flext_dsp)(): #if FLEXT_SYS == FLEXT_SYS_JMAX - srate(fts_dsp_get_sample_rate()), // should we set it? - blksz(fts_dsp_get_tick_size()), + srate(fts_dsp_get_sample_rate()), // should we set it? + blksz(fts_dsp_get_tick_size()), #else - srate(sys_getsr()), // should we set it? - blksz(sys_getblksize()), + srate(sys_getsr()), // should we set it? + blksz(sys_getblksize()), #endif #if FLEXT_SYS == FLEXT_SYS_PD - chnsin(sys_get_inchannels()), - chnsout(sys_get_outchannels()), + chnsin(sys_get_inchannels()), + chnsout(sys_get_outchannels()), #elif FLEXT_SYS == FLEXT_SYS_MAX - chnsin(sys_getch()), - chnsout(sys_getch()), + chnsin(sys_getch()), + chnsout(sys_getch()), #elif FLEXT_SYS == FLEXT_SYS_JMAX - #pragma message("not implemented") - chnsin(0),chnsout(0), + #pragma message("not implemented") + chnsin(0),chnsout(0), #else #error #endif #if FLEXT_SYS != FLEXT_SYS_MAX - dspon(true), + dspon(true), #endif - invecs(NULL),outvecs(NULL) + invecs(NULL),outvecs(NULL) { #if FLEXT_SYS == FLEXT_SYS_JMAX - fts_dsp_object_init(thisHdr()); + fts_dsp_object_init(thisHdr()); #endif } @@ -75,18 +75,18 @@ flext_dsp::FLEXT_CLASSDEF(flext_dsp)(): flext_dsp::~FLEXT_CLASSDEF(flext_dsp)() { #if FLEXT_SYS == FLEXT_SYS_JMAX - fts_dsp_object_delete(thisHdr()); + fts_dsp_object_delete(thisHdr()); #endif /* #if FLEXT_SYS == FLEXT_SYS_MAX - // switch off dsp as the dsp function might get called afterwards (?!) - thisHdr()->z_disabled = true; - - if(invecs) delete[] invecs; - if(outvecs) delete[] outvecs; + // switch off dsp as the dsp function might get called afterwards (?!) + thisHdr()->z_disabled = true; + + if(invecs) delete[] invecs; + if(outvecs) delete[] outvecs; #elif FLEXT_SYS == FLEXT_SYS_PD - dspon = false; + dspon = false; #endif */ } @@ -98,23 +98,23 @@ void flext_dsp::dspmeth(fts_word_t *w) #else t_int *flext_dsp::dspmeth(t_int *w) { - flext_dsp *obj = (flext_dsp *)w[1]; + flext_dsp *obj = (flext_dsp *)w[1]; /* #ifdef FLEXT_DEBUG - if(!obj->thisHdr()) { - // object is already deleted! - ERRINTERNAL(); - return w+3; - } + if(!obj->thisHdr()) { + // object is already deleted! + ERRINTERNAL(); + return w+3; + } #endif */ #if FLEXT_SYS == FLEXT_SYS_MAX - if(!obj->thisHdr()->z_disabled) + if(!obj->thisHdr()->z_disabled) #else - if(obj->dspon) + if(obj->dspon) #endif - obj->m_signal(obj->blksz,obj->invecs,obj->outvecs); - return w+2; + obj->m_signal(obj->blksz,obj->invecs,obj->outvecs); + return w+2; } #endif @@ -126,72 +126,72 @@ void flext_dsp::cb_dsp(t_class *c,t_signal **sp,short *count) void flext_dsp::cb_dsp(t_class *c,t_signal **sp) #endif { - flext_dsp *obj = thisObject(c); + flext_dsp *obj = thisObject(c); - if(obj->CntInSig()+obj->CntOutSig() == 0) return; + if(obj->CntInSig()+obj->CntOutSig() == 0) return; - // store current dsp parameters + // store current dsp parameters #if FLEXT_SYS == FLEXT_SYS_JMAX - fts_dsp_descr_t *dsp = (fts_dsp_descr_t *)fts_get_pointer(at+0); - obj->srate = fts_dsp_get_input_srate(dsp,0); - obj->blksz = fts_dsp_get_input_size(dsp,0); // is this guaranteed to be the same as sys_getblksize() ? + fts_dsp_descr_t *dsp = (fts_dsp_descr_t *)fts_get_pointer(at+0); + obj->srate = fts_dsp_get_input_srate(dsp,0); + obj->blksz = fts_dsp_get_input_size(dsp,0); // is this guaranteed to be the same as sys_getblksize() ? #else - obj->srate = sp[0]->s_sr; - obj->blksz = sp[0]->s_n; // is this guaranteed to be the same as sys_getblksize() ? + obj->srate = sp[0]->s_sr; + obj->blksz = sp[0]->s_n; // is this guaranteed to be the same as sys_getblksize() ? #endif /* #if FLEXT_SYS == FLEXT_SYS_PD - obj->chnsin = sys_get_inchannels(); - obj->chnsout = sys_get_outchannels(); + obj->chnsin = sys_get_inchannels(); + obj->chnsout = sys_get_outchannels(); #elif FLEXT_SYS == FLEXT_SYS_MAX - obj->chnsin = obj->chnsout = sys_getch(); + obj->chnsin = obj->chnsout = sys_getch(); #elif FLEXT_SYS == FLEXT_SYS_JMAX - #pragma message ("How to query the channels?") + #pragma message ("How to query the channels?") #else #error #endif */ - // store in and out signal vectors - int i; - int in = obj->chnsin = obj->CntInSig(); - int out = obj->chnsout = obj->CntOutSig(); + // store in and out signal vectors + int i; + int in = obj->chnsin = obj->CntInSig(); + int out = obj->chnsout = obj->CntOutSig(); #if FLEXT_SYS == FLEXT_SYS_PD - // min. 1 input channel! (CLASS_MAININLET in pd...) - if(!in) { obj->chnsin = in = 1; } + // min. 1 input channel! (CLASS_MAININLET in pd...) + if(!in) { obj->chnsin = in = 1; } #endif - if(obj->invecs) delete[] obj->invecs; - obj->invecs = new t_signalvec[in]; - for(i = 0; i < in; ++i) - obj->invecs[i] = + if(obj->invecs) delete[] obj->invecs; + obj->invecs = new t_signalvec[in]; + for(i = 0; i < in; ++i) + obj->invecs[i] = #if FLEXT_SYS == FLEXT_SYS_JMAX - fts_dsp_get_input_name(dsp,i); + fts_dsp_get_input_name(dsp,i); #else - sp[i]->s_vec; + sp[i]->s_vec; #endif - if(obj->outvecs) delete[] obj->outvecs; - obj->outvecs = new t_signalvec[out]; - for(i = 0; i < out; ++i) - obj->outvecs[i] = + if(obj->outvecs) delete[] obj->outvecs; + obj->outvecs = new t_signalvec[out]; + for(i = 0; i < out; ++i) + obj->outvecs[i] = #if FLEXT_SYS == FLEXT_SYS_JMAX - fts_dsp_get_output_name(dsp,i); + fts_dsp_get_output_name(dsp,i); #else - sp[in+i]->s_vec; + sp[in+i]->s_vec; #endif - // with the following call derived classes can do their eventual DSP setup - obj->m_dsp(obj->blksz,obj->invecs,obj->outvecs); + // with the following call derived classes can do their eventual DSP setup + obj->m_dsp(obj->blksz,obj->invecs,obj->outvecs); - // set the DSP function + // set the DSP function #if FLEXT_SYS == FLEXT_SYS_JMAX - fts_atom_t args; - fts_set_pointer(args,obj); - fts_dsp_add_function(dspsym,1,args); + fts_atom_t args; + fts_set_pointer(args,obj); + fts_dsp_add_function(dspsym,1,args); #else - dsp_add((t_dspmethod)dspmeth,1,obj); + dsp_add((t_dspmethod)dspmeth,1,obj); #endif } @@ -199,12 +199,12 @@ void flext_dsp::cb_dsp(t_class *c,t_signal **sp) #if FLEXT_SYS == FLEXT_SYS_JMAX void flext_dsp::cb_dsp_init(fts_object_t *c, int winlet, fts_symbol_t *s, int ac, const fts_atom_t *at) { - fts_dsp_add_object(c); + fts_dsp_add_object(c); } void flext_dsp::cb_dsp_delete(fts_object_t *c, int winlet, fts_symbol_t *s, int ac, const fts_atom_t *at) { - fts_dsp_remove_object(c); + fts_dsp_remove_object(c); } #endif */ @@ -213,7 +213,7 @@ void flext_dsp::m_dsp(int /*n*/,t_signalvec const * /*insigs*/,t_signalvec const void flext_dsp::m_signal(int n,t_sample *const * /*insigs*/,t_sample *const *outs) { - for(int i = 0; i < CntOutSig(); ++i) ZeroSamples(outs[i],n); + for(int i = 0; i < CntOutSig(); ++i) ZeroSamples(outs[i],n); } #if FLEXT_SYS != FLEXT_SYS_MAX diff --git a/externals/grill/flext/source/flext.cpp b/externals/grill/flext/source/flext.cpp index b89e464b..eb3f2a35 100644 --- a/externals/grill/flext/source/flext.cpp +++ b/externals/grill/flext/source/flext.cpp @@ -21,160 +21,160 @@ WARRANTIES, see the file, "license.txt," in this distribution. bool flext_base::compatibility = true; flext_base::FLEXT_CLASSDEF(flext_base)(): - inlist(NULL),outlist(NULL), - curtag(NULL), - incnt(0),outcnt(0), - insigs(0),outsigs(0), - distmsgs(false) + inlist(NULL),outlist(NULL), + curtag(NULL), + incnt(0),outcnt(0), + insigs(0),outsigs(0), + distmsgs(false) #if FLEXT_SYS == FLEXT_SYS_PD || FLEXT_SYS == FLEXT_SYS_MAX - ,outlets(NULL),inlets(NULL) + ,outlets(NULL),inlets(NULL) #endif #if FLEXT_SYS == FLEXT_SYS_MAX - ,indesc(NULL),outdesc(NULL) + ,indesc(NULL),outdesc(NULL) #endif { - FLEXT_LOG1("%s - flext logging is on",thisName()); - - t_classid clid = thisClassId(); - clmethhead = ClMeths(clid); - methhead = new ItemCont; - bindhead = NULL; - - if(procattr) { - // initialize when attribute processing is enabled - attrhead = new ItemCont; - clattrhead = ClAttrs(clid); - attrdata = new AttrDataCont; - } - else { - attrhead = clattrhead = NULL; - attrdata = NULL; - } + FLEXT_LOG1("%s - flext logging is on",thisName()); + + t_classid clid = thisClassId(); + clmethhead = ClMeths(clid); + methhead = new ItemCont; + bindhead = NULL; + + if(procattr) { + // initialize when attribute processing is enabled + attrhead = new ItemCont; + clattrhead = ClAttrs(clid); + attrdata = new AttrDataCont; + } + else { + attrhead = clattrhead = NULL; + attrdata = NULL; + } } flext_base::~FLEXT_CLASSDEF(flext_base)() { #if FLEXT_SYS == FLEXT_SYS_MAX // according to David Z. one should do that first... -// if(insigs) dsp_free(thisHdr()); - if(insigs) dsp_freebox(thisHdr()); +// if(insigs) dsp_free(thisHdr()); + if(insigs) dsp_freebox(thisHdr()); #endif #ifdef FLEXT_THREADS - StopThreads(); + StopThreads(); #endif - // send remaining pending messages for this object - QFlush(this); + // send remaining pending messages for this object + QFlush(this); - // delete message lists - if(methhead) delete methhead; - if(bindhead) delete bindhead; // ATTENTION: the object must free all memory associated to bindings itself - if(attrhead) delete attrhead; - if(attrdata) delete attrdata; - - // destroy inlets and outlets and their proxy objects - if(inlist) delete inlist; - if(outlist) delete outlist; + // delete message lists + if(methhead) delete methhead; + if(bindhead) delete bindhead; // ATTENTION: the object must free all memory associated to bindings itself + if(attrhead) delete attrhead; + if(attrdata) delete attrdata; + + // destroy inlets and outlets and their proxy objects + if(inlist) delete inlist; + if(outlist) delete outlist; #if FLEXT_SYS == FLEXT_SYS_PD || FLEXT_SYS == FLEXT_SYS_MAX - if(outlets) delete[] outlets; + if(outlets) delete[] outlets; - if(inlets) { - for(int ix = 0; ix < incnt; ++ix) - if(inlets[ix]) { - // release proxy object + if(inlets) { + for(int ix = 0; ix < incnt; ++ix) + if(inlets[ix]) { + // release proxy object #if FLEXT_SYS == FLEXT_SYS_PD - pd_free(&inlets[ix]->obj.ob_pd); + pd_free(&inlets[ix]->obj.ob_pd); #elif FLEXT_SYS == FLEXT_SYS_MAX - freeobject((object *)inlets[ix]); + freeobject((object *)inlets[ix]); #endif - } - delete[] inlets; - } + } + delete[] inlets; + } #endif #if FLEXT_SYS == FLEXT_SYS_MAX - if(indesc) { - for(int i = 0; i < incnt; ++i) if(indesc[i]) delete[] indesc[i]; - delete[] indesc; - } - if(outdesc) { - for(int i = 0; i < outcnt; ++i) if(outdesc[i]) delete[] outdesc[i]; - delete[] outdesc; - } + if(indesc) { + for(int i = 0; i < incnt; ++i) if(indesc[i]) delete[] indesc[i]; + delete[] indesc; + } + if(outdesc) { + for(int i = 0; i < outcnt; ++i) if(outdesc[i]) delete[] outdesc[i]; + delete[] outdesc; + } #endif } /*! This virtual function is called after the object has been created, that is, - after the constructor has been processed. - It creates the inlets and outlets and the message and attribute lists. - \note You can override it in your own class, but be sure to call it, - \note otherwise no inlets/outlets will be created - \note All inlet, outlets, method and attribute declarations must be made before a call to Init! - \remark Creation of inlets/outlets can't be done upon declaration, as Max/MSP needs creation - \remark in reverse. + after the constructor has been processed. + It creates the inlets and outlets and the message and attribute lists. + \note You can override it in your own class, but be sure to call it, + \note otherwise no inlets/outlets will be created + \note All inlet, outlets, method and attribute declarations must be made before a call to Init! + \remark Creation of inlets/outlets can't be done upon declaration, as Max/MSP needs creation + \remark in reverse. */ bool flext_base::Init() { - bool ok = flext_obj::Init(); + bool ok = flext_obj::Init(); - if(ok) ok = InitInlets() && InitOutlets(); + if(ok) ok = InitInlets() && InitOutlets(); - if(ok) { - if(procattr && m_holdaargc && m_holdaargv) { - // initialize creation attributes - ok = InitAttrib(m_holdaargc,m_holdaargv); - } - } + if(ok) { + if(procattr && m_holdaargc && m_holdaargv) { + // initialize creation attributes + ok = InitAttrib(m_holdaargc,m_holdaargv); + } + } - return ok; + return ok; } /*! Set up proxy classes and basic methods at class creation time - This ensures that they are processed before the registered flext messages + This ensures that they are processed before the registered flext messages */ void flext_base::Setup(t_classid id) { - t_class *c = getClass(id); + t_class *c = getClass(id); #if FLEXT_SYS == FLEXT_SYS_PD || FLEXT_SYS == FLEXT_SYS_MAX - add_method(c,cb_help,"help"); - add_loadbang(c,cb_loadbang); + add_method(c,cb_help,"help"); + add_loadbang(c,cb_loadbang); #if FLEXT_SYS == FLEXT_SYS_MAX - add_assist(c,cb_assist); + add_assist(c,cb_assist); #endif #else - fts_class_message_varargs(c,MakeSymbol("help"),cb_help); - #pragma message ("no implementation of loadbang or assist") + fts_class_message_varargs(c,MakeSymbol("help"),cb_help); + #pragma message ("no implementation of loadbang or assist") #endif - if(process_attributes) { - AddMethod(id,0,"getattributes",cb_ListAttrib); - AddMethod(id,0,"getmethods",cb_ListMethods); + if(process_attributes) { + AddMethod(id,0,"getattributes",cb_ListAttrib); + AddMethod(id,0,"getmethods",cb_ListMethods); #if FLEXT_SYS == FLEXT_SYS_PD && !defined(FLEXT_NOATTREDIT) - AddMethod(id,0,"attributedialog",cb_AttrDialog); - SetAttrEditor(id); + AddMethod(id,0,"attributedialog",cb_AttrDialog); + SetAttrEditor(id); #endif - } + } - SetProxies(c); + SetProxies(c); - StartQueue(); + StartQueue(); } #if FLEXT_SYS == FLEXT_SYS_JMAX -void flext_base::cb_help(fts_object_t *c,int, fts_symbol_t, int, const fts_atom_t *) { thisObject(c)->m_help(); } +void flext_base::cb_help(fts_object_t *c,int, fts_symbol_t, int, const fts_atom_t *) { thisObject(c)->m_help(); } #else -void flext_base::cb_help(t_class *c) { thisObject(c)->m_help(); } -void flext_base::cb_loadbang(t_class *c) { thisObject(c)->m_loadbang(); } +void flext_base::cb_help(t_class *c) { thisObject(c)->m_help(); } +void flext_base::cb_loadbang(t_class *c) { thisObject(c)->m_loadbang(); } #endif void flext_base::m_help() { - // This should better be overloaded - post("%s (using flext " FLEXT_VERSTR ") - compiled on %s %s",thisName(),__DATE__,__TIME__); + // This should better be overloaded + post("%s (using flext " FLEXT_VERSTR ") - compiled on %s %s",thisName(),__DATE__,__TIME__); } void flext_base::m_loadbang() {} @@ -186,16 +186,16 @@ void flext_base::cb_assist(t_class *c,void * /*b*/,long msg,long arg,char *s) { void flext_base::m_assist(long msg,long arg,char *s) { #if FLEXT_SYS == FLEXT_SYS_MAX - switch(msg) { - case 1: //ASSIST_INLET: - strcpy(s,arg < incnt && indesc[arg]?indesc[arg]:""); - break; - case 2: //ASSIST_OUTLET: - if(arg < outcnt) - strcpy(s,outdesc[arg]?outdesc[arg]:""); - else - strcpy(s,arg == outcnt && procattr?"Attributes":""); - break; - } + switch(msg) { + case 1: //ASSIST_INLET: + strcpy(s,arg < incnt && indesc[arg]?indesc[arg]:""); + break; + case 2: //ASSIST_OUTLET: + if(arg < outcnt) + strcpy(s,outdesc[arg]?outdesc[arg]:""); + else + strcpy(s,arg == outcnt && procattr?"Attributes":""); + break; + } #endif } diff --git a/externals/grill/flext/source/flext.h b/externals/grill/flext/source/flext.h index 4f4f166c..41996a0d 100644 --- a/externals/grill/flext/source/flext.h +++ b/externals/grill/flext/source/flext.h @@ -23,10 +23,10 @@ WARRANTIES, see the file, "license.txt," in this distribution. */ //! \brief flext version number -#define FLEXT_VERSION 406 +#define FLEXT_VERSION 407 //! \brief flext version string -#define FLEXT_VERSTR "0.4.6" +#define FLEXT_VERSTR "0.4.7pre" //! @} diff --git a/externals/grill/flext/source/flinternal.h b/externals/grill/flext/source/flinternal.h index 29887f8e..0bdc3bf6 100644 --- a/externals/grill/flext/source/flinternal.h +++ b/externals/grill/flext/source/flinternal.h @@ -10,10 +10,10 @@ WARRANTIES, see the file, "license.txt," in this distribution. /*! \file flinternal.h \brief Definitions for internal flext usage - \internal + \internal Here, a few shortcuts for common Max/MSP or PD library calls and type definitions - are declared + are declared */ #ifndef __FLEXT_INTERNALS_H @@ -26,7 +26,7 @@ WARRANTIES, see the file, "license.txt," in this distribution. #define object_new(clss) pd_new(clss) #define object_free(obj) pd_free(&(obj)->ob_pd) - + #define add_dsp(clss,meth) class_addmethod(clss, (t_method)meth,gensym("dsp"),A_NULL) diff --git a/externals/grill/flext/source/flitem.cpp b/externals/grill/flext/source/flitem.cpp index c8697279..8970e1c3 100755 --- a/externals/grill/flext/source/flitem.cpp +++ b/externals/grill/flext/source/flitem.cpp @@ -18,57 +18,57 @@ WARRANTIES, see the file, "license.txt," in this distribution. flext_base::Item::~Item() { - if(nxt) delete nxt; + if(nxt) delete nxt; } flext_base::ItemSet::ItemSet() {} flext_base::ItemSet::~ItemSet() { - for(iterator it = begin(); it != end(); ++it) - if(it.data()) delete it.data(); + for(iterator it = begin(); it != end(); ++it) + if(it.data()) delete it.data(); } flext_base::ItemCont::ItemCont(): - memsize(0),size(0),members(0),cont(NULL) + memsize(0),size(0),members(0),cont(NULL) {} flext_base::ItemCont::~ItemCont() { - if(cont) { - for(int i = 0; i < size; ++i) delete cont[i]; - delete[] cont; - } + if(cont) { + for(int i = 0; i < size; ++i) delete cont[i]; + delete[] cont; + } } void flext_base::ItemCont::Resize(int nsz) { - if(nsz > memsize) { - int nmemsz = nsz+10; // increment maximum allocation size - ItemSet **ncont = new ItemSet *[nmemsz]; // make new array - if(cont) { - memcpy(ncont,cont,size*sizeof(*cont)); // copy existing entries - delete[] cont; - } - cont = ncont; // set current array - memsize = nmemsz; // set new allocation size - } - - // make new items - while(size < nsz) cont[size++] = new ItemSet; + if(nsz > memsize) { + int nmemsz = nsz+10; // increment maximum allocation size + ItemSet **ncont = new ItemSet *[nmemsz]; // make new array + if(cont) { + memcpy(ncont,cont,size*sizeof(*cont)); // copy existing entries + delete[] cont; + } + cont = ncont; // set current array + memsize = nmemsz; // set new allocation size + } + + // make new items + while(size < nsz) cont[size++] = new ItemSet; } void flext_base::ItemCont::Add(Item *item,const t_symbol *tag,int inlet) { if(!Contained(inlet)) Resize(inlet+2); ItemSet &set = GetInlet(inlet); - Item *&lst = set[tag]; - if(!lst) - lst = item; - else - for(;;) - if(!lst->nxt) { lst->nxt = item; break; } - else lst = lst->nxt; + Item *&lst = set[tag]; + if(!lst) + lst = item; + else + for(;;) + if(!lst->nxt) { lst->nxt = item; break; } + else lst = lst->nxt; members++; } @@ -80,9 +80,9 @@ bool flext_base::ItemCont::Remove(Item *item,const t_symbol *tag,int inlet) if(it != set.end()) { for(Item *lit = it.data(),*prv = NULL; lit; prv = lit,lit = lit->nxt) { if(lit == item) { - if(prv) prv->nxt = lit->nxt; - else it.data() = lit->nxt; - + if(prv) prv->nxt = lit->nxt; + else it.data() = lit->nxt; + lit->nxt = NULL; delete lit; return true; } diff --git a/externals/grill/flext/source/fllib.cpp b/externals/grill/flext/source/fllib.cpp index 203f4aa9..f9d2f84b 100755 --- a/externals/grill/flext/source/fllib.cpp +++ b/externals/grill/flext/source/fllib.cpp @@ -170,7 +170,19 @@ void flext_obj::lib_init(const char *name,void setupfun(),bool attr) sizeof(flext_hdr),NULL,A_GIMME,A_NULL); #endif process_attributes = attr; - setupfun(); + + try { + setupfun(); + } + catch(std::exception &x) { + error("%s - Exception at library setup: %s",name,x.what()); + } + catch(const char *txt) { + error("%s - Exception at library setup: %s",name,txt); + } + catch(...) { + error("%s - Unknown exception at library setup",name); + } } #if FLEXT_SYS == FLEXT_SYS_JMAX @@ -287,8 +299,19 @@ void flext_obj::obj_add(bool lib,bool dsp,bool attr,const char *idname,const cha #endif } - // call class setup function - setupfun(clid); + try { + // call class setup function + setupfun(clid); + } + catch(std::exception &x) { + error("%s - Exception while initializing class: %s",idname,x.what()); + } + catch(const char *txt) { + error("%s - Exception while initializing class: %s",idname,txt); + } + catch(...) { + error("%s - Unknown exception while initializing class",idname); + } } @@ -370,65 +393,81 @@ flext_hdr *flext_obj::obj_new(const t_symbol *s,int _argc_,t_atom *argv) error("%s: Creation arguments do not match",GetString(s)); } + if(ok) { - t_classid clid; + try { + t_classid clid; #if FLEXT_SYS == FLEXT_SYS_PD - clid = lo->clss; - obj = (flext_hdr *)::pd_new(lo->clss); + clid = lo->clss; + obj = (flext_hdr *)::pd_new(lo->clss); #elif FLEXT_SYS == FLEXT_SYS_MAX - clid = lo; - obj = (flext_hdr *)::newobject(lo->clss); + clid = lo; + obj = (flext_hdr *)::newobject(lo->clss); #elif FLEXT_SYS == FLEXT_SYS_JMAX - clid = lo->clss; + clid = lo->clss; #else #error #endif - flext_obj::m_holder = obj; - flext_obj::m_holdname = s; - flext_obj::m_holdattr = lo->attr; - - // get actual flext object (newfun calls "new flext_obj()") - if(lo->argc >= 0) - obj->data = lo->newfun(lo->argc,args); - else - obj->data = lo->newfun(argc,argv); - - flext_obj::m_holder = NULL; - flext_obj::m_holdname = NULL; - flext_obj::m_holdattr = false; - - ok = obj->data && - // check constructor exit flag - obj->data->InitOk(); - - if(ok) { - if(lo->attr) { - // DON'T convert eventual patcher args here... this is done by the actual attribute stuff - // so that the initial $- or #- be preserved! - - // store creation args for attribute initialization (inside flext_base::Init()) - flext_obj::m_holdaargc = _argc_-argc; - flext_obj::m_holdaargv = argv+argc; - } - else { - flext_obj::m_holdaargc = 0; - flext_obj::m_holdaargv = NULL; - } - - // call virtual init function - // here, inlets, outlets, methods and attributes can be set up - ok = obj->data->Init(); - - // call another virtual init function - if(ok) ok = obj->data->Finalize(); - - flext_obj::m_holdaargc = 0; - flext_obj::m_holdaargv = NULL; - } - - if(!ok) { + flext_obj::m_holder = obj; + flext_obj::m_holdname = s; + flext_obj::m_holdattr = lo->attr; + + // get actual flext object (newfun calls "new flext_obj()") + if(lo->argc >= 0) + obj->data = lo->newfun(lo->argc,args); + else + obj->data = lo->newfun(argc,argv); + + flext_obj::m_holder = NULL; + flext_obj::m_holdname = NULL; + flext_obj::m_holdattr = false; + + ok = obj->data && + // check constructor exit flag + obj->data->InitOk(); + + if(ok) { + if(lo->attr) { + // DON'T convert eventual patcher args here... this is done by the actual attribute stuff + // so that the initial $- or #- be preserved! + + // store creation args for attribute initialization (inside flext_base::Init()) + flext_obj::m_holdaargc = _argc_-argc; + flext_obj::m_holdaargv = argv+argc; + } + else { + flext_obj::m_holdaargc = 0; + flext_obj::m_holdaargv = NULL; + } + + // call virtual init function + // here, inlets, outlets, methods and attributes can be set up + ok = obj->data->Init(); + + // call another virtual init function + if(ok) ok = obj->data->Finalize(); + + flext_obj::m_holdaargc = 0; + flext_obj::m_holdaargv = NULL; + } + + } //try + catch(std::exception &x) { + error("%s - Exception while creating object: %s",GetString(s),x.what()); + ok = false; + } + catch(const char *txt) { + error("%s - Exception while creating object: %s",GetString(s),txt); + ok = false; + } + catch(...) { + error("%s - Unknown exception while creating object",GetString(s)); + ok = false; + } + + if(!ok) { // there was some init error, free object lo->freefun(obj); obj = NULL; @@ -460,11 +499,22 @@ void flext_obj::obj_free(flext_hdr *h) libclass *lcl = FindName(name); if(lcl) { - // call virtual exit function - hdr->data->Exit(); - - // now call object destructor and deallocate - lcl->freefun(hdr); + try { + // call virtual exit function + hdr->data->Exit(); + + // now call object destructor and deallocate + lcl->freefun(hdr); + } //try + catch(std::exception &x) { + error("%s - Exception while destroying object: %s",GetString(name),x.what()); + } + catch(const char *txt) { + error("%s - Exception while destroying object: %s",GetString(name),txt); + } + catch(...) { + error("%s - Unknown exception while destroying object",GetString(name)); + } } #ifdef FLEXT_DEBUG else diff --git a/externals/grill/flext/source/flmeth.cpp b/externals/grill/flext/source/flmeth.cpp index 776461dd..21e15f5c 100755 --- a/externals/grill/flext/source/flmeth.cpp +++ b/externals/grill/flext/source/flmeth.cpp @@ -21,125 +21,125 @@ WARRANTIES, see the file, "license.txt," in this distribution. flext_base::MethItem::MethItem(AttrItem *conn): - Item(conn),index(0), - argc(0),args(NULL) - ,fun(NULL) + Item(conn),index(0), + argc(0),args(NULL) + ,fun(NULL) {} flext_base::MethItem::~MethItem() { - if(args) delete[] args; + if(args) delete[] args; } void flext_base::MethItem::SetArgs(methfun _fun,int _argc,metharg *_args) { - fun = _fun; - if(args) delete[] args; - argc = _argc,args = _args; + fun = _fun; + if(args) delete[] args; + argc = _argc,args = _args; } void flext_base::AddMethodDef(int inlet,const char *tag) { const t_symbol *t = tag?MakeSymbol(tag):NULL; - methhead->Add(new MethItem,t,inlet); + methhead->Add(new MethItem,t,inlet); } /*! \brief Add a method to the queue */ void flext_base::AddMethod(ItemCont *ma,int inlet,const char *tag,methfun fun,metharg tp,...) { - va_list marker; - - // at first just count the arg type list (in argc) - int argc = 0; - va_start(marker,tp); - metharg *args = NULL,arg = tp; - for(; arg != a_null; ++argc) arg = (metharg)va_arg(marker,int); //metharg); - va_end(marker); - - if(argc > 0) { - if(argc > FLEXT_MAXMETHARGS) { - error("flext - method %s: only %i arguments are type-checkable: use variable argument list for more",tag?tag:"?",FLEXT_MAXMETHARGS); - argc = FLEXT_MAXMETHARGS; - } - - args = new metharg[argc]; - - va_start(marker,tp); - metharg a = tp; - for(int ix = 0; ix < argc; ++ix) { + va_list marker; + + // at first just count the arg type list (in argc) + int argc = 0; + va_start(marker,tp); + metharg *args = NULL,arg = tp; + for(; arg != a_null; ++argc) arg = (metharg)va_arg(marker,int); //metharg); + va_end(marker); + + if(argc > 0) { + if(argc > FLEXT_MAXMETHARGS) { + error("flext - method %s: only %i arguments are type-checkable: use variable argument list for more",tag?tag:"?",FLEXT_MAXMETHARGS); + argc = FLEXT_MAXMETHARGS; + } + + args = new metharg[argc]; + + va_start(marker,tp); + metharg a = tp; + for(int ix = 0; ix < argc; ++ix) { #ifdef FLEXT_DEBUG - if(a == a_list && ix > 0) { - ERRINTERNAL(); - } + if(a == a_list && ix > 0) { + ERRINTERNAL(); + } #endif #if FLEXT_SYS == FLEXT_SYS_PD - if(a == a_pointer && flext_base::compatibility) { - post("Pointer arguments are not allowed in compatibility mode"); - } + if(a == a_pointer && flext_base::compatibility) { + post("Pointer arguments are not allowed in compatibility mode"); + } #endif - args[ix] = a; - a = (metharg)va_arg(marker,int); //metharg); - } - va_end(marker); - } - - MethItem *mi = new MethItem; + args[ix] = a; + a = (metharg)va_arg(marker,int); //metharg); + } + va_end(marker); + } + + MethItem *mi = new MethItem; mi->index = ma->Members(); - mi->SetArgs(fun,argc,args); - ma->Add(mi,MakeSymbol(tag),inlet); + mi->SetArgs(fun,argc,args); + ma->Add(mi,MakeSymbol(tag),inlet); } void flext_base::ListMethods(AtomList &la,int inlet) const { - typedef DataMap<int,const t_symbol *> MethList; - MethList list[2]; + typedef DataMap<int,const t_symbol *> MethList; + MethList list[2]; - int i; - for(i = 0; i <= 1; ++i) { - ItemCont *a = i?methhead:clmethhead; - if(a && a->Contained(inlet)) { + int i; + for(i = 0; i <= 1; ++i) { + ItemCont *a = i?methhead:clmethhead; + if(a && a->Contained(inlet)) { ItemSet &ai = a->GetInlet(inlet); for(ItemSet::iterator as = ai.begin(); as != ai.end(); ++as) { for(Item *al = as.data(); al; al = al->nxt) { - MethItem *aa = (MethItem *)al; + MethItem *aa = (MethItem *)al; - // check it's not related to an attribute + // check it's not related to an attribute if(!aa->IsAttr()) { list[i][aa->index] = as.key(); break; } } - } - } - } - - la(list[0].size()+list[1].size()); - int ix = 0; - MethList::iterator it; - for(i = 0; i <= 1; ++i) - for(it = list[i].begin(); it != list[i].end(); ++it) - SetSymbol(la[ix++],it.data()); + } + } + } + + la(list[0].size()+list[1].size()); + int ix = 0; + MethList::iterator it; + for(i = 0; i <= 1; ++i) + for(it = list[i].begin(); it != list[i].end(); ++it) + SetSymbol(la[ix++],it.data()); } bool flext_base::ListMethods(int inlet) const { - if(procattr) { - AtomList la; - ListMethods(la,inlet); - ToOutAnything(GetOutAttr(),MakeSymbol("methods"),la.Count(),la.Atoms()); - return true; - } - else - return false; + if(procattr) { + AtomList la; + ListMethods(la,inlet); + ToOutAnything(GetOutAttr(),MakeSymbol("methods"),la.Count(),la.Atoms()); + return true; + } + else + return false; } bool flext_base::cb_ListMethods(flext_base *c,int argc,const t_atom *argv) { - if(argc == 0 || (argc == 1 && CanbeInt(argv[0]))) - return c->ListMethods(argc?GetAInt(argv[0]):0); - else - return false; + if(argc == 0 || (argc == 1 && CanbeInt(argv[0]))) + return c->ListMethods(argc?GetAInt(argv[0]):0); + else + return false; } diff --git a/externals/grill/flext/source/flmsg.cpp b/externals/grill/flext/source/flmsg.cpp index e586274e..3191edc0 100755 --- a/externals/grill/flext/source/flmsg.cpp +++ b/externals/grill/flext/source/flmsg.cpp @@ -16,60 +16,60 @@ WARRANTIES, see the file, "license.txt," in this distribution. bool flext_base::CallMeth(const MethItem &m,int argc,const t_atom *argv) { - bool ret = false; - int ix; - t_any aargs[FLEXT_MAXMETHARGS]; - bool ok = true; - for(ix = 0; ix < argc && ok; ++ix) { - switch(m.args[ix]) { - case a_float: { - if(IsFloat(argv[ix])) aargs[ix].ft = GetFloat(argv[ix]); - else if(IsInt(argv[ix])) aargs[ix].ft = (float)GetInt(argv[ix]); - else ok = false; - - if(ok) FLEXT_LOG2("int arg %i = %f",ix,aargs[ix].ft); - break; - } - case a_int: { - if(IsFloat(argv[ix])) aargs[ix].it = (int)GetFloat(argv[ix]); - else if(IsInt(argv[ix])) aargs[ix].it = GetInt(argv[ix]); - else ok = false; - - if(ok) FLEXT_LOG2("float arg %i = %i",ix,aargs[ix].it); - break; - } - case a_symbol: { - if(IsSymbol(argv[ix])) aargs[ix].st = GetSymbol(argv[ix]); - else ok = false; - - if(ok) FLEXT_LOG2("symbol arg %i = %s",ix,GetString(aargs[ix].st)); - break; - } + bool ret = false; + int ix; + t_any aargs[FLEXT_MAXMETHARGS]; + bool ok = true; + for(ix = 0; ix < argc && ok; ++ix) { + switch(m.args[ix]) { + case a_float: { + if(IsFloat(argv[ix])) aargs[ix].ft = GetFloat(argv[ix]); + else if(IsInt(argv[ix])) aargs[ix].ft = (float)GetInt(argv[ix]); + else ok = false; + + if(ok) FLEXT_LOG2("int arg %i = %f",ix,aargs[ix].ft); + break; + } + case a_int: { + if(IsFloat(argv[ix])) aargs[ix].it = (int)GetFloat(argv[ix]); + else if(IsInt(argv[ix])) aargs[ix].it = GetInt(argv[ix]); + else ok = false; + + if(ok) FLEXT_LOG2("float arg %i = %i",ix,aargs[ix].it); + break; + } + case a_symbol: { + if(IsSymbol(argv[ix])) aargs[ix].st = GetSymbol(argv[ix]); + else ok = false; + + if(ok) FLEXT_LOG2("symbol arg %i = %s",ix,GetString(aargs[ix].st)); + break; + } #if FLEXT_SYS == FLEXT_SYS_PD - case a_pointer: { - if(IsPointer(argv[ix])) aargs[ix].pt = (t_gpointer *)GetPointer(argv[ix]); - else ok = false; - break; - } + case a_pointer: { + if(IsPointer(argv[ix])) aargs[ix].pt = (t_gpointer *)GetPointer(argv[ix]); + else ok = false; + break; + } #endif - default: - error("Argument type illegal"); - ok = false; - } - } - - if(ok && ix == argc) { - switch(argc) { - case 0: ret = ((methfun_0)m.fun)(this); break; - case 1: ret = ((methfun_1)m.fun)(this,aargs[0]); break; - case 2: ret = ((methfun_2)m.fun)(this,aargs[0],aargs[1]); break; - case 3: ret = ((methfun_3)m.fun)(this,aargs[0],aargs[1],aargs[2]); break; - case 4: ret = ((methfun_4)m.fun)(this,aargs[0],aargs[1],aargs[2],aargs[3]); break; - case 5: ret = ((methfun_5)m.fun)(this,aargs[0],aargs[1],aargs[2],aargs[3],aargs[4]); break; - } - } - - return ret; + default: + error("Argument type illegal"); + ok = false; + } + } + + if(ok && ix == argc) { + switch(argc) { + case 0: ret = ((methfun_0)m.fun)(this); break; + case 1: ret = ((methfun_1)m.fun)(this,aargs[0]); break; + case 2: ret = ((methfun_2)m.fun)(this,aargs[0],aargs[1]); break; + case 3: ret = ((methfun_3)m.fun)(this,aargs[0],aargs[1],aargs[2]); break; + case 4: ret = ((methfun_4)m.fun)(this,aargs[0],aargs[1],aargs[2],aargs[3]); break; + case 5: ret = ((methfun_5)m.fun)(this,aargs[0],aargs[1],aargs[2],aargs[3],aargs[4]); break; + } + } + + return ret; } bool flext_base::TryMethTag(Item *lst,const t_symbol *tag,int argc,const t_atom *argv) @@ -78,29 +78,29 @@ bool flext_base::TryMethTag(Item *lst,const t_symbol *tag,int argc,const t_atom MethItem *m = (MethItem *)lst; // FLEXT_LOG3("found method tag %s: inlet=%i, argc=%i",GetString(tag),m->inlet,argc); - - if(m->attr) { - // attributes are treated differently - - if(m->attr->IsGet()) - return DumpAttrib(tag,m->attr); - else - return SetAttrib(tag,m->attr,argc,argv); - } - else { - if(m->argc == 1) { - // try list - if(m->args[0] == a_list && ((methfun_V)m->fun)(this,argc,const_cast<t_atom *>(argv))) return true; - - // try anything - if(m->args[0] == a_any && ((methfun_A)m->fun)(this,tag,argc,const_cast<t_atom *>(argv))) return true; - } - - // try matching number of args - if(argc == m->argc && CallMeth(*m,argc,argv)) return true; - } - } - return false; + + if(m->attr) { + // attributes are treated differently + + if(m->attr->IsGet()) + return DumpAttrib(tag,m->attr); + else + return SetAttrib(tag,m->attr,argc,argv); + } + else { + if(m->argc == 1) { + // try list + if(m->args[0] == a_list && ((methfun_V)m->fun)(this,argc,const_cast<t_atom *>(argv))) return true; + + // try anything + if(m->args[0] == a_any && ((methfun_A)m->fun)(this,tag,argc,const_cast<t_atom *>(argv))) return true; + } + + // try matching number of args + if(argc == m->argc && CallMeth(*m,argc,argv)) return true; + } + } + return false; } bool flext_base::TryMethSym(Item *lst,const t_symbol *s) @@ -108,14 +108,14 @@ bool flext_base::TryMethSym(Item *lst,const t_symbol *s) for(; lst; lst = lst->nxt) { MethItem *m = (MethItem *)lst; - if(!m->IsAttr()) { -// FLEXT_LOG3("found symbol method for %s: inlet=%i, symbol=%s",GetString(m->tag),m->inlet,GetString(s)); + if(!m->IsAttr()) { +// FLEXT_LOG3("found symbol method for %s: inlet=%i, symbol=%s",GetString(m->tag),m->inlet,GetString(s)); - t_any sym; sym.st = const_cast<t_symbol *>(s); - if(((methfun_1)m->fun)(this,sym)) return true; - } - } - return false; + t_any sym; sym.st = const_cast<t_symbol *>(s); + if(((methfun_1)m->fun)(this,sym)) return true; + } + } + return false; } bool flext_base::TryMethAny(Item *lst,const t_symbol *s,int argc,const t_atom *argv) @@ -123,141 +123,153 @@ bool flext_base::TryMethAny(Item *lst,const t_symbol *s,int argc,const t_atom *a for(; lst; lst = lst->nxt) { MethItem *m = (MethItem *)lst; - if(!m->IsAttr() && m->argc == 1 && m->args[0] == a_any) { -// FLEXT_LOG4("found any method for %s: inlet=%i, symbol=%s, argc=%i",GetString(m->tag),m->inlet,GetString(s),argc); + if(!m->IsAttr() && m->argc == 1 && m->args[0] == a_any) { +// FLEXT_LOG4("found any method for %s: inlet=%i, symbol=%s, argc=%i",GetString(m->tag),m->inlet,GetString(s),argc); - if(((methfun_A)m->fun)(this,s,argc,const_cast<t_atom *>(argv))) return true; - } + if(((methfun_A)m->fun)(this,s,argc,const_cast<t_atom *>(argv))) return true; + } } return false; } /*! \brief Find a method item for a specific tag and arguments - \remark All attributes are also stored in the method list and retrieved by a member of the method item + \remark All attributes are also stored in the method list and retrieved by a member of the method item */ bool flext_base::FindMeth(int inlet,const t_symbol *s,int argc,const t_atom *argv) { Item *lst; - // search for exactly matching tag - if((lst = methhead->FindList(s,inlet)) != NULL && TryMethTag(lst,s,argc,argv)) return true; - if((lst = clmethhead->FindList(s,inlet)) != NULL && TryMethTag(lst,s,argc,argv)) return true; - - // if no list args, then search for pure symbol - if(!argc) { - if((lst = methhead->FindList(sym_symbol,inlet)) != NULL && TryMethSym(lst,s)) return true; - if((lst = clmethhead->FindList(sym_symbol,inlet)) != NULL && TryMethSym(lst,s)) return true; - } - - // otherwise search for anything - if((lst = methhead->FindList(sym_anything,inlet)) != NULL && TryMethAny(lst,s,argc,argv)) return true; - if((lst = clmethhead->FindList(sym_anything,inlet)) != NULL && TryMethAny(lst,s,argc,argv)) return true; - - // if nothing found try any inlet - return inlet >= 0 && FindMeth(-1,s,argc,argv); + // search for exactly matching tag + if((lst = methhead->FindList(s,inlet)) != NULL && TryMethTag(lst,s,argc,argv)) return true; + if((lst = clmethhead->FindList(s,inlet)) != NULL && TryMethTag(lst,s,argc,argv)) return true; + + // if no list args, then search for pure symbol + if(!argc) { + if((lst = methhead->FindList(sym_symbol,inlet)) != NULL && TryMethSym(lst,s)) return true; + if((lst = clmethhead->FindList(sym_symbol,inlet)) != NULL && TryMethSym(lst,s)) return true; + } + + // otherwise search for anything + if((lst = methhead->FindList(sym_anything,inlet)) != NULL && TryMethAny(lst,s,argc,argv)) return true; + if((lst = clmethhead->FindList(sym_anything,inlet)) != NULL && TryMethAny(lst,s,argc,argv)) return true; + + // if nothing found try any inlet + return inlet >= 0 && FindMeth(-1,s,argc,argv); } /*! \brief All the message processing - The messages of all the inlets go here and are promoted to the registered callback functions + The messages of all the inlets go here and are promoted to the registered callback functions */ bool flext_base::m_methodmain(int inlet,const t_symbol *s,int argc,const t_atom *argv) { - static bool trap = false; + static bool trap = false; + + curtag = s; + +// post("methodmain inlet:%i args:%i symbol:%s",inlet,argc,s?GetString(s):""); - curtag = s; + bool ret = FindMeth(inlet,s,argc,argv); + if(ret) goto end; -// post("methodmain inlet:%i args:%i symbol:%s",inlet,argc,s?GetString(s):""); - - bool ret = FindMeth(inlet,s,argc,argv); - if(ret) goto end; + try { #if FLEXT_SYS == FLEXT_SYS_MAX - // If float message is not explicitly handled: try int handler instead - if(argc == 1 && s == sym_float && !trap) { - t_atom fl; - SetInt(fl,GetAInt(argv[0])); - trap = true; - ret = m_methodmain(inlet,sym_int,1,&fl); - trap = false; - } - if(ret) goto end; - - // If int message is not explicitly handled: try float handler instead - if(argc == 1 && s == sym_int && !trap) { - t_atom fl; - SetFloat(fl,GetAFloat(argv[0])); - trap = true; - ret = m_methodmain(inlet,sym_float,1,&fl); - trap = false; - } - if(ret) goto end; + // If float message is not explicitly handled: try int handler instead + if(argc == 1 && s == sym_float && !trap) { + t_atom fl; + SetInt(fl,GetAInt(argv[0])); + trap = true; + ret = m_methodmain(inlet,sym_int,1,&fl); + trap = false; + } + if(ret) goto end; + + // If int message is not explicitly handled: try float handler instead + if(argc == 1 && s == sym_int && !trap) { + t_atom fl; + SetFloat(fl,GetAFloat(argv[0])); + trap = true; + ret = m_methodmain(inlet,sym_float,1,&fl); + trap = false; + } + if(ret) goto end; #endif - - // If float or int message is not explicitly handled: try list handler instead - if(!trap && argc == 1 && (s == sym_float + + // If float or int message is not explicitly handled: try list handler instead + if(!trap && argc == 1 && (s == sym_float #if FLEXT_SYS == FLEXT_SYS_MAX - || s == sym_int + || s == sym_int #endif - )) { - t_atom list; - if(s == sym_float) - SetFloat(list,GetFloat(argv[0])); + )) { + t_atom list; + if(s == sym_float) + SetFloat(list,GetFloat(argv[0])); #if FLEXT_SYS == FLEXT_SYS_MAX - else if(s == sym_int) - SetInt(list,GetInt(argv[0])); + else if(s == sym_int) + SetInt(list,GetInt(argv[0])); #endif - trap = true; - ret = m_methodmain(inlet,sym_list,1,&list); - trap = false; - } - if(ret) goto end; - - // If symbol message (pure anything without args) is not explicitly handled: try list handler instead - if(!trap && argc == 0) { - t_atom list; - SetSymbol(list,s); - trap = true; - ret = m_methodmain(inlet,sym_list,1,&list); - trap = false; - } - if(ret) goto end; - - // if distmsgs is switched on then distribute list elements over inlets (Max/MSP behavior) - if(distmsgs && !trap && inlet == 0 && s == sym_list && insigs <= 1) { - int i = incnt; - if(i > argc) i = argc; - for(--i; i >= 0; --i) { // right to left distribution - const t_symbol *sym = NULL; - if(IsFloat(argv[i])) sym = sym_float; - else if(IsInt(argv[i])) sym = sym_int; - else if(IsSymbol(argv[i])) sym = sym_symbol; + trap = true; + ret = m_methodmain(inlet,sym_list,1,&list); + trap = false; + } + if(ret) goto end; + + // If symbol message (pure anything without args) is not explicitly handled: try list handler instead + if(!trap && argc == 0) { + t_atom list; + SetSymbol(list,s); + trap = true; + ret = m_methodmain(inlet,sym_list,1,&list); + trap = false; + } + if(ret) goto end; + + // if distmsgs is switched on then distribute list elements over inlets (Max/MSP behavior) + if(distmsgs && !trap && inlet == 0 && s == sym_list && insigs <= 1) { + int i = incnt; + if(i > argc) i = argc; + for(--i; i >= 0; --i) { // right to left distribution + const t_symbol *sym = NULL; + if(IsFloat(argv[i])) sym = sym_float; + else if(IsInt(argv[i])) sym = sym_int; + else if(IsSymbol(argv[i])) sym = sym_symbol; #if FLEXT_SYS == FLEXT_SYS_PD - else if(IsPointer(argv[i])) sym = sym_pointer; // can pointer atoms occur here? + else if(IsPointer(argv[i])) sym = sym_pointer; // can pointer atoms occur here? #endif - if(sym) { - trap = true; - m_methodmain(i,sym,1,argv+i); - trap = false; - } - } - - ret = true; - } - - if(!ret && !trap) ret = m_method_(inlet,s,argc,argv); - + if(sym) { + trap = true; + m_methodmain(i,sym,1,argv+i); + trap = false; + } + } + + ret = true; + } + + if(!ret && !trap) ret = m_method_(inlet,s,argc,argv); + } + catch(std::exception &x) { + error("%s - Exception while processing method: %s",thisName(),x.what()); + } + catch(const char *txt) { + error("%s - Exception while processing method: %s",thisName(),txt); + } + catch(...) { + error("%s - Unknown exception while processing method",thisName()); + } + end: - curtag = NULL; + curtag = NULL; - return ret; // true if appropriate handler was found and called + return ret; // true if appropriate handler was found and called } bool flext_base::m_method_(int inlet,const t_symbol *s,int argc,const t_atom *argv) { //#ifdef FLEXT_DEBUG - post("%s: message unhandled - inlet:%i args:%i symbol:%s",thisName(),inlet,argc,s?GetString(s):""); + post("%s: message unhandled - inlet:%i args:%i symbol:%s",thisName(),inlet,argc,s?GetString(s):""); //#endif - return false; + return false; } diff --git a/externals/grill/flext/source/flmspbuffer.h b/externals/grill/flext/source/flmspbuffer.h index c09f690f..88023806 100755 --- a/externals/grill/flext/source/flmspbuffer.h +++ b/externals/grill/flext/source/flmspbuffer.h @@ -10,71 +10,71 @@ WARRANTIES, see the file, "license.txt," in this distribution. /*! \file flmspbuffer.h \brief Definition of the Max/MSP buffer structure - \internal + \internal - This file comes from David Zicarellis inofficial package index.sit - The latter is not easily found so i included the original file buffer.h with flext + This file comes from David Zicarellis inofficial package index.sit + The latter is not easily found so i included the original file buffer.h with flext */ #if (FLEXT_SYS == FLEXT_SYS_MAX) && !defined(__FLEXT_MSPBUFFER_H) #define __FLEXT_MSPBUFFER_H enum { - MAXCHAN = 4 + MAXCHAN = 4 }; enum { - bi_basefreq = 0, - bi_detune, - bi_lowfreq, - bi_hifreq, - bi_lowvel, - bi_hivel, - bi_gain, - bi_numparams + bi_basefreq = 0, + bi_detune, + bi_lowfreq, + bi_hifreq, + bi_lowvel, + bi_hivel, + bi_gain, + bi_numparams }; typedef struct _buffer { - t_object b_obj; // doesn't have any signals so it doesn't need to be pxobject - long b_valid; // flag is off during read replacement or editing operation - float *b_samples; // stored with interleaved channels if multi-channel - long b_frames; // number of sample frames (each one is sizeof(float) * b_nchans bytes) - long b_nchans; // number of channels - long b_size; // size of buffer in floats - float b_sr; // sampling rate of the buffer - float b_1oversr; // 1 / sr - float b_msr; // sr * .001 - // Mac-specific stuff - float *b_memory; // pointer to where memory starts (initial padding for interp) - t_symbol *b_name; - short b_vol; - short b_space; - // looping info (from AIFF file) - long b_susloopstart; // in samples - long b_susloopend; // in samples - long b_relloopstart; // in samples - long b_relloopend; // in samples - // instrument info (from AIFF file) - short b_inst[bi_numparams]; - // window stuff - void *b_wind; - double b_pixperfr; - double b_frperpix; - long b_imagesize; - Point b_scroll; - long b_scrollscale; - long b_selbegin[MAXCHAN]; - long b_selend[MAXCHAN]; - long b_zoom; - long b_zim[11]; - void *b_mouseout; - long b_format; // 'AIFF' or 'Sd2f' - t_symbol *b_filename; // last file read (not written) for readagain message - long b_oldnchans; // used for resizing window in case of # of channels change - void *b_doneout; - long b_outputbytes; // number of bytes used for output sample (1-4) - long b_modtime; // last modified time ("dirty" method) + t_object b_obj; // doesn't have any signals so it doesn't need to be pxobject + long b_valid; // flag is off during read replacement or editing operation + float *b_samples; // stored with interleaved channels if multi-channel + long b_frames; // number of sample frames (each one is sizeof(float) * b_nchans bytes) + long b_nchans; // number of channels + long b_size; // size of buffer in floats + float b_sr; // sampling rate of the buffer + float b_1oversr; // 1 / sr + float b_msr; // sr * .001 + // Mac-specific stuff + float *b_memory; // pointer to where memory starts (initial padding for interp) + t_symbol *b_name; + short b_vol; + short b_space; + // looping info (from AIFF file) + long b_susloopstart; // in samples + long b_susloopend; // in samples + long b_relloopstart; // in samples + long b_relloopend; // in samples + // instrument info (from AIFF file) + short b_inst[bi_numparams]; + // window stuff + void *b_wind; + double b_pixperfr; + double b_frperpix; + long b_imagesize; + Point b_scroll; + long b_scrollscale; + long b_selbegin[MAXCHAN]; + long b_selend[MAXCHAN]; + long b_zoom; + long b_zim[11]; + void *b_mouseout; + long b_format; // 'AIFF' or 'Sd2f' + t_symbol *b_filename; // last file read (not written) for readagain message + long b_oldnchans; // used for resizing window in case of # of channels change + void *b_doneout; + long b_outputbytes; // number of bytes used for output sample (1-4) + long b_modtime; // last modified time ("dirty" method) } t_buffer; #define BUFWIND(x) ((t_wind *)(x->b_wind)) diff --git a/externals/grill/flext/source/flout.cpp b/externals/grill/flext/source/flout.cpp index fcfaa6c8..245de189 100644 --- a/externals/grill/flext/source/flout.cpp +++ b/externals/grill/flext/source/flout.cpp @@ -58,349 +58,349 @@ void flext_base::ToOutAnything(int n,const t_symbol *s,int argc,const t_atom *ar bool flext_base::InitInlets() { - bool ok = true; + bool ok = true; - // ---------------------------------- - // create inlets - // ---------------------------------- + // ---------------------------------- + // create inlets + // ---------------------------------- - incnt = insigs = 0; + incnt = insigs = 0; // digest inlist { - xlet *xi; - incnt = 0; - for(xi = inlist; xi; xi = xi->nxt) ++incnt; - xlet::type *list = new xlet::type[incnt]; - int i; - for(xi = inlist,i = 0; xi; xi = xi->nxt,++i) list[i] = xi->tp; - -#if FLEXT_SYS == FLEXT_SYS_MAX - // copy inlet descriptions - indesc = new char *[incnt]; - for(xi = inlist,i = 0; xi; xi = xi->nxt,++i) { - int l = xi->desc?strlen(xi->desc):0; - if(l) { - indesc[i] = new char[l+1]; - memcpy(indesc[i],xi->desc,l); - indesc[i][l] = 0; - } - else - indesc[i] = NULL; - } + xlet *xi; + incnt = 0; + for(xi = inlist; xi; xi = xi->nxt) ++incnt; + xlet::type *list = new xlet::type[incnt]; + int i; + for(xi = inlist,i = 0; xi; xi = xi->nxt,++i) list[i] = xi->tp; + +#if FLEXT_SYS == FLEXT_SYS_MAX + // copy inlet descriptions + indesc = new char *[incnt]; + for(xi = inlist,i = 0; xi; xi = xi->nxt,++i) { + int l = xi->desc?strlen(xi->desc):0; + if(l) { + indesc[i] = new char[l+1]; + memcpy(indesc[i],xi->desc,l); + indesc[i][l] = 0; + } + else + indesc[i] = NULL; + } #endif - delete inlist; inlist = NULL; - + delete inlist; inlist = NULL; + #if FLEXT_SYS == FLEXT_SYS_PD || FLEXT_SYS == FLEXT_SYS_MAX - inlets = new px_object *[incnt]; - for(i = 0; i < incnt; ++i) inlets[i] = NULL; + inlets = new px_object *[incnt]; + for(i = 0; i < incnt; ++i) inlets[i] = NULL; #endif - - // type info is now in list array + + // type info is now in list array #if FLEXT_SYS == FLEXT_SYS_PD - { - int cnt = 0; - - if(incnt >= 1) { - switch(list[0]) { - case xlet::tp_sig: - ++insigs; - break; - default: - // leftmost inlet is already there... - break; - } - ++cnt; - } - - for(int ix = 1; ix < incnt; ++ix,++cnt) { - switch(list[ix]) { - case xlet::tp_float: - case xlet::tp_int: { - char sym[] = "ft??"; - if(ix >= 10) { - if(compatibility) { - // Max allows max. 9 inlets - post("%s: Only 9 float/int inlets allowed in compatibility mode",thisName()); - ok = false; - } - else { - if(ix > 99) - post("%s: Inlet index > 99 not allowed for float/int inlets",thisName()); - sym[2] = '0'+ix/10,sym[3] = '0'+ix%10; - } - } - else - sym[2] = '0'+ix,sym[3] = 0; - if(ok) inlet_new(&x_obj->obj, &x_obj->obj.ob_pd, (t_symbol *)sym_float, gensym(sym)); - break; - } - case xlet::tp_sym: - (inlets[ix] = (px_object *)pd_new(px_class))->init(this,ix); // proxy for 2nd inlet messages - inlet_new(&x_obj->obj,&inlets[ix]->obj.ob_pd, (t_symbol *)sym_symbol, (t_symbol *)sym_symbol); - break; - case xlet::tp_list: - (inlets[ix] = (px_object *)pd_new(px_class))->init(this,ix); // proxy for 2nd inlet messages - inlet_new(&x_obj->obj,&inlets[ix]->obj.ob_pd, (t_symbol *)sym_list, (t_symbol *)sym_list); - break; - case xlet::tp_any: - (inlets[ix] = (px_object *)pd_new(px_class))->init(this,ix); // proxy for 2nd inlet messages - inlet_new(&x_obj->obj,&inlets[ix]->obj.ob_pd, 0, 0); - break; - case xlet::tp_sig: - if(compatibility && list[ix-1] != xlet::tp_sig) { - post("%s: All signal inlets must be left-aligned in compatibility mode",thisName()); - ok = false; - } - else { - // pd doesn't seem to be able to handle signals and messages into the same inlet... - - inlet_new(&x_obj->obj, &x_obj->obj.ob_pd, (t_symbol *)sym_signal, (t_symbol *)sym_signal); - ++insigs; - } - break; - default: - error("%s: Wrong type for inlet #%i: %i",thisName(),ix,(int)list[ix]); - ok = false; - } - } - - incnt = cnt; - } + { + int cnt = 0; + + if(incnt >= 1) { + switch(list[0]) { + case xlet::tp_sig: + ++insigs; + break; + default: + // leftmost inlet is already there... + break; + } + ++cnt; + } + + for(int ix = 1; ix < incnt; ++ix,++cnt) { + switch(list[ix]) { + case xlet::tp_float: + case xlet::tp_int: { + char sym[] = "ft??"; + if(ix >= 10) { + if(compatibility) { + // Max allows max. 9 inlets + post("%s: Only 9 float/int inlets allowed in compatibility mode",thisName()); + ok = false; + } + else { + if(ix > 99) + post("%s: Inlet index > 99 not allowed for float/int inlets",thisName()); + sym[2] = '0'+ix/10,sym[3] = '0'+ix%10; + } + } + else + sym[2] = '0'+ix,sym[3] = 0; + if(ok) inlet_new(&x_obj->obj, &x_obj->obj.ob_pd, (t_symbol *)sym_float, gensym(sym)); + break; + } + case xlet::tp_sym: + (inlets[ix] = (px_object *)pd_new(px_class))->init(this,ix); // proxy for 2nd inlet messages + inlet_new(&x_obj->obj,&inlets[ix]->obj.ob_pd, (t_symbol *)sym_symbol, (t_symbol *)sym_symbol); + break; + case xlet::tp_list: + (inlets[ix] = (px_object *)pd_new(px_class))->init(this,ix); // proxy for 2nd inlet messages + inlet_new(&x_obj->obj,&inlets[ix]->obj.ob_pd, (t_symbol *)sym_list, (t_symbol *)sym_list); + break; + case xlet::tp_any: + (inlets[ix] = (px_object *)pd_new(px_class))->init(this,ix); // proxy for 2nd inlet messages + inlet_new(&x_obj->obj,&inlets[ix]->obj.ob_pd, 0, 0); + break; + case xlet::tp_sig: + if(compatibility && list[ix-1] != xlet::tp_sig) { + post("%s: All signal inlets must be left-aligned in compatibility mode",thisName()); + ok = false; + } + else { + // pd doesn't seem to be able to handle signals and messages into the same inlet... + + inlet_new(&x_obj->obj, &x_obj->obj.ob_pd, (t_symbol *)sym_signal, (t_symbol *)sym_signal); + ++insigs; + } + break; + default: + error("%s: Wrong type for inlet #%i: %i",thisName(),ix,(int)list[ix]); + ok = false; + } + } + + incnt = cnt; + } #elif FLEXT_SYS == FLEXT_SYS_MAX - { - int ix,cnt; - // count leftmost signal inlets - while(insigs < incnt && list[insigs] == xlet::tp_sig) ++insigs; - - for(cnt = 0,ix = incnt-1; ix >= insigs; --ix,++cnt) { - if(ix == 0) { - if(list[ix] != xlet::tp_any) { - error("%s: Leftmost inlet must be of type signal or anything",thisName()); - ok = false; - } - } - else { - switch(list[ix]) { - case xlet::tp_sig: - error("%s: All signal inlets must be left-aligned",thisName()); - ok = false; - break; - case xlet::tp_float: - if(ix >= 10) { - post("%s: Only 9 float inlets possible",thisName()); - ok = false; - } - else - floatin(x_obj,ix); - break; - case xlet::tp_int: - if(ix >= 10) { - post("%s: Only 9 int inlets possible",thisName()); - ok = false; - } - else - intin(x_obj,ix); - break; - case xlet::tp_any: // non-leftmost - case xlet::tp_sym: - case xlet::tp_list: - inlets[ix] = (px_object *)proxy_new(x_obj,ix,&((flext_hdr *)x_obj)->curinlet); - break; - default: - error("%s: Wrong type for inlet #%i: %i",thisName(),ix,(int)list[ix]); - ok = false; - } - } - } - -// incnt = cnt; - - if(insigs) -// dsp_setup(thisHdr(),insigs); // signal inlets - dsp_setupbox(thisHdr(),insigs); // signal inlets - } + { + int ix,cnt; + // count leftmost signal inlets + while(insigs < incnt && list[insigs] == xlet::tp_sig) ++insigs; + + for(cnt = 0,ix = incnt-1; ix >= insigs; --ix,++cnt) { + if(ix == 0) { + if(list[ix] != xlet::tp_any) { + error("%s: Leftmost inlet must be of type signal or anything",thisName()); + ok = false; + } + } + else { + switch(list[ix]) { + case xlet::tp_sig: + error("%s: All signal inlets must be left-aligned",thisName()); + ok = false; + break; + case xlet::tp_float: + if(ix >= 10) { + post("%s: Only 9 float inlets possible",thisName()); + ok = false; + } + else + floatin(x_obj,ix); + break; + case xlet::tp_int: + if(ix >= 10) { + post("%s: Only 9 int inlets possible",thisName()); + ok = false; + } + else + intin(x_obj,ix); + break; + case xlet::tp_any: // non-leftmost + case xlet::tp_sym: + case xlet::tp_list: + inlets[ix] = (px_object *)proxy_new(x_obj,ix,&((flext_hdr *)x_obj)->curinlet); + break; + default: + error("%s: Wrong type for inlet #%i: %i",thisName(),ix,(int)list[ix]); + ok = false; + } + } + } + +// incnt = cnt; + + if(insigs) +// dsp_setup(thisHdr(),insigs); // signal inlets + dsp_setupbox(thisHdr(),insigs); // signal inlets + } #elif FLEXT_SYS == FLEXT_SYS_JMAX - { - t_class *cl = thisClass(); - int cnt = 0; - for(int ix = 0; ix < incnt; ++ix,++cnt) { - switch(list[ix]) { - case xlet::tp_float: - case xlet::tp_int: -// fts_class_inlet_number(cl, ix, jmax_proxy); - break; - case xlet::tp_sym: -// fts_class_inlet_symbol(cl, ix, jmax_proxy); - break; - case xlet::tp_sig: - if(compatibility && list[ix-1] != xlet::tp_sig) { - post("%s: All signal inlets must be left-aligned in compatibility mode",thisName()); - ok = false; - } - else { - if(!insigs) fts_dsp_declare_inlet(cl,0); - ++insigs; - } - // no break -> let a signal inlet also accept any messages - case xlet::tp_list: - case xlet::tp_any: -// fts_class_inlet_varargs(cl,ix, jmax_proxy); - break; - default: - error("%s: Wrong type for inlet #%i: %i",thisName(),ix,(int)list[ix]); - ok = false; - } - } - - incnt = cnt; - - fts_object_set_inlets_number((fts_object_t *)thisHdr(), incnt); - } + { + t_class *cl = thisClass(); + int cnt = 0; + for(int ix = 0; ix < incnt; ++ix,++cnt) { + switch(list[ix]) { + case xlet::tp_float: + case xlet::tp_int: +// fts_class_inlet_number(cl, ix, jmax_proxy); + break; + case xlet::tp_sym: +// fts_class_inlet_symbol(cl, ix, jmax_proxy); + break; + case xlet::tp_sig: + if(compatibility && list[ix-1] != xlet::tp_sig) { + post("%s: All signal inlets must be left-aligned in compatibility mode",thisName()); + ok = false; + } + else { + if(!insigs) fts_dsp_declare_inlet(cl,0); + ++insigs; + } + // no break -> let a signal inlet also accept any messages + case xlet::tp_list: + case xlet::tp_any: +// fts_class_inlet_varargs(cl,ix, jmax_proxy); + break; + default: + error("%s: Wrong type for inlet #%i: %i",thisName(),ix,(int)list[ix]); + ok = false; + } + } + + incnt = cnt; + + fts_object_set_inlets_number((fts_object_t *)thisHdr(), incnt); + } #else #error #endif - delete[] list; - } + delete[] list; + } - return ok; + return ok; } bool flext_base::InitOutlets() { - bool ok = true; + bool ok = true; - // ---------------------------------- - // create outlets - // ---------------------------------- + // ---------------------------------- + // create outlets + // ---------------------------------- - outcnt = outsigs = 0; - + outcnt = outsigs = 0; + #if FLEXT_SYS == FLEXT_SYS_MAX - // for Max/MSP the rightmost outlet has to be created first - outlet *attrtmp = NULL; - if(procattr) - attrtmp = (outlet *)newout_anything(thisHdr()); + // for Max/MSP the rightmost outlet has to be created first + outlet *attrtmp = NULL; + if(procattr) + attrtmp = (outlet *)newout_anything(thisHdr()); #endif // digest outlist - { - xlet *xi; - - // count outlets - outcnt = 0; - for(xi = outlist; xi; xi = xi->nxt) ++outcnt; - - xlet::type *list = new xlet::type[outcnt]; - int i; - for(xi = outlist,i = 0; xi; xi = xi->nxt,++i) list[i] = xi->tp; - -#if FLEXT_SYS == FLEXT_SYS_MAX - // copy outlet descriptions - outdesc = new char *[outcnt]; - for(xi = outlist,i = 0; xi; xi = xi->nxt,++i) { - int l = xi->desc?strlen(xi->desc):0; - if(l) { - outdesc[i] = new char[l+1]; - memcpy(outdesc[i],xi->desc,l); - outdesc[i][l] = 0; - } - else - outdesc[i] = NULL; - } + { + xlet *xi; + + // count outlets + outcnt = 0; + for(xi = outlist; xi; xi = xi->nxt) ++outcnt; + + xlet::type *list = new xlet::type[outcnt]; + int i; + for(xi = outlist,i = 0; xi; xi = xi->nxt,++i) list[i] = xi->tp; + +#if FLEXT_SYS == FLEXT_SYS_MAX + // copy outlet descriptions + outdesc = new char *[outcnt]; + for(xi = outlist,i = 0; xi; xi = xi->nxt,++i) { + int l = xi->desc?strlen(xi->desc):0; + if(l) { + outdesc[i] = new char[l+1]; + memcpy(outdesc[i],xi->desc,l); + outdesc[i][l] = 0; + } + else + outdesc[i] = NULL; + } #endif - delete outlist; outlist = NULL; - + delete outlist; outlist = NULL; + #if FLEXT_SYS == FLEXT_SYS_PD || FLEXT_SYS == FLEXT_SYS_MAX - outlets = new outlet *[outcnt+(procattr?1:0)]; + outlets = new outlet *[outcnt+(procattr?1:0)]; - // type info is now in list array + // type info is now in list array #if FLEXT_SYS == FLEXT_SYS_PD - for(int ix = 0; ix < outcnt; ++ix) + for(int ix = 0; ix < outcnt; ++ix) #elif FLEXT_SYS == FLEXT_SYS_MAX - for(int ix = outcnt-1; ix >= 0; --ix) + for(int ix = outcnt-1; ix >= 0; --ix) #else #error #endif - { - switch(list[ix]) { - case xlet::tp_float: - outlets[ix] = (outlet *)newout_float(&x_obj->obj); - break; - case xlet::tp_int: - outlets[ix] = (outlet *)newout_flint(&x_obj->obj); - break; - case xlet::tp_sig: - outlets[ix] = (outlet *)newout_signal(&x_obj->obj); - ++outsigs; - break; - case xlet::tp_sym: - outlets[ix] = (outlet *)newout_symbol(&x_obj->obj); - break; - case xlet::tp_list: - outlets[ix] = (outlet *)newout_list(&x_obj->obj); - break; - case xlet::tp_any: - outlets[ix] = (outlet *)newout_anything(&x_obj->obj); - break; + { + switch(list[ix]) { + case xlet::tp_float: + outlets[ix] = (outlet *)newout_float(&x_obj->obj); + break; + case xlet::tp_int: + outlets[ix] = (outlet *)newout_flint(&x_obj->obj); + break; + case xlet::tp_sig: + outlets[ix] = (outlet *)newout_signal(&x_obj->obj); + ++outsigs; + break; + case xlet::tp_sym: + outlets[ix] = (outlet *)newout_symbol(&x_obj->obj); + break; + case xlet::tp_list: + outlets[ix] = (outlet *)newout_list(&x_obj->obj); + break; + case xlet::tp_any: + outlets[ix] = (outlet *)newout_anything(&x_obj->obj); + break; #ifdef FLEXT_DEBUG - default: - ERRINTERNAL(); - ok = false; + default: + ERRINTERNAL(); + ok = false; #endif - } - } + } + } #elif FLEXT_SYS == FLEXT_SYS_JMAX - t_class *cl = thisClass(); - for(int ix = 0; ix < outcnt; ++ix) { - switch(list[ix]) { - case xlet::tp_float: - case xlet::tp_int: -// fts_class_outlet_number(cl, ix); - break; - case xlet::tp_sym: -// fts_class_outlet_symbol(cl, ix); - break; - case xlet::tp_list: - case xlet::tp_any: -// fts_class_outlet_anything(cl, ix); - break; - case xlet::tp_sig: - if(!outsigs) fts_dsp_declare_outlet(cl,0); - ++outsigs; - break; + t_class *cl = thisClass(); + for(int ix = 0; ix < outcnt; ++ix) { + switch(list[ix]) { + case xlet::tp_float: + case xlet::tp_int: +// fts_class_outlet_number(cl, ix); + break; + case xlet::tp_sym: +// fts_class_outlet_symbol(cl, ix); + break; + case xlet::tp_list: + case xlet::tp_any: +// fts_class_outlet_anything(cl, ix); + break; + case xlet::tp_sig: + if(!outsigs) fts_dsp_declare_outlet(cl,0); + ++outsigs; + break; #ifdef FLEXT_DEBUG - default: - ERRINTERNAL(); - ok = false; + default: + ERRINTERNAL(); + ok = false; #endif - } - } + } + } - fts_object_set_outlets_number((fts_object_t *)thisHdr(), outcnt+(procattr?1:0)); + fts_object_set_outlets_number((fts_object_t *)thisHdr(), outcnt+(procattr?1:0)); #endif - delete[] list; - } + delete[] list; + } #if FLEXT_SYS == FLEXT_SYS_PD || FLEXT_SYS == FLEXT_SYS_MAX - if(procattr) { - // attribute dump outlet is the last one - outlets[outcnt] = + if(procattr) { + // attribute dump outlet is the last one + outlets[outcnt] = #if FLEXT_SYS == FLEXT_SYS_PD - // attribute dump outlet is the last one - (outlet *)newout_anything(&x_obj->obj); + // attribute dump outlet is the last one + (outlet *)newout_anything(&x_obj->obj); #elif FLEXT_SYS == FLEXT_SYS_MAX - attrtmp; + attrtmp; #endif - } + } #endif - - return ok; + + return ok; } diff --git a/externals/grill/flext/source/flprefix.h b/externals/grill/flext/source/flprefix.h index a61ec8d7..626ff70a 100755 --- a/externals/grill/flext/source/flprefix.h +++ b/externals/grill/flext/source/flprefix.h @@ -16,44 +16,44 @@ WARRANTIES, see the file, "license.txt," in this distribution. #define __FLEXT_PREFIX_H // --- definitions for FLEXT_SYS --------------------- -#define FLEXT_SYS_UNKNOWN 0 +#define FLEXT_SYS_UNKNOWN 0 #ifndef FLEXT_SYS_MAX - #define FLEXT_SYS_MAX 1 + #define FLEXT_SYS_MAX 1 #else - // already defined - #undef FLEXT_SYS_MAX - #define FLEXT_SYS_MAX 1 - #define FLEXT_SYS FLEXT_SYS_MAX + // already defined + #undef FLEXT_SYS_MAX + #define FLEXT_SYS_MAX 1 + #define FLEXT_SYS FLEXT_SYS_MAX #endif #ifndef FLEXT_SYS_PD - #define FLEXT_SYS_PD 2 + #define FLEXT_SYS_PD 2 #else - // already defined - #undef FLEXT_SYS_PD - #define FLEXT_SYS_PD 2 - #define FLEXT_SYS FLEXT_SYS_PD + // already defined + #undef FLEXT_SYS_PD + #define FLEXT_SYS_PD 2 + #define FLEXT_SYS FLEXT_SYS_PD #endif #ifndef FLEXT_SYS_JMAX - #define FLEXT_SYS_JMAX 3 + #define FLEXT_SYS_JMAX 3 #else - // already defined - #undef FLEXT_SYS_JMAX - #define FLEXT_SYS_JMAX 3 - #define FLEXT_SYS FLEXT_SYS_JMAX + // already defined + #undef FLEXT_SYS_JMAX + #define FLEXT_SYS_JMAX 3 + #define FLEXT_SYS FLEXT_SYS_JMAX #endif // --- definitions for FLEXT_OS ---------------------- -#define FLEXT_OS_UNKNOWN 0 -#define FLEXT_OS_WIN 1 -#define FLEXT_OS_MAC 2 -#define FLEXT_OS_LINUX 3 -#define FLEXT_OS_IRIX 4 +#define FLEXT_OS_UNKNOWN 0 +#define FLEXT_OS_WIN 1 +#define FLEXT_OS_MAC 2 +#define FLEXT_OS_LINUX 3 +#define FLEXT_OS_IRIX 4 // --- definitions for FLEXT_OS_API --------------------- -#define FLEXT_OSAPI_UNKNOWN 0 +#define FLEXT_OSAPI_UNKNOWN 0 #define FLEXT_OSAPI_UNIX_POSIX 1 @@ -62,36 +62,36 @@ WARRANTIES, see the file, "license.txt," in this distribution. #define FLEXT_OSAPI_MAC_MACH 4 #define FLEXT_OSAPI_WIN_NATIVE 5 // WIN32 Platform -#define FLEXT_OSAPI_WIN_POSIX 6 // POSIX API (e.g. cygwin) +#define FLEXT_OSAPI_WIN_POSIX 6 // POSIX API (e.g. cygwin) // --- definitions for FLEXT_CPU --------------------- -#define FLEXT_CPU_UNKNOWN 0 +#define FLEXT_CPU_UNKNOWN 0 #define FLEXT_CPU_INTEL 1 -#define FLEXT_CPU_PPC 2 -#define FLEXT_CPU_MIPS 3 -#define FLEXT_CPU_ALPHA 4 +#define FLEXT_CPU_PPC 2 +#define FLEXT_CPU_MIPS 3 +#define FLEXT_CPU_ALPHA 4 // --- definitions for FLEXT_THREADS ----------------- #define FLEXT_THR_POSIX 1 // pthreads -#define FLEXT_THR_WIN32 2 // Win32 native -#define FLEXT_THR_MP 3 // MacOS MPThreads +#define FLEXT_THR_WIN32 2 // Win32 native +#define FLEXT_THR_MP 3 // MacOS MPThreads // --------------------------------------------------- // support old definitions #ifndef FLEXT_SYS - #if defined(MAXMSP) - #define FLEXT_SYS FLEXT_SYS_MAX - // #undef MAXMSP - #elif defined(PD) - #define FLEXT_SYS FLEXT_SYS_PD - // #undef PD - // #undef NT - #endif + #if defined(MAXMSP) + #define FLEXT_SYS FLEXT_SYS_MAX + // #undef MAXMSP + #elif defined(PD) + #define FLEXT_SYS FLEXT_SYS_PD + // #undef PD + // #undef NT + #endif #endif #if defined(_DEBUG) && !defined(FLEXT_DEBUG) - #define FLEXT_DEBUG + #define FLEXT_DEBUG #endif // --------------------------------------------------- @@ -101,268 +101,268 @@ WARRANTIES, see the file, "license.txt," in this distribution. #elif FLEXT_SYS == FLEXT_SYS_PD #elif FLEXT_SYS == FLEXT_SYS_JMAX #else - #error "System must be defined by either FLEXT_SYS_MAX, FLEXT_SYS_PD or FLEXT_SYS_JMAX" + #error "System must be defined by either FLEXT_SYS_MAX, FLEXT_SYS_PD or FLEXT_SYS_JMAX" #endif // Definition of OS/CPU #if defined(_MSC_VER) || (defined(__ICC) && (FLEXT_OS == FLEXT_OS_WIN || defined(_WIN32))) - // Microsoft C++ + // Microsoft C++ // and Intel C++ (as guessed) - - #ifndef FLEXT_CPU - #if defined(_M_IX86) - #define FLEXT_CPU FLEXT_CPU_INTEL - #elif defined(_M_PPC) - #define FLEXT_CPU FLEXT_CPU_PPC - #elif defined(_M_MRX000) - #define FLEXT_CPU FLEXT_CPU_MIPS - #elif defined(_M_ALPHA) - #define FLEXT_CPU FLEXT_CPU_ALPHA - #else - #define FLEXT_CPU FLEXT_CPU_UNKNOWN - #endif - #endif - - #ifndef FLEXT_OS - #if defined(_WIN32) - #define FLEXT_OS FLEXT_OS_WIN - #define FLEXT_OSAPI FLEXT_OSAPI_WIN_NATIVE - #else - #define FLEXT_OS FLEXT_OS_UNKNOWN - #define FLEXT_OSAPI FLEXT_OSAPI_UNKNOWN - #endif - #endif + + #ifndef FLEXT_CPU + #if defined(_M_IX86) + #define FLEXT_CPU FLEXT_CPU_INTEL + #elif defined(_M_PPC) + #define FLEXT_CPU FLEXT_CPU_PPC + #elif defined(_M_MRX000) + #define FLEXT_CPU FLEXT_CPU_MIPS + #elif defined(_M_ALPHA) + #define FLEXT_CPU FLEXT_CPU_ALPHA + #else + #define FLEXT_CPU FLEXT_CPU_UNKNOWN + #endif + #endif + + #ifndef FLEXT_OS + #if defined(_WIN32) + #define FLEXT_OS FLEXT_OS_WIN + #define FLEXT_OSAPI FLEXT_OSAPI_WIN_NATIVE + #else + #define FLEXT_OS FLEXT_OS_UNKNOWN + #define FLEXT_OSAPI FLEXT_OSAPI_UNKNOWN + #endif + #endif #elif defined(__BORLANDC__) - // Borland C++ + // Borland C++ - #ifndef FLEXT_CPU - #define FLEXT_CPU FLEXT_CPU_INTEL - #endif - #ifndef FLEXT_OS - #define FLEXT_OS FLEXT_OS_WIN - #define FLEXT_OSAPI FLEXT_OSAPI_WIN_NATIVE - #else - #define FLEXT_OSAPI FLEXT_OSAPI_UNKNOWN - #endif + #ifndef FLEXT_CPU + #define FLEXT_CPU FLEXT_CPU_INTEL + #endif + #ifndef FLEXT_OS + #define FLEXT_OS FLEXT_OS_WIN + #define FLEXT_OSAPI FLEXT_OSAPI_WIN_NATIVE + #else + #define FLEXT_OSAPI FLEXT_OSAPI_UNKNOWN + #endif #elif defined(__MWERKS__) - // Metrowerks CodeWarrior - - #ifdef __MACH__ - // quick fix for OSX Mach-O - #define TARGET_CPU_PPC 1 - #define TARGET_OS_MAC 1 - #define TARGET_API_MAC_OSX 1 - #else - #ifndef __CONDITIONALMACROS__ - #include <ConditionalMacros.h> - #endif - #endif - - #ifndef FLEXT_CPU - #if TARGET_CPU_X86 - #define FLEXT_CPU FLEXT_CPU_INTEL - #elif TARGET_CPU_PPC - #define FLEXT_CPU FLEXT_CPU_PPC - #elif TARGET_CPU_MIPS - #define FLEXT_CPU FLEXT_CPU_MIPS - #elif TARGET_CPU_ALPHA - #define FLEXT_CPU FLEXT_CPU_ALPHA - #else - #define FLEXT_CPU FLEXT_CPU_UNKNOWN - #endif - #endif - - #ifndef FLEXT_OS - #if TARGET_OS_MAC - #define FLEXT_OS FLEXT_OS_MAC - #elif TARGET_OS_WIN32 - // assume Windows - #define FLEXT_OS FLEXT_OS_WIN - #else - #define FLEXT_OS FLEXT_OS_UNKNOWN - #endif - #endif - - #ifndef FLEXT_OSAPI - #if TARGET_API_MAC_MACH - // this is for Mach-O - // this has the precedence (MACH also supports Carbon, of course) - #define FLEXT_OSAPI FLEXT_OSAPI_MAC_MACH - #elif TARGET_API_MAC_CARBON - // this is for CFM - #define FLEXT_OSAPI FLEXT_OSAPI_MAC_CARBON - #else - #define FLEXT_OSAPI FLEXT_OSAPI_UNKNOWN - #endif - #endif - - // This is important for method and attribute callbacks - #pragma enumsalwaysint on - // This is important for everything - #pragma bool on + // Metrowerks CodeWarrior + + #ifdef __MACH__ + // quick fix for OSX Mach-O + #define TARGET_CPU_PPC 1 + #define TARGET_OS_MAC 1 + #define TARGET_API_MAC_OSX 1 + #else + #ifndef __CONDITIONALMACROS__ + #include <ConditionalMacros.h> + #endif + #endif + + #ifndef FLEXT_CPU + #if TARGET_CPU_X86 + #define FLEXT_CPU FLEXT_CPU_INTEL + #elif TARGET_CPU_PPC + #define FLEXT_CPU FLEXT_CPU_PPC + #elif TARGET_CPU_MIPS + #define FLEXT_CPU FLEXT_CPU_MIPS + #elif TARGET_CPU_ALPHA + #define FLEXT_CPU FLEXT_CPU_ALPHA + #else + #define FLEXT_CPU FLEXT_CPU_UNKNOWN + #endif + #endif + + #ifndef FLEXT_OS + #if TARGET_OS_MAC + #define FLEXT_OS FLEXT_OS_MAC + #elif TARGET_OS_WIN32 + // assume Windows + #define FLEXT_OS FLEXT_OS_WIN + #else + #define FLEXT_OS FLEXT_OS_UNKNOWN + #endif + #endif + + #ifndef FLEXT_OSAPI + #if TARGET_API_MAC_MACH + // this is for Mach-O + // this has the precedence (MACH also supports Carbon, of course) + #define FLEXT_OSAPI FLEXT_OSAPI_MAC_MACH + #elif TARGET_API_MAC_CARBON + // this is for CFM + #define FLEXT_OSAPI FLEXT_OSAPI_MAC_CARBON + #else + #define FLEXT_OSAPI FLEXT_OSAPI_UNKNOWN + #endif + #endif + + // This is important for method and attribute callbacks + #pragma enumsalwaysint on + // This is important for everything + #pragma bool on #elif defined(__GNUG__) || (defined(__ICC) && (FLEXT_OS == FLEXT_OS_LINUX || defined(linux) || defined(__linux__))) - // GNU C++ + // GNU C++ // and Intel (as suggested by Tim Blechmann) - #ifndef FLEXT_CPU - #if defined(_X86_) || defined(__i386__) || defined(__i586__) || defined(__i686__) - #define FLEXT_CPU FLEXT_CPU_INTEL - #elif defined(__POWERPC__) - #define FLEXT_CPU FLEXT_CPU_PPC - #elif defined(__MIPS__) - #define FLEXT_CPU FLEXT_CPU_MIPS - #else - #define FLEXT_CPU FLEXT_CPU_UNKNOWN - #endif - #endif - - #ifndef FLEXT_OS - #if defined(linux) || defined(__linux__) - #define FLEXT_OS FLEXT_OS_LINUX - #elif defined(__CYGWIN__) || defined(__CYGWIN32__) || defined(__MINGW32__) - #define FLEXT_OS FLEXT_OS_WIN - #elif defined(__APPLE__) && defined(__MACH__) - #define FLEXT_OS FLEXT_OS_MAC - // how about IRIX?? - #else - #define FLEXT_OS FLEXT_OS_UNKNOWN - #endif - #endif - - #ifndef FLEXT_OSAPI - #if FLEXT_OS == FLEXT_OS_MAC - #define FLEXT_OSAPI FLEXT_OSAPI_MAC_MACH - #elif FLEXT_OS == FLEXT_OS_WIN + #ifndef FLEXT_CPU + #if defined(_X86_) || defined(__i386__) || defined(__i586__) || defined(__i686__) + #define FLEXT_CPU FLEXT_CPU_INTEL + #elif defined(__POWERPC__) + #define FLEXT_CPU FLEXT_CPU_PPC + #elif defined(__MIPS__) + #define FLEXT_CPU FLEXT_CPU_MIPS + #else + #define FLEXT_CPU FLEXT_CPU_UNKNOWN + #endif + #endif + + #ifndef FLEXT_OS + #if defined(linux) || defined(__linux__) + #define FLEXT_OS FLEXT_OS_LINUX + #elif defined(__CYGWIN__) || defined(__CYGWIN32__) || defined(__MINGW32__) + #define FLEXT_OS FLEXT_OS_WIN + #elif defined(__APPLE__) && defined(__MACH__) + #define FLEXT_OS FLEXT_OS_MAC + // how about IRIX?? + #else + #define FLEXT_OS FLEXT_OS_UNKNOWN + #endif + #endif + + #ifndef FLEXT_OSAPI + #if FLEXT_OS == FLEXT_OS_MAC + #define FLEXT_OSAPI FLEXT_OSAPI_MAC_MACH + #elif FLEXT_OS == FLEXT_OS_WIN #if defined(__MINGW32__) - #define FLEXT_OSAPI FLEXT_OSAPI_WIN_NATIVE + #define FLEXT_OSAPI FLEXT_OSAPI_WIN_NATIVE #else - #define FLEXT_OSAPI FLEXT_OSAPI_WIN_POSIX + #define FLEXT_OSAPI FLEXT_OSAPI_WIN_POSIX #endif - #elif FLEXT_OS == FLEXT_OS_LINUX || FLEXT_OS == FLEXT_OS_IRIX - #define FLEXT_OSAPI FLEXT_OSAPI_UNIX_POSIX - #else - #define FLEXT_OSAPI FLEXT_OSAPI_UNKNOWN - #endif - #endif + #elif FLEXT_OS == FLEXT_OS_LINUX || FLEXT_OS == FLEXT_OS_IRIX + #define FLEXT_OSAPI FLEXT_OSAPI_UNIX_POSIX + #else + #define FLEXT_OSAPI FLEXT_OSAPI_UNKNOWN + #endif + #endif #elif defined(__MRC__) && defined(MPW_CPLUS) - // Apple MPW MrCpp - - #if __MRC__ < 0x500 - #error Apple MPW MrCpp v.5.0.0 or later compiler required - #endif - - #ifndef FLEXT_CPU - #if defined(__POWERPC__) - #define FLEXT_CPU FLEXT_CPU_PPC - #else - #define FLEXT_CPU FLEXT_CPU_UNKNOWN - #endif - #endif - - #ifndef FLEXT_OS - #if defined(macintosh) - #define FLEXT_OS FLEXT_OS_MAC - #else - #define FLEXT_OS FLEXT_OS_UNKNOWN - #endif - #endif - - #ifndef FLEXT_OSAPI - #if FLEXT_OS == FLEXT_OS_MAC - #define FLEXT_OSAPI FLEXT_OSAPI_MAC_CLASSIC - #else - #define FLEXT_OSAPI FLEXT_OSAPI_UNKNOWN - #endif - #endif + // Apple MPW MrCpp + + #if __MRC__ < 0x500 + #error Apple MPW MrCpp v.5.0.0 or later compiler required + #endif + + #ifndef FLEXT_CPU + #if defined(__POWERPC__) + #define FLEXT_CPU FLEXT_CPU_PPC + #else + #define FLEXT_CPU FLEXT_CPU_UNKNOWN + #endif + #endif + + #ifndef FLEXT_OS + #if defined(macintosh) + #define FLEXT_OS FLEXT_OS_MAC + #else + #define FLEXT_OS FLEXT_OS_UNKNOWN + #endif + #endif + + #ifndef FLEXT_OSAPI + #if FLEXT_OS == FLEXT_OS_MAC + #define FLEXT_OSAPI FLEXT_OSAPI_MAC_CLASSIC + #else + #define FLEXT_OSAPI FLEXT_OSAPI_UNKNOWN + #endif + #endif #endif #if FLEXT_OS == FLEXT_OS_WIN -// #pragma message("Compiling for Windows") - - #if FLEXT_SYS == FLEXT_SYS_MAX -// #define WIN_VERSION 1 - #elif FLEXT_SYS == FLEXT_SYS_PD -// #define PD -// #define NT - #endif +// #pragma message("Compiling for Windows") + + #if FLEXT_SYS == FLEXT_SYS_MAX +// #define WIN_VERSION 1 + #elif FLEXT_SYS == FLEXT_SYS_PD +// #define PD +// #define NT + #endif #elif FLEXT_OS == FLEXT_OS_LINUX -// #pragma message("Compiling for Linux") +// #pragma message("Compiling for Linux") - #if FLEXT_SYS == FLEXT_SYS_PD -// #define PD - #else - #error "Flext SYS/OS combination unknown" - #endif + #if FLEXT_SYS == FLEXT_SYS_PD +// #define PD + #else + #error "Flext SYS/OS combination unknown" + #endif #elif FLEXT_OS == FLEXT_OS_IRIX -// #pragma message("Compiling for Irix") +// #pragma message("Compiling for Irix") - #if FLEXT_SYS == FLEXT_SYS_PD -// #define PD - #else - #error "Flext SYS/OS combination unknown" - #endif + #if FLEXT_SYS == FLEXT_SYS_PD +// #define PD + #else + #error "Flext SYS/OS combination unknown" + #endif #elif FLEXT_OS == FLEXT_OS_MAC -// #pragma message("Compiling for MacOS") +// #pragma message("Compiling for MacOS") - #if FLEXT_SYS == FLEXT_SYS_PD -// #define PD - #endif + #if FLEXT_SYS == FLEXT_SYS_PD +// #define PD + #endif #else - #error "Operating system could not be determined" + #error "Operating system could not be determined" #endif #if FLEXT_SYS == FLEXT_SYS_MAX -// #pragma message("Compiling for Max/MSP") +// #pragma message("Compiling for Max/MSP") #elif FLEXT_SYS == FLEXT_SYS_PD -// #pragma message("Compiling for PD") +// #pragma message("Compiling for PD") #endif // ----- set threading model ----- // shared builds are always threaded (although this not be so....) #ifdef FLEXT_SHARED - #undef FLEXT_THREADS - #define FLEXT_THREADS + #undef FLEXT_THREADS + #define FLEXT_THREADS /* - // and also enabled for virtual daughter-classes?? - #undef FLEXT_VIRT - #define FLEXT_VIRT + // and also enabled for virtual daughter-classes?? + #undef FLEXT_VIRT + #define FLEXT_VIRT */ #endif #ifdef FLEXT_THREADS - #undef FLEXT_THREADS - #if FLEXT_OS == FLEXT_OS_MAC && FLEXT_SYS == FLEXT_SYS_MAX - // Max crashes with posix threads (because it's in the CFM model) - #define FLEXT_THREADS FLEXT_THR_MP - #elif FLEXT_SYS == FLEXT_SYS_MAX && FLEXT_OS == FLEXT_OS_WIN - // for wmax use native Windows threads - #define FLEXT_THREADS FLEXT_THR_WIN32 - #else - #define FLEXT_THREADS FLEXT_THR_POSIX - #endif + #undef FLEXT_THREADS + #if FLEXT_OS == FLEXT_OS_MAC && FLEXT_SYS == FLEXT_SYS_MAX + // Max crashes with posix threads (because it's in the CFM model) + #define FLEXT_THREADS FLEXT_THR_MP + #elif FLEXT_SYS == FLEXT_SYS_MAX && FLEXT_OS == FLEXT_OS_WIN + // for wmax use native Windows threads + #define FLEXT_THREADS FLEXT_THR_WIN32 + #else + #define FLEXT_THREADS FLEXT_THR_POSIX + #endif #endif // ----- macros for class names ----- /* With linux (flat linker namespace) and more than one flext-based external loaded all calls to static exported functions refer to the first instance loaded! - Therefore different class names are used so that the correct type of flext function is called. + Therefore different class names are used so that the correct type of flext function is called. */ #if defined(FLEXT_SHARED) - #define FLEXT_CLASSDEF(CL) CL##_shared + #define FLEXT_CLASSDEF(CL) CL##_shared #elif defined(FLEXT_THREADS) - #define FLEXT_CLASSDEF(CL) CL##_multi + #define FLEXT_CLASSDEF(CL) CL##_multi #else - #define FLEXT_CLASSDEF(CL) CL##_single + #define FLEXT_CLASSDEF(CL) CL##_single #endif // std namespace diff --git a/externals/grill/flext/source/flproxy.cpp b/externals/grill/flext/source/flproxy.cpp index 4406fd07..c2f906b3 100755 --- a/externals/grill/flext/source/flproxy.cpp +++ b/externals/grill/flext/source/flproxy.cpp @@ -24,18 +24,18 @@ t_class *flext_base::px_class = NULL; void flext_base::px_object::px_method(px_object *obj,const t_symbol *s,int argc,t_atom *argv) { - obj->base->m_methodmain(obj->index,s,argc,argv); + obj->base->m_methodmain(obj->index,s,argc,argv); } void flext_base::cb_px_anything(t_class *c,const t_symbol *s,int argc,t_atom *argv) { - thisObject(c)->m_methodmain(0,s,argc,argv); + thisObject(c)->m_methodmain(0,s,argc,argv); } #define DEF_IN_FT(IX) \ void flext_base::cb_px_ft ## IX(t_class *c,float v) { \ - t_atom atom; SETFLOAT(&atom,v); \ - thisObject(c)->m_methodmain(IX,sym_float,1,&atom); \ + t_atom atom; SETFLOAT(&atom,v); \ + thisObject(c)->m_methodmain(IX,sym_float,1,&atom); \ } #define ADD_IN_FT(IX) \ @@ -45,11 +45,11 @@ add_method1(c,cb_px_ft ## IX,"ft" #IX,A_FLOAT) void flext_base::cb_px_anything(t_class *c,const t_symbol *s,short argc,t_atom *argv) { - // check if inlet allows anything (or list) - - flext_base *o = thisObject(c); - int ci = ((flext_hdr *)o->x_obj)->curinlet; - o->m_methodmain(ci,s,argc,argv); + // check if inlet allows anything (or list) + + flext_base *o = thisObject(c); + int ci = ((flext_hdr *)o->x_obj)->curinlet; + o->m_methodmain(ci,s,argc,argv); } #if 0 //FLEXT_OS == FLEXT_OS_WIN @@ -57,45 +57,45 @@ void flext_base::cb_px_anything(t_class *c,const t_symbol *s,short argc,t_atom * void flext_base::cb_px_int(t_class *c,long v) { - flext_base *o = thisObject(c); - int ci = proxy_getinlet((t_object *)o->x_obj); - // check if inlet allows int type - t_atom atom; - SetInt(atom,v); - o->m_methodmain(ci,sym_int,1,&atom); + flext_base *o = thisObject(c); + int ci = proxy_getinlet((t_object *)o->x_obj); + // check if inlet allows int type + t_atom atom; + SetInt(atom,v); + o->m_methodmain(ci,sym_int,1,&atom); } void flext_base::cb_px_float(t_class *c,double v) { - flext_base *o = thisObject(c); - int ci = proxy_getinlet((t_object *)o->x_obj); - // check if inlet allows float type - t_atom atom; - SetFloat(atom,v); - o->m_methodmain(ci,sym_float,1,&atom); + flext_base *o = thisObject(c); + int ci = proxy_getinlet((t_object *)o->x_obj); + // check if inlet allows float type + t_atom atom; + SetFloat(atom,v); + o->m_methodmain(ci,sym_float,1,&atom); } #else void flext_base::cb_px_int(t_class *c,long v) { - // check if inlet allows int type - t_atom atom; - SetInt(atom,v); - cb_px_anything(c,sym_int,1,&atom); + // check if inlet allows int type + t_atom atom; + SetInt(atom,v); + cb_px_anything(c,sym_int,1,&atom); } void flext_base::cb_px_float(t_class *c,double v) { - // check if inlet allows float type - t_atom atom; - SetFloat(atom,v); - cb_px_anything(c,sym_float,1,&atom); + // check if inlet allows float type + t_atom atom; + SetFloat(atom,v); + cb_px_anything(c,sym_float,1,&atom); } #endif void flext_base::cb_px_bang(t_class *c) { - // check if inlet allows bang - cb_px_anything(c,sym_bang,0,NULL); + // check if inlet allows bang + cb_px_anything(c,sym_bang,0,NULL); } @@ -123,50 +123,50 @@ DEF_IN_FT(9) void flext_base::SetProxies(t_class *c) { - // proxy for extra inlets + // proxy for extra inlets #if FLEXT_SYS == FLEXT_SYS_PD - add_anything(c,cb_px_anything); // for leftmost inlet + add_anything(c,cb_px_anything); // for leftmost inlet px_class = class_new(gensym("flext_base proxy"),NULL,NULL,sizeof(px_object),CLASS_PD|CLASS_NOINLET, A_NULL); - add_anything(px_class,px_object::px_method); // for other inlets + add_anything(px_class,px_object::px_method); // for other inlets #elif FLEXT_SYS == FLEXT_SYS_MAX - add_bang(c,cb_px_bang); - add_method1(c,cb_px_int,"int",A_INT); - add_method1(c,cb_px_float,"float",A_FLOAT); - add_methodG(c,cb_px_anything,"list"); - add_anything(c,cb_px_anything); + add_bang(c,cb_px_bang); + add_method1(c,cb_px_int,"int",A_INT); + add_method1(c,cb_px_float,"float",A_FLOAT); + add_methodG(c,cb_px_anything,"list"); + add_anything(c,cb_px_anything); #else #error Not implemented! -#endif +#endif #if 0 //FLEXT_SYS == FLEXT_SYS_MAX && FLEXT_OS == FLEXT_OS_WIN - // could also work for OSX! - addint((method)cb_px_int); - addfloat((method)cb_px_float); + // could also work for OSX! + addint((method)cb_px_int); + addfloat((method)cb_px_float); #else - // setup non-leftmost ints and floats - ADD_IN_FT(1); - ADD_IN_FT(2); - ADD_IN_FT(3); - ADD_IN_FT(4); - ADD_IN_FT(5); - ADD_IN_FT(6); - ADD_IN_FT(7); - ADD_IN_FT(8); - ADD_IN_FT(9); + // setup non-leftmost ints and floats + ADD_IN_FT(1); + ADD_IN_FT(2); + ADD_IN_FT(3); + ADD_IN_FT(4); + ADD_IN_FT(5); + ADD_IN_FT(6); + ADD_IN_FT(7); + ADD_IN_FT(8); + ADD_IN_FT(9); #endif } #elif FLEXT_SYS == FLEXT_SYS_JMAX void flext_base::jmax_proxy(fts_object_t *c, int winlet, fts_symbol_t s, int argc, const fts_atom_t *argv) { - flext_base *o = thisObject(c); - o->m_methodmain(winlet,s,argc,argv); + flext_base *o = thisObject(c); + o->m_methodmain(winlet,s,argc,argv); } void flext_base::SetProxies(t_class *c) { - fts_class_set_default_handler(c, jmax_proxy); + fts_class_set_default_handler(c, jmax_proxy); } #endif diff --git a/externals/grill/flext/source/flqueue.cpp b/externals/grill/flext/source/flqueue.cpp index aaf82fef..41941734 100755 --- a/externals/grill/flext/source/flqueue.cpp +++ b/externals/grill/flext/source/flqueue.cpp @@ -27,43 +27,43 @@ flext::thrid_t flext::thrmsgid = 0; class qmsg { public: - qmsg(flext_base *b): nxt(NULL),th(b),tp(tp_none) {} - ~qmsg(); - - qmsg *nxt; - - void Clear(); - - void SetBang(int o) { Clear(); out = o; tp = tp_bang; } - void SetFloat(int o,float f) { Clear(); out = o; tp = tp_float; _float = f; } - void SetInt(int o,int i) { Clear(); out = o; tp = tp_int; _int = i; } - void SetSymbol(int o,const t_symbol *s) { Clear(); out = o; tp = tp_sym; _sym = s; } - void SetList(int o,int argc,const t_atom *argv) { Clear(); out = o; tp = tp_list; _list.argc = argc,_list.argv = flext::CopyList(argc,argv); } - void SetAny(int o,const t_symbol *s,int argc,const t_atom *argv) { Clear(); out = o; tp = tp_any; _any.s = s,_any.argc = argc,_any.argv = flext::CopyList(argc,argv); } - - flext_base *th; - int out; - enum { tp_none,tp_bang,tp_float,tp_int,tp_sym,tp_list,tp_any } tp; - union { - float _float; - int _int; - const t_symbol *_sym; - struct { int argc; t_atom *argv; } _list; - struct { const t_symbol *s; int argc; t_atom *argv; } _any; - }; + qmsg(flext_base *b): nxt(NULL),th(b),tp(tp_none) {} + ~qmsg(); + + qmsg *nxt; + + void Clear(); + + void SetBang(int o) { Clear(); out = o; tp = tp_bang; } + void SetFloat(int o,float f) { Clear(); out = o; tp = tp_float; _float = f; } + void SetInt(int o,int i) { Clear(); out = o; tp = tp_int; _int = i; } + void SetSymbol(int o,const t_symbol *s) { Clear(); out = o; tp = tp_sym; _sym = s; } + void SetList(int o,int argc,const t_atom *argv) { Clear(); out = o; tp = tp_list; _list.argc = argc,_list.argv = flext::CopyList(argc,argv); } + void SetAny(int o,const t_symbol *s,int argc,const t_atom *argv) { Clear(); out = o; tp = tp_any; _any.s = s,_any.argc = argc,_any.argv = flext::CopyList(argc,argv); } + + flext_base *th; + int out; + enum { tp_none,tp_bang,tp_float,tp_int,tp_sym,tp_list,tp_any } tp; + union { + float _float; + int _int; + const t_symbol *_sym; + struct { int argc; t_atom *argv; } _list; + struct { const t_symbol *s; int argc; t_atom *argv; } _any; + }; }; qmsg::~qmsg() { - Clear(); - if(nxt) delete nxt; + Clear(); + if(nxt) delete nxt; } void qmsg::Clear() { - if(tp == tp_list) { if(_list.argv) delete[] _list.argv; } - else if(tp == tp_any) { if(_any.argv) delete[] _any.argv; } - tp = tp_none; + if(tp == tp_list) { if(_list.argv) delete[] _list.argv; } + else if(tp == tp_any) { if(_any.argv) delete[] _any.argv; } + tp = tp_none; } static volatile int qcnt = 0; @@ -83,94 +83,94 @@ static flext::ThrMutex qmutex; static void QWork(bool qlock,bool syslock) { - for(;;) { - // Since qcnt can only be increased from any other function than QWork - // qc will be a minimum guaranteed number of present queue elements. - // On the other hand, if new queue elements are added by the methods called - // in the loop, these will be sent in the next tick to avoid recursion overflow. - int qc = qcnt; - if(!qc) break; - - #ifdef FLEXT_QTHR - if(syslock) sys_lock(); - #endif - - for(int i = 0; i < qc && qhead; ++i) { - #ifdef FLEXT_THREADS - if(qlock) qmutex.Lock(); - #endif - qmsg *m = qhead; - qcnt--; - qhead = m->nxt; - if(!qhead) qtail = NULL; - m->nxt = NULL; - #ifdef FLEXT_THREADS - if(qlock) qmutex.Unlock(); - #endif - - if(m->out < 0) { - // message to self - - const int n = -1-m->out; - t_atom tmp; - - switch(m->tp) { - case qmsg::tp_bang: - m->th->m_methodmain(n,flext::sym_bang,0,&tmp); - break; - case qmsg::tp_float: - flext::SetFloat(tmp,m->_float); - m->th->m_methodmain(n,flext::sym_float,1,&tmp); - break; - case qmsg::tp_int: - flext::SetInt(tmp,m->_int); - #if FLEXT_SYS == FLEXT_SYS_PD - m->th->m_methodmain(n,flext::sym_float,1,&tmp); - #elif FLEXT_SYS == FLEXT_SYS_MAX - m->th->m_methodmain(n,flext::sym_int,1,&tmp); - #else - #error Not implemented! - #endif - case qmsg::tp_sym: - flext::SetSymbol(tmp,m->_sym); - m->th->m_methodmain(n,flext::sym_symbol,1,&tmp); - break; - case qmsg::tp_list: - m->th->m_methodmain(n,flext::sym_list,m->_list.argc,m->_list.argv); - break; - case qmsg::tp_any: - m->th->m_methodmain(n,m->_any.s,m->_any.argc,m->_any.argv); - break; - #ifdef FLEXT_DEBUG - default: ERRINTERNAL(); - #endif - } - } - else { - // message to outlet - - switch(m->tp) { - case qmsg::tp_bang: m->th->ToSysBang(m->out); break; - case qmsg::tp_float: m->th->ToSysFloat(m->out,m->_float); break; - case qmsg::tp_int: m->th->ToSysInt(m->out,m->_int); break; - case qmsg::tp_sym: m->th->ToSysSymbol(m->out,m->_sym); break; - case qmsg::tp_list: m->th->ToSysList(m->out,m->_list.argc,m->_list.argv); break; - case qmsg::tp_any: m->th->ToSysAnything(m->out,m->_any.s,m->_any.argc,m->_any.argv); break; - #ifdef FLEXT_DEBUG - default: ERRINTERNAL(); - #endif - } - } - - // delete processed queue element - delete m; - } // inner loop - - #ifdef FLEXT_QTHR - if(syslock) sys_unlock(); - #endif - - } // for(;;) + for(;;) { + // Since qcnt can only be increased from any other function than QWork + // qc will be a minimum guaranteed number of present queue elements. + // On the other hand, if new queue elements are added by the methods called + // in the loop, these will be sent in the next tick to avoid recursion overflow. + int qc = qcnt; + if(!qc) break; + + #ifdef FLEXT_QTHR + if(syslock) sys_lock(); + #endif + + for(int i = 0; i < qc && qhead; ++i) { + #ifdef FLEXT_THREADS + if(qlock) qmutex.Lock(); + #endif + qmsg *m = qhead; + qcnt--; + qhead = m->nxt; + if(!qhead) qtail = NULL; + m->nxt = NULL; + #ifdef FLEXT_THREADS + if(qlock) qmutex.Unlock(); + #endif + + if(m->out < 0) { + // message to self + + const int n = -1-m->out; + t_atom tmp; + + switch(m->tp) { + case qmsg::tp_bang: + m->th->m_methodmain(n,flext::sym_bang,0,&tmp); + break; + case qmsg::tp_float: + flext::SetFloat(tmp,m->_float); + m->th->m_methodmain(n,flext::sym_float,1,&tmp); + break; + case qmsg::tp_int: + flext::SetInt(tmp,m->_int); + #if FLEXT_SYS == FLEXT_SYS_PD + m->th->m_methodmain(n,flext::sym_float,1,&tmp); + #elif FLEXT_SYS == FLEXT_SYS_MAX + m->th->m_methodmain(n,flext::sym_int,1,&tmp); + #else + #error Not implemented! + #endif + case qmsg::tp_sym: + flext::SetSymbol(tmp,m->_sym); + m->th->m_methodmain(n,flext::sym_symbol,1,&tmp); + break; + case qmsg::tp_list: + m->th->m_methodmain(n,flext::sym_list,m->_list.argc,m->_list.argv); + break; + case qmsg::tp_any: + m->th->m_methodmain(n,m->_any.s,m->_any.argc,m->_any.argv); + break; + #ifdef FLEXT_DEBUG + default: ERRINTERNAL(); + #endif + } + } + else { + // message to outlet + + switch(m->tp) { + case qmsg::tp_bang: m->th->ToSysBang(m->out); break; + case qmsg::tp_float: m->th->ToSysFloat(m->out,m->_float); break; + case qmsg::tp_int: m->th->ToSysInt(m->out,m->_int); break; + case qmsg::tp_sym: m->th->ToSysSymbol(m->out,m->_sym); break; + case qmsg::tp_list: m->th->ToSysList(m->out,m->_list.argc,m->_list.argv); break; + case qmsg::tp_any: m->th->ToSysAnything(m->out,m->_any.s,m->_any.argc,m->_any.argv); break; + #ifdef FLEXT_DEBUG + default: ERRINTERNAL(); + #endif + } + } + + // delete processed queue element + delete m; + } // inner loop + + #ifdef FLEXT_QTHR + if(syslock) sys_unlock(); + #endif + + } // for(;;) } #if !defined(FLEXT_QTHR) @@ -181,11 +181,11 @@ static void QTick(fts_object_t *c,int winlet, fts_symbol_t s, int ac, const fts_ static void QTick(flext_base *c) { #endif -// post("qtick"); +// post("qtick"); #ifdef FLEXT_THREADS - FLEXT_ASSERT(flext::IsSystemThread()); + FLEXT_ASSERT(flext::IsSystemThread()); #endif - QWork(true,false); + QWork(true,false); } #endif @@ -196,48 +196,48 @@ But then the order of sent messages is not as intended void flext_base::QFlush(flext_base *th) { #ifdef FLEXT_THREADS - if(!IsSystemThread()) { - error("flext - Queue flush called by wrong thread!"); - return; - } + if(!IsSystemThread()) { + error("flext - Queue flush called by wrong thread!"); + return; + } #endif #ifdef FLEXT_THREADS - qmutex.Lock(); + qmutex.Lock(); #endif - while(qcnt) QWork(false,false); + while(qcnt) QWork(false,false); #ifdef FLEXT_THREADS - qmutex.Unlock(); + qmutex.Unlock(); #endif } static void Queue(qmsg *m) { -// post("Queue"); +// post("Queue"); #ifdef FLEXT_THREADS - qmutex.Lock(); + qmutex.Lock(); #endif - if(qtail) qtail->nxt = m; - else qhead = m; - qtail = m; - qcnt++; + if(qtail) qtail->nxt = m; + else qhead = m; + qtail = m; + qcnt++; #ifdef FLEXT_THREADS - qmutex.Unlock(); + qmutex.Unlock(); #endif #if FLEXT_SYS == FLEXT_SYS_PD #ifdef FLEXT_QTHR // wake up a worker thread // (instead of triggering the clock) - qthrcond.Signal(); - #else - clock_delay(qclk,0); + qthrcond.Signal(); + #else + clock_delay(qclk,0); #endif #elif FLEXT_SYS == FLEXT_SYS_MAX - qelem_set(qclk); + qelem_set(qclk); #elif FLEXT_SYS == FLEXT_SYS_JMAX - // this is dangerous because there may be other timers on this object! - fts_timebase_add_call(fts_get_timebase(), (fts_object_t *)thisHdr(), QTick, NULL, 0); + // this is dangerous because there may be other timers on this object! + fts_timebase_add_call(fts_get_timebase(), (fts_object_t *)thisHdr(), QTick, NULL, 0); #else #error Not implemented #endif @@ -247,28 +247,28 @@ static void Queue(qmsg *m) void flext_base::QWorker(thr_params *) { thrmsgid = GetThreadId(); - for(;;) { - qthrcond.Wait(); - QWork(true,true); - } + for(;;) { + qthrcond.Wait(); + QWork(true,true); + } } #endif void flext_base::StartQueue() { - static bool started = false; - if(started) return; - else started = true; + static bool started = false; + if(started) return; + else started = true; - // message queue ticker - qhead = qtail = NULL; - qcnt = 0; + // message queue ticker + qhead = qtail = NULL; + qcnt = 0; #ifdef FLEXT_QTHR - LaunchThread(QWorker,NULL); + LaunchThread(QWorker,NULL); #else #if FLEXT_SYS == FLEXT_SYS_PD || FLEXT_SYS == FLEXT_SYS_MAX - qclk = (t_qelem *)(qelem_new(NULL,(t_method)QTick)); + qclk = (t_qelem *)(qelem_new(NULL,(t_method)QTick)); #else #error Not implemented! #endif @@ -277,50 +277,50 @@ void flext_base::StartQueue() void flext_base::ToQueueBang(int o) const { - FLEXT_ASSERT(o >= 0); - qmsg *m = new qmsg(const_cast<flext_base *>(this)); - m->SetBang(o); - Queue(m); + FLEXT_ASSERT(o >= 0); + qmsg *m = new qmsg(const_cast<flext_base *>(this)); + m->SetBang(o); + Queue(m); } void flext_base::ToQueueFloat(int o,float f) const { - FLEXT_ASSERT(o >= 0); - qmsg *m = new qmsg(const_cast<flext_base *>(this)); - m->SetFloat(o,f); - Queue(m); + FLEXT_ASSERT(o >= 0); + qmsg *m = new qmsg(const_cast<flext_base *>(this)); + m->SetFloat(o,f); + Queue(m); } void flext_base::ToQueueInt(int o,int f) const { - FLEXT_ASSERT(o >= 0); - qmsg *m = new qmsg(const_cast<flext_base *>(this)); - m->SetInt(o,f); - Queue(m); + FLEXT_ASSERT(o >= 0); + qmsg *m = new qmsg(const_cast<flext_base *>(this)); + m->SetInt(o,f); + Queue(m); } void flext_base::ToQueueSymbol(int o,const t_symbol *s) const { - FLEXT_ASSERT(o >= 0); - qmsg *m = new qmsg(const_cast<flext_base *>(this)); - m->SetSymbol(o,s); - Queue(m); + FLEXT_ASSERT(o >= 0); + qmsg *m = new qmsg(const_cast<flext_base *>(this)); + m->SetSymbol(o,s); + Queue(m); } void flext_base::ToQueueList(int o,int argc,const t_atom *argv) const { - FLEXT_ASSERT(o >= 0); - qmsg *m = new qmsg(const_cast<flext_base *>(this)); - m->SetList(o,argc,argv); - Queue(m); + FLEXT_ASSERT(o >= 0); + qmsg *m = new qmsg(const_cast<flext_base *>(this)); + m->SetList(o,argc,argv); + Queue(m); } void flext_base::ToQueueAnything(int o,const t_symbol *s,int argc,const t_atom *argv) const { - FLEXT_ASSERT(o >= 0); - qmsg *m = new qmsg(const_cast<flext_base *>(this)); - m->SetAny(o,s,argc,argv); - Queue(m); + FLEXT_ASSERT(o >= 0); + qmsg *m = new qmsg(const_cast<flext_base *>(this)); + m->SetAny(o,s,argc,argv); + Queue(m); } diff --git a/externals/grill/flext/source/flsimd.cpp b/externals/grill/flext/source/flsimd.cpp index c14bc1b1..d3487790 100755 --- a/externals/grill/flext/source/flsimd.cpp +++ b/externals/grill/flext/source/flsimd.cpp @@ -9,7 +9,7 @@ WARRANTIES, see the file, "license.txt," in this distribution. */ /*! \file flsimd.cpp - \brief flext SIMD support functions + \brief flext SIMD support functions If FLEXT_USE_SIMD is defined at compilation, SIMD instructions are used wherever feasible. If used with MSVC++ the "Processor Pack" must be installed. @@ -36,20 +36,20 @@ WARRANTIES, see the file, "license.txt," in this distribution. #include <emmintrin.h> // SSE2 #include <mm3dnow.h> // 3DNow! #elif FLEXT_CPU == FLEXT_CPU_PPC && defined(__MWERKS__) && defined(__ALTIVEC__) - #if FLEXT_OSAPI == FLEXT_OSAPI_MAC_MACH - #include <sys/sysctl.h> - #include <vDSP.h> - #else - #include <Gestalt.h> - #endif + #if FLEXT_OSAPI == FLEXT_OSAPI_MAC_MACH + #include <sys/sysctl.h> + #include <vDSP.h> + #else + #include <Gestalt.h> + #endif - #pragma altivec_model on + #pragma altivec_model on - #include <altivec.h> - #include <vectorOps.h> + #include <altivec.h> + #include <vectorOps.h> #elif FLEXT_CPU == FLEXT_CPU_PPC && defined(__GNUG__) && defined(__ALTIVEC__) - #include <sys/sysctl.h> - #include <vecLib/vecLib.h> + #include <sys/sysctl.h> + #include <vecLib/vecLib.h> #endif #endif // FLEXT_USE_SIMD @@ -57,7 +57,7 @@ WARRANTIES, see the file, "license.txt," in this distribution. static unsigned long setsimdcaps(); /*! \brief Holds SIMD capability flags - \internal + \internal */ unsigned long flext::simdcaps = setsimdcaps(); @@ -259,7 +259,7 @@ static int _cpuid (_p_info *pinfo) /*! \brief Determine SIMD capabilities - \internal + \internal */ static unsigned long setsimdcaps() { @@ -275,23 +275,23 @@ static unsigned long setsimdcaps() #if FLEXT_OSAPI == FLEXT_OSAPI_MAC_MACH - int selectors[2] = { CTL_HW, HW_VECTORUNIT }; - int hasVectorUnit = 0; - size_t length = sizeof(hasVectorUnit); - int error = sysctl(selectors, 2, &hasVectorUnit, &length, NULL, 0); + int selectors[2] = { CTL_HW, HW_VECTORUNIT }; + int hasVectorUnit = 0; + size_t length = sizeof(hasVectorUnit); + int error = sysctl(selectors, 2, &hasVectorUnit, &length, NULL, 0); - if(!error && hasVectorUnit != 0) simdflags += flext::simd_altivec; - - #else + if(!error && hasVectorUnit != 0) simdflags += flext::simd_altivec; + + #else - long cpuAttributes; - Boolean hasAltiVec = false; - OSErr err = Gestalt( gestaltPowerPCProcessorFeatures, &cpuAttributes ); + long cpuAttributes; + Boolean hasAltiVec = false; + OSErr err = Gestalt( gestaltPowerPCProcessorFeatures, &cpuAttributes ); - if( noErr == err ) - if(( 1 << gestaltPowerPCHasVectorInstructions) & cpuAttributes) simdflags += flext::simd_altivec; + if( noErr == err ) + if(( 1 << gestaltPowerPCHasVectorInstructions) & cpuAttributes) simdflags += flext::simd_altivec; - #endif + #endif #endif return simdflags; } @@ -304,53 +304,53 @@ static unsigned long setsimdcaps() //! Load a vector from an unaligned location in memory inline vector unsigned char LoadUnaligned( vector unsigned char *v ) { - vector unsigned char permuteVector = vec_lvsl( 0, (int*) v ); - vector unsigned char low = vec_ld( 0, v ); - vector unsigned char high = vec_ld( 16, v ); - return vec_perm( low, high, permuteVector ); + vector unsigned char permuteVector = vec_lvsl( 0, (int*) v ); + vector unsigned char low = vec_ld( 0, v ); + vector unsigned char high = vec_ld( 16, v ); + return vec_perm( low, high, permuteVector ); } //! Store a vector to an unaligned location in memory inline void StoreUnaligned( vector unsigned char v, vector unsigned char *where) { - // Load the surrounding area - vector unsigned char low = vec_ld( 0, where ); - vector unsigned char high = vec_ld( 16, where ); - // Prepare the constants that we need - vector unsigned char permuteVector = vec_lvsr( 0, (int*) where ); - - vector unsigned char oxFF = (vector unsigned char)vec_splat_s8( -1 ); - vector unsigned char ox00 = (vector unsigned char)vec_splat_s8( 0 ); - // Make a mask for which parts of the vectors to swap out - vector unsigned char mask = vec_perm( ox00, oxFF, permuteVector ); - // Right rotate our input data - v = vec_perm( v, v, permuteVector ); - // Insert our data into the low and high vectors - low = vec_sel( v, low, mask ); - high = vec_sel( high, v, mask ); - // Store the two aligned result vectors - vec_st( low, 0, where ); - vec_st( high, 16, where ); + // Load the surrounding area + vector unsigned char low = vec_ld( 0, where ); + vector unsigned char high = vec_ld( 16, where ); + // Prepare the constants that we need + vector unsigned char permuteVector = vec_lvsr( 0, (int*) where ); + + vector unsigned char oxFF = (vector unsigned char)vec_splat_s8( -1 ); + vector unsigned char ox00 = (vector unsigned char)vec_splat_s8( 0 ); + // Make a mask for which parts of the vectors to swap out + vector unsigned char mask = vec_perm( ox00, oxFF, permuteVector ); + // Right rotate our input data + v = vec_perm( v, v, permuteVector ); + // Insert our data into the low and high vectors + low = vec_sel( v, low, mask ); + high = vec_sel( high, v, mask ); + // Store the two aligned result vectors + vec_st( low, 0, where ); + vec_st( high, 16, where ); } inline vector float LoadUnaligned(const float *v ) { - return (vector float)LoadUnaligned((vector unsigned char *)v); + return (vector float)LoadUnaligned((vector unsigned char *)v); } inline void StoreUnaligned( vector float v,float *where) { - return StoreUnaligned((vector unsigned char)v,(vector unsigned char *)where); + return StoreUnaligned((vector unsigned char)v,(vector unsigned char *)where); } inline bool IsVectorAligned(const void *where) { - return reinterpret_cast<unsigned long>(where)&(sizeof(vector float)-1) == 0; + return reinterpret_cast<unsigned long>(where)&(sizeof(vector float)-1) == 0; } inline vector float LoadValue(const float &f) { - return IsVectorAligned(&f)?vec_splat(vec_ld(0,(vector float *)&f),0):LoadUnaligned(&f); + return IsVectorAligned(&f)?vec_splat(vec_ld(0,(vector float *)&f),0):LoadUnaligned(&f); } #endif @@ -375,133 +375,136 @@ void flext::CopySamples(t_sample *dst,const t_sample *src,int cnt) if(GetSIMDCapabilities()&simd_sse) { // single precision - __asm { - mov eax,dword ptr [src] - prefetcht0 [eax+0] - prefetcht0 [eax+32] - } - - int n = cnt>>4; + int n = cnt>>4; cnt -= n<<4; - if((reinterpret_cast<unsigned long>(src)&(__alignof(__m128)-1)) == 0) { - if((reinterpret_cast<unsigned long>(dst)&(__alignof(__m128)-1)) == 0) { - // aligned src, aligned dst - __asm { - mov eax,dword ptr [src] - mov edx,dword ptr [dst] - mov ecx,[n] + if(!n) goto zero; + + __asm { + mov eax,dword ptr [src] + prefetcht0 [eax+0] + prefetcht0 [eax+32] + } + + if((reinterpret_cast<unsigned long>(src)&(__alignof(__m128)-1)) == 0) { + if((reinterpret_cast<unsigned long>(dst)&(__alignof(__m128)-1)) == 0) { + // aligned src, aligned dst + __asm { + mov eax,dword ptr [src] + mov edx,dword ptr [dst] + mov ecx,[n] loopaa: - prefetcht0 [eax+64] - prefetcht0 [eax+96] - movaps xmm0,xmmword ptr[eax] - movaps xmmword ptr[edx],xmm0 - movaps xmm1,xmmword ptr[eax+4*4] - movaps xmmword ptr[edx+4*4],xmm1 - movaps xmm2,xmmword ptr[eax+8*4] - movaps xmmword ptr[edx+8*4],xmm2 - movaps xmm3,xmmword ptr[eax+12*4] - movaps xmmword ptr[edx+12*4],xmm3 - - add eax,16*4 - add edx,16*4 - loop loopaa - } - } - else { - // aligned src, unaligned dst - __asm { - mov eax,dword ptr [src] - mov edx,dword ptr [dst] - mov ecx,[n] + prefetcht0 [eax+64] + prefetcht0 [eax+96] + movaps xmm0,xmmword ptr[eax] + movaps xmmword ptr[edx],xmm0 + movaps xmm1,xmmword ptr[eax+4*4] + movaps xmmword ptr[edx+4*4],xmm1 + movaps xmm2,xmmword ptr[eax+8*4] + movaps xmmword ptr[edx+8*4],xmm2 + movaps xmm3,xmmword ptr[eax+12*4] + movaps xmmword ptr[edx+12*4],xmm3 + + add eax,16*4 + add edx,16*4 + loop loopaa + } + } + else { + // aligned src, unaligned dst + __asm { + mov eax,dword ptr [src] + mov edx,dword ptr [dst] + mov ecx,[n] loopau: - prefetcht0 [eax+64] - prefetcht0 [eax+96] - movaps xmm0,xmmword ptr[eax] - movups xmmword ptr[edx],xmm0 - movaps xmm1,xmmword ptr[eax+4*4] - movups xmmword ptr[edx+4*4],xmm1 - movaps xmm2,xmmword ptr[eax+8*4] - movups xmmword ptr[edx+8*4],xmm2 - movaps xmm3,xmmword ptr[eax+12*4] - movups xmmword ptr[edx+12*4],xmm3 - - add eax,16*4 - add edx,16*4 - loop loopau - } - } - } - else { - if((reinterpret_cast<unsigned long>(dst)&(__alignof(__m128)-1)) == 0) { - // unaligned src, aligned dst - __asm { - mov eax,dword ptr [src] - mov edx,dword ptr [dst] - mov ecx,[n] + prefetcht0 [eax+64] + prefetcht0 [eax+96] + movaps xmm0,xmmword ptr[eax] + movups xmmword ptr[edx],xmm0 + movaps xmm1,xmmword ptr[eax+4*4] + movups xmmword ptr[edx+4*4],xmm1 + movaps xmm2,xmmword ptr[eax+8*4] + movups xmmword ptr[edx+8*4],xmm2 + movaps xmm3,xmmword ptr[eax+12*4] + movups xmmword ptr[edx+12*4],xmm3 + + add eax,16*4 + add edx,16*4 + loop loopau + } + } + } + else { + if((reinterpret_cast<unsigned long>(dst)&(__alignof(__m128)-1)) == 0) { + // unaligned src, aligned dst + __asm { + mov eax,dword ptr [src] + mov edx,dword ptr [dst] + mov ecx,[n] loopua: - prefetcht0 [eax+64] - prefetcht0 [eax+96] - movups xmm0,xmmword ptr[eax] - movaps xmmword ptr[edx],xmm0 - movups xmm1,xmmword ptr[eax+4*4] - movaps xmmword ptr[edx+4*4],xmm1 - movups xmm2,xmmword ptr[eax+8*4] - movaps xmmword ptr[edx+8*4],xmm2 - movups xmm3,xmmword ptr[eax+12*4] - movaps xmmword ptr[edx+12*4],xmm3 - - add eax,16*4 - add edx,16*4 - loop loopua - } - } - else { - // unaligned src, unaligned dst - __asm { - mov eax,dword ptr [src] - mov edx,dword ptr [dst] - mov ecx,[n] + prefetcht0 [eax+64] + prefetcht0 [eax+96] + movups xmm0,xmmword ptr[eax] + movaps xmmword ptr[edx],xmm0 + movups xmm1,xmmword ptr[eax+4*4] + movaps xmmword ptr[edx+4*4],xmm1 + movups xmm2,xmmword ptr[eax+8*4] + movaps xmmword ptr[edx+8*4],xmm2 + movups xmm3,xmmword ptr[eax+12*4] + movaps xmmword ptr[edx+12*4],xmm3 + + add eax,16*4 + add edx,16*4 + loop loopua + } + } + else { + // unaligned src, unaligned dst + __asm { + mov eax,dword ptr [src] + mov edx,dword ptr [dst] + mov ecx,[n] loopuu: - prefetcht0 [eax+64] - prefetcht0 [eax+96] - movups xmm0,xmmword ptr[eax] - movups xmmword ptr[edx],xmm0 - movups xmm1,xmmword ptr[eax+4*4] - movups xmmword ptr[edx+4*4],xmm1 - movups xmm2,xmmword ptr[eax+8*4] - movups xmmword ptr[edx+8*4],xmm2 - movups xmm3,xmmword ptr[eax+12*4] - movups xmmword ptr[edx+12*4],xmm3 - - add eax,16*4 - add edx,16*4 - loop loopuu - } - } - } - while(cnt--) *(dst++) = *(src++); + prefetcht0 [eax+64] + prefetcht0 [eax+96] + movups xmm0,xmmword ptr[eax] + movups xmmword ptr[edx],xmm0 + movups xmm1,xmmword ptr[eax+4*4] + movups xmmword ptr[edx+4*4],xmm1 + movups xmm2,xmmword ptr[eax+8*4] + movups xmmword ptr[edx+8*4],xmm2 + movups xmm3,xmmword ptr[eax+12*4] + movups xmmword ptr[edx+12*4],xmm3 + + add eax,16*4 + add edx,16*4 + loop loopuu + } + } + } +zero: + while(cnt--) *(dst++) = *(src++); } else #elif FLEXT_CPU == FLEXT_CPU_PPC && defined(__VECTOROPS__) if(true) { - int n = cnt>>2,n4 = n<<2; - vScopy(n4,(vector float *)src,(vector float *)dst); - cnt -= n4,src += n4,dst += n4; - while(cnt--) *(dst++) = *(src++); - } - else + int n = cnt>>2,n4 = n<<2; + vScopy(n4,(vector float *)src,(vector float *)dst); + cnt -= n4,src += n4,dst += n4; + while(cnt--) *(dst++) = *(src++); + } + else #endif // _MSC_VER #endif // FLEXT_USE_SIMD { - int n = cnt>>3; - cnt -= n<<3; - while(n--) { - dst[0] = src[0]; dst[1] = src[1]; dst[2] = src[2]; dst[3] = src[3]; - dst[4] = src[4]; dst[5] = src[5]; dst[6] = src[6]; dst[7] = src[7]; - src += 8,dst += 8; - } - while(cnt--) *(dst++) = *(src++); + int n = cnt>>3; + cnt -= n<<3; + while(n--) { + dst[0] = src[0]; dst[1] = src[1]; dst[2] = src[2]; dst[3] = src[3]; + dst[4] = src[4]; dst[5] = src[5]; dst[6] = src[6]; dst[7] = src[7]; + src += 8,dst += 8; + } + while(cnt--) *(dst++) = *(src++); } #endif } @@ -513,146 +516,146 @@ static const vector float zero = (vector float)(0); static void SetAltivec(t_sample *dst,int cnt,t_sample s) { - vector float svec = LoadValue(s); - int n = cnt>>4; + vector float svec = LoadValue(s); + int n = cnt>>4; cnt -= n<<4; - while(n--) { - vec_st(svec,0,dst); - vec_st(svec,16,dst); - vec_st(svec,32,dst); - vec_st(svec,48,dst); - dst += 16; - } + while(n--) { + vec_st(svec,0,dst); + vec_st(svec,16,dst); + vec_st(svec,32,dst); + vec_st(svec,48,dst); + dst += 16; + } while(cnt--) *(dst++) = s; } static void MulAltivec(t_sample *dst,const t_sample *src,t_sample op,int cnt) { - const vector float arg = LoadValue(op); - int n = cnt>>4; + const vector float arg = LoadValue(op); + int n = cnt>>4; cnt -= n<<4; - for(; n--; src += 16,dst += 16) { - vector float a1 = vec_ld( 0,src); - vector float a2 = vec_ld(16,src); - vector float a3 = vec_ld(32,src); - vector float a4 = vec_ld(48,src); - - a1 = vec_madd(a1,arg,zero); - a2 = vec_madd(a2,arg,zero); - a3 = vec_madd(a3,arg,zero); - a4 = vec_madd(a4,arg,zero); - - vec_st(a1, 0,dst); - vec_st(a2,16,dst); - vec_st(a3,32,dst); - vec_st(a4,48,dst); - } + for(; n--; src += 16,dst += 16) { + vector float a1 = vec_ld( 0,src); + vector float a2 = vec_ld(16,src); + vector float a3 = vec_ld(32,src); + vector float a4 = vec_ld(48,src); + + a1 = vec_madd(a1,arg,zero); + a2 = vec_madd(a2,arg,zero); + a3 = vec_madd(a3,arg,zero); + a4 = vec_madd(a4,arg,zero); + + vec_st(a1, 0,dst); + vec_st(a2,16,dst); + vec_st(a3,32,dst); + vec_st(a4,48,dst); + } while(cnt--) *(dst++) = *(src++)*op; } static void MulAltivec(t_sample *dst,const t_sample *src,const t_sample *op,int cnt) { - int n = cnt>>4; + int n = cnt>>4; cnt -= n<<4; - - for(; n--; src += 16,op += 16,dst += 16) { - vector float a1 = vec_ld( 0,src),b1 = vec_ld( 0,op); - vector float a2 = vec_ld(16,src),b2 = vec_ld(16,op); - vector float a3 = vec_ld(32,src),b3 = vec_ld(32,op); - vector float a4 = vec_ld(48,src),b4 = vec_ld(48,op); - - a1 = vec_madd(a1,b1,zero); - a2 = vec_madd(a2,b2,zero); - a3 = vec_madd(a3,b3,zero); - a4 = vec_madd(a4,b4,zero); - - vec_st(a1, 0,dst); - vec_st(a2,16,dst); - vec_st(a3,32,dst); - vec_st(a4,48,dst); - } - while(cnt--) *(dst++) = *(src++) * *(op++); + + for(; n--; src += 16,op += 16,dst += 16) { + vector float a1 = vec_ld( 0,src),b1 = vec_ld( 0,op); + vector float a2 = vec_ld(16,src),b2 = vec_ld(16,op); + vector float a3 = vec_ld(32,src),b3 = vec_ld(32,op); + vector float a4 = vec_ld(48,src),b4 = vec_ld(48,op); + + a1 = vec_madd(a1,b1,zero); + a2 = vec_madd(a2,b2,zero); + a3 = vec_madd(a3,b3,zero); + a4 = vec_madd(a4,b4,zero); + + vec_st(a1, 0,dst); + vec_st(a2,16,dst); + vec_st(a3,32,dst); + vec_st(a4,48,dst); + } + while(cnt--) *(dst++) = *(src++) * *(op++); } static void AddAltivec(t_sample *dst,const t_sample *src,t_sample op,int cnt) { - const vector float arg = LoadValue(op); - int n = cnt>>4; + const vector float arg = LoadValue(op); + int n = cnt>>4; cnt -= n<<4; - for(; n--; src += 16,dst += 16) { - vector float a1 = vec_ld( 0,src); - vector float a2 = vec_ld(16,src); - vector float a3 = vec_ld(32,src); - vector float a4 = vec_ld(48,src); - - a1 = vec_add(a1,arg); - a2 = vec_add(a2,arg); - a3 = vec_add(a3,arg); - a4 = vec_add(a4,arg); - - vec_st(a1, 0,dst); - vec_st(a2,16,dst); - vec_st(a3,32,dst); - vec_st(a4,48,dst); - } + for(; n--; src += 16,dst += 16) { + vector float a1 = vec_ld( 0,src); + vector float a2 = vec_ld(16,src); + vector float a3 = vec_ld(32,src); + vector float a4 = vec_ld(48,src); + + a1 = vec_add(a1,arg); + a2 = vec_add(a2,arg); + a3 = vec_add(a3,arg); + a4 = vec_add(a4,arg); + + vec_st(a1, 0,dst); + vec_st(a2,16,dst); + vec_st(a3,32,dst); + vec_st(a4,48,dst); + } while(cnt--) *(dst++) = *(src++)+op; } static void AddAltivec(t_sample *dst,const t_sample *src,const t_sample *op,int cnt) { - int n = cnt>>4; + int n = cnt>>4; cnt -= n<<4; - - for(; n--; src += 16,op += 16,dst += 16) { - vector float a1 = vec_ld( 0,src),b1 = vec_ld( 0,op); - vector float a2 = vec_ld(16,src),b2 = vec_ld(16,op); - vector float a3 = vec_ld(32,src),b3 = vec_ld(32,op); - vector float a4 = vec_ld(48,src),b4 = vec_ld(48,op); - - a1 = vec_add(a1,b1); - a2 = vec_add(a2,b2); - a3 = vec_add(a3,b3); - a4 = vec_add(a4,b4); - - vec_st(a1, 0,dst); - vec_st(a2,16,dst); - vec_st(a3,32,dst); - vec_st(a4,48,dst); - } - while(cnt--) *(dst++) = *(src++) + *(op++); + + for(; n--; src += 16,op += 16,dst += 16) { + vector float a1 = vec_ld( 0,src),b1 = vec_ld( 0,op); + vector float a2 = vec_ld(16,src),b2 = vec_ld(16,op); + vector float a3 = vec_ld(32,src),b3 = vec_ld(32,op); + vector float a4 = vec_ld(48,src),b4 = vec_ld(48,op); + + a1 = vec_add(a1,b1); + a2 = vec_add(a2,b2); + a3 = vec_add(a3,b3); + a4 = vec_add(a4,b4); + + vec_st(a1, 0,dst); + vec_st(a2,16,dst); + vec_st(a3,32,dst); + vec_st(a4,48,dst); + } + while(cnt--) *(dst++) = *(src++) + *(op++); } static void ScaleAltivec(t_sample *dst,const t_sample *src,t_sample opmul,t_sample opadd,int cnt) { - const vector float argmul = LoadValue(opmul); - const vector float argadd = LoadValue(opadd); - int n = cnt>>4; + const vector float argmul = LoadValue(opmul); + const vector float argadd = LoadValue(opadd); + int n = cnt>>4; cnt -= n<<4; - for(; n--; src += 16,dst += 16) { - vector float a1 = vec_ld( 0,src); - vector float a2 = vec_ld(16,src); - vector float a3 = vec_ld(32,src); - vector float a4 = vec_ld(48,src); - - a1 = vec_madd(a1,argmul,argadd); - a2 = vec_madd(a2,argmul,argadd); - a3 = vec_madd(a3,argmul,argadd); - a4 = vec_madd(a4,argmul,argadd); - - vec_st(a1, 0,dst); - vec_st(a2,16,dst); - vec_st(a3,32,dst); - vec_st(a4,48,dst); - } - - while(cnt--) *(dst++) = *(src++)*opmul+opadd; + for(; n--; src += 16,dst += 16) { + vector float a1 = vec_ld( 0,src); + vector float a2 = vec_ld(16,src); + vector float a3 = vec_ld(32,src); + vector float a4 = vec_ld(48,src); + + a1 = vec_madd(a1,argmul,argadd); + a2 = vec_madd(a2,argmul,argadd); + a3 = vec_madd(a3,argmul,argadd); + a4 = vec_madd(a4,argmul,argadd); + + vec_st(a1, 0,dst); + vec_st(a2,16,dst); + vec_st(a3,32,dst); + vec_st(a4,48,dst); + } + + while(cnt--) *(dst++) = *(src++)*opmul+opadd; } #endif @@ -671,62 +674,64 @@ void flext::SetSamples(t_sample *dst,int cnt,t_sample s) if(GetSIMDCapabilities()&simd_sse) { // single precision - int n = cnt>>4; + int n = cnt>>4; cnt -= n<<4; + if(!n) goto zero; __asm { - movss xmm0,xmmword ptr [s] - shufps xmm0,xmm0,0 - } + movss xmm0,xmmword ptr [s] + shufps xmm0,xmm0,0 + } if((reinterpret_cast<unsigned long>(dst)&(__alignof(__m128)-1)) == 0) { // aligned version - __asm { - mov ecx,[n] - mov edx,dword ptr [dst] + __asm { + mov ecx,[n] + mov edx,dword ptr [dst] loopa: - movaps xmmword ptr[edx],xmm0 - movaps xmmword ptr[edx+4*4],xmm0 - movaps xmmword ptr[edx+8*4],xmm0 - movaps xmmword ptr[edx+12*4],xmm0 - - add edx,16*4 - loop loopa - } + movaps xmmword ptr[edx],xmm0 + movaps xmmword ptr[edx+4*4],xmm0 + movaps xmmword ptr[edx+8*4],xmm0 + movaps xmmword ptr[edx+12*4],xmm0 + + add edx,16*4 + loop loopa + } } else { // unaligned version - __asm { - mov ecx,[n] - mov edx,dword ptr [dst] + __asm { + mov ecx,[n] + mov edx,dword ptr [dst] loopu: - movups xmmword ptr[edx],xmm0 - movups xmmword ptr[edx+4*4],xmm0 - movups xmmword ptr[edx+8*4],xmm0 - movups xmmword ptr[edx+12*4],xmm0 - - add edx,16*4 - loop loopu - } + movups xmmword ptr[edx],xmm0 + movups xmmword ptr[edx+4*4],xmm0 + movups xmmword ptr[edx+8*4],xmm0 + movups xmmword ptr[edx+12*4],xmm0 + + add edx,16*4 + loop loopu + } } - while(cnt--) *(dst++) = s; +zero: + while(cnt--) *(dst++) = s; } else #elif FLEXT_CPU == FLEXT_CPU_PPC && defined(__ALTIVEC__) if(GetSIMDCapabilities()&simd_altivec && IsVectorAligned(dst)) - SetAltivec(dst,cnt,s); - else + SetAltivec(dst,cnt,s); + else #endif #endif // FLEXT_USE_SIMD { - int n = cnt>>3; - cnt -= n<<3; - while(n--) { - dst[0] = dst[1] = dst[2] = dst[3] = dst[4] = dst[5] = dst[6] = dst[7] = s; - dst += 8; - } - - while(cnt--) *(dst++) = s; + int n = cnt>>3; + cnt -= n<<3; + while(n--) { + dst[0] = dst[1] = dst[2] = dst[3] = dst[4] = dst[5] = dst[6] = dst[7] = s; + dst += 8; + } + + while(cnt--) *(dst++) = s; } #endif } @@ -750,118 +755,121 @@ void flext::MulSamples(t_sample *dst,const t_sample *src,t_sample op,int cnt) // single precision __m128 a = _mm_load1_ps(&op); - int n = cnt>>4; + int n = cnt>>4; cnt -= n<<4; + if(!n) goto zero; + __asm { - mov eax,dword ptr [src] - prefetcht0 [eax+0] - prefetcht0 [eax+32] + mov eax,dword ptr [src] + prefetcht0 [eax+0] + prefetcht0 [eax+32] - movss xmm0,xmmword ptr [op] - shufps xmm0,xmm0,0 - } + movss xmm0,xmmword ptr [op] + shufps xmm0,xmm0,0 + } if((reinterpret_cast<unsigned long>(src)&(__alignof(__m128)-1)) == 0 && (reinterpret_cast<unsigned long>(dst)&(__alignof(__m128)-1)) == 0 ) { // aligned version __asm { - mov ecx,[n] - mov eax,dword ptr [src] - mov edx,dword ptr [dst] + mov ecx,[n] + mov eax,dword ptr [src] + mov edx,dword ptr [dst] loopa: - prefetcht0 [eax+64] - prefetcht0 [eax+96] + prefetcht0 [eax+64] + prefetcht0 [eax+96] - movaps xmm1,xmmword ptr[eax] - mulps xmm1,xmm0 - movaps xmmword ptr[edx],xmm1 + movaps xmm1,xmmword ptr[eax] + mulps xmm1,xmm0 + movaps xmmword ptr[edx],xmm1 - movaps xmm2,xmmword ptr[eax+4*4] - mulps xmm2,xmm0 - movaps xmmword ptr[edx+4*4],xmm2 + movaps xmm2,xmmword ptr[eax+4*4] + mulps xmm2,xmm0 + movaps xmmword ptr[edx+4*4],xmm2 - movaps xmm3,xmmword ptr[eax+8*4] - mulps xmm3,xmm0 - movaps xmmword ptr[edx+8*4],xmm3 + movaps xmm3,xmmword ptr[eax+8*4] + mulps xmm3,xmm0 + movaps xmmword ptr[edx+8*4],xmm3 - movaps xmm4,xmmword ptr[eax+12*4] - mulps xmm4,xmm0 - movaps xmmword ptr[edx+12*4],xmm4 + movaps xmm4,xmmword ptr[eax+12*4] + mulps xmm4,xmm0 + movaps xmmword ptr[edx+12*4],xmm4 - add eax,16*4 - add edx,16*4 - loop loopa + add eax,16*4 + add edx,16*4 + loop loopa } } else { // unaligned version __asm { - mov ecx,[n] - mov eax,dword ptr [src] - mov edx,dword ptr [dst] + mov ecx,[n] + mov eax,dword ptr [src] + mov edx,dword ptr [dst] loopu: - prefetcht0 [eax+64] - prefetcht0 [eax+96] + prefetcht0 [eax+64] + prefetcht0 [eax+96] - movups xmm1,xmmword ptr[eax] - mulps xmm1,xmm0 - movups xmmword ptr[edx],xmm1 + movups xmm1,xmmword ptr[eax] + mulps xmm1,xmm0 + movups xmmword ptr[edx],xmm1 - movups xmm2,xmmword ptr[eax+4*4] - mulps xmm2,xmm0 - movups xmmword ptr[edx+4*4],xmm2 + movups xmm2,xmmword ptr[eax+4*4] + mulps xmm2,xmm0 + movups xmmword ptr[edx+4*4],xmm2 - movups xmm3,xmmword ptr[eax+8*4] - mulps xmm3,xmm0 - movups xmmword ptr[edx+8*4],xmm3 + movups xmm3,xmmword ptr[eax+8*4] + mulps xmm3,xmm0 + movups xmmword ptr[edx+8*4],xmm3 - movups xmm4,xmmword ptr[eax+12*4] - mulps xmm4,xmm0 - movups xmmword ptr[edx+12*4],xmm4 + movups xmm4,xmmword ptr[eax+12*4] + mulps xmm4,xmm0 + movups xmmword ptr[edx+12*4],xmm4 - add eax,16*4 - add edx,16*4 - loop loopu - } + add eax,16*4 + add edx,16*4 + loop loopu + } } - while(cnt--) *(dst++) = *(src++)*op; +zero: + while(cnt--) *(dst++) = *(src++)*op; } else #elif FLEXT_CPU == FLEXT_CPU_PPC && defined(__VDSP__) if(true) { - vsmul(src,1,&op,dst,1,cnt); - } - else + vsmul(src,1,&op,dst,1,cnt); + } + else #elif FLEXT_CPU == FLEXT_CPU_PPC && defined(__ALTIVEC__) if(GetSIMDCapabilities()&simd_altivec && IsVectorAligned(src) && IsVectorAligned(dst)) - MulAltivec(dst,src,op,cnt); - else + MulAltivec(dst,src,op,cnt); + else #endif // _MSC_VER #endif // FLEXT_USE_SIMD { - int n = cnt>>3; - cnt -= n<<3; - - if(src == dst) { - while(n--) { - dst[0] *= op; dst[1] *= op; dst[2] *= op; dst[3] *= op; - dst[4] *= op; dst[5] *= op; dst[6] *= op; dst[7] *= op; - dst += 8; - } - while(cnt--) *(dst++) *= op; - } - else { - while(n--) { - dst[0] = src[0]*op; dst[1] = src[1]*op; - dst[2] = src[2]*op; dst[3] = src[3]*op; - dst[4] = src[4]*op; dst[5] = src[5]*op; - dst[6] = src[6]*op; dst[7] = src[7]*op; - src += 8,dst += 8; - } - while(cnt--) *(dst++) = *(src++)*op; - } + int n = cnt>>3; + cnt -= n<<3; + + if(src == dst) { + while(n--) { + dst[0] *= op; dst[1] *= op; dst[2] *= op; dst[3] *= op; + dst[4] *= op; dst[5] *= op; dst[6] *= op; dst[7] *= op; + dst += 8; + } + while(cnt--) *(dst++) *= op; + } + else { + while(n--) { + dst[0] = src[0]*op; dst[1] = src[1]*op; + dst[2] = src[2]*op; dst[3] = src[3]*op; + dst[4] = src[4]*op; dst[5] = src[5]*op; + dst[6] = src[6]*op; dst[7] = src[7]*op; + src += 8,dst += 8; + } + while(cnt--) *(dst++) = *(src++)*op; + } } #endif } @@ -883,214 +891,217 @@ void flext::MulSamples(t_sample *dst,const t_sample *src,const t_sample *op,int #ifdef _MSC_VER if(GetSIMDCapabilities()&simd_sse) { // single precision - int n = cnt>>4; + int n = cnt>>4; cnt -= n<<4; - __asm { - mov eax,[src] - mov ebx,[op] - prefetcht0 [eax+0] - prefetcht0 [ebx+0] - prefetcht0 [eax+32] - prefetcht0 [ebx+32] - } + if(!n) goto zero; + + __asm { + mov eax,[src] + mov ebx,[op] + prefetcht0 [eax+0] + prefetcht0 [ebx+0] + prefetcht0 [eax+32] + prefetcht0 [ebx+32] + } if((reinterpret_cast<unsigned long>(src)&(__alignof(__m128)-1)) == 0 && (reinterpret_cast<unsigned long>(dst)&(__alignof(__m128)-1)) == 0 - ) { - if((reinterpret_cast<unsigned long>(op)&(__alignof(__m128)-1)) == 0) { - __asm { - mov ecx,[n] - mov eax,dword ptr [src] - mov edx,dword ptr [dst] - mov ebx,dword ptr [op] - loopaa: - prefetcht0 [eax+64] - prefetcht0 [ebx+64] - prefetcht0 [eax+96] - prefetcht0 [ebx+96] - - movaps xmm0,xmmword ptr[eax] - movaps xmm1,xmmword ptr[ebx] - mulps xmm0,xmm1 - movaps xmmword ptr[edx],xmm0 - - movaps xmm2,xmmword ptr[eax+4*4] - movaps xmm3,xmmword ptr[ebx+4*4] - mulps xmm2,xmm3 - movaps xmmword ptr[edx+4*4],xmm2 - - movaps xmm4,xmmword ptr[eax+8*4] - movaps xmm5,xmmword ptr[ebx+8*4] - mulps xmm4,xmm5 - movaps xmmword ptr[edx+8*4],xmm4 - - movaps xmm6,xmmword ptr[eax+12*4] - movaps xmm7,xmmword ptr[ebx+12*4] - mulps xmm6,xmm7 - movaps xmmword ptr[edx+12*4],xmm6 - - add eax,16*4 - add ebx,16*4 - add edx,16*4 - loop loopaa - } - } - else { - __asm { - mov ecx,[n] - mov eax,dword ptr [src] - mov edx,dword ptr [dst] - mov ebx,dword ptr [op] - loopau: - prefetcht0 [eax+64] - prefetcht0 [ebx+64] - prefetcht0 [eax+96] - prefetcht0 [ebx+96] - - movaps xmm0,xmmword ptr[eax] - movups xmm1,xmmword ptr[ebx] - mulps xmm0,xmm1 - movaps xmmword ptr[edx],xmm0 - - movaps xmm2,xmmword ptr[eax+4*4] - movups xmm3,xmmword ptr[ebx+4*4] - mulps xmm2,xmm3 - movaps xmmword ptr[edx+4*4],xmm2 - - movaps xmm4,xmmword ptr[eax+8*4] - movups xmm5,xmmword ptr[ebx+8*4] - mulps xmm4,xmm5 - movaps xmmword ptr[edx+8*4],xmm4 - - movaps xmm6,xmmword ptr[eax+12*4] - movups xmm7,xmmword ptr[ebx+12*4] - mulps xmm6,xmm7 - movaps xmmword ptr[edx+12*4],xmm6 - - add eax,16*4 - add ebx,16*4 - add edx,16*4 - loop loopau - } - } - } + ) { + if((reinterpret_cast<unsigned long>(op)&(__alignof(__m128)-1)) == 0) { + __asm { + mov ecx,[n] + mov eax,dword ptr [src] + mov edx,dword ptr [dst] + mov ebx,dword ptr [op] + loopaa: + prefetcht0 [eax+64] + prefetcht0 [ebx+64] + prefetcht0 [eax+96] + prefetcht0 [ebx+96] + + movaps xmm0,xmmword ptr[eax] + movaps xmm1,xmmword ptr[ebx] + mulps xmm0,xmm1 + movaps xmmword ptr[edx],xmm0 + + movaps xmm2,xmmword ptr[eax+4*4] + movaps xmm3,xmmword ptr[ebx+4*4] + mulps xmm2,xmm3 + movaps xmmword ptr[edx+4*4],xmm2 + + movaps xmm4,xmmword ptr[eax+8*4] + movaps xmm5,xmmword ptr[ebx+8*4] + mulps xmm4,xmm5 + movaps xmmword ptr[edx+8*4],xmm4 + + movaps xmm6,xmmword ptr[eax+12*4] + movaps xmm7,xmmword ptr[ebx+12*4] + mulps xmm6,xmm7 + movaps xmmword ptr[edx+12*4],xmm6 + + add eax,16*4 + add ebx,16*4 + add edx,16*4 + loop loopaa + } + } + else { + __asm { + mov ecx,[n] + mov eax,dword ptr [src] + mov edx,dword ptr [dst] + mov ebx,dword ptr [op] + loopau: + prefetcht0 [eax+64] + prefetcht0 [ebx+64] + prefetcht0 [eax+96] + prefetcht0 [ebx+96] + + movaps xmm0,xmmword ptr[eax] + movups xmm1,xmmword ptr[ebx] + mulps xmm0,xmm1 + movaps xmmword ptr[edx],xmm0 + + movaps xmm2,xmmword ptr[eax+4*4] + movups xmm3,xmmword ptr[ebx+4*4] + mulps xmm2,xmm3 + movaps xmmword ptr[edx+4*4],xmm2 + + movaps xmm4,xmmword ptr[eax+8*4] + movups xmm5,xmmword ptr[ebx+8*4] + mulps xmm4,xmm5 + movaps xmmword ptr[edx+8*4],xmm4 + + movaps xmm6,xmmword ptr[eax+12*4] + movups xmm7,xmmword ptr[ebx+12*4] + mulps xmm6,xmm7 + movaps xmmword ptr[edx+12*4],xmm6 + + add eax,16*4 + add ebx,16*4 + add edx,16*4 + loop loopau + } + } + } else { - if((reinterpret_cast<unsigned long>(op)&(__alignof(__m128)-1)) == 0) { - __asm { - mov ecx,[n] - mov eax,dword ptr [src] - mov edx,dword ptr [dst] - mov ebx,dword ptr [op] - loopua: - prefetcht0 [eax+64] - prefetcht0 [ebx+64] - prefetcht0 [eax+96] - prefetcht0 [ebx+96] - - movups xmm0,xmmword ptr[eax] - movaps xmm1,xmmword ptr[ebx] - mulps xmm0,xmm1 - movups xmmword ptr[edx],xmm0 - - movups xmm2,xmmword ptr[eax+4*4] - movaps xmm3,xmmword ptr[ebx+4*4] - mulps xmm2,xmm3 - movups xmmword ptr[edx+4*4],xmm2 - - movups xmm4,xmmword ptr[eax+8*4] - movaps xmm5,xmmword ptr[ebx+8*4] - mulps xmm4,xmm5 - movups xmmword ptr[edx+8*4],xmm4 - - movups xmm6,xmmword ptr[eax+12*4] - movaps xmm7,xmmword ptr[ebx+12*4] - mulps xmm6,xmm7 - movups xmmword ptr[edx+12*4],xmm6 - - add eax,16*4 - add ebx,16*4 - add edx,16*4 - loop loopua - } - } - else { - __asm { - mov ecx,[n] - mov eax,dword ptr [src] - mov edx,dword ptr [dst] - mov ebx,dword ptr [op] + if((reinterpret_cast<unsigned long>(op)&(__alignof(__m128)-1)) == 0) { + __asm { + mov ecx,[n] + mov eax,dword ptr [src] + mov edx,dword ptr [dst] + mov ebx,dword ptr [op] + loopua: + prefetcht0 [eax+64] + prefetcht0 [ebx+64] + prefetcht0 [eax+96] + prefetcht0 [ebx+96] + + movups xmm0,xmmword ptr[eax] + movaps xmm1,xmmword ptr[ebx] + mulps xmm0,xmm1 + movups xmmword ptr[edx],xmm0 + + movups xmm2,xmmword ptr[eax+4*4] + movaps xmm3,xmmword ptr[ebx+4*4] + mulps xmm2,xmm3 + movups xmmword ptr[edx+4*4],xmm2 + + movups xmm4,xmmword ptr[eax+8*4] + movaps xmm5,xmmword ptr[ebx+8*4] + mulps xmm4,xmm5 + movups xmmword ptr[edx+8*4],xmm4 + + movups xmm6,xmmword ptr[eax+12*4] + movaps xmm7,xmmword ptr[ebx+12*4] + mulps xmm6,xmm7 + movups xmmword ptr[edx+12*4],xmm6 + + add eax,16*4 + add ebx,16*4 + add edx,16*4 + loop loopua + } + } + else { + __asm { + mov ecx,[n] + mov eax,dword ptr [src] + mov edx,dword ptr [dst] + mov ebx,dword ptr [op] loopuu: - prefetcht0 [eax+64] - prefetcht0 [ebx+64] - prefetcht0 [eax+96] - prefetcht0 [ebx+96] - - movups xmm0,xmmword ptr[eax] - movups xmm1,xmmword ptr[ebx] - mulps xmm0,xmm1 - movups xmmword ptr[edx],xmm0 - - movups xmm2,xmmword ptr[eax+4*4] - movups xmm3,xmmword ptr[ebx+4*4] - mulps xmm2,xmm3 - movups xmmword ptr[edx+4*4],xmm2 - - movups xmm4,xmmword ptr[eax+8*4] - movups xmm5,xmmword ptr[ebx+8*4] - mulps xmm4,xmm5 - movups xmmword ptr[edx+8*4],xmm4 - - movups xmm6,xmmword ptr[eax+12*4] - movups xmm7,xmmword ptr[ebx+12*4] - mulps xmm6,xmm7 - movups xmmword ptr[edx+12*4],xmm6 - - add eax,16*4 - add ebx,16*4 - add edx,16*4 - loop loopuu - } - } + prefetcht0 [eax+64] + prefetcht0 [ebx+64] + prefetcht0 [eax+96] + prefetcht0 [ebx+96] + + movups xmm0,xmmword ptr[eax] + movups xmm1,xmmword ptr[ebx] + mulps xmm0,xmm1 + movups xmmword ptr[edx],xmm0 + + movups xmm2,xmmword ptr[eax+4*4] + movups xmm3,xmmword ptr[ebx+4*4] + mulps xmm2,xmm3 + movups xmmword ptr[edx+4*4],xmm2 + + movups xmm4,xmmword ptr[eax+8*4] + movups xmm5,xmmword ptr[ebx+8*4] + mulps xmm4,xmm5 + movups xmmword ptr[edx+8*4],xmm4 + + movups xmm6,xmmword ptr[eax+12*4] + movups xmm7,xmmword ptr[ebx+12*4] + mulps xmm6,xmm7 + movups xmmword ptr[edx+12*4],xmm6 + + add eax,16*4 + add ebx,16*4 + add edx,16*4 + loop loopuu + } + } } - while(cnt--) *(dst++) = *(src++) * *(op++); +zero: + while(cnt--) *(dst++) = *(src++) * *(op++); } else #elif FLEXT_CPU == FLEXT_CPU_PPC && defined(__VDSP__) if(true) { - vmul(src,1,op,1,dst,1,cnt); - } - else + vmul(src,1,op,1,dst,1,cnt); + } + else #elif FLEXT_CPU == FLEXT_CPU_PPC && defined(__ALTIVEC__) if(GetSIMDCapabilities()&simd_altivec && IsVectorAligned(src) && IsVectorAligned(op) && IsVectorAligned(dst)) - MulAltivec(dst,src,op,cnt); - else + MulAltivec(dst,src,op,cnt); + else #endif // _MSC_VER #endif // FLEXT_USE_SIMD { - int n = cnt>>3; - cnt -= n<<3; - - if(src == dst) { - while(n--) { - dst[0] *= op[0]; dst[1] *= op[1]; - dst[2] *= op[2]; dst[3] *= op[3]; - dst[4] *= op[4]; dst[5] *= op[5]; - dst[6] *= op[6]; dst[7] *= op[7]; - dst += 8,op += 8; - } - while(cnt--) *(dst++) *= *(op++); - } - else { - while(n--) { - dst[0] = src[0]*op[0]; dst[1] = src[1]*op[1]; - dst[2] = src[2]*op[2]; dst[3] = src[3]*op[3]; - dst[4] = src[4]*op[4]; dst[5] = src[5]*op[5]; - dst[6] = src[6]*op[6]; dst[7] = src[7]*op[7]; - src += 8,dst += 8,op += 8; - } - while(cnt--) *(dst++) = *(src++) * *(op++); - } + int n = cnt>>3; + cnt -= n<<3; + + if(src == dst) { + while(n--) { + dst[0] *= op[0]; dst[1] *= op[1]; + dst[2] *= op[2]; dst[3] *= op[3]; + dst[4] *= op[4]; dst[5] *= op[5]; + dst[6] *= op[6]; dst[7] *= op[7]; + dst += 8,op += 8; + } + while(cnt--) *(dst++) *= *(op++); + } + else { + while(n--) { + dst[0] = src[0]*op[0]; dst[1] = src[1]*op[1]; + dst[2] = src[2]*op[2]; dst[3] = src[3]*op[3]; + dst[4] = src[4]*op[4]; dst[5] = src[5]*op[5]; + dst[6] = src[6]*op[6]; dst[7] = src[7]*op[7]; + src += 8,dst += 8,op += 8; + } + while(cnt--) *(dst++) = *(src++) * *(op++); + } } #endif } @@ -1112,113 +1123,113 @@ void flext::AddSamples(t_sample *dst,const t_sample *src,t_sample op,int cnt) #ifdef _MSC_VER if(GetSIMDCapabilities()&simd_sse) { // single precision - int n = cnt>>4; + int n = cnt>>4; cnt -= n<<4; __asm { - mov eax,[src] - prefetcht0 [eax+0] - prefetcht0 [eax+32] + mov eax,[src] + prefetcht0 [eax+0] + prefetcht0 [eax+32] - movss xmm0,xmmword ptr [op] - shufps xmm0,xmm0,0 - } + movss xmm0,xmmword ptr [op] + shufps xmm0,xmm0,0 + } if((reinterpret_cast<unsigned long>(src)&(__alignof(__m128)-1)) == 0 && (reinterpret_cast<unsigned long>(dst)&(__alignof(__m128)-1)) == 0 ) { // aligned version - __asm { - mov ecx,[n] - mov eax,dword ptr [src] - mov edx,dword ptr [dst] + __asm { + mov ecx,[n] + mov eax,dword ptr [src] + mov edx,dword ptr [dst] loopa: - prefetcht0 [eax+64] - prefetcht0 [eax+96] + prefetcht0 [eax+64] + prefetcht0 [eax+96] - movaps xmm1,xmmword ptr[eax] - addps xmm1,xmm0 - movaps xmmword ptr[edx],xmm1 + movaps xmm1,xmmword ptr[eax] + addps xmm1,xmm0 + movaps xmmword ptr[edx],xmm1 - movaps xmm2,xmmword ptr[eax+4*4] - addps xmm2,xmm0 - movaps xmmword ptr[edx+4*4],xmm2 + movaps xmm2,xmmword ptr[eax+4*4] + addps xmm2,xmm0 + movaps xmmword ptr[edx+4*4],xmm2 - movaps xmm3,xmmword ptr[eax+8*4] - addps xmm3,xmm0 - movaps xmmword ptr[edx+8*4],xmm3 + movaps xmm3,xmmword ptr[eax+8*4] + addps xmm3,xmm0 + movaps xmmword ptr[edx+8*4],xmm3 - movaps xmm4,xmmword ptr[eax+12*4] - addps xmm4,xmm0 - movaps xmmword ptr[edx+12*4],xmm4 + movaps xmm4,xmmword ptr[eax+12*4] + addps xmm4,xmm0 + movaps xmmword ptr[edx+12*4],xmm4 - add eax,16*4 - add edx,16*4 - loop loopa + add eax,16*4 + add edx,16*4 + loop loopa } } else { // unaligned version - __asm { - mov ecx,[n] - mov eax,dword ptr [src] - mov edx,dword ptr [dst] + __asm { + mov ecx,[n] + mov eax,dword ptr [src] + mov edx,dword ptr [dst] loopu: - prefetcht0 [eax+64] - prefetcht0 [eax+96] + prefetcht0 [eax+64] + prefetcht0 [eax+96] - movups xmm1,xmmword ptr[eax] - addps xmm1,xmm0 - movups xmmword ptr[edx],xmm1 + movups xmm1,xmmword ptr[eax] + addps xmm1,xmm0 + movups xmmword ptr[edx],xmm1 - movups xmm2,xmmword ptr[eax+4*4] - addps xmm2,xmm0 - movups xmmword ptr[edx+4*4],xmm2 + movups xmm2,xmmword ptr[eax+4*4] + addps xmm2,xmm0 + movups xmmword ptr[edx+4*4],xmm2 - movups xmm3,xmmword ptr[eax+8*4] - addps xmm3,xmm0 - movups xmmword ptr[edx+8*4],xmm3 + movups xmm3,xmmword ptr[eax+8*4] + addps xmm3,xmm0 + movups xmmword ptr[edx+8*4],xmm3 - movups xmm4,xmmword ptr[eax+12*4] - addps xmm4,xmm0 - movups xmmword ptr[edx+12*4],xmm4 + movups xmm4,xmmword ptr[eax+12*4] + addps xmm4,xmm0 + movups xmmword ptr[edx+12*4],xmm4 - add eax,16*4 - add edx,16*4 - loop loopu - } + add eax,16*4 + add edx,16*4 + loop loopu + } } - while(cnt--) *(dst++) = *(src++)+op; + while(cnt--) *(dst++) = *(src++)+op; } else #elif FLEXT_CPU == FLEXT_CPU_PPC && defined(__ALTIVEC__) if(GetSIMDCapabilities()&simd_altivec && IsVectorAligned(src) && IsVectorAligned(dst)) - AddAltivec(dst,src,op,cnt); - else + AddAltivec(dst,src,op,cnt); + else #endif // _MSC_VER #endif // FLEXT_USE_SIMD { - int n = cnt>>3; - cnt -= n<<3; - - if(src == dst) { - while(n--) { - dst[0] += op; dst[1] += op; dst[2] += op; dst[3] += op; - dst[4] += op; dst[5] += op; dst[6] += op; dst[7] += op; - dst += 8; - } - while(cnt--) *(dst++) += op; - } - else { - while(n--) { - dst[0] = src[0]+op; dst[1] = src[1]+op; - dst[2] = src[2]+op; dst[3] = src[3]+op; - dst[4] = src[4]+op; dst[5] = src[5]+op; - dst[6] = src[6]+op; dst[7] = src[7]+op; - src += 8,dst += 8; - } - while(cnt--) *(dst++) = *(src++)+op; - } + int n = cnt>>3; + cnt -= n<<3; + + if(src == dst) { + while(n--) { + dst[0] += op; dst[1] += op; dst[2] += op; dst[3] += op; + dst[4] += op; dst[5] += op; dst[6] += op; dst[7] += op; + dst += 8; + } + while(cnt--) *(dst++) += op; + } + else { + while(n--) { + dst[0] = src[0]+op; dst[1] = src[1]+op; + dst[2] = src[2]+op; dst[3] = src[3]+op; + dst[4] = src[4]+op; dst[5] = src[5]+op; + dst[6] = src[6]+op; dst[7] = src[7]+op; + src += 8,dst += 8; + } + while(cnt--) *(dst++) = *(src++)+op; + } } #endif } @@ -1239,216 +1250,216 @@ void flext::AddSamples(t_sample *dst,const t_sample *src,const t_sample *op,int #ifdef FLEXT_USE_SIMD #ifdef _MSC_VER if(GetSIMDCapabilities()&simd_sse) { - // Prefetch cache - __asm { - mov eax,dword ptr [src] - mov ebx,dword ptr [op] - prefetcht0 [eax] - prefetcht0 [ebx] - prefetcht0 [eax+32] - prefetcht0 [ebx+32] - } + // Prefetch cache + __asm { + mov eax,dword ptr [src] + mov ebx,dword ptr [op] + prefetcht0 [eax] + prefetcht0 [ebx] + prefetcht0 [eax+32] + prefetcht0 [ebx+32] + } // single precision - int n = cnt>>4; + int n = cnt>>4; cnt -= n<<4; if((reinterpret_cast<unsigned long>(src)&(__alignof(__m128)-1)) == 0 && (reinterpret_cast<unsigned long>(dst)&(__alignof(__m128)-1)) == 0 - ) { - if((reinterpret_cast<unsigned long>(op)&(__alignof(__m128)-1)) == 0) { - __asm { - mov ecx,dword ptr [n] - mov eax,dword ptr [src] - mov edx,dword ptr [dst] - mov ebx,dword ptr [op] - loopaa: - prefetcht0 [eax+64] - prefetcht0 [ebx+64] - prefetcht0 [eax+96] - prefetcht0 [ebx+96] - - movaps xmm0,xmmword ptr[eax] - movaps xmm1,xmmword ptr[ebx] - addps xmm0,xmm1 - movaps xmmword ptr[edx],xmm0 - - movaps xmm2,xmmword ptr[eax+4*4] - movaps xmm3,xmmword ptr[ebx+4*4] - addps xmm2,xmm3 - movaps xmmword ptr[edx+4*4],xmm2 - - movaps xmm4,xmmword ptr[eax+8*4] - movaps xmm5,xmmword ptr[ebx+8*4] - addps xmm4,xmm5 - movaps xmmword ptr[edx+8*4],xmm4 - - movaps xmm6,xmmword ptr[eax+12*4] - movaps xmm7,xmmword ptr[ebx+12*4] - addps xmm6,xmm7 - movaps xmmword ptr[edx+12*4],xmm6 - - add eax,16*4 - add ebx,16*4 - add edx,16*4 - loop loopaa - } - } - else { - __asm { - mov ecx,dword ptr [n] - mov eax,dword ptr [src] - mov edx,dword ptr [dst] - mov ebx,dword ptr [op] - loopau: - prefetcht0 [eax+64] - prefetcht0 [ebx+64] - prefetcht0 [eax+96] - prefetcht0 [ebx+96] - - movaps xmm0,xmmword ptr[eax] - movups xmm1,xmmword ptr[ebx] - addps xmm0,xmm1 - movaps xmmword ptr[edx],xmm0 - - movaps xmm2,xmmword ptr[eax+4*4] - movups xmm3,xmmword ptr[ebx+4*4] - addps xmm2,xmm3 - movaps xmmword ptr[edx+4*4],xmm2 - - movaps xmm4,xmmword ptr[eax+8*4] - movups xmm5,xmmword ptr[ebx+8*4] - addps xmm4,xmm5 - movaps xmmword ptr[edx+8*4],xmm4 - - movaps xmm6,xmmword ptr[eax+12*4] - movups xmm7,xmmword ptr[ebx+12*4] - addps xmm6,xmm7 - movaps xmmword ptr[edx+12*4],xmm6 - - add eax,16*4 - add ebx,16*4 - add edx,16*4 - loop loopau - } - } + ) { + if((reinterpret_cast<unsigned long>(op)&(__alignof(__m128)-1)) == 0) { + __asm { + mov ecx,dword ptr [n] + mov eax,dword ptr [src] + mov edx,dword ptr [dst] + mov ebx,dword ptr [op] + loopaa: + prefetcht0 [eax+64] + prefetcht0 [ebx+64] + prefetcht0 [eax+96] + prefetcht0 [ebx+96] + + movaps xmm0,xmmword ptr[eax] + movaps xmm1,xmmword ptr[ebx] + addps xmm0,xmm1 + movaps xmmword ptr[edx],xmm0 + + movaps xmm2,xmmword ptr[eax+4*4] + movaps xmm3,xmmword ptr[ebx+4*4] + addps xmm2,xmm3 + movaps xmmword ptr[edx+4*4],xmm2 + + movaps xmm4,xmmword ptr[eax+8*4] + movaps xmm5,xmmword ptr[ebx+8*4] + addps xmm4,xmm5 + movaps xmmword ptr[edx+8*4],xmm4 + + movaps xmm6,xmmword ptr[eax+12*4] + movaps xmm7,xmmword ptr[ebx+12*4] + addps xmm6,xmm7 + movaps xmmword ptr[edx+12*4],xmm6 + + add eax,16*4 + add ebx,16*4 + add edx,16*4 + loop loopaa + } + } + else { + __asm { + mov ecx,dword ptr [n] + mov eax,dword ptr [src] + mov edx,dword ptr [dst] + mov ebx,dword ptr [op] + loopau: + prefetcht0 [eax+64] + prefetcht0 [ebx+64] + prefetcht0 [eax+96] + prefetcht0 [ebx+96] + + movaps xmm0,xmmword ptr[eax] + movups xmm1,xmmword ptr[ebx] + addps xmm0,xmm1 + movaps xmmword ptr[edx],xmm0 + + movaps xmm2,xmmword ptr[eax+4*4] + movups xmm3,xmmword ptr[ebx+4*4] + addps xmm2,xmm3 + movaps xmmword ptr[edx+4*4],xmm2 + + movaps xmm4,xmmword ptr[eax+8*4] + movups xmm5,xmmword ptr[ebx+8*4] + addps xmm4,xmm5 + movaps xmmword ptr[edx+8*4],xmm4 + + movaps xmm6,xmmword ptr[eax+12*4] + movups xmm7,xmmword ptr[ebx+12*4] + addps xmm6,xmm7 + movaps xmmword ptr[edx+12*4],xmm6 + + add eax,16*4 + add ebx,16*4 + add edx,16*4 + loop loopau + } + } } else { - if((reinterpret_cast<unsigned long>(op)&(__alignof(__m128)-1)) == 0) { - __asm { - mov ecx,dword ptr [n] - mov eax,dword ptr [src] - mov edx,dword ptr [dst] - mov ebx,dword ptr [op] - loopua: - prefetcht0 [eax+64] - prefetcht0 [ebx+64] - prefetcht0 [eax+96] - prefetcht0 [ebx+96] - - movups xmm0,xmmword ptr[eax] - movaps xmm1,xmmword ptr[ebx] - addps xmm0,xmm1 - movups xmmword ptr[edx],xmm0 - - movups xmm2,xmmword ptr[eax+4*4] - movaps xmm3,xmmword ptr[ebx+4*4] - addps xmm2,xmm3 - movups xmmword ptr[edx+4*4],xmm2 - - movups xmm4,xmmword ptr[eax+8*4] - movaps xmm5,xmmword ptr[ebx+8*4] - addps xmm4,xmm5 - movups xmmword ptr[edx+8*4],xmm4 - - movups xmm6,xmmword ptr[eax+12*4] - movaps xmm7,xmmword ptr[ebx+12*4] - addps xmm6,xmm7 - movups xmmword ptr[edx+12*4],xmm6 - - add eax,16*4 - add ebx,16*4 - add edx,16*4 - loop loopua - } - } - else { - __asm { - mov ecx,dword ptr [n] - mov eax,dword ptr [src] - mov edx,dword ptr [dst] - mov ebx,dword ptr [op] - loopuu: - prefetcht0 [eax+64] - prefetcht0 [ebx+64] - prefetcht0 [eax+96] - prefetcht0 [ebx+96] - - movups xmm0,xmmword ptr[eax] - movups xmm1,xmmword ptr[ebx] - addps xmm0,xmm1 - movups xmmword ptr[edx],xmm0 - - movups xmm2,xmmword ptr[eax+4*4] - movups xmm3,xmmword ptr[ebx+4*4] - addps xmm2,xmm3 - movups xmmword ptr[edx+4*4],xmm2 - - movups xmm4,xmmword ptr[eax+8*4] - movups xmm5,xmmword ptr[ebx+8*4] - addps xmm4,xmm5 - movups xmmword ptr[edx+8*4],xmm4 - - movups xmm6,xmmword ptr[eax+12*4] - movups xmm7,xmmword ptr[ebx+12*4] - addps xmm6,xmm7 - movups xmmword ptr[edx+12*4],xmm6 - - add eax,16*4 - add ebx,16*4 - add edx,16*4 - loop loopuu - } - } + if((reinterpret_cast<unsigned long>(op)&(__alignof(__m128)-1)) == 0) { + __asm { + mov ecx,dword ptr [n] + mov eax,dword ptr [src] + mov edx,dword ptr [dst] + mov ebx,dword ptr [op] + loopua: + prefetcht0 [eax+64] + prefetcht0 [ebx+64] + prefetcht0 [eax+96] + prefetcht0 [ebx+96] + + movups xmm0,xmmword ptr[eax] + movaps xmm1,xmmword ptr[ebx] + addps xmm0,xmm1 + movups xmmword ptr[edx],xmm0 + + movups xmm2,xmmword ptr[eax+4*4] + movaps xmm3,xmmword ptr[ebx+4*4] + addps xmm2,xmm3 + movups xmmword ptr[edx+4*4],xmm2 + + movups xmm4,xmmword ptr[eax+8*4] + movaps xmm5,xmmword ptr[ebx+8*4] + addps xmm4,xmm5 + movups xmmword ptr[edx+8*4],xmm4 + + movups xmm6,xmmword ptr[eax+12*4] + movaps xmm7,xmmword ptr[ebx+12*4] + addps xmm6,xmm7 + movups xmmword ptr[edx+12*4],xmm6 + + add eax,16*4 + add ebx,16*4 + add edx,16*4 + loop loopua + } + } + else { + __asm { + mov ecx,dword ptr [n] + mov eax,dword ptr [src] + mov edx,dword ptr [dst] + mov ebx,dword ptr [op] + loopuu: + prefetcht0 [eax+64] + prefetcht0 [ebx+64] + prefetcht0 [eax+96] + prefetcht0 [ebx+96] + + movups xmm0,xmmword ptr[eax] + movups xmm1,xmmword ptr[ebx] + addps xmm0,xmm1 + movups xmmword ptr[edx],xmm0 + + movups xmm2,xmmword ptr[eax+4*4] + movups xmm3,xmmword ptr[ebx+4*4] + addps xmm2,xmm3 + movups xmmword ptr[edx+4*4],xmm2 + + movups xmm4,xmmword ptr[eax+8*4] + movups xmm5,xmmword ptr[ebx+8*4] + addps xmm4,xmm5 + movups xmmword ptr[edx+8*4],xmm4 + + movups xmm6,xmmword ptr[eax+12*4] + movups xmm7,xmmword ptr[ebx+12*4] + addps xmm6,xmm7 + movups xmmword ptr[edx+12*4],xmm6 + + add eax,16*4 + add ebx,16*4 + add edx,16*4 + loop loopuu + } + } } - while(cnt--) *(dst++) = *(src++) + *(op++); + while(cnt--) *(dst++) = *(src++) + *(op++); } else #elif FLEXT_CPU == FLEXT_CPU_PPC && defined(__VDSP__) if(true) { - vadd(src,1,op,1,dst,1,cnt); - } - else + vadd(src,1,op,1,dst,1,cnt); + } + else #elif FLEXT_CPU == FLEXT_CPU_PPC && defined(__ALTIVEC__) if(GetSIMDCapabilities()&simd_altivec && IsVectorAligned(src) && IsVectorAligned(op) && IsVectorAligned(dst)) - AddAltivec(dst,src,op,cnt); - else + AddAltivec(dst,src,op,cnt); + else #endif // _MSC_VER #endif // FLEXT_USE_SIMD { - int n = cnt>>3; - cnt -= n<<3; - - if(dst == src) { - while(n--) { - dst[0] += op[0]; dst[1] += op[1]; - dst[2] += op[2]; dst[3] += op[3]; - dst[4] += op[4]; dst[5] += op[5]; - dst[6] += op[6]; dst[7] += op[7]; - dst += 8,op += 8; - } - while(cnt--) *(dst++) += *(op++); - } - else { - while(n--) { - dst[0] = src[0]+op[0]; dst[1] = src[1]+op[1]; - dst[2] = src[2]+op[2]; dst[3] = src[3]+op[3]; - dst[4] = src[4]+op[4]; dst[5] = src[5]+op[5]; - dst[6] = src[6]+op[6]; dst[7] = src[7]+op[7]; - src += 8,dst += 8,op += 8; - } - while(cnt--) *(dst++) = *(src++) + *(op++); - } + int n = cnt>>3; + cnt -= n<<3; + + if(dst == src) { + while(n--) { + dst[0] += op[0]; dst[1] += op[1]; + dst[2] += op[2]; dst[3] += op[3]; + dst[4] += op[4]; dst[5] += op[5]; + dst[6] += op[6]; dst[7] += op[7]; + dst += 8,op += 8; + } + while(cnt--) *(dst++) += *(op++); + } + else { + while(n--) { + dst[0] = src[0]+op[0]; dst[1] = src[1]+op[1]; + dst[2] = src[2]+op[2]; dst[3] = src[3]+op[3]; + dst[4] = src[4]+op[4]; dst[5] = src[5]+op[5]; + dst[6] = src[6]+op[6]; dst[7] = src[7]+op[7]; + src += 8,dst += 8,op += 8; + } + while(cnt--) *(dst++) = *(src++) + *(op++); + } } #endif } @@ -1472,112 +1483,112 @@ void flext::ScaleSamples(t_sample *dst,const t_sample *src,t_sample opmul,t_samp #ifdef _MSC_VER if(GetSIMDCapabilities()&simd_sse) { // single precision - int n = cnt>>4; + int n = cnt>>4; cnt -= n<<4; __asm { - mov eax,dword ptr [src] - prefetcht0 [eax+0] - prefetcht0 [eax+32] - - movss xmm0,xmmword ptr [opadd] - shufps xmm0,xmm0,0 - movss xmm1,xmmword ptr [opmul] - shufps xmm1,xmm1,0 - } + mov eax,dword ptr [src] + prefetcht0 [eax+0] + prefetcht0 [eax+32] + + movss xmm0,xmmword ptr [opadd] + shufps xmm0,xmm0,0 + movss xmm1,xmmword ptr [opmul] + shufps xmm1,xmm1,0 + } if((reinterpret_cast<unsigned long>(src)&(__alignof(__m128)-1)) == 0 && (reinterpret_cast<unsigned long>(dst)&(__alignof(__m128)-1)) == 0 ) { // aligned version - __asm { - mov ecx,dword ptr [n] - mov eax,dword ptr [src] - mov edx,dword ptr [dst] + __asm { + mov ecx,dword ptr [n] + mov eax,dword ptr [src] + mov edx,dword ptr [dst] loopa: - prefetcht0 [eax+64] - prefetcht0 [eax+96] - - movaps xmm2,xmmword ptr[eax] - mulps xmm2,xmm1 - addps xmm2,xmm0 - movaps xmmword ptr[edx],xmm2 - - movaps xmm3,xmmword ptr[eax+4*4] - mulps xmm3,xmm1 - addps xmm3,xmm0 - movaps xmmword ptr[edx+4*4],xmm3 - - movaps xmm4,xmmword ptr[eax+8*4] - mulps xmm4,xmm1 - addps xmm4,xmm0 - movaps xmmword ptr[edx+8*4],xmm4 - - movaps xmm5,xmmword ptr[eax+12*4] - mulps xmm5,xmm1 - addps xmm5,xmm0 - movaps xmmword ptr[edx+12*4],xmm5 - - add eax,16*4 - add edx,16*4 - loop loopa - } + prefetcht0 [eax+64] + prefetcht0 [eax+96] + + movaps xmm2,xmmword ptr[eax] + mulps xmm2,xmm1 + addps xmm2,xmm0 + movaps xmmword ptr[edx],xmm2 + + movaps xmm3,xmmword ptr[eax+4*4] + mulps xmm3,xmm1 + addps xmm3,xmm0 + movaps xmmword ptr[edx+4*4],xmm3 + + movaps xmm4,xmmword ptr[eax+8*4] + mulps xmm4,xmm1 + addps xmm4,xmm0 + movaps xmmword ptr[edx+8*4],xmm4 + + movaps xmm5,xmmword ptr[eax+12*4] + mulps xmm5,xmm1 + addps xmm5,xmm0 + movaps xmmword ptr[edx+12*4],xmm5 + + add eax,16*4 + add edx,16*4 + loop loopa + } } else { // unaligned version - __asm { - mov ecx,dword ptr [n] - mov eax,dword ptr [src] - mov edx,dword ptr [dst] + __asm { + mov ecx,dword ptr [n] + mov eax,dword ptr [src] + mov edx,dword ptr [dst] loopu: - prefetcht0 [eax+64] - prefetcht0 [eax+96] - - movups xmm2,xmmword ptr[eax] - mulps xmm2,xmm1 - addps xmm2,xmm0 - movups xmmword ptr[edx],xmm2 - - movups xmm3,xmmword ptr[eax+4*4] - mulps xmm3,xmm1 - addps xmm3,xmm0 - movups xmmword ptr[edx+4*4],xmm3 - - movups xmm4,xmmword ptr[eax+8*4] - mulps xmm4,xmm1 - addps xmm4,xmm0 - movups xmmword ptr[edx+8*4],xmm4 - - movups xmm5,xmmword ptr[eax+12*4] - mulps xmm5,xmm1 - addps xmm5,xmm0 - movups xmmword ptr[edx+12*4],xmm5 - - add eax,16*4 - add edx,16*4 - loop loopu - } + prefetcht0 [eax+64] + prefetcht0 [eax+96] + + movups xmm2,xmmword ptr[eax] + mulps xmm2,xmm1 + addps xmm2,xmm0 + movups xmmword ptr[edx],xmm2 + + movups xmm3,xmmword ptr[eax+4*4] + mulps xmm3,xmm1 + addps xmm3,xmm0 + movups xmmword ptr[edx+4*4],xmm3 + + movups xmm4,xmmword ptr[eax+8*4] + mulps xmm4,xmm1 + addps xmm4,xmm0 + movups xmmword ptr[edx+8*4],xmm4 + + movups xmm5,xmmword ptr[eax+12*4] + mulps xmm5,xmm1 + addps xmm5,xmm0 + movups xmmword ptr[edx+12*4],xmm5 + + add eax,16*4 + add edx,16*4 + loop loopu + } } - while(cnt--) *(dst++) = *(src++)*opmul+opadd; + while(cnt--) *(dst++) = *(src++)*opmul+opadd; } else #elif FLEXT_CPU == FLEXT_CPU_PPC && defined(__ALTIVEC__) if(GetSIMDCapabilities()&simd_altivec && IsVectorAligned(src) && IsVectorAligned(dst)) - ScaleAltivec(dst,src,opmul,opadd,cnt); - else + ScaleAltivec(dst,src,opmul,opadd,cnt); + else #endif // _MSC_VER #endif // FLEXT_USE_SIMD { - int n = cnt>>3; - cnt -= n<<3; - while(n--) { - dst[0] = src[0]*opmul+opadd; dst[1] = src[1]*opmul+opadd; - dst[2] = src[2]*opmul+opadd; dst[3] = src[3]*opmul+opadd; - dst[4] = src[4]*opmul+opadd; dst[5] = src[5]*opmul+opadd; - dst[6] = src[6]*opmul+opadd; dst[7] = src[7]*opmul+opadd; - src += 8,dst += 8; - } - while(cnt--) *(dst++) = *(src++)*opmul+opadd; + int n = cnt>>3; + cnt -= n<<3; + while(n--) { + dst[0] = src[0]*opmul+opadd; dst[1] = src[1]*opmul+opadd; + dst[2] = src[2]*opmul+opadd; dst[3] = src[3]*opmul+opadd; + dst[4] = src[4]*opmul+opadd; dst[5] = src[5]*opmul+opadd; + dst[6] = src[6]*opmul+opadd; dst[7] = src[7]*opmul+opadd; + src += 8,dst += 8; + } + while(cnt--) *(dst++) = *(src++)*opmul+opadd; } #endif } diff --git a/externals/grill/flext/source/flsndobj.cpp b/externals/grill/flext/source/flsndobj.cpp index e5203556..82e6048b 100644 --- a/externals/grill/flext/source/flsndobj.cpp +++ b/externals/grill/flext/source/flsndobj.cpp @@ -13,84 +13,84 @@ WARRANTIES, see the file, "license.txt," in this distribution. flext_sndobj::flext_sndobj(): - inobjs(0),outobjs(0), - inobj(NULL),tmpobj(NULL),outobj(NULL), - smprt(0),blsz(0) + inobjs(0),outobjs(0), + inobj(NULL),tmpobj(NULL),outobj(NULL), + smprt(0),blsz(0) {} bool flext_sndobj::Init() { - bool ret = flext_dsp::Init(); - inobjs = CntInSig(); - outobjs = CntOutSig(); - return ret; + bool ret = flext_dsp::Init(); + inobjs = CntInSig(); + outobjs = CntOutSig(); + return ret; } void flext_sndobj::Exit() { - ClearObjs(); - flext_dsp::Exit(); + ClearObjs(); + flext_dsp::Exit(); } void flext_sndobj::ClearObjs() { - FreeObjs(); - - if(inobj) { - for(int i = 0; i < inobjs; ++i) delete inobj[i]; - delete[] inobj; inobj = NULL; - } - if(tmpobj) { - for(int i = 0; i < inobjs; ++i) delete tmpobj[i]; - delete[] tmpobj; tmpobj = NULL; - } - if(outobj) { - for(int i = 0; i < outobjs; ++i) delete outobj[i]; - delete[] outobj; outobj = NULL; - } + FreeObjs(); + + if(inobj) { + for(int i = 0; i < inobjs; ++i) delete inobj[i]; + delete[] inobj; inobj = NULL; + } + if(tmpobj) { + for(int i = 0; i < inobjs; ++i) delete tmpobj[i]; + delete[] tmpobj; tmpobj = NULL; + } + if(outobj) { + for(int i = 0; i < outobjs; ++i) delete outobj[i]; + delete[] outobj; outobj = NULL; + } } void flext_sndobj::m_dsp(int n,t_sample *const *in,t_sample *const *out) { - // called on every rebuild of the dsp chain - - int i; - if(Blocksize() != blsz || Samplerate() != smprt) { - // block size or sample rate has changed... rebuild all objects - - ClearObjs(); - - blsz = Blocksize(); - smprt = Samplerate(); - - // set up sndobjs for inlets and outlets - if(inobjs) { - inobj = new Inlet *[inobjs]; - tmpobj = new SndObj *[inobjs]; - for(i = 0; i < inobjs; ++i) { - inobj[i] = new Inlet(in[i],blsz,smprt); - tmpobj[i] = new SndObj(NULL,blsz,smprt); - } - } - if(outobjs) { - outobj = new Outlet *[outobjs]; - for(i = 0; i < outobjs; ++i) outobj[i] = new Outlet(out[i],blsz,smprt); - } - - if(!NewObjs()) ClearObjs(); - } - else { - // assign changed input/output vectors - - for(i = 0; i < inobjs; ++i) inobj[i]->SetBuf(in[i]); - for(i = 0; i < outobjs; ++i) outobj[i]->SetBuf(out[i]); - } + // called on every rebuild of the dsp chain + + int i; + if(Blocksize() != blsz || Samplerate() != smprt) { + // block size or sample rate has changed... rebuild all objects + + ClearObjs(); + + blsz = Blocksize(); + smprt = Samplerate(); + + // set up sndobjs for inlets and outlets + if(inobjs) { + inobj = new Inlet *[inobjs]; + tmpobj = new SndObj *[inobjs]; + for(i = 0; i < inobjs; ++i) { + inobj[i] = new Inlet(in[i],blsz,smprt); + tmpobj[i] = new SndObj(NULL,blsz,smprt); + } + } + if(outobjs) { + outobj = new Outlet *[outobjs]; + for(i = 0; i < outobjs; ++i) outobj[i] = new Outlet(out[i],blsz,smprt); + } + + if(!NewObjs()) ClearObjs(); + } + else { + // assign changed input/output vectors + + for(i = 0; i < inobjs; ++i) inobj[i]->SetBuf(in[i]); + for(i = 0; i < outobjs; ++i) outobj[i]->SetBuf(out[i]); + } } void flext_sndobj::m_signal(int n,t_sample *const *in,t_sample *const *out) { - for(int i = 0; i < inobjs; ++i) *tmpobj[i] << *inobj[i]; - ProcessObjs(); + for(int i = 0; i < inobjs; ++i) *tmpobj[i] << *inobj[i]; + ProcessObjs(); } @@ -100,12 +100,12 @@ flext_sndobj::Inlet::Inlet(const t_sample *b,int vecsz,float sr): short flext_sndobj::Inlet::Read() { - if(!m_error) { - for(m_vecpos = 0; m_vecpos < m_samples; m_vecpos++) - m_output[m_vecpos] = buf[m_vecpos]; - return 1; - } - else return 0; + if(!m_error) { + for(m_vecpos = 0; m_vecpos < m_samples; m_vecpos++) + m_output[m_vecpos] = buf[m_vecpos]; + return 1; + } + else return 0; } short flext_sndobj::Inlet::Write() { return 0; } @@ -119,13 +119,13 @@ short flext_sndobj::Outlet::Read() { return 0; } short flext_sndobj::Outlet::Write() { - if(!m_error) { - if(m_IOobjs[0]) - for(m_vecpos = 0; m_vecpos < m_samples; m_vecpos++) - buf[m_vecpos] = m_IOobjs[0]->Output(m_vecpos); - return 1; - } - else return 0; + if(!m_error) { + if(m_IOobjs[0]) + for(m_vecpos = 0; m_vecpos < m_samples; m_vecpos++) + buf[m_vecpos] = m_IOobjs[0]->Output(m_vecpos); + return 1; + } + else return 0; } diff --git a/externals/grill/flext/source/flsndobj.h b/externals/grill/flext/source/flsndobj.h index 960267be..f45080d5 100644 --- a/externals/grill/flext/source/flsndobj.h +++ b/externals/grill/flext/source/flsndobj.h @@ -21,69 +21,69 @@ WARRANTIES, see the file, "license.txt," in this distribution. class FLEXT_SHARE flext_sndobj: - public flext_dsp + public flext_dsp { - FLEXT_HEADER(flext_sndobj,flext_dsp) + FLEXT_HEADER(flext_sndobj,flext_dsp) public: - flext_sndobj(); + flext_sndobj(); - // these have to be overridden in child classes - virtual bool NewObjs() { return true; } - virtual void FreeObjs() {} - virtual void ProcessObjs() {} + // these have to be overridden in child classes + virtual bool NewObjs() { return true; } + virtual void FreeObjs() {} + virtual void ProcessObjs() {} - // inputs and outputs - SndObj &InObj(int i) { return *tmpobj[i]; } - SndIO &OutObj(int i) { return *outobj[i]; } + // inputs and outputs + SndObj &InObj(int i) { return *tmpobj[i]; } + SndIO &OutObj(int i) { return *outobj[i]; } protected: - virtual bool Init(); - virtual void Exit(); + virtual bool Init(); + virtual void Exit(); - virtual void m_dsp(int n,t_sample *const *in,t_sample *const *out); - virtual void m_signal(int n,t_sample *const *in,t_sample *const *out); + virtual void m_dsp(int n,t_sample *const *in,t_sample *const *out); + virtual void m_signal(int n,t_sample *const *in,t_sample *const *out); private: - //! SndObj for reading from inlet buffer - class Inlet: - public SndIO - { - public: - Inlet(const t_sample *b,int vecsz,float sr); - virtual short Read(); - virtual short Write(); - - void SetBuf(const t_sample *b) { buf = b; } - - private: - const t_sample *buf; - }; - - //! SndObj for writing to outlet buffer - class Outlet: - public SndIO - { - public: - Outlet(t_sample *b,int vecsz,float sr); - virtual short Read(); - virtual short Write(); - - void SetBuf(t_sample *b) { buf = b; } - - private: - t_sample *buf; - }; - - void ClearObjs(); - - int inobjs,outobjs; - SndObj **tmpobj; - Inlet **inobj; - Outlet **outobj; - - float smprt; - int blsz; + //! SndObj for reading from inlet buffer + class Inlet: + public SndIO + { + public: + Inlet(const t_sample *b,int vecsz,float sr); + virtual short Read(); + virtual short Write(); + + void SetBuf(const t_sample *b) { buf = b; } + + private: + const t_sample *buf; + }; + + //! SndObj for writing to outlet buffer + class Outlet: + public SndIO + { + public: + Outlet(t_sample *b,int vecsz,float sr); + virtual short Read(); + virtual short Write(); + + void SetBuf(t_sample *b) { buf = b; } + + private: + t_sample *buf; + }; + + void ClearObjs(); + + int inobjs,outobjs; + SndObj **tmpobj; + Inlet **inobj; + Outlet **outobj; + + float smprt; + int blsz; }; #endif diff --git a/externals/grill/flext/source/flstdc.h b/externals/grill/flext/source/flstdc.h index 13ac68b5..19586a4a 100644 --- a/externals/grill/flext/source/flstdc.h +++ b/externals/grill/flext/source/flstdc.h @@ -99,10 +99,15 @@ typedef t_clock t_qelem; #endif +// necessary for the old OS9 SDK +extern "C" { + #include "ext.h" #include "ext_user.h" #include "z_dsp.h" +} // extern "C" + #undef WIN_VERSION diff --git a/externals/grill/flext/source/flstk.cpp b/externals/grill/flext/source/flstk.cpp index 42f2fa85..24739b28 100644 --- a/externals/grill/flext/source/flstk.cpp +++ b/externals/grill/flext/source/flstk.cpp @@ -12,105 +12,105 @@ WARRANTIES, see the file, "license.txt," in this distribution. #include "flstk.h" flext_stk::flext_stk(): - inobjs(0),outobjs(0), - inobj(NULL),outobj(NULL), - smprt(0),blsz(0) + inobjs(0),outobjs(0), + inobj(NULL),outobj(NULL), + smprt(0),blsz(0) {} bool flext_stk::Init() { - bool ret = flext_dsp::Init(); - inobjs = CntInSig(); - outobjs = CntOutSig(); - return ret; + bool ret = flext_dsp::Init(); + inobjs = CntInSig(); + outobjs = CntOutSig(); + return ret; } void flext_stk::Exit() { - ClearObjs(); - flext_dsp::Exit(); + ClearObjs(); + flext_dsp::Exit(); } void flext_stk::ClearObjs() { - FreeObjs(); - - if(inobj) { - for(int i = 0; i < inobjs; ++i) delete inobj[i]; - delete[] inobj; inobj = NULL; - } - if(outobj) { - for(int i = 0; i < outobjs; ++i) delete outobj[i]; - delete[] outobj; outobj = NULL; - } + FreeObjs(); + + if(inobj) { + for(int i = 0; i < inobjs; ++i) delete inobj[i]; + delete[] inobj; inobj = NULL; + } + if(outobj) { + for(int i = 0; i < outobjs; ++i) delete outobj[i]; + delete[] outobj; outobj = NULL; + } } void flext_stk::m_dsp(int n,t_sample *const *in,t_sample *const *out) { - // called on every rebuild of the dsp chain - - int i; - - if(Blocksize() != blsz || Samplerate() != smprt) { - // block size or sample rate has changed... rebuild all objects - - ClearObjs(); - - smprt = Samplerate(); - blsz = Blocksize(); - Stk::setSampleRate(smprt); - - // set up sndobjs for inlets and outlets - if(inobjs) { - inobj = new Input *[inobjs]; - for(i = 0; i < inobjs; ++i) - inobj[i] = new Input(in[i],blsz); - } - if(outobjs) { - outobj = new Output *[outobjs]; - for(i = 0; i < outobjs; ++i) - outobj[i] = new Output(out[i],blsz); - } - - if(!NewObjs()) ClearObjs(); - } - else { - // assign changed input/output vectors - - for(i = 0; i < inobjs; ++i) inobj[i]->SetBuf(in[i]); - for(i = 0; i < outobjs; ++i) outobj[i]->SetBuf(out[i]); - } + // called on every rebuild of the dsp chain + + int i; + + if(Blocksize() != blsz || Samplerate() != smprt) { + // block size or sample rate has changed... rebuild all objects + + ClearObjs(); + + smprt = Samplerate(); + blsz = Blocksize(); + Stk::setSampleRate(smprt); + + // set up sndobjs for inlets and outlets + if(inobjs) { + inobj = new Input *[inobjs]; + for(i = 0; i < inobjs; ++i) + inobj[i] = new Input(in[i],blsz); + } + if(outobjs) { + outobj = new Output *[outobjs]; + for(i = 0; i < outobjs; ++i) + outobj[i] = new Output(out[i],blsz); + } + + if(!NewObjs()) ClearObjs(); + } + else { + // assign changed input/output vectors + + for(i = 0; i < inobjs; ++i) inobj[i]->SetBuf(in[i]); + for(i = 0; i < outobjs; ++i) outobj[i]->SetBuf(out[i]); + } } void flext_stk::m_signal(int n,t_sample *const *in,t_sample *const *out) { - if(inobjs || outobjs) ProcessObjs(blsz); + if(inobjs || outobjs) ProcessObjs(blsz); } // inlet class flext_stk::Input::Input(const t_sample *b,int v): - buf(b),vecsz(v), - index(0) + buf(b),vecsz(v), + index(0) {} MY_FLOAT *flext_stk::Input::tick(MY_FLOAT *vector,unsigned int vectorSize) { - for(unsigned int i = 0; i < vectorSize; i++) vector[i] = tick(); - return vector; + for(unsigned int i = 0; i < vectorSize; i++) vector[i] = tick(); + return vector; } // outlet class flext_stk::Output::Output(t_sample *b,int v): - buf(b),vecsz(v), - index(0) + buf(b),vecsz(v), + index(0) {} void flext_stk::Output::tick(const MY_FLOAT *vector,unsigned int vectorSize) { - for(unsigned int i = 0; i < vectorSize; i++) tick(vector[i]); + for(unsigned int i = 0; i < vectorSize; i++) tick(vector[i]); } diff --git a/externals/grill/flext/source/flstk.h b/externals/grill/flext/source/flstk.h index d6bad079..a610e9c6 100644 --- a/externals/grill/flext/source/flstk.h +++ b/externals/grill/flext/source/flstk.h @@ -15,81 +15,81 @@ WARRANTIES, see the file, "license.txt," in this distribution. #include <Stk.h> class FLEXT_SHARE flext_stk: - public flext_dsp + public flext_dsp { - FLEXT_HEADER(flext_stk,flext_dsp) + FLEXT_HEADER(flext_stk,flext_dsp) public: - flext_stk(); + flext_stk(); - // these have to be overridden in child classes - virtual bool NewObjs() { return true; } - virtual void FreeObjs() {} - virtual void ProcessObjs(int blocksize) {} + // these have to be overridden in child classes + virtual bool NewObjs() { return true; } + virtual void FreeObjs() {} + virtual void ProcessObjs(int blocksize) {} protected: - virtual bool Init(); - virtual void Exit(); + virtual bool Init(); + virtual void Exit(); - //! STK object for reading from inlet buffer - class Input: - public Stk - { - public: - Input(const t_sample *b,int vecsz); + //! STK object for reading from inlet buffer + class Input: + public Stk + { + public: + Input(const t_sample *b,int vecsz); - inline MY_FLOAT lastOut() const { return (MY_FLOAT)buf[index]; } + inline MY_FLOAT lastOut() const { return (MY_FLOAT)buf[index]; } - inline MY_FLOAT tick() { - if(++index >= vecsz) index = 0; - return lastOut(); + inline MY_FLOAT tick() { + if(++index >= vecsz) index = 0; + return lastOut(); } - MY_FLOAT *tick(MY_FLOAT *vector,unsigned int vectorSize); + MY_FLOAT *tick(MY_FLOAT *vector,unsigned int vectorSize); - inline void SetBuf(const t_sample *b) { buf = b; } + inline void SetBuf(const t_sample *b) { buf = b; } - private: - const t_sample *buf; - int vecsz,index; - }; + private: + const t_sample *buf; + int vecsz,index; + }; - //! STK object for writing to outlet buffer - class Output: - public Stk - { - public: - Output(t_sample *b,int vecsz); + //! STK object for writing to outlet buffer + class Output: + public Stk + { + public: + Output(t_sample *b,int vecsz); inline void tick(MY_FLOAT s) { buf[index] = (t_sample)s; if(++index >= vecsz) index = 0; } - void tick(const MY_FLOAT *vector,unsigned int vectorSize); + void tick(const MY_FLOAT *vector,unsigned int vectorSize); - inline void SetBuf(t_sample *b) { buf = b; } + inline void SetBuf(t_sample *b) { buf = b; } - private: - t_sample *buf; - int vecsz,index; - }; + private: + t_sample *buf; + int vecsz,index; + }; - Input &Inlet(int ix) { return *inobj[ix]; } - Output &Outlet(int ix) { return *outobj[ix]; } + Input &Inlet(int ix) { return *inobj[ix]; } + Output &Outlet(int ix) { return *outobj[ix]; } private: - virtual void m_dsp(int n,t_sample *const *in,t_sample *const *out); - virtual void m_signal(int n,t_sample *const *in,t_sample *const *out); + virtual void m_dsp(int n,t_sample *const *in,t_sample *const *out); + virtual void m_signal(int n,t_sample *const *in,t_sample *const *out); - void ClearObjs(); + void ClearObjs(); - int inobjs,outobjs; - Input **inobj; - Output **outobj; + int inobjs,outobjs; + Input **inobj; + Output **outobj; - float smprt; - int blsz; + float smprt; + int blsz; }; #endif diff --git a/externals/grill/flext/source/flsupport.h b/externals/grill/flext/source/flsupport.h index cd92aaa4..14ddad47 100644 --- a/externals/grill/flext/source/flsupport.h +++ b/externals/grill/flext/source/flsupport.h @@ -419,13 +419,6 @@ public: //! Check whether the atom can be represented as an integer static bool CanbeInt(const t_atom &a) { return IsFloat(a) || IsInt(a); } - //! Set the atom to represent a boolean - static void SetBool(t_atom &a,bool v) { SetInt(a,v?1:0); } - //! Check whether the atom can be represented as a boolean - static bool CanbeBool(const t_atom &a) { return CanbeInt(a); } - //! Check for an boolean and get its value - static bool GetABool(const t_atom &a) { return GetAInt(a) != 0; } - #if FLEXT_SYS == FLEXT_SYS_PD //! Check for a float and get its value static float GetAFloat(const t_atom &a,float def = 0) { return IsFloat(a)?GetFloat(a):def; } @@ -500,6 +493,15 @@ public: #error "Platform not supported" #endif + //! Set the atom to represent a boolean + static void SetBool(t_atom &a,bool v) { SetInt(a,v?1:0); } + //! Check whether the atom can be represented as a boolean + static bool CanbeBool(const t_atom &a) { return CanbeInt(a); } + //! Check for an boolean and get its value + static bool GetABool(const t_atom &a) { return GetAInt(a) != 0; } + //! Check for an boolean and get its value + static bool GetBool(const t_atom &a) { return GetInt(a) != 0; } + // --- atom list stuff ------------------------------------------- //! Class representing a list of atoms diff --git a/externals/grill/flext/source/fltimer.cpp b/externals/grill/flext/source/fltimer.cpp index 3ce05ed9..9cab8e90 100755 --- a/externals/grill/flext/source/fltimer.cpp +++ b/externals/grill/flext/source/fltimer.cpp @@ -9,7 +9,7 @@ WARRANTIES, see the file, "license.txt," in this distribution. */ /*! \file fltimer.cpp - \brief flext timer functions and classes + \brief flext timer functions and classes */ #include "flext.h" @@ -29,24 +29,24 @@ WARRANTIES, see the file, "license.txt," in this distribution. double flext::GetTime() { #if FLEXT_SYS == FLEXT_SYS_PD - return clock_gettimesince(0)*0.001; + return clock_gettimesince(0)*0.001; #elif FLEXT_SYS == FLEXT_SYS_MAX - double tm; - clock_getftime(&tm); - return tm*0.001; + double tm; + clock_getftime(&tm); + return tm*0.001; #else - #error Not implemented + #error Not implemented #endif } double flext::GetTimeGrain() { #if FLEXT_SYS == FLEXT_SYS_PD - return 0; + return 0; #elif FLEXT_SYS == FLEXT_SYS_MAX - return 0.001; + return 0.001; #else - #error Not implemented + #error Not implemented #endif } @@ -55,13 +55,13 @@ static double starttime = getstarttime(); static double getstarttime() { - starttime = 0; - return flext::GetOSTime(); + starttime = 0; + return flext::GetOSTime(); } double flext::GetOSTime() { - double tm; + double tm; #if FLEXT_OS == FLEXT_OS_WIN LARGE_INTEGER frq,cnt; @@ -75,37 +75,37 @@ double flext::GetOSTime() tm = (double)((LARGE_INTEGER *)&fltm)->QuadPart*0.001; } #elif FLEXT_OS == FLEXT_OS_LINUX || FLEXT_OS == FLEXT_OS_IRIX || FLEXT_OSAPI == FLEXT_OSAPI_MAC_MACH // POSIX - timeval tmv; - gettimeofday(&tmv,NULL); - tm = tmv.tv_sec+tmv.tv_usec*1.e-6; + timeval tmv; + gettimeofday(&tmv,NULL); + tm = tmv.tv_sec+tmv.tv_usec*1.e-6; #elif FLEXT_OS == FLEXT_OS_MAC // that's just for OS9 & Carbon! - UnsignedWide tick; - Microseconds(&tick); - tm = (tick.hi*((double)(1L<<((sizeof tick.lo)*4))*(double)(1L<<((sizeof tick.lo)*4)))+tick.lo)*1.e-6; + UnsignedWide tick; + Microseconds(&tick); + tm = (tick.hi*((double)(1L<<((sizeof tick.lo)*4))*(double)(1L<<((sizeof tick.lo)*4)))+tick.lo)*1.e-6; #else - #error Not implemented + #error Not implemented #endif - return tm-starttime; + return tm-starttime; } void flext::Sleep(double s) { #if FLEXT_OS == FLEXT_OS_WIN - ::Sleep((long)(s*1000.)); + ::Sleep((long)(s*1000.)); #elif FLEXT_OS == FLEXT_OS_LINUX || FLEXT_OS == FLEXT_OS_IRIX || FLEXT_OSAPI == FLEXT_OSAPI_MAC_MACH // POSIX - usleep((long)(s*1000000.)); + usleep((long)(s*1000000.)); #elif FLEXT_OS == FLEXT_OS_MAC // that's just for OS9 & Carbon! - UnsignedWide tick; - Microseconds(&tick); - double target = tick.hi*((double)(1L<<((sizeof tick.lo)*4))*(double)(1L<<((sizeof tick.lo)*4)))+tick.lo+s*1.e6; - for(;;) { - // this is just a loop running until the time has passed - stone age (but we yield at least) - Microseconds(&tick); - if(target <= tick.hi*((double)(1L<<((sizeof tick.lo)*4))*(double)(1L<<((sizeof tick.lo)*4)))+tick.lo) break; - YieldToAnyThread(); // yielding surely reduces the timing precision (but we're civilized) - } + UnsignedWide tick; + Microseconds(&tick); + double target = tick.hi*((double)(1L<<((sizeof tick.lo)*4))*(double)(1L<<((sizeof tick.lo)*4)))+tick.lo+s*1.e6; + for(;;) { + // this is just a loop running until the time has passed - stone age (but we yield at least) + Microseconds(&tick); + if(target <= tick.hi*((double)(1L<<((sizeof tick.lo)*4))*(double)(1L<<((sizeof tick.lo)*4)))+tick.lo) break; + YieldToAnyThread(); // yielding surely reduces the timing precision (but we're civilized) + } #else - #error Not implemented + #error Not implemented #endif } @@ -113,134 +113,134 @@ void flext::Sleep(double s) /* \param qu determines whether timed messages should be queued (low priority - only when supported by the system). */ flext::Timer::Timer(bool qu): - queued(qu), - clss(NULL),userdata(NULL), - period(0) + queued(qu), + clss(NULL),userdata(NULL), + period(0) { #if FLEXT_SYS == FLEXT_SYS_PD - clk = (t_clock *)clock_new(this,(t_method)callback); + clk = (t_clock *)clock_new(this,(t_method)callback); #elif FLEXT_SYS == FLEXT_SYS_MAX - clk = (t_clock *)clock_new(this,(t_method)callback); - if(queued) qelem = (t_qelem *)qelem_new(this,(method)queuefun); + clk = (t_clock *)clock_new(this,(t_method)callback); + if(queued) qelem = (t_qelem *)qelem_new(this,(method)queuefun); #else - #error Not implemented + #error Not implemented #endif } flext::Timer::~Timer() { #if FLEXT_SYS == FLEXT_SYS_PD - clock_free(clk); + clock_free(clk); #elif FLEXT_SYS == FLEXT_SYS_MAX - clock_free(clk); - if(queued) ::qelem_free(qelem); + clock_free(clk); + if(queued) ::qelem_free(qelem); #else - #error Not implemented + #error Not implemented #endif } bool flext::Timer::Reset() { #if FLEXT_SYS == FLEXT_SYS_PD - clock_unset(clk); + clock_unset(clk); #elif FLEXT_SYS == FLEXT_SYS_MAX - clock_unset(clk); - if(queued) ::qelem_unset(qelem); + clock_unset(clk); + if(queued) ::qelem_unset(qelem); #else - #error Not implemented + #error Not implemented #endif - return true; + return true; } /*! \param tm absolute time (in seconds) - \param data user data - \param dopast if set events with times lying in the past will be triggered immediately, if not set they are ignored - \return true on success + \param data user data + \param dopast if set events with times lying in the past will be triggered immediately, if not set they are ignored + \return true on success */ bool flext::Timer::At(double tm,void *data,bool dopast) { - userdata = data; - period = 0; + userdata = data; + period = 0; #if FLEXT_SYS == FLEXT_SYS_PD - const double ms = tm*1000.; - if(dopast || clock_gettimesince(ms) <= 0) - clock_set(clk,ms); + const double ms = tm*1000.; + if(dopast || clock_gettimesince(ms) <= 0) + clock_set(clk,ms); #elif FLEXT_SYS == FLEXT_SYS_MAX - const double ms = tm*1000.; - double cur; - clock_getftime(&cur); - if(cur <= ms) - clock_fdelay(clk,ms-cur); - else if(dopast) // trigger timer is past - clock_fdelay(clk,0); + const double ms = tm*1000.; + double cur; + clock_getftime(&cur); + if(cur <= ms) + clock_fdelay(clk,ms-cur); + else if(dopast) // trigger timer is past + clock_fdelay(clk,0); #else - #error Not implemented + #error Not implemented #endif - return true; + return true; } /*! \param tm relative time (in seconds) - \param data user data - \return true on success + \param data user data + \return true on success */ bool flext::Timer::Delay(double tm,void *data) { - userdata = data; - period = 0; + userdata = data; + period = 0; #if FLEXT_SYS == FLEXT_SYS_PD - clock_delay(clk,tm*1000); + clock_delay(clk,tm*1000); #elif FLEXT_SYS == FLEXT_SYS_MAX - clock_fdelay(clk,tm*1000.); + clock_fdelay(clk,tm*1000.); #else - #error Not implemented + #error Not implemented #endif - return true; + return true; } /*! \param tm relative time between periodic events (in seconds) - \param data user data - \return true on success - \note the first event will be delayed by tm + \param data user data + \return true on success + \note the first event will be delayed by tm */ bool flext::Timer::Periodic(double tm,void *data) { - userdata = data; - period = tm; + userdata = data; + period = tm; #if FLEXT_SYS == FLEXT_SYS_PD - clock_delay(clk,tm*1000); + clock_delay(clk,tm*1000); #elif FLEXT_SYS == FLEXT_SYS_MAX - clock_fdelay(clk,tm*1000.); + clock_fdelay(clk,tm*1000.); #else - #error Not implemented + #error Not implemented #endif - return true; + return true; } /*! \brief Callback function for system clock. - \todo Make periodic events scheduled as such. + \todo Make periodic events scheduled as such. */ void flext::Timer::callback(Timer *tmr) { - if(tmr->period) { - // clearly it would be more precise if the periodic event is scheduled as such - // and not retriggered every time + if(tmr->period) { + // clearly it would be more precise if the periodic event is scheduled as such + // and not retriggered every time #if FLEXT_SYS == FLEXT_SYS_PD - clock_delay(tmr->clk,tmr->period*1000); + clock_delay(tmr->clk,tmr->period*1000); #elif FLEXT_SYS == FLEXT_SYS_MAX - clock_fdelay(tmr->clk,tmr->period*1000.); + clock_fdelay(tmr->clk,tmr->period*1000.); #else - #error Not implemented + #error Not implemented #endif - } + } - if(tmr->cback) { + if(tmr->cback) { #if FLEXT_SYS == FLEXT_SYS_MAX - if(tmr->queued) - qelem_set(tmr->qelem); - else + if(tmr->queued) + qelem_set(tmr->qelem); + else #endif - tmr->Work(); - } + tmr->Work(); + } } #if FLEXT_SYS == FLEXT_SYS_MAX @@ -250,13 +250,13 @@ void flext::Timer::queuefun(Timer *tmr) { tmr->Work(); } #endif /*! \brief Virtual worker function - by default it calls the user callback function. - \remark The respective callback parameter format is chosen depending on whether clss is defined or not. + \remark The respective callback parameter format is chosen depending on whether clss is defined or not. */ void flext::Timer::Work() { - if(clss) - ((bool (*)(flext_base *,void *))cback)(clss,userdata); - else - cback(userdata); + if(clss) + ((bool (*)(flext_base *,void *))cback)(clss,userdata); + else + cback(userdata); } diff --git a/externals/grill/flext/source/flutil.cpp b/externals/grill/flext/source/flutil.cpp index 3c7c704d..2e80b6e6 100644 --- a/externals/grill/flext/source/flutil.cpp +++ b/externals/grill/flext/source/flutil.cpp @@ -18,11 +18,11 @@ WARRANTIES, see the file, "license.txt," in this distribution. #if FLEXT_OS == FLEXT_OS_WIN #include <windows.h> #elif FLEXT_OS == FLEXT_OS_MAC - #if FLEXT_OSAPI != FLEXT_OSAPI_MAC_MACH - #include <MacMemory.h> - #else - #include <Carbon/Carbon.h> - #endif + #if FLEXT_OSAPI != FLEXT_OSAPI_MAC_MACH + #include <MacMemory.h> + #else + #include <Carbon/Carbon.h> + #endif #endif void flext::CopyMem(void *dst,const void *src,int bytes) @@ -30,9 +30,9 @@ void flext::CopyMem(void *dst,const void *src,int bytes) #if FLEXT_OS == FLEXT_OS_WIN MoveMemory(dst,src,bytes); #elif FLEXT_OS == FLEXT_OS_MAC - BlockMoveData(src,dst,bytes); + BlockMoveData(src,dst,bytes); #else - memcpy(dst,src,bytes); + memcpy(dst,src,bytes); #endif } @@ -43,22 +43,22 @@ void flext::ZeroMem(void *dst,int bytes) #elif FLEXT_OS == FLEXT_OS_MAC BlockZero(dst,bytes); #else - memset(dst,0,bytes); + memset(dst,0,bytes); #endif } bool flext::Forward(const t_symbol *recv,const t_symbol *s,int argc,const t_atom *argv) { - void *cl = recv->s_thing; - if(!cl) return false; + void *cl = recv->s_thing; + if(!cl) return false; #if FLEXT_SYS == FLEXT_SYS_PD - pd_typedmess((t_class **)cl,(t_symbol *)s,argc,(t_atom *)argv); + pd_typedmess((t_class **)cl,(t_symbol *)s,argc,(t_atom *)argv); #elif FLEXT_SYS == FLEXT_SYS_MAX - typedmess(recv->s_thing,(t_symbol *)s,argc,(t_atom *)argv); + typedmess(recv->s_thing,(t_symbol *)s,argc,(t_atom *)argv); #else #error Not implemented #endif - return true; + return true; } diff --git a/externals/grill/flext/source/flxlet.cpp b/externals/grill/flext/source/flxlet.cpp index 76c02afb..1d57177c 100755 --- a/externals/grill/flext/source/flxlet.cpp +++ b/externals/grill/flext/source/flxlet.cpp @@ -19,78 +19,78 @@ WARRANTIES, see the file, "license.txt," in this distribution. flext_base::xlet::xlet(type t,const char *d): - tp(t),nxt(NULL) + tp(t),nxt(NULL) { - if(d) { - int ln = strlen(d); - desc = new char[ln+1]; - memcpy(desc,d,ln); - desc[ln] = 0; - } - else desc = NULL; + if(d) { + int ln = strlen(d); + desc = new char[ln+1]; + memcpy(desc,d,ln); + desc[ln] = 0; + } + else desc = NULL; } flext_base::xlet::~xlet() { - if(desc) delete[] desc; - if(nxt) delete nxt; + if(desc) delete[] desc; + if(nxt) delete nxt; } void flext_base::AddXlet(xlet::type tp,int mult,const char *desc,xlet *&root) { - if(!root && mult) { root = new xlet(tp,desc); --mult; } - if(mult) { - xlet *xi = root; - while(xi->nxt) xi = xi->nxt; - while(mult--) xi = xi->nxt = new xlet(tp,desc); - } + if(!root && mult) { root = new xlet(tp,desc); --mult; } + if(mult) { + xlet *xi = root; + while(xi->nxt) xi = xi->nxt; + while(mult--) xi = xi->nxt = new xlet(tp,desc); + } } void flext_base::DescXlet(int ix,const char *d,xlet *&root) { - xlet *xi = root; - for(int i = 0; xi && i < ix; xi = xi->nxt,++i) {} - - if(xi) { - if(xi->desc) delete[] xi->desc; - int ln = strlen(d); - xi->desc = new char[ln+1]; - memcpy(xi->desc,d,ln); - xi->desc[ln] = 0; - } + xlet *xi = root; + for(int i = 0; xi && i < ix; xi = xi->nxt,++i) {} + + if(xi) { + if(xi->desc) delete[] xi->desc; + int ln = strlen(d); + xi->desc = new char[ln+1]; + memcpy(xi->desc,d,ln); + xi->desc[ln] = 0; + } } unsigned long flext_base::XletCode(xlet::type tp,...) { - unsigned long code = 0; + unsigned long code = 0; - va_list marker; - va_start(marker,tp); - int cnt = 0; - xlet::type arg = tp; - for(; arg; ++cnt) { + va_list marker; + va_start(marker,tp); + int cnt = 0; + xlet::type arg = tp; + for(; arg; ++cnt) { #ifdef FLEXT_DEBUG - if(cnt > 9) { - error("%s - Too many in/outlets defined - truncated to 9",thisName()); - break; - } -#endif - - code = code*10+(int)arg; - arg = (xlet::type)va_arg(marker,int); - } - va_end(marker); - - return code; + if(cnt > 9) { + error("%s - Too many in/outlets defined - truncated to 9",thisName()); + break; + } +#endif + + code = code*10+(int)arg; + arg = (xlet::type)va_arg(marker,int); + } + va_end(marker); + + return code; } void flext_base::AddInlets(unsigned long code) { - for(; code; code /= 10) AddInlet((xlet::type)(code%10)); + for(; code; code /= 10) AddInlet((xlet::type)(code%10)); } void flext_base::AddOutlets(unsigned long code) { - for(; code; code /= 10) AddOutlet((xlet::type)(code%10)); + for(; code; code /= 10) AddOutlet((xlet::type)(code%10)); } |