aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGerard van Dongen <vdongen@users.sourceforge.net>2003-10-18 13:38:48 +0000
committerGerard van Dongen <vdongen@users.sourceforge.net>2003-10-18 13:38:48 +0000
commit7ed00adf7a1d30fbbb35b80f4915c8d778b4f9cc (patch)
treea57086108302a6a2dab36e0d4e4d540e8e77016d
This commit was generated by cvs2svn to compensate for changes in r1106,svn2git-root
which included commits to RCS files with non-trunk default branches. svn path=/trunk/externals/jackx/; revision=1107
-rw-r--r--GnuGPL.txt290
-rw-r--r--README25
-rw-r--r--jack-connect.pd34
-rw-r--r--jack-ports.pd24
-rw-r--r--jack.pd47
-rw-r--r--jackx.c396
-rw-r--r--makefile7
7 files changed, 823 insertions, 0 deletions
diff --git a/GnuGPL.txt b/GnuGPL.txt
new file mode 100644
index 0000000..fa0bef4
--- /dev/null
+++ b/GnuGPL.txt
@@ -0,0 +1,290 @@
+GNU GENERAL PUBLIC LICENSE
+
+Version 2, June 1991
+
+Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+
+Everyone is permitted to copy and distribute verbatim copies
+of this license document, but changing it is not allowed.
+
+Preamble
+
+The licenses for most software are designed to take away your freedom
+to share and change it. By contrast, the GNU General Public License is
+intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This General
+Public License applies to most of the Free Software Foundation's
+software and to any other program whose authors commit to using it.
+(Some other Free Software Foundation software is covered by the
+GNU Library General Public License instead.) You can apply it to your
+programs, too.
+
+When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new free
+programs; and that you know you can do these things.
+
+To protect your rights, we need to make restrictions that forbid anyone
+to deny you these rights or to ask you to surrender the rights. These
+restrictions translate to certain responsibilities for you if you distribute
+copies of the software, or if you modify it.
+
+For example, if you distribute copies of such a program, whether gratis
+or for a fee, you must give the recipients all the rights that you have. You
+must make sure that they, too, receive or can get the source code. And
+you must show them these terms so they know their rights.
+
+We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on,
+we want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+Finally, any free program is threatened constantly by software patents.
+We wish to avoid the danger that redistributors of a free program will
+individually obtain patent licenses, in effect making the program
+proprietary. To prevent this, we have made it clear that any patent must
+be licensed for everyone's free use or not licensed at all.
+
+The precise terms and conditions for copying, distribution and
+modification follow.
+
+TERMS AND CONDITIONS FOR
+COPYING, DISTRIBUTION AND
+MODIFICATION
+
+0. This License applies to any program or other work which contains a
+notice placed by the copyright holder saying it may be distributed under
+the terms of this General Public License. The "Program", below, refers
+to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it, either
+verbatim or with modifications and/or translated into another language.
+(Hereinafter, translation is included without limitation in the term
+"modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of running
+the Program is not restricted, and the output from the Program is
+covered only if its contents constitute a work based on the Program
+(independent of having been made by running the Program). Whether
+that is true depends on what the Program does.
+
+1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the notices
+that refer to this License and to the absence of any warranty; and give
+any other recipients of the Program a copy of this License along with the
+Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide a
+ warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but does
+ not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program, and
+can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based on
+the Program, the distribution of the whole must be on the terms of this
+License, whose permissions for other licensees extend to the entire
+whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest your
+rights to work written entirely by you; rather, the intent is to exercise the
+right to control the distribution of derivative or collective works based
+on the Program.
+
+In addition, mere aggregation of another work not based on the
+Program with the Program (or with a work based on the Program) on a
+volume of a storage or distribution medium does not bring the other
+work under the scope of this License.
+
+3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding
+ machine-readable source code, which must be distributed under
+ the terms of Sections 1 and 2 above on a medium customarily
+ used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your cost
+ of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a
+ medium customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with
+ such an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to control
+compilation and installation of the executable. However, as a special
+exception, the source code distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies the
+executable.
+
+If distribution of executable or object code is made by offering access to
+copy from a designated place, then offering equivalent access to copy
+the source code from the same place counts as distribution of the source
+code, even though third parties are not compelled to copy the source
+along with the object code.
+
+4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt otherwise
+to copy, modify, sublicense or distribute the Program is void, and will
+automatically terminate your rights under this License. However, parties
+who have received copies, or rights, from you under this License will not
+have their licenses terminated so long as such parties remain in full
+compliance.
+
+5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and all
+its terms and conditions for copying, distributing or modifying the
+Program or works based on it.
+
+6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the original
+licensor to copy, distribute or modify the Program subject to these terms
+and conditions. You may not impose any further restrictions on the
+recipients' exercise of the rights granted herein. You are not responsible
+for enforcing compliance by third parties to this License.
+
+7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot distribute
+so as to satisfy simultaneously your obligations under this License and
+any other pertinent obligations, then as a consequence you may not
+distribute the Program at all. For example, if a patent license would not
+permit royalty-free redistribution of the Program by all those who
+receive copies directly or indirectly through you, then the only way you
+could satisfy both it and this License would be to refrain entirely from
+distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any patents
+or other property right claims or to contest validity of any such claims;
+this section has the sole purpose of protecting the integrity of the free
+software distribution system, which is implemented by public license
+practices. Many people have made generous contributions to the wide
+range of software distributed through that system in reliance on
+consistent application of that system; it is up to the author/donor to
+decide if he or she is willing to distribute software through any other
+system and a licensee cannot impose that choice.
+
+This section is intended to make thoroughly clear what is believed to be
+a consequence of the rest of this License.
+
+8. If the distribution and/or use of the Program is restricted in certain
+countries either by patents or by copyrighted interfaces, the original
+copyright holder who places the Program under this License may add an
+explicit geographical distribution limitation excluding those countries, so
+that distribution is permitted only in or among countries not thus
+excluded. In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+9. The Free Software Foundation may publish revised and/or new
+versions of the General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may differ in
+detail to address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number
+of this License, you may choose any version ever published by the Free
+Software Foundation.
+
+10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we
+sometimes make exceptions for this. Our decision will be guided by the
+two goals of preserving the free status of all derivatives of our free
+software and of promoting the sharing and reuse of software generally.
+
+NO WARRANTY
+
+11. BECAUSE THE PROGRAM IS LICENSED FREE OF
+CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM,
+TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT
+WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE
+PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND,
+EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND
+PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD
+THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE
+COST OF ALL NECESSARY SERVICING, REPAIR OR
+CORRECTION.
+
+12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW
+OR AGREED TO IN WRITING WILL ANY COPYRIGHT
+HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED
+ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING
+ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR
+INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT
+LIMITED TO LOSS OF DATA OR DATA BEING RENDERED
+INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE
+WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR
+OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY
+OF SUCH DAMAGES.
+
+END OF TERMS AND CONDITIONS
diff --git a/README b/README
new file mode 100644
index 0000000..1bef917
--- /dev/null
+++ b/README
@@ -0,0 +1,25 @@
+
+Another small external lib.
+This one has two objects:
+jack-connect :connect/disconnect/toggle/query connections from named ports
+jack-ports: find the ports in the jack-graph. You can send it regular-expressions plus a few keywords to get client and port names.
+
+There are two basic help patches included.
+
+
+
+To compile:
+make sure that m_pd.h is in your include path
+type make.
+Manually install everything :)
+
+have fun
+
+TODO
+finally learn autotools
+When and if the jack-developers finalize their transport structures add a jack-transport object.
+
+
+
+Gerard van Dongen
+gml@xs4all.nl
diff --git a/jack-connect.pd b/jack-connect.pd
new file mode 100644
index 0000000..be2cb51
--- /dev/null
+++ b/jack-connect.pd
@@ -0,0 +1,34 @@
+#N canvas 1260 312 610 300 10;
+#X obj 137 190 jack-connect;
+#X obj 137 231 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0
+1;
+#X msg 136 12 connect;
+#X msg 139 39 toggle;
+#X msg 156 89 symbol alsa_pcm;
+#X msg 195 133 symbol pure_data_0;
+#X msg 138 65 query;
+#X msg 317 8 bang;
+#X msg 382 6 0;
+#X obj 346 30 metro 50;
+#X msg 173 113 symbol capture_2;
+#X msg 216 155 symbol input0;
+#X text 307 89 output client;
+#X text 306 111 output port;
+#X text 343 133 input client;
+#X text 344 155 input port;
+#X msg 24 13 disconnect;
+#X text 185 232 output is 1 for connect(ed) 0 for disconnect(ed);
+#X text 199 64 doesn't change the connection only outputs the state
+;
+#X connect 0 0 1 0;
+#X connect 2 0 0 0;
+#X connect 3 0 0 0;
+#X connect 4 0 0 1;
+#X connect 5 0 0 3;
+#X connect 6 0 0 0;
+#X connect 7 0 9 0;
+#X connect 8 0 9 0;
+#X connect 9 0 3 0;
+#X connect 10 0 0 2;
+#X connect 11 0 0 4;
+#X connect 16 0 0 0;
diff --git a/jack-ports.pd b/jack-ports.pd
new file mode 100644
index 0000000..b87c172
--- /dev/null
+++ b/jack-ports.pd
@@ -0,0 +1,24 @@
+#N canvas 1245 199 744 386 10;
+#X obj 161 197 jack-ports;
+#X msg 160 1 bang;
+#X obj 146 239 print output;
+#X obj 253 238 print input;
+#X text 41 267 output is in the form of a pairs client - port. outputs
+on the left \, inputs on the right.;
+#X text 200 5 will give all ports registered;
+#X text 181 25 Input is a regular expression for the client/port plus
+one or more of the following keywords: virtual: a port that is _not_
+a physical hw interface physical: a port that _is_ a hw interface output:a
+port that is a jack output input: a port that is a jack input;
+#X msg 184 123 virtual input .*3.*;
+#X text 340 123 will give all software inputs with a 3 in the name
+;
+#X msg 182 153 physical ouput .*[34].*;
+#X text 356 152 will give the hw jack outputs with either a 3 or a
+4 in the name;
+#X text 354 181 notice that these are soundcard _inputs_!!;
+#X connect 0 0 2 0;
+#X connect 0 1 3 0;
+#X connect 1 0 0 0;
+#X connect 7 0 0 0;
+#X connect 9 0 0 0;
diff --git a/jack.pd b/jack.pd
new file mode 100644
index 0000000..de8dbc1
--- /dev/null
+++ b/jack.pd
@@ -0,0 +1,47 @@
+#N canvas 0 0 827 657 10;
+#X obj 77 194 jack-connect;
+#X msg 47 68 c;
+#X floatatom 78 237 5 0 0 0 - - -;
+#X msg 67 18 connect;
+#X msg 184 44 toggle;
+#X msg 178 82 symbol alsa_pcm;
+#X msg 215 127 symbol pure_data_0;
+#X msg 79 157 query;
+#X msg 227 153 symbol output0;
+#X msg 199 103 symbol playback_3;
+#X msg 317 8 bang;
+#X msg 382 6 0;
+#X obj 346 30 metro 50;
+#X obj 354 345 jack-ports;
+#X msg 365 263 bang;
+#X msg 443 271 input pure_data.*;
+#X msg 451 225 output;
+#X msg 475 298 pure_data.*;
+#X msg 523 323 pure.* output;
+#X msg 415 175 physical output .*[34].*;
+#X obj 306 399 unpack s s;
+#X obj 412 401 unpack s s;
+#X obj 265 479 jack-connect;
+#X obj 408 490 print;
+#X connect 0 0 2 0;
+#X connect 1 0 0 0;
+#X connect 3 0 0 0;
+#X connect 4 0 0 0;
+#X connect 5 0 0 3;
+#X connect 6 0 0 1;
+#X connect 7 0 0 0;
+#X connect 8 0 0 2;
+#X connect 9 0 0 4;
+#X connect 10 0 12 0;
+#X connect 11 0 12 0;
+#X connect 12 0 4 0;
+#X connect 13 0 20 0;
+#X connect 13 0 23 0;
+#X connect 13 1 21 0;
+#X connect 13 1 23 0;
+#X connect 14 0 13 0;
+#X connect 15 0 13 0;
+#X connect 16 0 13 0;
+#X connect 17 0 13 0;
+#X connect 18 0 13 0;
+#X connect 19 0 13 0;
diff --git a/jackx.c b/jackx.c
new file mode 100644
index 0000000..9c04bd6
--- /dev/null
+++ b/jackx.c
@@ -0,0 +1,396 @@
+/* jack utility externals for linux pd
+ * copyright 2003 Gerard van Dongen gml@xs4all.nl
+
+* This program is free software; you can redistribute it and/or
+* modify it under the terms of the GNU General Public License
+* as published by the Free Software Foundation; either version 2
+* of the License, or (at your option) any later version.
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU General Public License for more details.
+* You should have received a copy of the GNU General Public License
+* along with this program; if not, write to the Free Software
+* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+
+
+* objects:
+* jack-connect
+* this can query and set the port connections on the jack system
+* methods:
+* jack-ports
+* this can query jack ports with regex's
+
+
+
+
+ */
+
+
+
+
+#include "m_pd.h"
+
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <sys/ioctl.h>
+#include <jack/jack.h>
+
+
+static t_class *jackports_class;
+static t_class *jackconnect_class;
+
+typedef struct _jackports {
+ t_object x_obj;
+ t_outlet *input_ports, *output_ports;
+ char expression[128];
+ char *buffer; //used internally it doesn't have to be reserved every time
+ t_atom *a_outlist;
+
+} t_jackports;
+
+typedef struct _jackconnect {
+ t_object x_obj;
+ t_symbol *input_client,*input_port, *output_client,*output_port;
+ char source[128],destination[128]; //ought to be enough for most names
+ int connected;
+} t_jackconnect;
+
+static jack_client_t * jc;
+
+
+
+/********************************************************************************************************
+
+methods for jack-ports
+
+*********************************************************************************************************/
+
+void jackports_input(t_jackports *x, t_symbol *s,int argc, t_atom *argv)
+{
+ if (jc){
+ char ** ports;
+
+ int l = 0;
+ int n = 0;
+ int keyflag = 0;
+ int expflag =0;
+ int portflags = 0;
+ t_symbol *s_client;
+ t_symbol *s_port;
+ char *t;
+
+ if (!strcmp(s->s_name,"bang")) {
+ strcpy(x->expression,"");
+ expflag = 1;
+ } else {
+
+ //parse symbol s and all arguments for keywords:
+ //physical,virtual,input and output
+
+ if (!strcmp(s->s_name,"physical")) {
+ portflags = portflags | JackPortIsPhysical;
+ keyflag = 1;
+ }
+ if (!strcmp(s->s_name,"virtual")) {
+ portflags = portflags & (~JackPortIsPhysical);
+ keyflag = 1;
+ }
+ if (!strcmp(s->s_name,"input")) {
+ portflags = portflags | JackPortIsInput;
+ keyflag = 1;
+ }
+
+ if (!strcmp(s->s_name,"output")) {
+ portflags = portflags | JackPortIsOutput;
+ keyflag = 1;
+ }
+ if (!keyflag) {
+ strcpy(x->expression,s->s_name);
+ expflag = 1;
+ }
+ for (n=0;n<argc;n++) {
+ keyflag = 0;
+ atom_string(argv+n,x->buffer,128);
+ if (!strcmp(x->buffer,"physical")) {
+ portflags = portflags | JackPortIsPhysical;
+ keyflag = 1;
+ }
+ if (!strcmp(x->buffer,"virtual")) {
+ portflags = portflags & (~JackPortIsPhysical);
+ keyflag = 1;
+ }
+ if (!strcmp(x->buffer,"input")) {
+ portflags = portflags | JackPortIsInput;
+ keyflag = 1;
+ }
+
+ if (!strcmp(x->buffer,"output")) {
+ portflags = portflags | JackPortIsOutput;
+ keyflag = 1;
+ }
+ if (!keyflag && !expflag) {
+ strcpy(x->expression,x->buffer);
+ expflag = 1;
+ }
+
+
+ }
+
+
+ }
+
+
+ ports = jack_get_ports (jc,x->expression,NULL,portflags|JackPortIsOutput);
+ n=0;
+ if (ports) {
+ while (ports[n]) {
+ //seperate port and client
+
+ l = strlen(ports[n]);
+ t = strchr(ports[n],':');
+
+ if (t) {
+ s_port=gensym(strchr(ports[n],':')+1);
+
+
+ snprintf(x->buffer,l-strlen(s_port->s_name),ports[n]);
+ s_client = gensym(x->buffer);
+
+ SETSYMBOL(x->a_outlist,s_client);
+ SETSYMBOL(x->a_outlist+1,s_port);
+
+ // output in output-outlet
+ outlet_list(x->output_ports,&s_list,2,x->a_outlist);
+ }
+
+ n++;
+ }
+ }
+ free(ports);
+
+ ports = jack_get_ports (jc,x->expression,NULL,portflags|JackPortIsInput);
+ n=0;
+ if (ports) {
+ while (ports[n]) {
+ l = strlen(ports[n]);
+ t = strchr(ports[n],':');
+
+ if (t) {
+ s_port=gensym(strchr(ports[n],':')+1);
+
+
+ snprintf(x->buffer,l-strlen(s_port->s_name),ports[n]);
+ s_client = gensym(x->buffer);
+
+ SETSYMBOL(x->a_outlist,s_client);
+ SETSYMBOL(x->a_outlist+1,s_port);
+
+ // output in output-outlet
+ outlet_list(x->input_ports,&s_list,2,x->a_outlist);
+ }
+
+
+ n++;
+ }
+ }
+ free(ports);
+
+ strcpy(x->expression,"");//reset regex
+ }
+
+}
+
+
+
+
+void *jackports_new(void)
+{
+ t_jackports * x = (t_jackports *)pd_new(jackports_class);
+ x->output_ports = outlet_new(&x->x_obj, &s_list);
+ x->input_ports = outlet_new(&x->x_obj, &s_list);
+ x->a_outlist = getbytes(3 * sizeof(t_atom));
+ x->buffer = getbytes(128);
+
+ return (void*)x;
+}
+
+
+
+/********************************************************************************************************
+
+methods for jack-connect
+
+*********************************************************************************************************/
+void jackconnect_getnames(t_jackconnect *x)
+{
+ char* to = x->source;
+ to = (char*)stpcpy( to,x->output_client->s_name);
+ to = (char*)stpcpy(to,":");
+ to = (char*)stpcpy(to,x->output_port->s_name);
+ to = x->destination;
+ to = (char*)stpcpy(to,x->input_client->s_name);
+ to = (char*)stpcpy(to,":");
+ to = (char*)stpcpy(to,x->input_port->s_name);
+
+}
+void jackconnect_connect(t_jackconnect *x)
+{
+
+ if (jc) {
+
+ jackconnect_getnames(x);
+ post("connecting %s with %s",x->source,x->destination);
+ if (!jack_connect(jc,x->source,x->destination)) {
+ x->connected = 1;
+ outlet_float(x->x_obj.ob_outlet,x->connected);
+ }
+ }
+
+}
+
+void jackconnect_disconnect(t_jackconnect *x)
+{
+ if (jc) {
+
+ jackconnect_getnames(x);
+ if (!jack_disconnect(jc,x->source,x->destination)) {
+ x->connected = 0;
+ outlet_float(x->x_obj.ob_outlet,x->connected);
+ }
+ post("disconnecting %s with %s",x->source,x->destination);
+ }
+
+}
+
+void jackconnect_toggle(t_jackconnect *x)
+{
+ if (jc) {
+
+ jackconnect_getnames(x);
+ post("toggling connection %s with %s",x->source,x->destination);
+ if (jack_disconnect(jc,x->source,x->destination)) {
+ jack_connect(jc,x->source,x->destination);
+ x->connected = 1;
+ } else {
+ x->connected = 0;
+ }
+ outlet_float(x->x_obj.ob_outlet,x->connected);
+ }
+}
+
+
+void jackconnect_query(t_jackconnect *x)
+{
+ if (jc) {
+
+ char **ports;
+ int n=0;
+ jackconnect_getnames(x);
+
+ post("querying connection %s with %s",x->source,x->destination);
+
+ ports = jack_port_get_all_connections(jc,(jack_port_t *)jack_port_by_name(jc,x->source));
+ x->connected = 0;
+
+ if(ports){
+ while (ports[n]){
+ post("n = %i",n);
+ if (!strcmp(ports[n],x->destination)){
+ x->connected = 1;
+ break;
+ }
+ n++;
+
+ }
+ free(ports);
+ }
+ outlet_float(x->x_obj.ob_outlet,x->connected);
+ }
+
+
+
+}
+
+
+
+
+
+
+
+void *jackconnect_new(void)
+{
+ t_jackconnect * x = (t_jackconnect *)pd_new(jackconnect_class);
+
+ outlet_new(&x->x_obj, &s_float);
+ symbolinlet_new(&x->x_obj,&x->output_client);
+ symbolinlet_new(&x->x_obj,&x->output_port);
+ symbolinlet_new(&x->x_obj,&x->input_client);
+ symbolinlet_new(&x->x_obj,&x->input_port);
+
+ /* to prevent segfaults put default names in the client/port variables */
+ x->input_client = gensym("none");
+ x->input_port = gensym("none");
+ x->output_client = gensym("none");
+ x->output_port = gensym("none");
+ x->connected = 0;
+ jackconnect_getnames(x);
+
+ return (void*)x;
+}
+
+
+/********************************************************************************************************
+
+setup for jack-connect and jack-ports
+
+*********************************************************************************************************/
+
+
+
+void jackx_setup(void)
+{
+
+ post("//////////////////////////////////////////\n"
+ "/////Jack utility external library///////\n"
+ "////Gerard van Dongen, gml@xs4all.nl////\n"
+ "///testing for jack////////////////////\n"
+ "//////////////////////////////////////");
+
+
+ jc = jack_client_new("jacky-x");
+
+
+
+
+ /*jack ports setup */
+
+ jackports_class = class_new(gensym("jack-ports"),(t_newmethod)jackports_new,0,sizeof(t_jackports),CLASS_DEFAULT,0);
+
+
+
+
+ class_addanything(jackports_class,jackports_input);
+
+ class_sethelpsymbol(jackports_class,gensym("jack-ports"));
+
+ /*jack-connect setup */
+
+
+
+ jackconnect_class = class_new(gensym("jack-connect"),(t_newmethod)jackconnect_new,0,sizeof(t_jackconnect),CLASS_DEFAULT,0);
+
+ class_addmethod(jackconnect_class, (t_method)jackconnect_connect, gensym("connect"),0);
+ class_addmethod(jackconnect_class, (t_method)jackconnect_disconnect, gensym("disconnect"),0);
+ class_addmethod(jackconnect_class, (t_method)jackconnect_toggle, gensym("toggle"),0);
+ class_addmethod(jackconnect_class, (t_method)jackconnect_query, gensym("query"),0);
+ class_addbang(jackconnect_class, (t_method)jackconnect_toggle);
+ class_sethelpsymbol(jackports_class,gensym("jack-connect"));
+}
+
+
+
+
diff --git a/makefile b/makefile
new file mode 100644
index 0000000..787cb8c
--- /dev/null
+++ b/makefile
@@ -0,0 +1,7 @@
+jackx: jackx.c
+ gcc $(CFLAGS) $(LINUXCFLAGS) $(LINUXINCLUDE) -o jackx.o -c jackx.c
+ ld -export_dynamic -shared -o jackx.pd_linux jackx.o -lc -lm
+ strip --strip-unneeded jackx.pd_linux
+ rm jackx.o
+
+