From 7ed00adf7a1d30fbbb35b80f4915c8d778b4f9cc Mon Sep 17 00:00:00 2001 From: Gerard van Dongen Date: Sat, 18 Oct 2003 13:38:48 +0000 Subject: This commit was generated by cvs2svn to compensate for changes in r1106, which included commits to RCS files with non-trunk default branches. svn path=/trunk/externals/jackx/; revision=1107 --- GnuGPL.txt | 290 +++++++++++++++++++++++++++++++++++++++++ README | 25 ++++ jack-connect.pd | 34 +++++ jack-ports.pd | 24 ++++ jack.pd | 47 +++++++ jackx.c | 396 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ makefile | 7 + 7 files changed, 823 insertions(+) create mode 100644 GnuGPL.txt create mode 100644 README create mode 100644 jack-connect.pd create mode 100644 jack-ports.pd create mode 100644 jack.pd create mode 100644 jackx.c create mode 100644 makefile 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 +#include +#include +#include +#include +#include + + +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;nbuffer,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 + + -- cgit v1.2.1