summaryrefslogtreecommitdiff
path: root/apps/plugins/pdbox/PDa/src/s_main.c
diff options
context:
space:
mode:
authorPeter D'Hoye <peter.dhoye@gmail.com>2009-05-22 21:58:48 +0000
committerPeter D'Hoye <peter.dhoye@gmail.com>2009-05-22 21:58:48 +0000
commit513389b4c1bc8afe4b2dc9947c534bfeb105e3da (patch)
tree10e673b35651ac567fed2eda0c679c7ade64cbc6 /apps/plugins/pdbox/PDa/src/s_main.c
parent95fa7f6a2ef466444fbe3fe87efc6d5db6b77b36 (diff)
downloadrockbox-513389b4c1bc8afe4b2dc9947c534bfeb105e3da.zip
rockbox-513389b4c1bc8afe4b2dc9947c534bfeb105e3da.tar.gz
rockbox-513389b4c1bc8afe4b2dc9947c534bfeb105e3da.tar.bz2
rockbox-513389b4c1bc8afe4b2dc9947c534bfeb105e3da.tar.xz
Add FS #10214. Initial commit of the original PDa code for the GSoC Pure Data plugin project of Wincent Balin. Stripped some non-sourcefiles and added a rockbox readme that needs a bit more info from Wincent. Is added to CATEGORIES and viewers, but not yet to SUBDIRS (ie doesn't build yet)
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@21044 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps/plugins/pdbox/PDa/src/s_main.c')
-rw-r--r--apps/plugins/pdbox/PDa/src/s_main.c1676
1 files changed, 1676 insertions, 0 deletions
diff --git a/apps/plugins/pdbox/PDa/src/s_main.c b/apps/plugins/pdbox/PDa/src/s_main.c
new file mode 100644
index 0000000..84f4cfb
--- /dev/null
+++ b/apps/plugins/pdbox/PDa/src/s_main.c
@@ -0,0 +1,1676 @@
+/* Copyright (c) 1997-1999 Miller Puckette and others.
+* For information on usage and redistribution, and for a DISCLAIMER OF ALL
+* WARRANTIES, see the file, "LICENSE.txt," in this distribution. */
+
+/* IOhannes :
+ * hacked the code to add advanced multidevice-support
+ * 1311:forum::für::umläute:2001
+ */
+
+char pd_version[] = "Pd version 0.37.4\n";
+char pd_compiletime[] = __TIME__;
+char pd_compiledate[] = __DATE__;
+
+#include "m_pd.h"
+#include "m_imp.h"
+#include "s_stuff.h"
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <limits.h>
+#include <string.h>
+#include <stdio.h>
+#include <fcntl.h>
+#include <stdlib.h>
+
+#ifdef UNIX
+#include <unistd.h>
+#endif
+#ifdef MSW
+#include <io.h>
+#include <windows.h>
+#include <winbase.h>
+#endif
+
+void pd_init(void);
+int sys_argparse(int argc, char **argv);
+void sys_findprogdir(char *progname);
+int sys_startgui(const char *guipath);
+int sys_rcfile(void);
+int m_scheduler(void);
+void sys_addhelppath(char *p);
+void alsa_adddev(char *name);
+
+int sys_debuglevel;
+int sys_verbose;
+int sys_noloadbang;
+int sys_nogui;
+int sys_stdin = 0;
+char *sys_guicmd;
+t_symbol *sys_libdir;
+static t_symbol *sys_guidir;
+static t_namelist *sys_externlist;
+static t_namelist *sys_openlist;
+static t_namelist *sys_messagelist;
+static int sys_version;
+int sys_oldtclversion; /* hack to warn g_rtext.c about old text sel */
+
+int sys_nmidiout = 1;
+#ifdef MSW
+int sys_nmidiin = 0;
+#else
+int sys_nmidiin = 1;
+#endif
+int sys_midiindevlist[MAXMIDIINDEV] = {1};
+int sys_midioutdevlist[MAXMIDIOUTDEV] = {1};
+
+static int sys_main_srate = DEFAULTSRATE;
+static int sys_main_advance = DEFAULTADVANCE;
+
+/* IOhannes { */
+
+ /* here the "-1" counts signify that the corresponding vector hasn't been
+ specified in command line arguments; sys_open_audio will detect this
+ and fill things in. */
+int sys_nsoundin = -1;
+int sys_nsoundout = -1;
+int sys_soundindevlist[MAXAUDIOINDEV];
+int sys_soundoutdevlist[MAXAUDIOOUTDEV];
+
+int sys_nchin = -1;
+int sys_nchout = -1;
+int sys_chinlist[MAXAUDIOINDEV];
+int sys_choutlist[MAXAUDIOOUTDEV];
+/* } IOhannes */
+
+
+typedef struct _fontinfo
+{
+ int fi_fontsize;
+ int fi_maxwidth;
+ int fi_maxheight;
+ int fi_hostfontsize;
+ int fi_width;
+ int fi_height;
+} t_fontinfo;
+
+ /* these give the nominal point size and maximum height of the characters
+ in the six fonts. */
+
+static t_fontinfo sys_fontlist[] = {
+ {8, 5, 9, 0, 0, 0}, {10, 7, 13, 0, 0, 0}, {12, 9, 16, 0, 0, 0},
+ {16, 10, 20, 0, 0, 0}, {24, 15, 25, 0, 0, 0}, {36, 25, 45, 0, 0, 0}};
+#define NFONT (sizeof(sys_fontlist)/sizeof(*sys_fontlist))
+
+/* here are the actual font size structs on msp's systems:
+MSW:
+font 8 5 9 8 5 11
+font 10 7 13 10 6 13
+font 12 9 16 14 8 16
+font 16 10 20 16 10 18
+font 24 15 25 16 10 18
+font 36 25 42 36 22 41
+
+linux:
+font 8 5 9 8 5 9
+font 10 7 13 12 7 13
+font 12 9 16 14 9 15
+font 16 10 20 16 10 19
+font 24 15 25 24 15 24
+font 36 25 42 36 22 41
+*/
+
+static t_fontinfo *sys_findfont(int fontsize)
+{
+ unsigned int i;
+ t_fontinfo *fi;
+ for (i = 0, fi = sys_fontlist; i < (NFONT-1); i++, fi++)
+ if (fontsize < fi[1].fi_fontsize) return (fi);
+ return (sys_fontlist + (NFONT-1));
+}
+
+int sys_nearestfontsize(int fontsize)
+{
+ return (sys_findfont(fontsize)->fi_fontsize);
+}
+
+int sys_hostfontsize(int fontsize)
+{
+ return (sys_findfont(fontsize)->fi_hostfontsize);
+}
+
+int sys_fontwidth(int fontsize)
+{
+ return (sys_findfont(fontsize)->fi_width);
+}
+
+int sys_fontheight(int fontsize)
+{
+ return (sys_findfont(fontsize)->fi_height);
+}
+
+int sys_defaultfont;
+#ifdef MSW
+#define DEFAULTFONT 12
+#else
+#define DEFAULTFONT 10
+#endif
+
+static void openit(const char *dirname, const char *filename)
+{
+ char dirbuf[MAXPDSTRING], *nameptr;
+ int fd = open_via_path(dirname, filename, "", dirbuf, &nameptr,
+ MAXPDSTRING, 0);
+ if (fd)
+ {
+ close (fd);
+ glob_evalfile(0, gensym(nameptr), gensym(dirbuf));
+ }
+ else
+ error("%s: can't open", filename);
+}
+
+#define NHOSTFONT 7
+
+/* this is called from the gui process. The first argument is the cwd, and
+succeeding args give the widths and heights of known fonts. We wait until
+these are known to open files and send messages specified on the command line.
+We ask the GUI to specify the "cwd" in case we don't have a local OS to get it
+from; for instance we could be some kind of RT embedded system. However, to
+really make this make sense we would have to implement
+open(), read(), etc, calls to be served somehow from the GUI too. */
+
+void glob_initfromgui(void *dummy, t_symbol *s, int argc, t_atom *argv)
+{
+ char *cwd = atom_getsymbolarg(0, argc, argv)->s_name;
+ t_namelist *nl;
+ unsigned int i, j;
+ if (argc != 2 + 3 * NHOSTFONT) bug("glob_initfromgui");
+ for (i = 0; i < NFONT; i++)
+ {
+ int wantheight = sys_fontlist[i].fi_maxheight;
+ for (j = 0; j < NHOSTFONT-1; j++)
+ {
+ if (atom_getintarg(3 * (j + 1) + 3, argc, argv) > wantheight)
+ break;
+ }
+ /* j is now the "real" font index for the desired font index i. */
+ sys_fontlist[i].fi_hostfontsize = atom_getintarg(3 * j + 1, argc, argv);
+ sys_fontlist[i].fi_width = atom_getintarg(3 * j + 2, argc, argv);
+ sys_fontlist[i].fi_height = atom_getintarg(3 * j + 3, argc, argv);
+ }
+#if 0
+ for (i = 0; i < 6; i++)
+ fprintf(stderr, "font %d %d %d %d %d\n",
+ sys_fontlist[i].fi_fontsize,
+ sys_fontlist[i].fi_maxheight,
+ sys_fontlist[i].fi_hostfontsize,
+ sys_fontlist[i].fi_width,
+ sys_fontlist[i].fi_height);
+#endif
+ /* load dynamic libraries specified with "-lib" args */
+ for (nl = sys_externlist; nl; nl = nl->nl_next)
+ if (!sys_load_lib(cwd, nl->nl_string))
+ post("%s: can't load library", nl->nl_string);
+ namelist_free(sys_externlist);
+ sys_externlist = 0;
+ /* open patches specifies with "-open" args */
+ for (nl = sys_openlist; nl; nl = nl->nl_next)
+ openit(cwd, nl->nl_string);
+ namelist_free(sys_openlist);
+ sys_openlist = 0;
+ /* send messages specified with "-send" args */
+ for (nl = sys_messagelist; nl; nl = nl->nl_next)
+ {
+ t_binbuf *b = binbuf_new();
+ binbuf_text(b, nl->nl_string, strlen(nl->nl_string));
+ binbuf_eval(b, 0, 0, 0);
+ binbuf_free(b);
+ }
+ namelist_free(sys_messagelist);
+ sys_messagelist = 0;
+ sys_oldtclversion = atom_getfloatarg(1 + 3 * NHOSTFONT, argc, argv);
+}
+
+static void sys_afterargparse(void);
+
+/* this is called from main() in s_entry.c */
+int sys_main(int argc, char **argv)
+{
+#ifdef PD_DEBUG
+ fprintf(stderr, "Pd: COMPILED FOR DEBUGGING\n");
+#endif
+ pd_init();
+ sys_findprogdir(argv[0]); /* set sys_progname, guipath */
+#ifdef UNIX
+ sys_rcfile(); /* parse the startup file */
+#endif
+ if (sys_argparse(argc, argv)) /* parse cmd line */
+ return (1);
+ sys_afterargparse(); /* post-argparse settings */
+ if (sys_verbose || sys_version) fprintf(stderr, "%scompiled %s %s\n",
+ pd_version, pd_compiletime, pd_compiledate);
+ if (sys_version) /* if we were just asked our version, exit here. */
+ return (0);
+ if (sys_startgui(sys_guidir->s_name)) /* start the gui */
+ return(1);
+ /* open audio and MIDI */
+ sys_open_midi(sys_nmidiin, sys_midiindevlist,
+ sys_nmidiout, sys_midioutdevlist);
+ sys_open_audio(sys_nsoundin, sys_soundindevlist, sys_nchin, sys_chinlist,
+ sys_nsoundout, sys_soundoutdevlist, sys_nchout, sys_choutlist,
+ sys_main_srate, sys_main_advance, 1);
+ /* run scheduler until it quits */
+
+ return (m_scheduler_pda());
+ return (m_scheduler());
+}
+
+static char *(usagemessage[]) = {
+"usage: pd [-flags] [file]...\n",
+"\naudio configuration flags:\n",
+"-r <n> -- specify sample rate\n",
+"-audioindev ... -- audio in devices; e.g., \"1,3\" for first and third\n",
+"-audiooutdev ... -- audio out devices (same)\n",
+"-audiodev ... -- specify input and output together\n",
+"-inchannels ... -- audio input channels (by device, like \"2\" or \"16,8\")\n",
+"-outchannels ... -- number of audio out channels (same)\n",
+"-channels ... -- specify both input and output channels\n",
+"-audiobuf <n> -- specify size of audio buffer in msec\n",
+"-blocksize <n> -- specify audio I/O block size in sample frames\n",
+"-sleepgrain <n> -- specify number of milliseconds to sleep when idle\n",
+"-nodac -- suppress audio output\n",
+"-noadc -- suppress audio input\n",
+"-noaudio -- suppress audio input and output (-nosound is synonym) \n",
+"-listdev -- list audio and MIDI devices\n",
+
+#ifdef USEAPI_OSS
+"-oss -- use OSS audio API\n",
+"-32bit ----- allow 32 bit OSS audio (for RME Hammerfall)\n",
+#endif
+
+#ifdef USEAPI_ALSA
+"-alsa -- use ALSA audio API\n",
+"-alsaadd <name> -- add an ALSA device name to list\n",
+"-alsadev <n> ----- obsolete: use -audiodev\n",
+#endif
+
+#ifdef USEAPI_JACK
+"-jack -- use JACK audio API\n",
+#endif
+
+#ifdef USEAPI_PORTAUDIO
+#ifdef MSW
+"-asio -- use ASIO audio driver (via Portaudio)\n",
+"-pa -- synonym for -asio\n",
+#else
+"-pa -- use Portaudio API\n",
+#endif
+#endif
+
+#ifdef USEAPI_MMIO
+"-mmio -- use MMIO audio API (default for Windows)\n",
+#endif
+" (default audio API for this platform: ", API_DEFSTRING, ")\n\n",
+
+"\nMIDI configuration flags:\n",
+"-midiindev ... -- midi in device list; e.g., \"1,3\" for first and third\n",
+"-midioutdev ... -- midi out device list, same format\n",
+"-mididev ... -- specify -midioutdev and -midiindev together\n",
+"-nomidiin -- suppress MIDI input\n",
+"-nomidiout -- suppress MIDI output\n",
+"-nomidi -- suppress MIDI input and output\n",
+
+"\nother flags:\n",
+"-path <path> -- add to file search path\n",
+"-helppath <path> -- add to help file search path\n",
+"-open <file> -- open file(s) on startup\n",
+"-lib <file> -- load object library(s)\n",
+"-font <n> -- specify default font size in points\n",
+"-verbose -- extra printout on startup and when searching for files\n",
+"-version -- don't run Pd; just print out which version it is \n",
+"-d <n> -- specify debug level\n",
+"-noloadbang -- suppress all loadbangs\n",
+"-nogui -- suppress starting the GUI\n",
+"-stdin -- scan stdin for keypresses\n",
+"-guicmd \"cmd...\" -- substitute another GUI program (e.g., rsh)\n",
+"-send \"msg...\" -- send a message at startup (after patches are loaded)\n",
+#ifdef UNIX
+"-rt or -realtime -- use real-time priority\n",
+"-nrt -- don't use real-time priority\n",
+#endif
+};
+
+static void sys_parsedevlist(int *np, int *vecp, int max, char *str)
+{
+ int n = 0;
+ while (n < max)
+ {
+ if (!*str) break;
+ else
+ {
+ char *endp;
+ vecp[n] = strtol(str, &endp, 10);
+ if (endp == str)
+ break;
+ n++;
+ if (!endp)
+ break;
+ str = endp + 1;
+ }
+ }
+ *np = n;
+}
+
+static int sys_getmultidevchannels(int n, int *devlist)
+{
+ int sum = 0;
+ if (n<0)return(-1);
+ if (n==0)return 0;
+ while(n--)sum+=*devlist++;
+ return sum;
+}
+
+
+ /* this routine tries to figure out where to find the auxilliary files
+ Pd will need to run. This is either done by looking at the command line
+ invokation for Pd, or if that fails, by consulting the variable
+ INSTALL_PREFIX. In MSW, we don't try to use INSTALL_PREFIX. */
+void sys_findprogdir(char *progname)
+{
+ char sbuf[MAXPDSTRING], sbuf2[MAXPDSTRING], *sp;
+ char *lastslash;
+#ifdef UNIX
+ struct stat statbuf;
+#endif
+
+ /* find out by what string Pd was invoked; put answer in "sbuf". */
+#ifdef MSW
+ GetModuleFileName(NULL, sbuf2, sizeof(sbuf2));
+ sbuf2[MAXPDSTRING-1] = 0;
+ sys_unbashfilename(sbuf2, sbuf);
+#endif /* MSW */
+#ifdef UNIX
+ strncpy(sbuf, progname, MAXPDSTRING);
+ sbuf[MAXPDSTRING-1] = 0;
+#endif
+ lastslash = strrchr(sbuf, '/');
+ if (lastslash)
+ {
+ /* bash last slash to zero so that sbuf is directory pd was in,
+ e.g., ~/pd/bin */
+ *lastslash = 0;
+ /* go back to the parent from there, e.g., ~/pd */
+ lastslash = strrchr(sbuf, '/');
+ if (lastslash)
+ {
+ strncpy(sbuf2, sbuf, lastslash-sbuf);
+ sbuf2[lastslash-sbuf] = 0;
+ }
+ else strcpy(sbuf2, "..");
+ }
+ else
+ {
+ /* no slashes found. Try INSTALL_PREFIX. */
+#ifdef INSTALL_PREFIX
+ strcpy(sbuf2, INSTALL_PREFIX);
+#else
+ strcpy(sbuf2, ".");
+#endif
+ }
+ /* now we believe sbuf2 holds the parent directory of the directory
+ pd was found in. We now want to infer the "lib" directory and the
+ "gui" directory. In "simple" UNIX installations, the layout is
+ .../bin/pd
+ .../bin/pd-gui
+ .../doc
+ and in "complicated" UNIX installations, it's:
+ .../bin/pd
+ .../lib/pd/bin/pd-gui
+ .../lib/pd/doc
+ To decide which, we stat .../lib/pd; if that exists, we assume it's
+ the complicated layout. In MSW, it's the "simple" layout, but
+ the gui program is straight wish80:
+ .../bin/pd
+ .../bin/wish80.exe
+ .../doc
+ */
+#ifdef UNIX
+ strncpy(sbuf, sbuf2, MAXPDSTRING-30);
+ sbuf[MAXPDSTRING-30] = 0;
+ strcat(sbuf, "/lib/pd");
+ if (stat(sbuf, &statbuf) >= 0)
+ {
+ /* complicated layout: lib dir is the one we just stat-ed above */
+ sys_libdir = gensym(sbuf);
+ /* gui lives in .../lib/pd/bin */
+ strncpy(sbuf, sbuf2, MAXPDSTRING-30);
+ sbuf[MAXPDSTRING-30] = 0;
+ strcat(sbuf, "/lib/pd/bin");
+ sys_guidir = gensym(sbuf);
+ }
+ else
+ {
+ /* simple layout: lib dir is the parent */
+ sys_libdir = gensym(sbuf2);
+ /* gui lives in .../bin */
+ strncpy(sbuf, sbuf2, MAXPDSTRING-30);
+ sbuf[MAXPDSTRING-30] = 0;
+ strcat(sbuf, "/bin");
+ sys_guidir = gensym(sbuf);
+ }
+#endif
+#ifdef MSW
+ sys_libdir = gensym(sbuf2);
+ sys_guidir = &s_; /* in MSW the guipath just depends on the libdir */
+#endif
+}
+
+#ifdef MSW
+static int sys_mmio = 1;
+#else
+static int sys_mmio = 0;
+#endif
+
+int sys_argparse(int argc, char **argv)
+{
+ char sbuf[MAXPDSTRING];
+ int i;
+ argc--; argv++;
+ while ((argc > 0) && **argv == '-')
+ {
+ if (!strcmp(*argv, "-r") && argc > 1 &&
+ sscanf(argv[1], "%d", &sys_main_srate) >= 1)
+ {
+ argc -= 2;
+ argv += 2;
+ }
+ else if (!strcmp(*argv, "-inchannels"))
+ { /* IOhannes */
+ sys_parsedevlist(&sys_nchin,
+ sys_chinlist, MAXAUDIOINDEV, argv[1]);
+
+ if (!sys_nchin)
+ goto usage;
+
+ argc -= 2; argv += 2;
+ }
+ else if (!strcmp(*argv, "-outchannels"))
+ { /* IOhannes */
+ sys_parsedevlist(&sys_nchout, sys_choutlist,
+ MAXAUDIOOUTDEV, argv[1]);
+
+ if (!sys_nchout)
+ goto usage;
+
+ argc -= 2; argv += 2;
+ }
+ else if (!strcmp(*argv, "-channels"))
+ {
+ sys_parsedevlist(&sys_nchin, sys_chinlist,MAXAUDIOINDEV,
+ argv[1]);
+ sys_parsedevlist(&sys_nchout, sys_choutlist,MAXAUDIOOUTDEV,
+ argv[1]);
+
+ if (!sys_nchout)
+ goto usage;
+
+ argc -= 2; argv += 2;
+ }
+ else if (!strcmp(*argv, "-soundbuf") || !strcmp(*argv, "-audiobuf"))
+ {
+ sys_main_advance = atoi(argv[1]);
+ argc -= 2; argv += 2;
+ }
+ else if (!strcmp(*argv, "-blocksize"))
+ {
+ sys_setblocksize(atoi(argv[1]));
+ argc -= 2; argv += 2;
+ }
+ else if (!strcmp(*argv, "-sleepgrain"))
+ {
+ sys_sleepgrain = 1000 * atoi(argv[1]);
+ argc -= 2; argv += 2;
+ }
+ else if (!strcmp(*argv, "-nodac"))
+ { /* IOhannes */
+ sys_nsoundout=0;
+ sys_nchout = 0;
+ argc--; argv++;
+ }
+ else if (!strcmp(*argv, "-noadc"))
+ { /* IOhannes */
+ sys_nsoundin=0;
+ sys_nchin = 0;
+ argc--; argv++;
+ }
+ else if (!strcmp(*argv, "-nosound") || !strcmp(*argv, "-noaudio"))
+ { /* IOhannes */
+ sys_nsoundin=sys_nsoundout = 0;
+ sys_nchin = sys_nchout = 0;
+ argc--; argv++;
+ }
+#ifdef USEAPI_OSS
+ else if (!strcmp(*argv, "-oss"))
+ {
+ sys_set_audio_api(API_OSS);
+ argc--; argv++;
+ }
+ else if (!strcmp(*argv, "-32bit"))
+ {
+ sys_set_audio_api(API_OSS);
+ oss_set32bit();
+ argc--; argv++;
+ }
+#endif
+#ifdef USEAPI_ALSA
+ else if (!strcmp(*argv, "-alsa"))
+ {
+ sys_set_audio_api(API_ALSA);
+ argc--; argv++;
+ }
+ else if (!strcmp(*argv, "-alsaadd"))
+ {
+ if (argc > 1)
+ alsa_adddev(argv[1]);
+ else goto usage;
+ argc -= 2; argv +=2;
+ }
+ /* obsolete flag for setting ALSA device number or name */
+ else if (!strcmp(*argv, "-alsadev"))
+ {
+ int devno = 0;
+ if (argv[1][0] >= '1' && argv[1][0] <= '9')
+ devno = 1 + 2 * (atoi(argv[1]) - 1);
+ else if (!strncmp(argv[1], "hw:", 3))
+ devno = 1 + 2 * atoi(argv[1]+3);
+ else if (!strncmp(argv[1], "plughw:", 7))
+ devno = 2 + 2 * atoi(argv[1]+7);
+ else goto usage;
+ sys_nsoundin = sys_nsoundout = 1;
+ sys_soundindevlist[0] = sys_soundoutdevlist[0] = devno;
+ sys_set_audio_api(API_ALSA);
+ argc -= 2; argv +=2;
+ }
+#endif
+#ifdef USEAPI_JACK
+ else if (!strcmp(*argv, "-jack"))
+ {
+ sys_set_audio_api(API_JACK);
+ argc--; argv++;
+ }
+#endif
+#ifdef USEAPI_PORTAUDIO
+ else if (!strcmp(*argv, "-pa") || !strcmp(*argv, "-portaudio")
+#ifdef MSW
+ || !strcmp(*argv, "-asio")
+#endif
+ )
+ {
+ sys_set_audio_api(API_PORTAUDIO);
+ sys_mmio = 0;
+ argc--; argv++;
+ }
+#endif
+#ifdef USEAPI_MMIO
+ else if (!strcmp(*argv, "-mmio"))
+ {
+ sys_set_audio_api(API_MMIO);
+ sys_mmio = 1;
+ argc--; argv++;
+ }
+#endif
+ else if (!strcmp(*argv, "-nomidiin"))
+ {
+ sys_nmidiin = 0;
+ argc--; argv++;
+ }
+ else if (!strcmp(*argv, "-nomidiout"))
+ {
+ sys_nmidiout = 0;
+ argc--; argv++;
+ }
+ else if (!strcmp(*argv, "-nomidi"))
+ {
+ sys_nmidiin = sys_nmidiout = 0;
+ argc--; argv++;
+ }
+ else if (!strcmp(*argv, "-midiindev"))
+ {
+ sys_parsedevlist(&sys_nmidiin, sys_midiindevlist, MAXMIDIINDEV,
+ argv[1]);
+ if (!sys_nmidiin)
+ goto usage;
+ argc -= 2; argv += 2;
+ }
+ else if (!strcmp(*argv, "-midioutdev"))
+ {
+ sys_parsedevlist(&sys_nmidiout, sys_midioutdevlist, MAXMIDIOUTDEV,
+ argv[1]);
+ if (!sys_nmidiout)
+ goto usage;
+ argc -= 2; argv += 2;
+ }
+ else if (!strcmp(*argv, "-mididev"))
+ {
+ sys_parsedevlist(&sys_nmidiin, sys_midiindevlist, MAXMIDIINDEV,
+ argv[1]);
+ sys_parsedevlist(&sys_nmidiout, sys_midioutdevlist, MAXMIDIOUTDEV,
+ argv[1]);
+ if (!sys_nmidiout)
+ goto usage;
+ argc -= 2; argv += 2;
+ }
+ else if (!strcmp(*argv, "-path"))
+ {
+ sys_addpath(argv[1]);
+ argc -= 2; argv += 2;
+ }
+ else if (!strcmp(*argv, "-helppath"))
+ {
+ sys_addhelppath(argv[1]);
+ argc -= 2; argv += 2;
+ }
+ else if (!strcmp(*argv, "-open") && argc > 1)
+ {
+ sys_openlist = namelist_append(sys_openlist, argv[1]);
+ argc -= 2; argv += 2;
+ }
+ else if (!strcmp(*argv, "-lib") && argc > 1)
+ {
+ sys_externlist = namelist_append(sys_externlist, argv[1]);
+ argc -= 2; argv += 2;
+ }
+ else if (!strcmp(*argv, "-font") && argc > 1)
+ {
+ sys_defaultfont = sys_nearestfontsize(atoi(argv[1]));
+ argc -= 2;
+ argv += 2;
+ }
+ else if (!strcmp(*argv, "-verbose"))
+ {
+ sys_verbose = 1;
+ argc--; argv++;
+ }
+ else if (!strcmp(*argv, "-version"))
+ {
+ sys_version = 1;
+ argc--; argv++;
+ }
+ else if (!strcmp(*argv, "-d") && argc > 1 &&
+ sscanf(argv[1], "%d", &sys_debuglevel) >= 1)
+ {
+ argc -= 2;
+ argv += 2;
+ }
+ else if (!strcmp(*argv, "-noloadbang"))
+ {
+ sys_noloadbang = 1;
+ argc--; argv++;
+ }
+ else if (!strcmp(*argv, "-nogui"))
+ {
+ sys_nogui = 1;
+ argc--; argv++;
+ }
+ else if (!strcmp(*argv, "-stdin"))
+ {
+ sys_stdin = 1;
+ argc--; argv++;
+ }
+ else if (!strcmp(*argv, "-guicmd") && argc > 1)
+ {
+ sys_guicmd = argv[1];
+ argc -= 2; argv += 2;
+ }
+ else if (!strcmp(*argv, "-send") && argc > 1)
+ {
+ sys_messagelist = namelist_append(sys_messagelist, argv[1]);
+ argc -= 2; argv += 2;
+ }
+ else if (!strcmp(*argv, "-listdev"))
+ {
+ sys_listdevs();
+ argc--; argv++;
+ }
+#ifdef UNIX
+ else if (!strcmp(*argv, "-rt") || !strcmp(*argv, "-realtime"))
+ {
+ sys_hipriority = 1;
+ argc--; argv++;
+ }
+ else if (!strcmp(*argv, "-nrt"))
+ {
+ sys_hipriority = 0;
+ argc--; argv++;
+ }
+#endif
+ else if (!strcmp(*argv, "-soundindev") ||
+ !strcmp(*argv, "-audioindev"))
+ { /* IOhannes */
+ sys_parsedevlist(&sys_nsoundin, sys_soundindevlist,
+ MAXAUDIOINDEV, argv[1]);
+ if (!sys_nsoundin)
+ goto usage;
+ argc -= 2; argv += 2;
+ }
+ else if (!strcmp(*argv, "-soundoutdev") ||
+ !strcmp(*argv, "-audiooutdev"))
+ { /* IOhannes */
+ sys_parsedevlist(&sys_nsoundout, sys_soundoutdevlist,
+ MAXAUDIOOUTDEV, argv[1]);
+ if (!sys_nsoundout)
+ goto usage;
+ argc -= 2; argv += 2;
+ }
+ else if (!strcmp(*argv, "-sounddev") || !strcmp(*argv, "-audiodev"))
+ {
+ sys_parsedevlist(&sys_nsoundin, sys_soundindevlist,
+ MAXAUDIOINDEV, argv[1]);
+ sys_parsedevlist(&sys_nsoundout, sys_soundoutdevlist,
+ MAXAUDIOOUTDEV, argv[1]);
+ if (!sys_nsoundout)
+ goto usage;
+ argc -= 2; argv += 2;
+ }
+ else
+ {
+ unsigned int i;
+ usage:
+ for (i = 0; i < sizeof(usagemessage)/sizeof(*usagemessage); i++)
+ fprintf(stderr, "%s", usagemessage[i]);
+ return (1);
+ }
+ }
+ if (!sys_defaultfont)
+ sys_defaultfont = DEFAULTFONT;
+ for (; argc > 0; argc--, argv++)
+ sys_openlist = namelist_append(sys_openlist, *argv);
+
+
+ return (0);
+}
+
+int sys_getblksize(void)
+{
+ return (DEFDACBLKSIZE);
+}
+
+ /* stuff to do, once, after calling sys_argparse() -- which may itself
+ be called twice because of the .pdrc hack. */
+static void sys_afterargparse(void)
+{
+ char sbuf[MAXPDSTRING];
+ int i;
+ /* add "extra" library to path */
+ strncpy(sbuf, sys_libdir->s_name, MAXPDSTRING-30);
+ sbuf[MAXPDSTRING-30] = 0;
+ strcat(sbuf, "/extra");
+ sys_addpath(sbuf);
+ strncpy(sbuf, sys_libdir->s_name, MAXPDSTRING-30);
+ sbuf[MAXPDSTRING-30] = 0;
+ strcat(sbuf, "/intern");
+ sys_addpath(sbuf);
+ /* add "doc/5.reference" library to helppath */
+ strncpy(sbuf, sys_libdir->s_name, MAXPDSTRING-30);
+ sbuf[MAXPDSTRING-30] = 0;
+ strcat(sbuf, "/doc/5.reference");
+ sys_addhelppath(sbuf);
+ /* correct to make audio and MIDI device lists zero based. On
+ MMIO, however, "1" really means the second device (the first one
+ is "mapper" which is was not included when the command args were
+ set up, so we leave it that way for compatibility. */
+ if (!sys_mmio)
+ {
+ for (i = 0; i < sys_nsoundin; i++)
+ sys_soundindevlist[i]--;
+ for (i = 0; i < sys_nsoundout; i++)
+ sys_soundoutdevlist[i]--;
+ }
+ for (i = 0; i < sys_nmidiin; i++)
+ sys_midiindevlist[i]--;
+ for (i = 0; i < sys_nmidiout; i++)
+ sys_midioutdevlist[i]--;
+}
+
+static void sys_addreferencepath(void)
+{
+ char sbuf[MAXPDSTRING];
+}
+/* Copyright (c) 1997-1999 Miller Puckette and others.
+* For information on usage and redistribution, and for a DISCLAIMER OF ALL
+* WARRANTIES, see the file, "LICENSE.txt," in this distribution. */
+
+/* IOhannes :
+ * hacked the code to add advanced multidevice-support
+ * 1311:forum::für::umläute:2001
+ */
+
+char pd_version[] = "Pd version 0.37.4\n";
+char pd_compiletime[] = __TIME__;
+char pd_compiledate[] = __DATE__;
+
+#include "m_pd.h"
+#include "m_imp.h"
+#include "s_stuff.h"
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <limits.h>
+#include <string.h>
+#include <stdio.h>
+#include <fcntl.h>
+#include <stdlib.h>
+
+#ifdef UNIX
+#include <unistd.h>
+#endif
+#ifdef MSW
+#include <io.h>
+#include <windows.h>
+#include <winbase.h>
+#endif
+
+void pd_init(void);
+int sys_argparse(int argc, char **argv);
+void sys_findprogdir(char *progname);
+int sys_startgui(const char *guipath);
+int sys_rcfile(void);
+int m_scheduler(void);
+void sys_addhelppath(char *p);
+void alsa_adddev(char *name);
+
+int sys_debuglevel;
+int sys_verbose;
+int sys_noloadbang;
+int sys_nogui;
+int sys_stdin = 0;
+char *sys_guicmd;
+t_symbol *sys_libdir;
+static t_symbol *sys_guidir;
+static t_namelist *sys_externlist;
+static t_namelist *sys_openlist;
+static t_namelist *sys_messagelist;
+static int sys_version;
+int sys_oldtclversion; /* hack to warn g_rtext.c about old text sel */
+
+int sys_nmidiout = 1;
+#ifdef MSW
+int sys_nmidiin = 0;
+#else
+int sys_nmidiin = 1;
+#endif
+int sys_midiindevlist[MAXMIDIINDEV] = {1};
+int sys_midioutdevlist[MAXMIDIOUTDEV] = {1};
+
+static int sys_main_srate = DEFAULTSRATE;
+static int sys_main_advance = DEFAULTADVANCE;
+
+/* IOhannes { */
+
+ /* here the "-1" counts signify that the corresponding vector hasn't been
+ specified in command line arguments; sys_open_audio will detect this
+ and fill things in. */
+int sys_nsoundin = -1;
+int sys_nsoundout = -1;
+int sys_soundindevlist[MAXAUDIOINDEV];
+int sys_soundoutdevlist[MAXAUDIOOUTDEV];
+
+int sys_nchin = -1;
+int sys_nchout = -1;
+int sys_chinlist[MAXAUDIOINDEV];
+int sys_choutlist[MAXAUDIOOUTDEV];
+/* } IOhannes */
+
+
+typedef struct _fontinfo
+{
+ int fi_fontsize;
+ int fi_maxwidth;
+ int fi_maxheight;
+ int fi_hostfontsize;
+ int fi_width;
+ int fi_height;
+} t_fontinfo;
+
+ /* these give the nominal point size and maximum height of the characters
+ in the six fonts. */
+
+static t_fontinfo sys_fontlist[] = {
+ {8, 5, 9, 0, 0, 0}, {10, 7, 13, 0, 0, 0}, {12, 9, 16, 0, 0, 0},
+ {16, 10, 20, 0, 0, 0}, {24, 15, 25, 0, 0, 0}, {36, 25, 45, 0, 0, 0}};
+#define NFONT (sizeof(sys_fontlist)/sizeof(*sys_fontlist))
+
+/* here are the actual font size structs on msp's systems:
+MSW:
+font 8 5 9 8 5 11
+font 10 7 13 10 6 13
+font 12 9 16 14 8 16
+font 16 10 20 16 10 18
+font 24 15 25 16 10 18
+font 36 25 42 36 22 41
+
+linux:
+font 8 5 9 8 5 9
+font 10 7 13 12 7 13
+font 12 9 16 14 9 15
+font 16 10 20 16 10 19
+font 24 15 25 24 15 24
+font 36 25 42 36 22 41
+*/
+
+static t_fontinfo *sys_findfont(int fontsize)
+{
+ unsigned int i;
+ t_fontinfo *fi;
+ for (i = 0, fi = sys_fontlist; i < (NFONT-1); i++, fi++)
+ if (fontsize < fi[1].fi_fontsize) return (fi);
+ return (sys_fontlist + (NFONT-1));
+}
+
+int sys_nearestfontsize(int fontsize)
+{
+ return (sys_findfont(fontsize)->fi_fontsize);
+}
+
+int sys_hostfontsize(int fontsize)
+{
+ return (sys_findfont(fontsize)->fi_hostfontsize);
+}
+
+int sys_fontwidth(int fontsize)
+{
+ return (sys_findfont(fontsize)->fi_width);
+}
+
+int sys_fontheight(int fontsize)
+{
+ return (sys_findfont(fontsize)->fi_height);
+}
+
+int sys_defaultfont;
+#ifdef MSW
+#define DEFAULTFONT 12
+#else
+#define DEFAULTFONT 10
+#endif
+
+static void openit(const char *dirname, const char *filename)
+{
+ char dirbuf[MAXPDSTRING], *nameptr;
+ int fd = open_via_path(dirname, filename, "", dirbuf, &nameptr,
+ MAXPDSTRING, 0);
+ if (fd)
+ {
+ close (fd);
+ glob_evalfile(0, gensym(nameptr), gensym(dirbuf));
+ }
+ else
+ error("%s: can't open", filename);
+}
+
+#define NHOSTFONT 7
+
+/* this is called from the gui process. The first argument is the cwd, and
+succeeding args give the widths and heights of known fonts. We wait until
+these are known to open files and send messages specified on the command line.
+We ask the GUI to specify the "cwd" in case we don't have a local OS to get it
+from; for instance we could be some kind of RT embedded system. However, to
+really make this make sense we would have to implement
+open(), read(), etc, calls to be served somehow from the GUI too. */
+
+void glob_initfromgui(void *dummy, t_symbol *s, int argc, t_atom *argv)
+{
+ char *cwd = atom_getsymbolarg(0, argc, argv)->s_name;
+ t_namelist *nl;
+ unsigned int i, j;
+ if (argc != 2 + 3 * NHOSTFONT) bug("glob_initfromgui");
+ for (i = 0; i < NFONT; i++)
+ {
+ int wantheight = sys_fontlist[i].fi_maxheight;
+ for (j = 0; j < NHOSTFONT-1; j++)
+ {
+ if (atom_getintarg(3 * (j + 1) + 3, argc, argv) > wantheight)
+ break;
+ }
+ /* j is now the "real" font index for the desired font index i. */
+ sys_fontlist[i].fi_hostfontsize = atom_getintarg(3 * j + 1, argc, argv);
+ sys_fontlist[i].fi_width = atom_getintarg(3 * j + 2, argc, argv);
+ sys_fontlist[i].fi_height = atom_getintarg(3 * j + 3, argc, argv);
+ }
+#if 0
+ for (i = 0; i < 6; i++)
+ fprintf(stderr, "font %d %d %d %d %d\n",
+ sys_fontlist[i].fi_fontsize,
+ sys_fontlist[i].fi_maxheight,
+ sys_fontlist[i].fi_hostfontsize,
+ sys_fontlist[i].fi_width,
+ sys_fontlist[i].fi_height);
+#endif
+ /* load dynamic libraries specified with "-lib" args */
+ for (nl = sys_externlist; nl; nl = nl->nl_next)
+ if (!sys_load_lib(cwd, nl->nl_string))
+ post("%s: can't load library", nl->nl_string);
+ namelist_free(sys_externlist);
+ sys_externlist = 0;
+ /* open patches specifies with "-open" args */
+ for (nl = sys_openlist; nl; nl = nl->nl_next)
+ openit(cwd, nl->nl_string);
+ namelist_free(sys_openlist);
+ sys_openlist = 0;
+ /* send messages specified with "-send" args */
+ for (nl = sys_messagelist; nl; nl = nl->nl_next)
+ {
+ t_binbuf *b = binbuf_new();
+ binbuf_text(b, nl->nl_string, strlen(nl->nl_string));
+ binbuf_eval(b, 0, 0, 0);
+ binbuf_free(b);
+ }
+ namelist_free(sys_messagelist);
+ sys_messagelist = 0;
+ sys_oldtclversion = atom_getfloatarg(1 + 3 * NHOSTFONT, argc, argv);
+}
+
+static void sys_afterargparse(void);
+
+/* this is called from main() in s_entry.c */
+int sys_main(int argc, char **argv)
+{
+#ifdef PD_DEBUG
+ fprintf(stderr, "Pd: COMPILED FOR DEBUGGING\n");
+#endif
+ pd_init();
+ sys_findprogdir(argv[0]); /* set sys_progname, guipath */
+#ifdef UNIX
+ sys_rcfile(); /* parse the startup file */
+#endif
+ if (sys_argparse(argc, argv)) /* parse cmd line */
+ return (1);
+ sys_afterargparse(); /* post-argparse settings */
+ if (sys_verbose || sys_version) fprintf(stderr, "%scompiled %s %s\n",
+ pd_version, pd_compiletime, pd_compiledate);
+ if (sys_version) /* if we were just asked our version, exit here. */
+ return (0);
+ if (sys_startgui(sys_guidir->s_name)) /* start the gui */
+ return(1);
+ /* open audio and MIDI */
+ sys_open_midi(sys_nmidiin, sys_midiindevlist,
+ sys_nmidiout, sys_midioutdevlist);
+ sys_open_audio(sys_nsoundin, sys_soundindevlist, sys_nchin, sys_chinlist,
+ sys_nsoundout, sys_soundoutdevlist, sys_nchout, sys_choutlist,
+ sys_main_srate, sys_main_advance, 1);
+ /* run scheduler until it quits */
+
+ return (m_scheduler_pda());
+ return (m_scheduler());
+}
+
+static char *(usagemessage[]) = {
+"usage: pd [-flags] [file]...\n",
+"\naudio configuration flags:\n",
+"-r <n> -- specify sample rate\n",
+"-audioindev ... -- audio in devices; e.g., \"1,3\" for first and third\n",
+"-audiooutdev ... -- audio out devices (same)\n",
+"-audiodev ... -- specify input and output together\n",
+"-inchannels ... -- audio input channels (by device, like \"2\" or \"16,8\")\n",
+"-outchannels ... -- number of audio out channels (same)\n",
+"-channels ... -- specify both input and output channels\n",
+"-audiobuf <n> -- specify size of audio buffer in msec\n",
+"-blocksize <n> -- specify audio I/O block size in sample frames\n",
+"-sleepgrain <n> -- specify number of milliseconds to sleep when idle\n",
+"-nodac -- suppress audio output\n",
+"-noadc -- suppress audio input\n",
+"-noaudio -- suppress audio input and output (-nosound is synonym) \n",
+"-listdev -- list audio and MIDI devices\n",
+
+#ifdef USEAPI_OSS
+"-oss -- use OSS audio API\n",
+"-32bit ----- allow 32 bit OSS audio (for RME Hammerfall)\n",
+#endif
+
+#ifdef USEAPI_ALSA
+"-alsa -- use ALSA audio API\n",
+"-alsaadd <name> -- add an ALSA device name to list\n",
+"-alsadev <n> ----- obsolete: use -audiodev\n",
+#endif
+
+#ifdef USEAPI_JACK
+"-jack -- use JACK audio API\n",
+#endif
+
+#ifdef USEAPI_PORTAUDIO
+#ifdef MSW
+"-asio -- use ASIO audio driver (via Portaudio)\n",
+"-pa -- synonym for -asio\n",
+#else
+"-pa -- use Portaudio API\n",
+#endif
+#endif
+
+#ifdef USEAPI_MMIO
+"-mmio -- use MMIO audio API (default for Windows)\n",
+#endif
+" (default audio API for this platform: ", API_DEFSTRING, ")\n\n",
+
+"\nMIDI configuration flags:\n",
+"-midiindev ... -- midi in device list; e.g., \"1,3\" for first and third\n",
+"-midioutdev ... -- midi out device list, same format\n",
+"-mididev ... -- specify -midioutdev and -midiindev together\n",
+"-nomidiin -- suppress MIDI input\n",
+"-nomidiout -- suppress MIDI output\n",
+"-nomidi -- suppress MIDI input and output\n",
+
+"\nother flags:\n",
+"-path <path> -- add to file search path\n",
+"-helppath <path> -- add to help file search path\n",
+"-open <file> -- open file(s) on startup\n",
+"-lib <file> -- load object library(s)\n",
+"-font <n> -- specify default font size in points\n",
+"-verbose -- extra printout on startup and when searching for files\n",
+"-version -- don't run Pd; just print out which version it is \n",
+"-d <n> -- specify debug level\n",
+"-noloadbang -- suppress all loadbangs\n",
+"-nogui -- suppress starting the GUI\n",
+"-stdin -- scan stdin for keypresses\n",
+"-guicmd \"cmd...\" -- substitute another GUI program (e.g., rsh)\n",
+"-send \"msg...\" -- send a message at startup (after patches are loaded)\n",
+#ifdef UNIX
+"-rt or -realtime -- use real-time priority\n",
+"-nrt -- don't use real-time priority\n",
+#endif
+};
+
+static void sys_parsedevlist(int *np, int *vecp, int max, char *str)
+{
+ int n = 0;
+ while (n < max)
+ {
+ if (!*str) break;
+ else
+ {
+ char *endp;
+ vecp[n] = strtol(str, &endp, 10);
+ if (endp == str)
+ break;
+ n++;
+ if (!endp)
+ break;
+ str = endp + 1;
+ }
+ }
+ *np = n;
+}
+
+static int sys_getmultidevchannels(int n, int *devlist)
+{
+ int sum = 0;
+ if (n<0)return(-1);
+ if (n==0)return 0;
+ while(n--)sum+=*devlist++;
+ return sum;
+}
+
+
+ /* this routine tries to figure out where to find the auxilliary files
+ Pd will need to run. This is either done by looking at the command line
+ invokation for Pd, or if that fails, by consulting the variable
+ INSTALL_PREFIX. In MSW, we don't try to use INSTALL_PREFIX. */
+void sys_findprogdir(char *progname)
+{
+ char sbuf[MAXPDSTRING], sbuf2[MAXPDSTRING], *sp;
+ char *lastslash;
+#ifdef UNIX
+ struct stat statbuf;
+#endif
+
+ /* find out by what string Pd was invoked; put answer in "sbuf". */
+#ifdef MSW
+ GetModuleFileName(NULL, sbuf2, sizeof(sbuf2));
+ sbuf2[MAXPDSTRING-1] = 0;
+ sys_unbashfilename(sbuf2, sbuf);
+#endif /* MSW */
+#ifdef UNIX
+ strncpy(sbuf, progname, MAXPDSTRING);
+ sbuf[MAXPDSTRING-1] = 0;
+#endif
+ lastslash = strrchr(sbuf, '/');
+ if (lastslash)
+ {
+ /* bash last slash to zero so that sbuf is directory pd was in,
+ e.g., ~/pd/bin */
+ *lastslash = 0;
+ /* go back to the parent from there, e.g., ~/pd */
+ lastslash = strrchr(sbuf, '/');
+ if (lastslash)
+ {
+ strncpy(sbuf2, sbuf, lastslash-sbuf);
+ sbuf2[lastslash-sbuf] = 0;
+ }
+ else strcpy(sbuf2, "..");
+ }
+ else
+ {
+ /* no slashes found. Try INSTALL_PREFIX. */
+#ifdef INSTALL_PREFIX
+ strcpy(sbuf2, INSTALL_PREFIX);
+#else
+ strcpy(sbuf2, ".");
+#endif
+ }
+ /* now we believe sbuf2 holds the parent directory of the directory
+ pd was found in. We now want to infer the "lib" directory and the
+ "gui" directory. In "simple" UNIX installations, the layout is
+ .../bin/pd
+ .../bin/pd-gui
+ .../doc
+ and in "complicated" UNIX installations, it's:
+ .../bin/pd
+ .../lib/pd/bin/pd-gui
+ .../lib/pd/doc
+ To decide which, we stat .../lib/pd; if that exists, we assume it's
+ the complicated layout. In MSW, it's the "simple" layout, but
+ the gui program is straight wish80:
+ .../bin/pd
+ .../bin/wish80.exe
+ .../doc
+ */
+#ifdef UNIX
+ strncpy(sbuf, sbuf2, MAXPDSTRING-30);
+ sbuf[MAXPDSTRING-30] = 0;
+ strcat(sbuf, "/lib/pd");
+ if (stat(sbuf, &statbuf) >= 0)
+ {
+ /* complicated layout: lib dir is the one we just stat-ed above */
+ sys_libdir = gensym(sbuf);
+ /* gui lives in .../lib/pd/bin */
+ strncpy(sbuf, sbuf2, MAXPDSTRING-30);
+ sbuf[MAXPDSTRING-30] = 0;
+ strcat(sbuf, "/lib/pd/bin");
+ sys_guidir = gensym(sbuf);
+ }
+ else
+ {
+ /* simple layout: lib dir is the parent */
+ sys_libdir = gensym(sbuf2);
+ /* gui lives in .../bin */
+ strncpy(sbuf, sbuf2, MAXPDSTRING-30);
+ sbuf[MAXPDSTRING-30] = 0;
+ strcat(sbuf, "/bin");
+ sys_guidir = gensym(sbuf);
+ }
+#endif
+#ifdef MSW
+ sys_libdir = gensym(sbuf2);
+ sys_guidir = &s_; /* in MSW the guipath just depends on the libdir */
+#endif
+}
+
+#ifdef MSW
+static int sys_mmio = 1;
+#else
+static int sys_mmio = 0;
+#endif
+
+int sys_argparse(int argc, char **argv)
+{
+ char sbuf[MAXPDSTRING];
+ int i;
+ argc--; argv++;
+ while ((argc > 0) && **argv == '-')
+ {
+ if (!strcmp(*argv, "-r") && argc > 1 &&
+ sscanf(argv[1], "%d", &sys_main_srate) >= 1)
+ {
+ argc -= 2;
+ argv += 2;
+ }
+ else if (!strcmp(*argv, "-inchannels"))
+ { /* IOhannes */
+ sys_parsedevlist(&sys_nchin,
+ sys_chinlist, MAXAUDIOINDEV, argv[1]);
+
+ if (!sys_nchin)
+ goto usage;
+
+ argc -= 2; argv += 2;
+ }
+ else if (!strcmp(*argv, "-outchannels"))
+ { /* IOhannes */
+ sys_parsedevlist(&sys_nchout, sys_choutlist,
+ MAXAUDIOOUTDEV, argv[1]);
+
+ if (!sys_nchout)
+ goto usage;
+
+ argc -= 2; argv += 2;
+ }
+ else if (!strcmp(*argv, "-channels"))
+ {
+ sys_parsedevlist(&sys_nchin, sys_chinlist,MAXAUDIOINDEV,
+ argv[1]);
+ sys_parsedevlist(&sys_nchout, sys_choutlist,MAXAUDIOOUTDEV,
+ argv[1]);
+
+ if (!sys_nchout)
+ goto usage;
+
+ argc -= 2; argv += 2;
+ }
+ else if (!strcmp(*argv, "-soundbuf") || !strcmp(*argv, "-audiobuf"))
+ {
+ sys_main_advance = atoi(argv[1]);
+ argc -= 2; argv += 2;
+ }
+ else if (!strcmp(*argv, "-blocksize"))
+ {
+ sys_setblocksize(atoi(argv[1]));
+ argc -= 2; argv += 2;
+ }
+ else if (!strcmp(*argv, "-sleepgrain"))
+ {
+ sys_sleepgrain = 1000 * atoi(argv[1]);
+ argc -= 2; argv += 2;
+ }
+ else if (!strcmp(*argv, "-nodac"))
+ { /* IOhannes */
+ sys_nsoundout=0;
+ sys_nchout = 0;
+ argc--; argv++;
+ }
+ else if (!strcmp(*argv, "-noadc"))
+ { /* IOhannes */
+ sys_nsoundin=0;
+ sys_nchin = 0;
+ argc--; argv++;
+ }
+ else if (!strcmp(*argv, "-nosound") || !strcmp(*argv, "-noaudio"))
+ { /* IOhannes */
+ sys_nsoundin=sys_nsoundout = 0;
+ sys_nchin = sys_nchout = 0;
+ argc--; argv++;
+ }
+#ifdef USEAPI_OSS
+ else if (!strcmp(*argv, "-oss"))
+ {
+ sys_set_audio_api(API_OSS);
+ argc--; argv++;
+ }
+ else if (!strcmp(*argv, "-32bit"))
+ {
+ sys_set_audio_api(API_OSS);
+ oss_set32bit();
+ argc--; argv++;
+ }
+#endif
+#ifdef USEAPI_ALSA
+ else if (!strcmp(*argv, "-alsa"))
+ {
+ sys_set_audio_api(API_ALSA);
+ argc--; argv++;
+ }
+ else if (!strcmp(*argv, "-alsaadd"))
+ {
+ if (argc > 1)
+ alsa_adddev(argv[1]);
+ else goto usage;
+ argc -= 2; argv +=2;
+ }
+ /* obsolete flag for setting ALSA device number or name */
+ else if (!strcmp(*argv, "-alsadev"))
+ {
+ int devno = 0;
+ if (argv[1][0] >= '1' && argv[1][0] <= '9')
+ devno = 1 + 2 * (atoi(argv[1]) - 1);
+ else if (!strncmp(argv[1], "hw:", 3))
+ devno = 1 + 2 * atoi(argv[1]+3);
+ else if (!strncmp(argv[1], "plughw:", 7))
+ devno = 2 + 2 * atoi(argv[1]+7);
+ else goto usage;
+ sys_nsoundin = sys_nsoundout = 1;
+ sys_soundindevlist[0] = sys_soundoutdevlist[0] = devno;
+ sys_set_audio_api(API_ALSA);
+ argc -= 2; argv +=2;
+ }
+#endif
+#ifdef USEAPI_JACK
+ else if (!strcmp(*argv, "-jack"))
+ {
+ sys_set_audio_api(API_JACK);
+ argc--; argv++;
+ }
+#endif
+#ifdef USEAPI_PORTAUDIO
+ else if (!strcmp(*argv, "-pa") || !strcmp(*argv, "-portaudio")
+#ifdef MSW
+ || !strcmp(*argv, "-asio")
+#endif
+ )
+ {
+ sys_set_audio_api(API_PORTAUDIO);
+ sys_mmio = 0;
+ argc--; argv++;
+ }
+#endif
+#ifdef USEAPI_MMIO
+ else if (!strcmp(*argv, "-mmio"))
+ {
+ sys_set_audio_api(API_MMIO);
+ sys_mmio = 1;
+ argc--; argv++;
+ }
+#endif
+ else if (!strcmp(*argv, "-nomidiin"))
+ {
+ sys_nmidiin = 0;
+ argc--; argv++;
+ }
+ else if (!strcmp(*argv, "-nomidiout"))
+ {
+ sys_nmidiout = 0;
+ argc--; argv++;
+ }
+ else if (!strcmp(*argv, "-nomidi"))
+ {
+ sys_nmidiin = sys_nmidiout = 0;
+ argc--; argv++;
+ }
+ else if (!strcmp(*argv, "-midiindev"))
+ {
+ sys_parsedevlist(&sys_nmidiin, sys_midiindevlist, MAXMIDIINDEV,
+ argv[1]);
+ if (!sys_nmidiin)
+ goto usage;
+ argc -= 2; argv += 2;
+ }
+ else if (!strcmp(*argv, "-midioutdev"))
+ {
+ sys_parsedevlist(&sys_nmidiout, sys_midioutdevlist, MAXMIDIOUTDEV,
+ argv[1]);
+ if (!sys_nmidiout)
+ goto usage;
+ argc -= 2; argv += 2;
+ }
+ else if (!strcmp(*argv, "-mididev"))
+ {
+ sys_parsedevlist(&sys_nmidiin, sys_midiindevlist, MAXMIDIINDEV,
+ argv[1]);
+ sys_parsedevlist(&sys_nmidiout, sys_midioutdevlist, MAXMIDIOUTDEV,
+ argv[1]);
+ if (!sys_nmidiout)
+ goto usage;
+ argc -= 2; argv += 2;
+ }
+ else if (!strcmp(*argv, "-path"))
+ {
+ sys_addpath(argv[1]);
+ argc -= 2; argv += 2;
+ }
+ else if (!strcmp(*argv, "-helppath"))
+ {
+ sys_addhelppath(argv[1]);
+ argc -= 2; argv += 2;
+ }
+ else if (!strcmp(*argv, "-open") && argc > 1)
+ {
+ sys_openlist = namelist_append(sys_openlist, argv[1]);
+ argc -= 2; argv += 2;
+ }
+ else if (!strcmp(*argv, "-lib") && argc > 1)
+ {
+ sys_externlist = namelist_append(sys_externlist, argv[1]);
+ argc -= 2; argv += 2;
+ }
+ else if (!strcmp(*argv, "-font") && argc > 1)
+ {
+ sys_defaultfont = sys_nearestfontsize(atoi(argv[1]));
+ argc -= 2;
+ argv += 2;
+ }
+ else if (!strcmp(*argv, "-verbose"))
+ {
+ sys_verbose = 1;
+ argc--; argv++;
+ }
+ else if (!strcmp(*argv, "-version"))
+ {
+ sys_version = 1;
+ argc--; argv++;
+ }
+ else if (!strcmp(*argv, "-d") && argc > 1 &&
+ sscanf(argv[1], "%d", &sys_debuglevel) >= 1)
+ {
+ argc -= 2;
+ argv += 2;
+ }
+ else if (!strcmp(*argv, "-noloadbang"))
+ {
+ sys_noloadbang = 1;
+ argc--; argv++;
+ }
+ else if (!strcmp(*argv, "-nogui"))
+ {
+ sys_nogui = 1;
+ argc--; argv++;
+ }
+ else if (!strcmp(*argv, "-stdin"))
+ {
+ sys_stdin = 1;
+ argc--; argv++;
+ }
+ else if (!strcmp(*argv, "-guicmd") && argc > 1)
+ {
+ sys_guicmd = argv[1];
+ argc -= 2; argv += 2;
+ }
+ else if (!strcmp(*argv, "-send") && argc > 1)
+ {
+ sys_messagelist = namelist_append(sys_messagelist, argv[1]);
+ argc -= 2; argv += 2;
+ }
+ else if (!strcmp(*argv, "-listdev"))
+ {
+ sys_listdevs();
+ argc--; argv++;
+ }
+#ifdef UNIX
+ else if (!strcmp(*argv, "-rt") || !strcmp(*argv, "-realtime"))
+ {
+ sys_hipriority = 1;
+ argc--; argv++;
+ }
+ else if (!strcmp(*argv, "-nrt"))
+ {
+ sys_hipriority = 0;
+ argc--; argv++;
+ }
+#endif
+ else if (!strcmp(*argv, "-soundindev") ||
+ !strcmp(*argv, "-audioindev"))
+ { /* IOhannes */
+ sys_parsedevlist(&sys_nsoundin, sys_soundindevlist,
+ MAXAUDIOINDEV, argv[1]);
+ if (!sys_nsoundin)
+ goto usage;
+ argc -= 2; argv += 2;
+ }
+ else if (!strcmp(*argv, "-soundoutdev") ||
+ !strcmp(*argv, "-audiooutdev"))
+ { /* IOhannes */
+ sys_parsedevlist(&sys_nsoundout, sys_soundoutdevlist,
+ MAXAUDIOOUTDEV, argv[1]);
+ if (!sys_nsoundout)
+ goto usage;
+ argc -= 2; argv += 2;
+ }
+ else if (!strcmp(*argv, "-sounddev") || !strcmp(*argv, "-audiodev"))
+ {
+ sys_parsedevlist(&sys_nsoundin, sys_soundindevlist,
+ MAXAUDIOINDEV, argv[1]);
+ sys_parsedevlist(&sys_nsoundout, sys_soundoutdevlist,
+ MAXAUDIOOUTDEV, argv[1]);
+ if (!sys_nsoundout)
+ goto usage;
+ argc -= 2; argv += 2;
+ }
+ else
+ {
+ unsigned int i;
+ usage:
+ for (i = 0; i < sizeof(usagemessage)/sizeof(*usagemessage); i++)
+ fprintf(stderr, "%s", usagemessage[i]);
+ return (1);
+ }
+ }
+ if (!sys_defaultfont)
+ sys_defaultfont = DEFAULTFONT;
+ for (; argc > 0; argc--, argv++)
+ sys_openlist = namelist_append(sys_openlist, *argv);
+
+
+ return (0);
+}
+
+int sys_getblksize(void)
+{
+ return (DEFDACBLKSIZE);
+}
+
+ /* stuff to do, once, after calling sys_argparse() -- which may itself
+ be called twice because of the .pdrc hack. */
+static void sys_afterargparse(void)
+{
+ char sbuf[MAXPDSTRING];
+ int i;
+ /* add "extra" library to path */
+ strncpy(sbuf, sys_libdir->s_name, MAXPDSTRING-30);
+ sbuf[MAXPDSTRING-30] = 0;
+ strcat(sbuf, "/extra");
+ sys_addpath(sbuf);
+ strncpy(sbuf, sys_libdir->s_name, MAXPDSTRING-30);
+ sbuf[MAXPDSTRING-30] = 0;
+ strcat(sbuf, "/intern");
+ sys_addpath(sbuf);
+ /* add "doc/5.reference" library to helppath */
+ strncpy(sbuf, sys_libdir->s_name, MAXPDSTRING-30);
+ sbuf[MAXPDSTRING-30] = 0;
+ strcat(sbuf, "/doc/5.reference");
+ sys_addhelppath(sbuf);
+ /* correct to make audio and MIDI device lists zero based. On
+ MMIO, however, "1" really means the second device (the first one
+ is "mapper" which is was not included when the command args were
+ set up, so we leave it that way for compatibility. */
+ if (!sys_mmio)
+ {
+ for (i = 0; i < sys_nsoundin; i++)
+ sys_soundindevlist[i]--;
+ for (i = 0; i < sys_nsoundout; i++)
+ sys_soundoutdevlist[i]--;
+ }
+ for (i = 0; i < sys_nmidiin; i++)
+ sys_midiindevlist[i]--;
+ for (i = 0; i < sys_nmidiout; i++)
+ sys_midioutdevlist[i]--;
+}
+
+static void sys_addreferencepath(void)
+{
+ char sbuf[MAXPDSTRING];
+}